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