diff options
author | Andras Becsi <andras.becsi@digia.com> | 2013-12-11 21:33:03 +0100 |
---|---|---|
committer | Andras Becsi <andras.becsi@digia.com> | 2013-12-13 12:34:07 +0100 |
commit | f2a33ff9cbc6d19943f1c7fbddd1f23d23975577 (patch) | |
tree | 0586a32aa390ade8557dfd6b4897f43a07449578 /chromium/content/shell/browser/shell_browser_main.cc | |
parent | 5362912cdb5eea702b68ebe23702468d17c3017a (diff) | |
download | qtwebengine-chromium-f2a33ff9cbc6d19943f1c7fbddd1f23d23975577.tar.gz |
Update Chromium to branch 1650 (31.0.1650.63)
Change-Id: I57d8c832eaec1eb2364e0a8e7352a6dd354db99f
Reviewed-by: Jocelyn Turcotte <jocelyn.turcotte@digia.com>
Diffstat (limited to 'chromium/content/shell/browser/shell_browser_main.cc')
-rw-r--r-- | chromium/content/shell/browser/shell_browser_main.cc | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/chromium/content/shell/browser/shell_browser_main.cc b/chromium/content/shell/browser/shell_browser_main.cc new file mode 100644 index 00000000000..8e61f6a6b7c --- /dev/null +++ b/chromium/content/shell/browser/shell_browser_main.cc @@ -0,0 +1,226 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/shell/browser/shell_browser_main.h" + +#include <iostream> + +#include "base/command_line.h" +#include "base/file_util.h" +#include "base/files/file_path.h" +#include "base/files/scoped_temp_dir.h" +#include "base/logging.h" +#include "base/memory/scoped_ptr.h" +#include "base/message_loop/message_loop.h" +#include "base/strings/sys_string_conversions.h" +#include "base/strings/utf_string_conversions.h" +#include "base/threading/thread_restrictions.h" +#include "content/public/browser/browser_main_runner.h" +#include "content/shell/browser/shell.h" +#include "content/shell/browser/webkit_test_controller.h" +#include "content/shell/common/shell_switches.h" +#include "content/shell/common/webkit_test_helpers.h" +#include "content/test/webkit_support.h" +#include "net/base/net_util.h" + +#if defined(OS_ANDROID) +#include "base/run_loop.h" +#include "content/shell/browser/shell_layout_tests_android.h" +#endif + +namespace { + +GURL GetURLForLayoutTest(const std::string& test_name, + base::FilePath* current_working_directory, + bool* enable_pixel_dumping, + std::string* expected_pixel_hash) { + // A test name is formated like file:///path/to/test'--pixel-test'pixelhash + std::string path_or_url = test_name; + std::string pixel_switch; + std::string pixel_hash; + std::string::size_type separator_position = path_or_url.find('\''); + if (separator_position != std::string::npos) { + pixel_switch = path_or_url.substr(separator_position + 1); + path_or_url.erase(separator_position); + } + separator_position = pixel_switch.find('\''); + if (separator_position != std::string::npos) { + pixel_hash = pixel_switch.substr(separator_position + 1); + pixel_switch.erase(separator_position); + } + if (enable_pixel_dumping) { + *enable_pixel_dumping = + (pixel_switch == "--pixel-test" || pixel_switch == "-p"); + } + if (expected_pixel_hash) + *expected_pixel_hash = pixel_hash; + + GURL test_url; +#if defined(OS_ANDROID) + if (content::GetTestUrlForAndroid(path_or_url, &test_url)) + return test_url; +#endif + + test_url = GURL(path_or_url); + if (!(test_url.is_valid() && test_url.has_scheme())) { + // We're outside of the message loop here, and this is a test. + base::ThreadRestrictions::ScopedAllowIO allow_io; +#if defined(OS_WIN) + std::wstring wide_path_or_url = + base::SysNativeMBToWide(path_or_url); + base::FilePath local_file(wide_path_or_url); +#else + base::FilePath local_file(path_or_url); +#endif + if (!base::PathExists(local_file)) { + local_file = content::GetWebKitRootDirFilePath() + .Append(FILE_PATH_LITERAL("LayoutTests")).Append(local_file); + } + test_url = net::FilePathToFileURL(base::MakeAbsoluteFilePath(local_file)); + } + base::FilePath local_path; + if (current_working_directory) { + // We're outside of the message loop here, and this is a test. + base::ThreadRestrictions::ScopedAllowIO allow_io; + if (net::FileURLToFilePath(test_url, &local_path)) + *current_working_directory = local_path.DirName(); + else + file_util::GetCurrentDirectory(current_working_directory); + } + return test_url; +} + +bool GetNextTest(const CommandLine::StringVector& args, + size_t* position, + std::string* test) { + if (*position >= args.size()) + return false; + if (args[*position] == FILE_PATH_LITERAL("-")) + return !!std::getline(std::cin, *test, '\n'); +#if defined(OS_WIN) + *test = WideToUTF8(args[(*position)++]); +#else + *test = args[(*position)++]; +#endif + return true; +} + +} // namespace + +// Main routine for running as the Browser process. +int ShellBrowserMain( + const content::MainFunctionParams& parameters, + const scoped_ptr<content::BrowserMainRunner>& main_runner) { + bool layout_test_mode = + CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree); + base::ScopedTempDir browser_context_path_for_layout_tests; + + if (layout_test_mode) { + CHECK(browser_context_path_for_layout_tests.CreateUniqueTempDir()); + CHECK(!browser_context_path_for_layout_tests.path().MaybeAsASCII().empty()); + CommandLine::ForCurrentProcess()->AppendSwitchASCII( + switches::kContentShellDataPath, + browser_context_path_for_layout_tests.path().MaybeAsASCII()); + +#if defined(OS_ANDROID) + content::EnsureInitializeForAndroidLayoutTests(); +#endif + } + + int exit_code = main_runner->Initialize(parameters); + DCHECK_LT(exit_code, 0) + << "BrowserMainRunner::Initialize failed in ShellBrowserMain"; + + if (exit_code >= 0) + return exit_code; + + if (CommandLine::ForCurrentProcess()->HasSwitch( + switches::kCheckLayoutTestSysDeps)) { + base::MessageLoop::current()->PostTask(FROM_HERE, + base::MessageLoop::QuitClosure()); + main_runner->Run(); + content::Shell::CloseAllWindows(); + main_runner->Shutdown(); + return 0; + } + + if (layout_test_mode) { + content::WebKitTestController test_controller; + { + // We're outside of the message loop here, and this is a test. + base::ThreadRestrictions::ScopedAllowIO allow_io; + base::FilePath temp_path; + file_util::GetTempDir(&temp_path); + test_controller.SetTempPath(temp_path); + } + std::string test_string; + CommandLine::StringVector args = + CommandLine::ForCurrentProcess()->GetArgs(); + size_t command_line_position = 0; + bool ran_at_least_once = false; + +#if defined(OS_ANDROID) + std::cout << "#READY\n"; + std::cout.flush(); +#endif + + while (GetNextTest(args, &command_line_position, &test_string)) { + if (test_string.empty()) + continue; + if (test_string == "QUIT") + break; + + bool enable_pixel_dumps; + std::string pixel_hash; + base::FilePath cwd; + GURL test_url = GetURLForLayoutTest( + test_string, &cwd, &enable_pixel_dumps, &pixel_hash); + if (!content::WebKitTestController::Get()->PrepareForLayoutTest( + test_url, cwd, enable_pixel_dumps, pixel_hash)) { + break; + } + + ran_at_least_once = true; +#if defined(OS_ANDROID) + // The message loop on Android is provided by the system, and does not + // offer a blocking Run() method. For layout tests, use a nested loop + // together with a base::RunLoop so it can block until a QuitClosure. + base::RunLoop run_loop; + run_loop.Run(); +#else + main_runner->Run(); +#endif + + if (!content::WebKitTestController::Get()->ResetAfterLayoutTest()) + break; + +#if defined(OS_ANDROID) + // There will be left-over tasks in the queue for Android because the + // main window is being destroyed. Run them before starting the next test. + base::MessageLoop::current()->RunUntilIdle(); +#endif + } + if (!ran_at_least_once) { + base::MessageLoop::current()->PostTask(FROM_HERE, + base::MessageLoop::QuitClosure()); + main_runner->Run(); + } + +#if defined(OS_ANDROID) + // Android should only execute Shutdown() here when running layout tests. + main_runner->Shutdown(); +#endif + + exit_code = 0; + } + +#if !defined(OS_ANDROID) + if (!layout_test_mode) + exit_code = main_runner->Run(); + + main_runner->Shutdown(); +#endif + + return exit_code; +} |