chromium/fuchsia_web/webengine/browser/frame_host_impl_browsertest.cc

// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <lib/sys/cpp/service_directory.h>

#include "base/run_loop.h"
#include "content/public/test/browser_test.h"
#include "fuchsia_web/common/test/test_navigation_listener.h"
#include "fuchsia_web/webengine/browser/context_impl.h"
#include "fuchsia_web/webengine/test/web_engine_browser_test.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace {

using FrameHostImplBrowserTest = WebEngineBrowserTest;

}  // namespace

// Verify that it is possible to connect to the fuchsia.web.FrameHost service,
// and that a Frame created in it uses a different ContextImpl than one created
// via the fuchsia.web.Context.
IN_PROC_BROWSER_TEST_F(FrameHostImplBrowserTest, IsolatedFromWebContext) {
  ASSERT_TRUE(embedded_test_server()->Start());

  // Create a new Frame via the fuchsia.web.Context, and spin the loop to
  // allow the request to be processed.
  fuchsia::web::FramePtr context_frame;
  context()->CreateFrameWithParams({}, context_frame.NewRequest());
  base::RunLoop().RunUntilIdle();

  // Verify that the FrameImpl can be found via the |context_impl()| to which
  // the fuchsia.web.Context is connected.
  EXPECT_TRUE(context_impl()->GetFrameImplForTest(&context_frame) != nullptr);

  // Create a new Frame via a FrameHost instance.
  fuchsia::web::FrameHostPtr frame_host;
  published_services().Connect(frame_host.NewRequest());
  fuchsia::web::FramePtr frame_host_frame;
  frame_host->CreateFrameWithParams({}, frame_host_frame.NewRequest());
  base::RunLoop().RunUntilIdle();

  // Verify that the new Frame cannot be resolved to a FrameImpl under the
  // |context_impl()| to which the fuchsia.web.Context is connected.
  EXPECT_TRUE(context_impl()->GetFrameImplForTest(&frame_host_frame) ==
              nullptr);
}