| // Copyright 2018 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "fuchsia_web/webengine/test/web_engine_browser_test.h" |
| |
| #include <fuchsia/web/cpp/fidl.h> |
| #include <lib/sys/cpp/component_context.h> |
| #include <lib/sys/cpp/service_directory.h> |
| #include <lib/vfs/cpp/pseudo_dir.h> |
| |
| #include <vector> |
| |
| #include "base/command_line.h" |
| #include "base/fuchsia/fuchsia_logging.h" |
| #include "base/fuchsia/process_context.h" |
| #include "base/fuchsia/test_component_context_for_process.h" |
| #include "base/run_loop.h" |
| #include "fuchsia_web/webengine/browser/web_engine_browser_context.h" |
| #include "fuchsia_web/webengine/browser/web_engine_browser_main_parts.h" |
| #include "fuchsia_web/webengine/browser/web_engine_content_browser_client.h" |
| #include "fuchsia_web/webengine/switches.h" |
| #include "fuchsia_web/webengine/web_engine_main_delegate.h" |
| #include "net/test/embedded_test_server/default_handlers.h" |
| #include "ui/gfx/switches.h" |
| #include "ui/ozone/public/ozone_switches.h" |
| |
| WebEngineBrowserTest::WebEngineBrowserTest() = default; |
| |
| WebEngineBrowserTest::~WebEngineBrowserTest() = default; |
| |
| void WebEngineBrowserTest::SetUp() { |
| base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
| SetUpCommandLine(command_line); |
| BrowserTestBase::SetUp(); |
| } |
| |
| void WebEngineBrowserTest::PreRunTestOnMainThread() { |
| zx_status_t status = published_services().Connect(context_.NewRequest()); |
| ZX_CHECK(status == ZX_OK, status) << "Connect fuchsia.web.Context"; |
| |
| net::test_server::RegisterDefaultHandlers(embedded_test_server()); |
| if (!test_server_root_.empty()) { |
| embedded_test_server()->ServeFilesFromSourceDirectory(test_server_root_); |
| } |
| } |
| |
| void WebEngineBrowserTest::PostRunTestOnMainThread() { |
| // Unbind the Context while the message loops are still alive. |
| context_.Unbind(); |
| |
| // Shutting down the context needs to run connection error handlers |
| // etc which normally are what causes the main loop to exit. Since in |
| // tests we are not running a main loop indefinitely, we want to let those |
| // things run, just as they would in production, before shutting down. This |
| // makes the main loop run until breaking the connection completes. |
| base::RunLoop().RunUntilIdle(); |
| } |
| |
| sys::ServiceDirectory& WebEngineBrowserTest::published_services() { |
| if (!published_services_) { |
| fidl::InterfaceRequest<fuchsia::io::Directory> svc_request; |
| published_services_ = |
| sys::ServiceDirectory::CreateWithRequest(&svc_request); |
| base::ComponentContextForProcess() |
| ->outgoing() |
| ->GetOrCreateDirectory("svc") |
| ->Serve(fuchsia::io::OpenFlags::RIGHT_READABLE | |
| fuchsia::io::OpenFlags::RIGHT_WRITABLE, |
| svc_request.TakeChannel()); |
| } |
| return *published_services_; |
| } |
| |
| void WebEngineBrowserTest::SetHeadlessInCommandLine( |
| base::CommandLine* command_line) { |
| command_line->AppendSwitchNative(switches::kOzonePlatform, |
| switches::kHeadless); |
| command_line->AppendSwitch(switches::kHeadless); |
| } |
| |
| ContextImpl* WebEngineBrowserTest::context_impl() const { |
| // The ContentMainDelegate and ContentBrowserClient must already exist, |
| // since those are created early on, before test setup or execution. |
| auto* browser_client = |
| WebEngineMainDelegate::GetInstanceForTest()->browser_client(); |
| CHECK(browser_client); |
| |
| auto* main_parts = browser_client->main_parts_for_test(); |
| CHECK(main_parts) << "context_impl() called too early in browser startup."; |
| |
| auto* context = main_parts->context_for_test(); |
| CHECK(context) << "context_impl() called before Context connected."; |
| |
| return context; |
| } |
| |
| std::vector<FrameHostImpl*> WebEngineBrowserTest::frame_host_impls() const { |
| // The ContentMainDelegate and ContentBrowserClient must already exist, |
| // since those are created early on, before test setup or execution. |
| auto* browser_client = |
| WebEngineMainDelegate::GetInstanceForTest()->browser_client(); |
| CHECK(browser_client); |
| |
| auto* main_parts = browser_client->main_parts_for_test(); |
| CHECK(main_parts) << "frame_host_impl() called too early in browser startup."; |
| |
| return main_parts->frame_hosts_for_test(); |
| } |