15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/test/content_browser_test.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/common/content_paths.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h" 163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell.h" 173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_browser_context.h" 183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_content_browser_client.h" 19b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/shell/common/shell_switches.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/shell/renderer/shell_content_renderer_client.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/test/test_content_client.h" 2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "net/test/embedded_test_server/embedded_test_server.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(OS_ANDROID) 2523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "content/shell/app/shell_main_delegate.h" 2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif 2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/scoped_nsautorelease_pool.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if !defined(OS_CHROMEOS) && defined(OS_LINUX) 331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/base/ime/input_method_initializer.h" 341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif 351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)ContentBrowserTest::ContentBrowserTest() 39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) : setup_called_(false) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See comment in InProcessBrowserTest::InProcessBrowserTest(). 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath content_shell_path; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(PathService::Get(base::FILE_EXE, &content_shell_path)); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_shell_path = content_shell_path.DirName(); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_shell_path = content_shell_path.Append( 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PATH_LITERAL("Content Shell.app/Contents/MacOS/Content Shell")); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(PathService::Override(base::FILE_EXE, content_shell_path)); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::FilePath content_test_data(FILE_PATH_LITERAL("content/test/data")); 5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) CreateTestServer(content_test_data); 5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::FilePath content_test_data_absolute; 5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) CHECK(PathService::Get(base::DIR_SOURCE_ROOT, &content_test_data_absolute)); 5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content_test_data_absolute = 5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content_test_data_absolute.Append(content_test_data); 5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) embedded_test_server()->ServeFilesFromDirectory(content_test_data_absolute); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentBrowserTest::~ContentBrowserTest() { 59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CHECK(setup_called_) << "Overridden SetUp() did not call parent " 60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "implementation, so test not run."; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentBrowserTest::SetUp() { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine* command_line = CommandLine::ForCurrentProcess(); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kContentBrowserTest); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetUpCommandLine(command_line); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(OS_ANDROID) 7023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) shell_main_delegate_.reset(new ShellMainDelegate); 7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) shell_main_delegate_->PreSandboxStartup(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line->HasSwitch(switches::kSingleProcess)) { 7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // We explicitly leak the new ContentRendererClient as we're 7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // setting a global that may be used after ContentBrowserTest is 7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // destroyed. 7623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ContentRendererClient* old_client = 7723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetRendererClientForTesting(new ShellContentRendererClient()); 7823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // No-one should have set this value before we did. 7923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DCHECK(!old_client); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#elif defined(OS_MACOSX) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See InProcessBrowserTest::PrepareTestCommandLine(). 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath subprocess_path; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::FILE_EXE, &subprocess_path); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subprocess_path = subprocess_path.DirName().DirName(); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(subprocess_path.BaseName().value(), "Contents"); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subprocess_path = subprocess_path.Append( 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Frameworks/Content Shell Helper.app/Contents/MacOS/Content Shell Helper"); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchPath(switches::kBrowserSubprocessPath, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subprocess_path); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // LinuxInputMethodContextFactory has to be initialized. 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if !defined(OS_CHROMEOS) && defined(OS_LINUX) 951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ui::InitializeInputMethodForTesting(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) setup_called_ = true; 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserTestBase::SetUp(); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentBrowserTest::TearDown() { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserTestBase::TearDown(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // LinuxInputMethodContextFactory has to be shutdown. 1076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#if !defined(OS_CHROMEOS) && defined(OS_LINUX) 1081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ui::ShutdownInputMethodForTesting(); 1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif 1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 11123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(OS_ANDROID) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell_main_delegate_.reset(); 11323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentBrowserTest::RunTestOnMainThreadLoop() { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_EQ(Shell::windows().size(), 1u); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell_ = Shell::windows()[0]; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On Mac, without the following autorelease pool, code which is directly 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // executed (as opposed to executed inside a message loop) would autorelease 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // objects into a higher-level pool. This pool is not recycled in-sync with 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the message loops' pools and causes problems with code relying on 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // deallocation via an autorelease pool (such as browser window closure and 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // browser shutdown). To avoid this, the following pool is recycled after each 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // time code is directly executed. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::mac::ScopedNSAutoreleasePool pool; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pump startup related events. 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoopForUI::current()->RunUntilIdle(); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pool.Recycle(); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetUpOnMainThread(); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTestOnMainThread(); 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TearDownOnMainThread(); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pool.Recycle(); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RenderProcessHost::iterator i(RenderProcessHost::AllHostsIterator()); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !i.IsAtEnd(); i.Advance()) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i.GetCurrentValue()->FastShutdownIfPossible(); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::CloseAllWindows(); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Shell* ContentBrowserTest::CreateBrowser() { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Shell::CreateNewWindow( 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ShellContentBrowserClient::Get()->browser_context(), 160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GURL(url::kAboutBlankURL), 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MSG_ROUTING_NONE, 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size()); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Shell* ContentBrowserTest::CreateOffTheRecordBrowser() { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Shell::CreateNewWindow( 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ShellContentBrowserClient::Get()->off_the_record_browser_context(), 169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GURL(url::kAboutBlankURL), 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MSG_ROUTING_NONE, 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size()); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 176