| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/test/chromedriver/chrome_launcher.h" | 5 #include "chrome/test/chromedriver/chrome_launcher.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/base64.h" | 10 #include "base/base64.h" |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 return Status(kOk); | 188 return Status(kOk); |
| 189 } | 189 } |
| 190 } | 190 } |
| 191 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(50)); | 191 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(50)); |
| 192 } | 192 } |
| 193 return Status(kUnknownError, "unable to discover open pages"); | 193 return Status(kUnknownError, "unable to discover open pages"); |
| 194 } | 194 } |
| 195 | 195 |
| 196 Status CreateBrowserwideDevToolsClientAndConnect( | 196 Status CreateBrowserwideDevToolsClientAndConnect( |
| 197 const NetAddress& address, | 197 const NetAddress& address, |
| 198 const PerfLoggingPrefs& perf_logging_prefs, |
| 198 const SyncWebSocketFactory& socket_factory, | 199 const SyncWebSocketFactory& socket_factory, |
| 199 ScopedVector<DevToolsEventListener>& devtools_event_listeners, | 200 ScopedVector<DevToolsEventListener>& devtools_event_listeners, |
| 200 scoped_ptr<DevToolsClient>* browser_client) { | 201 scoped_ptr<DevToolsClient>* browser_client) { |
| 201 scoped_ptr<DevToolsClient> client(new DevToolsClientImpl( | 202 scoped_ptr<DevToolsClient> client(new DevToolsClientImpl( |
| 202 socket_factory, base::StringPrintf("ws://%s/devtools/browser/", | 203 socket_factory, base::StringPrintf("ws://%s/devtools/browser/", |
| 203 address.ToString().c_str()), | 204 address.ToString().c_str()), |
| 204 DevToolsClientImpl::kBrowserwideDevToolsClientId)); | 205 DevToolsClientImpl::kBrowserwideDevToolsClientId)); |
| 205 for (ScopedVector<DevToolsEventListener>::const_iterator it = | 206 for (ScopedVector<DevToolsEventListener>::const_iterator it = |
| 206 devtools_event_listeners.begin(); | 207 devtools_event_listeners.begin(); |
| 207 it != devtools_event_listeners.end(); | 208 it != devtools_event_listeners.end(); |
| 208 ++it) { | 209 ++it) { |
| 209 // Only add listeners that subscribe to the browser-wide |DevToolsClient|. | 210 // Only add listeners that subscribe to the browser-wide |DevToolsClient|. |
| 210 // Otherwise, listeners will think this client is associated with a webview, | 211 // Otherwise, listeners will think this client is associated with a webview, |
| 211 // and will send unrecognized commands to it. | 212 // and will send unrecognized commands to it. |
| 212 if ((*it)->subscribes_to_browser()) | 213 if ((*it)->subscribes_to_browser()) |
| 213 client->AddListener(*it); | 214 client->AddListener(*it); |
| 214 } | 215 } |
| 215 // TODO(johnmoore): Call client->ConnectIfNecessary if tracing is enabled. | 216 // Provide the client regardless of whether it connects, so that Chrome always |
| 216 // For now, provide the client anyway, so that Chrome always has a valid | 217 // has a valid |devtools_websocket_client_|. If not connected, no listeners |
| 217 // |devtools_websocket_client_|. No listeners will be notified, and the client | 218 // will be notified, and client will just return kDisconnected errors if used. |
| 218 // will just return kDisconnected errors if used. | |
| 219 *browser_client = client.Pass(); | 219 *browser_client = client.Pass(); |
| 220 // To avoid unnecessary overhead, only connect if tracing is enabled, since |
| 221 // the browser-wide client is currently only used for tracing. |
| 222 if (!perf_logging_prefs.trace_categories.empty()) { |
| 223 Status status = (*browser_client)->ConnectIfNecessary(); |
| 224 if (status.IsError()) |
| 225 return status; |
| 226 } |
| 220 return Status(kOk); | 227 return Status(kOk); |
| 221 } | 228 } |
| 222 | 229 |
| 223 Status LaunchRemoteChromeSession( | 230 Status LaunchRemoteChromeSession( |
| 224 URLRequestContextGetter* context_getter, | 231 URLRequestContextGetter* context_getter, |
| 225 const SyncWebSocketFactory& socket_factory, | 232 const SyncWebSocketFactory& socket_factory, |
| 226 const Capabilities& capabilities, | 233 const Capabilities& capabilities, |
| 227 ScopedVector<DevToolsEventListener>& devtools_event_listeners, | 234 ScopedVector<DevToolsEventListener>& devtools_event_listeners, |
| 228 scoped_ptr<Chrome>* chrome) { | 235 scoped_ptr<Chrome>* chrome) { |
| 229 Status status(kOk); | 236 Status status(kOk); |
| 230 scoped_ptr<DevToolsHttpClient> devtools_http_client; | 237 scoped_ptr<DevToolsHttpClient> devtools_http_client; |
| 231 status = WaitForDevToolsAndCheckVersion( | 238 status = WaitForDevToolsAndCheckVersion( |
| 232 capabilities.debugger_address, context_getter, socket_factory, | 239 capabilities.debugger_address, context_getter, socket_factory, |
| 233 NULL, &devtools_http_client); | 240 NULL, &devtools_http_client); |
| 234 if (status.IsError()) { | 241 if (status.IsError()) { |
| 235 return Status(kUnknownError, "cannot connect to chrome at " + | 242 return Status(kUnknownError, "cannot connect to chrome at " + |
| 236 capabilities.debugger_address.ToString(), | 243 capabilities.debugger_address.ToString(), |
| 237 status); | 244 status); |
| 238 } | 245 } |
| 239 | 246 |
| 240 scoped_ptr<DevToolsClient> devtools_websocket_client; | 247 scoped_ptr<DevToolsClient> devtools_websocket_client; |
| 241 status = CreateBrowserwideDevToolsClientAndConnect( | 248 status = CreateBrowserwideDevToolsClientAndConnect( |
| 242 capabilities.debugger_address, socket_factory, devtools_event_listeners, | 249 capabilities.debugger_address, capabilities.perf_logging_prefs, |
| 243 &devtools_websocket_client); | 250 socket_factory, devtools_event_listeners, &devtools_websocket_client); |
| 244 if (status.IsError()) { | 251 if (status.IsError()) { |
| 245 LOG(WARNING) << "Browser-wide DevTools client failed to connect: " | 252 LOG(WARNING) << "Browser-wide DevTools client failed to connect: " |
| 246 << status.message(); | 253 << status.message(); |
| 247 } | 254 } |
| 248 | 255 |
| 249 chrome->reset(new ChromeRemoteImpl(devtools_http_client.Pass(), | 256 chrome->reset(new ChromeRemoteImpl(devtools_http_client.Pass(), |
| 250 devtools_websocket_client.Pass(), | 257 devtools_websocket_client.Pass(), |
| 251 devtools_event_listeners)); | 258 devtools_event_listeners)); |
| 252 return Status(kOk); | 259 return Status(kOk); |
| 253 } | 260 } |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 int exit_code; | 365 int exit_code; |
| 359 if (base::GetTerminationStatus(process, &exit_code) == | 366 if (base::GetTerminationStatus(process, &exit_code) == |
| 360 base::TERMINATION_STATUS_STILL_RUNNING) | 367 base::TERMINATION_STATUS_STILL_RUNNING) |
| 361 return Status(kUnknownError, "cannot kill Chrome", status); | 368 return Status(kUnknownError, "cannot kill Chrome", status); |
| 362 } | 369 } |
| 363 return status; | 370 return status; |
| 364 } | 371 } |
| 365 | 372 |
| 366 scoped_ptr<DevToolsClient> devtools_websocket_client; | 373 scoped_ptr<DevToolsClient> devtools_websocket_client; |
| 367 status = CreateBrowserwideDevToolsClientAndConnect( | 374 status = CreateBrowserwideDevToolsClientAndConnect( |
| 368 NetAddress(port), socket_factory, devtools_event_listeners, | 375 NetAddress(port), capabilities.perf_logging_prefs, socket_factory, |
| 369 &devtools_websocket_client); | 376 devtools_event_listeners, &devtools_websocket_client); |
| 370 if (status.IsError()) { | 377 if (status.IsError()) { |
| 371 LOG(WARNING) << "Browser-wide DevTools client failed to connect: " | 378 LOG(WARNING) << "Browser-wide DevTools client failed to connect: " |
| 372 << status.message(); | 379 << status.message(); |
| 373 } | 380 } |
| 374 | 381 |
| 375 scoped_ptr<ChromeDesktopImpl> chrome_desktop( | 382 scoped_ptr<ChromeDesktopImpl> chrome_desktop( |
| 376 new ChromeDesktopImpl(devtools_http_client.Pass(), | 383 new ChromeDesktopImpl(devtools_http_client.Pass(), |
| 377 devtools_websocket_client.Pass(), | 384 devtools_websocket_client.Pass(), |
| 378 devtools_event_listeners, | 385 devtools_event_listeners, |
| 379 port_reservation.Pass(), | 386 port_reservation.Pass(), |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 439 socket_factory, | 446 socket_factory, |
| 440 &capabilities, | 447 &capabilities, |
| 441 &devtools_http_client); | 448 &devtools_http_client); |
| 442 if (status.IsError()) { | 449 if (status.IsError()) { |
| 443 device->TearDown(); | 450 device->TearDown(); |
| 444 return status; | 451 return status; |
| 445 } | 452 } |
| 446 | 453 |
| 447 scoped_ptr<DevToolsClient> devtools_websocket_client; | 454 scoped_ptr<DevToolsClient> devtools_websocket_client; |
| 448 status = CreateBrowserwideDevToolsClientAndConnect( | 455 status = CreateBrowserwideDevToolsClientAndConnect( |
| 449 NetAddress(port), socket_factory, devtools_event_listeners, | 456 NetAddress(port), capabilities.perf_logging_prefs, socket_factory, |
| 450 &devtools_websocket_client); | 457 devtools_event_listeners, &devtools_websocket_client); |
| 451 if (status.IsError()) { | 458 if (status.IsError()) { |
| 452 LOG(WARNING) << "Browser-wide DevTools client failed to connect: " | 459 LOG(WARNING) << "Browser-wide DevTools client failed to connect: " |
| 453 << status.message(); | 460 << status.message(); |
| 454 } | 461 } |
| 455 | 462 |
| 456 chrome->reset(new ChromeAndroidImpl(devtools_http_client.Pass(), | 463 chrome->reset(new ChromeAndroidImpl(devtools_http_client.Pass(), |
| 457 devtools_websocket_client.Pass(), | 464 devtools_websocket_client.Pass(), |
| 458 devtools_event_listeners, | 465 devtools_event_listeners, |
| 459 port_reservation.Pass(), | 466 port_reservation.Pass(), |
| 460 device.Pass())); | 467 device.Pass())); |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 780 // Write empty "First Run" file, otherwise Chrome will wipe the default | 787 // Write empty "First Run" file, otherwise Chrome will wipe the default |
| 781 // profile that was written. | 788 // profile that was written. |
| 782 if (base::WriteFile( | 789 if (base::WriteFile( |
| 783 user_data_dir.Append(chrome::kFirstRunSentinel), "", 0) != 0) { | 790 user_data_dir.Append(chrome::kFirstRunSentinel), "", 0) != 0) { |
| 784 return Status(kUnknownError, "failed to write first run file"); | 791 return Status(kUnknownError, "failed to write first run file"); |
| 785 } | 792 } |
| 786 return Status(kOk); | 793 return Status(kOk); |
| 787 } | 794 } |
| 788 | 795 |
| 789 } // namespace internal | 796 } // namespace internal |
| OLD | NEW |