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/session_commands.h" | 5 #include "chrome/test/chromedriver/session_commands.h" |
6 | 6 |
7 #include <list> | 7 #include <list> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
11 #include "base/file_util.h" | 11 #include "base/file_util.h" |
12 #include "base/logging.h" // For CHECK macros. | 12 #include "base/logging.h" // For CHECK macros. |
13 #include "base/memory/ref_counted.h" | 13 #include "base/memory/ref_counted.h" |
14 #include "base/message_loop/message_loop_proxy.h" | 14 #include "base/message_loop/message_loop_proxy.h" |
15 #include "base/synchronization/lock.h" | 15 #include "base/synchronization/lock.h" |
16 #include "base/synchronization/waitable_event.h" | 16 #include "base/synchronization/waitable_event.h" |
17 #include "base/values.h" | 17 #include "base/values.h" |
18 #include "chrome/test/chromedriver/basic_types.h" | 18 #include "chrome/test/chromedriver/basic_types.h" |
19 #include "chrome/test/chromedriver/capabilities.h" | |
19 #include "chrome/test/chromedriver/chrome/automation_extension.h" | 20 #include "chrome/test/chromedriver/chrome/automation_extension.h" |
20 #include "chrome/test/chromedriver/chrome/chrome.h" | 21 #include "chrome/test/chromedriver/chrome/chrome.h" |
22 #include "chrome/test/chromedriver/chrome/chrome_android_impl.h" | |
23 #include "chrome/test/chromedriver/chrome/chrome_desktop_impl.h" | |
24 #include "chrome/test/chromedriver/chrome/device_manager.h" | |
25 #include "chrome/test/chromedriver/chrome/devtools_event_listener.h" | |
21 #include "chrome/test/chromedriver/chrome/geoposition.h" | 26 #include "chrome/test/chromedriver/chrome/geoposition.h" |
22 #include "chrome/test/chromedriver/chrome/status.h" | 27 #include "chrome/test/chromedriver/chrome/status.h" |
28 #include "chrome/test/chromedriver/chrome/version.h" | |
23 #include "chrome/test/chromedriver/chrome/web_view.h" | 29 #include "chrome/test/chromedriver/chrome/web_view.h" |
30 #include "chrome/test/chromedriver/chrome_launcher.h" | |
24 #include "chrome/test/chromedriver/logging.h" | 31 #include "chrome/test/chromedriver/logging.h" |
32 #include "chrome/test/chromedriver/net/url_request_context_getter.h" | |
25 #include "chrome/test/chromedriver/session.h" | 33 #include "chrome/test/chromedriver/session.h" |
26 #include "chrome/test/chromedriver/util.h" | 34 #include "chrome/test/chromedriver/util.h" |
27 | 35 |
28 namespace { | 36 namespace { |
29 | 37 |
30 const char kWindowHandlePrefix[] = "CDwindow-"; | 38 const char kWindowHandlePrefix[] = "CDwindow-"; |
31 | 39 |
32 std::string WebViewIdToWindowHandle(const std::string& web_view_id) { | 40 std::string WebViewIdToWindowHandle(const std::string& web_view_id) { |
33 return kWindowHandlePrefix + web_view_id; | 41 return kWindowHandlePrefix + web_view_id; |
34 } | 42 } |
35 | 43 |
36 bool WindowHandleToWebViewId(const std::string& window_handle, | 44 bool WindowHandleToWebViewId(const std::string& window_handle, |
37 std::string* web_view_id) { | 45 std::string* web_view_id) { |
38 if (window_handle.find(kWindowHandlePrefix) != 0u) | 46 if (window_handle.find(kWindowHandlePrefix) != 0u) |
39 return false; | 47 return false; |
40 *web_view_id = window_handle.substr( | 48 *web_view_id = window_handle.substr( |
41 std::string(kWindowHandlePrefix).length()); | 49 std::string(kWindowHandlePrefix).length()); |
42 return true; | 50 return true; |
43 } | 51 } |
44 | 52 |
45 } // namespace | 53 } // namespace |
46 | 54 |
55 InitSessionParams::InitSessionParams( | |
56 scoped_refptr<URLRequestContextGetter> context_getter, | |
57 const SyncWebSocketFactory& socket_factory, | |
58 DeviceManager* device_manager) | |
59 : context_getter(context_getter), | |
60 socket_factory(socket_factory), | |
61 device_manager(device_manager) {} | |
62 | |
63 InitSessionParams::~InitSessionParams() {} | |
64 | |
65 namespace { | |
66 | |
67 scoped_ptr<base::DictionaryValue> CreateCapabilities(Chrome* chrome) { | |
68 scoped_ptr<base::DictionaryValue> caps(new base::DictionaryValue()); | |
69 caps->SetString("browserName", "chrome"); | |
70 caps->SetString("version", chrome->GetVersion()); | |
71 caps->SetString("chrome.chromedriverVersion", kChromeDriverVersion); | |
72 caps->SetString("platform", chrome->GetOperatingSystemName()); | |
73 caps->SetBoolean("javascriptEnabled", true); | |
74 caps->SetBoolean("takesScreenshot", true); | |
75 caps->SetBoolean("handlesAlerts", true); | |
76 caps->SetBoolean("databaseEnabled", true); | |
77 caps->SetBoolean("locationContextEnabled", true); | |
78 caps->SetBoolean("applicationCacheEnabled", false); | |
79 caps->SetBoolean("browserConnectionEnabled", false); | |
80 caps->SetBoolean("cssSelectorsEnabled", true); | |
81 caps->SetBoolean("webStorageEnabled", true); | |
82 caps->SetBoolean("rotatable", false); | |
83 caps->SetBoolean("acceptSslCerts", true); | |
84 caps->SetBoolean("nativeEvents", true); | |
85 return caps.Pass(); | |
86 } | |
87 | |
88 | |
89 Status InitSessionHelper( | |
90 const InitSessionParams& bound_params, | |
91 Session* session, | |
92 const base::DictionaryValue& params, | |
93 scoped_ptr<base::Value>* value) { | |
94 const base::DictionaryValue* desired_caps; | |
95 if (!params.GetDictionary("desiredCapabilities", &desired_caps)) | |
96 return Status(kUnknownError, "cannot find dict 'desiredCapabilities'"); | |
97 | |
98 Capabilities capabilities; | |
99 Status status = capabilities.Parse(*desired_caps); | |
chrisgao (Use stgao instead)
2013/09/06 21:20:13
If there is some warning during parsing like "load
kkania
2013/09/06 23:09:29
OK
| |
100 if (status.IsError()) | |
101 return status; | |
102 | |
103 // Create Log's and DevToolsEventListener's for ones that are DevTools-based. | |
104 // Session will own the Log's, Chrome will own the listeners. | |
105 ScopedVector<DevToolsEventListener> devtools_event_listeners; | |
106 status = CreateLogs(capabilities, | |
107 &session->devtools_logs, | |
108 &session->driver_log, | |
109 &devtools_event_listeners); | |
110 if (status.IsError()) | |
111 return status; | |
112 | |
113 status = LaunchChrome(bound_params.context_getter.get(), | |
114 bound_params.socket_factory, | |
115 bound_params.device_manager, | |
116 capabilities, | |
117 devtools_event_listeners, | |
118 &session->chrome); | |
119 if (status.IsError()) | |
120 return status; | |
121 | |
122 std::list<std::string> web_view_ids; | |
123 status = session->chrome->GetWebViewIds(&web_view_ids); | |
124 if (status.IsError() || web_view_ids.empty()) { | |
125 return status.IsError() ? status : | |
126 Status(kUnknownError, "unable to discover open window in chrome"); | |
127 } | |
128 | |
129 session->window = web_view_ids.front(); | |
130 session->detach = capabilities.detach; | |
131 session->force_devtools_screenshot = capabilities.force_devtools_screenshot; | |
132 session->capabilities = CreateCapabilities(session->chrome.get()); | |
133 value->reset(session->capabilities->DeepCopy()); | |
134 return Status(kOk); | |
135 } | |
136 | |
137 } // namespace | |
138 | |
139 Status ExecuteInitSession( | |
140 const InitSessionParams& bound_params, | |
141 Session* session, | |
142 const base::DictionaryValue& params, | |
143 scoped_ptr<base::Value>* value) { | |
144 Status status = InitSessionHelper(bound_params, session, params, value); | |
145 if (status.IsError()) | |
146 session->quit = true; | |
147 return status; | |
148 } | |
149 | |
47 Status ExecuteQuit( | 150 Status ExecuteQuit( |
48 bool allow_detach, | 151 bool allow_detach, |
49 Session* session, | 152 Session* session, |
50 const base::DictionaryValue& params, | 153 const base::DictionaryValue& params, |
51 scoped_ptr<base::Value>* value) { | 154 scoped_ptr<base::Value>* value) { |
52 if (allow_detach && session->detach) { | 155 if (allow_detach && session->detach) { |
53 return Status(kOk); | 156 return Status(kOk); |
54 } else { | 157 } else { |
55 session->quit = true; | 158 session->quit = true; |
56 return session->chrome->Quit(); | 159 return session->chrome->Quit(); |
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
379 return status; | 482 return status; |
380 | 483 |
381 return extension->MaximizeWindow(); | 484 return extension->MaximizeWindow(); |
382 } | 485 } |
383 | 486 |
384 Status ExecuteGetAvailableLogTypes( | 487 Status ExecuteGetAvailableLogTypes( |
385 Session* session, | 488 Session* session, |
386 const base::DictionaryValue& params, | 489 const base::DictionaryValue& params, |
387 scoped_ptr<base::Value>* value) { | 490 scoped_ptr<base::Value>* value) { |
388 scoped_ptr<base::ListValue> types(new base::ListValue()); | 491 scoped_ptr<base::ListValue> types(new base::ListValue()); |
389 for (ScopedVector<WebDriverLog>::const_iterator log | 492 std::vector<WebDriverLog*> logs = session->GetAllLogs(); |
390 = session->devtools_logs.begin(); | 493 for (std::vector<WebDriverLog*>::const_iterator log = logs.begin(); |
391 log != session->devtools_logs.end(); ++log) { | 494 log != logs.end(); |
495 ++log) { | |
392 types->AppendString((*log)->type()); | 496 types->AppendString((*log)->type()); |
393 } | 497 } |
394 value->reset(types.release()); | 498 *value = types.Pass(); |
395 return Status(kOk); | 499 return Status(kOk); |
396 } | 500 } |
397 | 501 |
398 Status ExecuteGetLog( | 502 Status ExecuteGetLog( |
399 Session* session, | 503 Session* session, |
400 const base::DictionaryValue& params, | 504 const base::DictionaryValue& params, |
401 scoped_ptr<base::Value>* value) { | 505 scoped_ptr<base::Value>* value) { |
402 std::string log_type; | 506 std::string log_type; |
403 if (!params.GetString("type", &log_type)) { | 507 if (!params.GetString("type", &log_type)) { |
404 return Status(kUnknownError, "missing or invalid 'type'"); | 508 return Status(kUnknownError, "missing or invalid 'type'"); |
405 } | 509 } |
406 for (ScopedVector<WebDriverLog>::const_iterator log | 510 std::vector<WebDriverLog*> logs = session->GetAllLogs(); |
407 = session->devtools_logs.begin(); | 511 for (std::vector<WebDriverLog*>::const_iterator log = logs.begin(); |
408 log != session->devtools_logs.end(); ++log) { | 512 log != logs.end(); |
513 ++log) { | |
409 if (log_type == (*log)->type()) { | 514 if (log_type == (*log)->type()) { |
410 scoped_ptr<base::ListValue> log_entries = (*log)->GetAndClearEntries(); | 515 *value = (*log)->GetAndClearEntries(); |
411 value->reset(log_entries.release()); | |
412 return Status(kOk); | 516 return Status(kOk); |
413 } | 517 } |
414 } | 518 } |
415 return Status(kUnknownError, "log type '" + log_type + "' not found"); | 519 return Status(kUnknownError, "log type '" + log_type + "' not found"); |
416 } | 520 } |
417 | 521 |
418 Status ExecuteUploadFile( | 522 Status ExecuteUploadFile( |
419 Session* session, | 523 Session* session, |
420 const base::DictionaryValue& params, | 524 const base::DictionaryValue& params, |
421 scoped_ptr<base::Value>* value) { | 525 scoped_ptr<base::Value>* value) { |
(...skipping 15 matching lines...) Expand all Loading... | |
437 } | 541 } |
438 std::string error_msg; | 542 std::string error_msg; |
439 base::FilePath upload; | 543 base::FilePath upload; |
440 Status status = UnzipSoleFile(upload_dir, zip_data, &upload); | 544 Status status = UnzipSoleFile(upload_dir, zip_data, &upload); |
441 if (status.IsError()) | 545 if (status.IsError()) |
442 return Status(kUnknownError, "unable to unzip 'file'", status); | 546 return Status(kUnknownError, "unable to unzip 'file'", status); |
443 | 547 |
444 value->reset(new base::StringValue(upload.value())); | 548 value->reset(new base::StringValue(upload.value())); |
445 return Status(kOk); | 549 return Status(kOk); |
446 } | 550 } |
OLD | NEW |