Index: chrome/test/chromedriver/chrome_launcher.cc |
diff --git a/chrome/test/chromedriver/chrome_launcher.cc b/chrome/test/chromedriver/chrome_launcher.cc |
index c9b0e4905498fa990e784c7fac4fc5c350f153d0..64f21c9345ea2fa4bdc5fb4a00075419466a2bd2 100644 |
--- a/chrome/test/chromedriver/chrome_launcher.cc |
+++ b/chrome/test/chromedriver/chrome_launcher.cc |
@@ -44,9 +44,6 @@ |
namespace { |
-const char* kCommonSwitches[] = { |
- "ignore-certificate-errors", "metrics-recording-only"}; |
- |
Status UnpackAutomationExtension(const base::FilePath& temp_dir, |
base::FilePath* automation_extension) { |
std::string decoded_extension; |
@@ -68,62 +65,44 @@ Status UnpackAutomationExtension(const base::FilePath& temp_dir, |
return Status(kOk); |
} |
-void AddSwitches(CommandLine* command, |
- const char* switches[], |
- size_t switch_count, |
- const std::set<std::string>& exclude_switches) { |
- for (size_t i = 0; i < switch_count; ++i) { |
- if (exclude_switches.find(switches[i]) == exclude_switches.end()) |
- command->AppendSwitch(switches[i]); |
- } |
-} |
- |
Status PrepareCommandLine(int port, |
const Capabilities& capabilities, |
+ Switches* switches, |
CommandLine* prepared_command, |
base::ScopedTempDir* user_data_dir, |
base::ScopedTempDir* extension_dir, |
std::vector<std::string>* extension_bg_pages) { |
- CommandLine command = capabilities.command; |
- base::FilePath program = command.GetProgram(); |
+ base::FilePath program = capabilities.binary; |
if (program.empty()) { |
if (!FindChrome(&program)) |
return Status(kUnknownError, "cannot find Chrome binary"); |
- command.SetProgram(program); |
} else if (!base::PathExists(program)) { |
return Status(kUnknownError, |
base::StringPrintf("no chrome binary at %" PRFilePath, |
program.value().c_str())); |
} |
- |
- const char* excludable_switches[] = { |
- "disable-hang-monitor", |
- "disable-prompt-on-repost", |
- "full-memory-crash-report", |
- "no-first-run", |
- "disable-background-networking", |
- // TODO(chrisgao): Add "disable-sync" when chrome 30- is not supported. |
- // For chrome 30-, it leads to crash when opening chrome://settings. |
- "disable-web-resources", |
- "safebrowsing-disable-auto-update", |
- "safebrowsing-disable-download-protection", |
- "disable-client-side-phishing-detection", |
- "disable-component-update", |
- "disable-default-apps", |
- }; |
- |
- AddSwitches(&command, excludable_switches, arraysize(excludable_switches), |
- capabilities.exclude_switches); |
- AddSwitches(&command, kCommonSwitches, arraysize(kCommonSwitches), |
- capabilities.exclude_switches); |
- |
- command.AppendSwitch("enable-logging"); |
- command.AppendSwitchASCII("logging-level", "1"); |
- command.AppendSwitchASCII("password-store", "basic"); |
- command.AppendSwitch("use-mock-keychain"); |
- command.AppendSwitchASCII("remote-debugging-port", base::IntToString(port)); |
- |
- if (!command.HasSwitch("user-data-dir")) { |
+ CommandLine command(program); |
+ |
+ // TODO(chrisgao): Add "disable-sync" when chrome 30- is not supported. |
+ // For chrome 30-, it leads to crash when opening chrome://settings. |
+ switches->SetSwitch("disable-hang-monitor"); |
+ switches->SetSwitch("disable-prompt-on-repost"); |
+ switches->SetSwitch("full-memory-crash-report"); |
+ switches->SetSwitch("no-first-run"); |
+ switches->SetSwitch("disable-background-networking"); |
+ switches->SetSwitch("disable-web-resources"); |
+ switches->SetSwitch("safebrowsing-disable-auto-update"); |
+ switches->SetSwitch("safebrowsing-disable-download-protection"); |
+ switches->SetSwitch("disable-client-side-phishing-detection"); |
+ switches->SetSwitch("disable-component-update"); |
+ switches->SetSwitch("disable-default-apps"); |
+ switches->SetSwitch("enable-logging"); |
+ switches->SetSwitch("logging-level", "1"); |
+ switches->SetSwitch("password-store", "basic"); |
+ switches->SetSwitch("use-mock-keychain"); |
+ switches->SetSwitch("remote-debugging-port", base::IntToString(port)); |
+ |
+ if (!switches->HasSwitch("user-data-dir")) { |
command.AppendArg("about:blank"); |
if (!user_data_dir->CreateUniqueTempDir()) |
return Status(kUnknownError, "cannot create temp dir for user data dir"); |
@@ -142,11 +121,13 @@ Status PrepareCommandLine(int port, |
Status status = internal::ProcessExtensions(capabilities.extensions, |
extension_dir->path(), |
true, |
- &command, |
+ switches, |
extension_bg_pages); |
if (status.IsError()) |
return status; |
+ switches->SetFromSwitches(capabilities.switches); |
chrisgao (Use stgao instead)
2013/08/30 02:12:55
including excludeSwitches,
automation-extension mi
|
+ switches->AppendToCommandLine(&command); |
*prepared_command = command; |
return Status(kOk); |
} |
@@ -190,11 +171,11 @@ Status LaunchExistingChromeSession( |
Status status(kOk); |
scoped_ptr<DevToolsHttpClient> devtools_client; |
status = WaitForDevToolsAndCheckVersion( |
- capabilities.use_existing_browser, context_getter, socket_factory, log, |
+ capabilities.debugger_address, context_getter, socket_factory, log, |
&devtools_client); |
if (status.IsError()) { |
return Status(kUnknownError, "cannot connect to chrome at " + |
- capabilities.use_existing_browser.ToString(), |
+ capabilities.debugger_address.ToString(), |
status); |
} |
chrome->reset(new ChromeExistingImpl(devtools_client.Pass(), |
@@ -209,6 +190,7 @@ Status LaunchDesktopChrome( |
const SyncWebSocketFactory& socket_factory, |
Log* log, |
const Capabilities& capabilities, |
+ Switches* switches, |
ScopedVector<DevToolsEventListener>& devtools_event_listeners, |
scoped_ptr<Chrome>* chrome) { |
CommandLine command(CommandLine::NO_PROGRAM); |
@@ -217,6 +199,7 @@ Status LaunchDesktopChrome( |
std::vector<std::string> extension_bg_pages; |
Status status = PrepareCommandLine(port, |
capabilities, |
+ switches, |
&command, |
&user_data_dir, |
&extension_dir, |
@@ -314,6 +297,7 @@ Status LaunchAndroidChrome( |
const SyncWebSocketFactory& socket_factory, |
Log* log, |
const Capabilities& capabilities, |
+ Switches* switches, |
ScopedVector<DevToolsEventListener>& devtools_event_listeners, |
DeviceManager* device_manager, |
scoped_ptr<Chrome>* chrome) { |
@@ -328,15 +312,12 @@ Status LaunchAndroidChrome( |
if (!status.IsOk()) |
return status; |
- std::string args(capabilities.android_args); |
- for (size_t i = 0; i < arraysize(kCommonSwitches); i++) |
- args += "--" + std::string(kCommonSwitches[i]) + " "; |
- args += "--disable-fre --enable-remote-debugging"; |
- |
+ switches->SetSwitch("disable-fre"); |
+ switches->SetSwitch("enable-remote-debugging"); |
status = device->StartApp(capabilities.android_package, |
capabilities.android_activity, |
capabilities.android_process, |
- args, port); |
+ switches->ToString(), port); |
if (!status.IsOk()) { |
device->StopApp(); |
return status; |
@@ -376,14 +357,20 @@ Status LaunchChrome( |
if (!FindOpenPort(&port)) |
return Status(kUnknownError, "failed to find an open port for Chrome"); |
+ Switches switches; |
+ const char* kCommonSwitches[] = { |
+ "ignore-certificate-errors", "metrics-recording-only"}; |
+ for (size_t i = 0; i < arraysize(kCommonSwitches); i++) |
+ switches.SetSwitch(kCommonSwitches[i]); |
+ |
if (capabilities.IsAndroid()) { |
return LaunchAndroidChrome( |
context_getter, port, socket_factory, log, capabilities, |
- devtools_event_listeners, device_manager, chrome); |
+ &switches, devtools_event_listeners, device_manager, chrome); |
} else { |
return LaunchDesktopChrome( |
context_getter, port, socket_factory, log, capabilities, |
- devtools_event_listeners, chrome); |
+ &switches, devtools_event_listeners, chrome); |
} |
} |
@@ -500,10 +487,20 @@ Status ProcessExtension(const std::string& extension, |
return Status(kOk); |
} |
+void UpdateExtensionSwitch(Switches* switches, |
+ const char name[], |
+ const base::FilePath::StringType& extension) { |
+ base::FilePath::StringType value = switches->GetSwitchValueNative(name); |
+ if (value.length()) |
+ value += FILE_PATH_LITERAL(","); |
+ value += extension; |
+ switches->SetSwitch(name, value); |
+} |
+ |
Status ProcessExtensions(const std::vector<std::string>& extensions, |
const base::FilePath& temp_dir, |
bool include_automation_extension, |
- CommandLine* command, |
+ Switches* switches, |
std::vector<std::string>* bg_pages) { |
std::vector<std::string> bg_pages_tmp; |
std::vector<base::FilePath::StringType> extension_paths; |
@@ -527,9 +524,9 @@ Status ProcessExtensions(const std::vector<std::string>& extensions, |
Status status = UnpackAutomationExtension(temp_dir, &automation_extension); |
if (status.IsError()) |
return status; |
- if (command->HasSwitch("disable-extensions")) { |
- command->AppendSwitchNative("load-component-extension", |
- automation_extension.value()); |
+ if (switches->HasSwitch("disable-extensions")) { |
+ UpdateExtensionSwitch(switches, "load-component-extension", |
+ automation_extension.value()); |
} else { |
extension_paths.push_back(automation_extension.value()); |
} |
@@ -538,7 +535,7 @@ Status ProcessExtensions(const std::vector<std::string>& extensions, |
if (extension_paths.size()) { |
base::FilePath::StringType extension_paths_value = JoinString( |
extension_paths, FILE_PATH_LITERAL(',')); |
- command->AppendSwitchNative("load-extension", extension_paths_value); |
+ UpdateExtensionSwitch(switches, "load-extension", extension_paths_value); |
} |
bg_pages->swap(bg_pages_tmp); |
return Status(kOk); |