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/window_commands.h" | 5 #include "chrome/test/chromedriver/window_commands.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <list> | 9 #include <list> |
10 #include <string> | 10 #include <string> |
(...skipping 11 matching lines...) Expand all Loading... |
22 #include "chrome/test/chromedriver/chrome/chrome_desktop_impl.h" | 22 #include "chrome/test/chromedriver/chrome/chrome_desktop_impl.h" |
23 #include "chrome/test/chromedriver/chrome/devtools_client.h" | 23 #include "chrome/test/chromedriver/chrome/devtools_client.h" |
24 #include "chrome/test/chromedriver/chrome/geoposition.h" | 24 #include "chrome/test/chromedriver/chrome/geoposition.h" |
25 #include "chrome/test/chromedriver/chrome/javascript_dialog_manager.h" | 25 #include "chrome/test/chromedriver/chrome/javascript_dialog_manager.h" |
26 #include "chrome/test/chromedriver/chrome/js.h" | 26 #include "chrome/test/chromedriver/chrome/js.h" |
27 #include "chrome/test/chromedriver/chrome/network_conditions.h" | 27 #include "chrome/test/chromedriver/chrome/network_conditions.h" |
28 #include "chrome/test/chromedriver/chrome/status.h" | 28 #include "chrome/test/chromedriver/chrome/status.h" |
29 #include "chrome/test/chromedriver/chrome/ui_events.h" | 29 #include "chrome/test/chromedriver/chrome/ui_events.h" |
30 #include "chrome/test/chromedriver/chrome/web_view.h" | 30 #include "chrome/test/chromedriver/chrome/web_view.h" |
31 #include "chrome/test/chromedriver/element_util.h" | 31 #include "chrome/test/chromedriver/element_util.h" |
| 32 #include "chrome/test/chromedriver/net/timeout.h" |
32 #include "chrome/test/chromedriver/session.h" | 33 #include "chrome/test/chromedriver/session.h" |
33 #include "chrome/test/chromedriver/util.h" | 34 #include "chrome/test/chromedriver/util.h" |
34 | 35 |
35 namespace { | 36 namespace { |
36 | 37 |
37 const std::string kUnreachableWebDataURL = "data:text/html,chromewebdata"; | 38 const std::string kUnreachableWebDataURL = "data:text/html,chromewebdata"; |
38 | 39 |
39 Status GetMouseButton(const base::DictionaryValue& params, | 40 Status GetMouseButton(const base::DictionaryValue& params, |
40 MouseButton* button) { | 41 MouseButton* button) { |
41 int button_num; | 42 int button_num; |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
195 TouchEvent(type, relative_x, relative_y)); | 196 TouchEvent(type, relative_x, relative_y)); |
196 return web_view->DispatchTouchEvents(events); | 197 return web_view->DispatchTouchEvents(events); |
197 } | 198 } |
198 | 199 |
199 } // namespace | 200 } // namespace |
200 | 201 |
201 Status ExecuteWindowCommand(const WindowCommand& command, | 202 Status ExecuteWindowCommand(const WindowCommand& command, |
202 Session* session, | 203 Session* session, |
203 const base::DictionaryValue& params, | 204 const base::DictionaryValue& params, |
204 std::unique_ptr<base::Value>* value) { | 205 std::unique_ptr<base::Value>* value) { |
| 206 Timeout timeout; |
205 WebView* web_view = NULL; | 207 WebView* web_view = NULL; |
206 Status status = session->GetTargetWindow(&web_view); | 208 Status status = session->GetTargetWindow(&web_view); |
207 if (status.IsError()) | 209 if (status.IsError()) |
208 return status; | 210 return status; |
209 | 211 |
210 status = web_view->ConnectIfNecessary(); | 212 status = web_view->ConnectIfNecessary(); |
211 if (status.IsError()) | 213 if (status.IsError()) |
212 return status; | 214 return status; |
213 | 215 |
214 status = web_view->HandleReceivedEvents(); | 216 status = web_view->HandleReceivedEvents(); |
(...skipping 10 matching lines...) Expand all Loading... |
225 } | 227 } |
226 | 228 |
227 Status nav_status(kOk); | 229 Status nav_status(kOk); |
228 for (int attempt = 0; attempt < 3; attempt++) { | 230 for (int attempt = 0; attempt < 3; attempt++) { |
229 if (attempt == 2) { | 231 if (attempt == 2) { |
230 // Switch to main frame and retry command if subframe no longer exists. | 232 // Switch to main frame and retry command if subframe no longer exists. |
231 session->SwitchToTopFrame(); | 233 session->SwitchToTopFrame(); |
232 } | 234 } |
233 | 235 |
234 nav_status = web_view->WaitForPendingNavigations( | 236 nav_status = web_view->WaitForPendingNavigations( |
235 session->GetCurrentFrameId(), session->page_load_timeout, true); | 237 session->GetCurrentFrameId(), |
| 238 Timeout(session->page_load_timeout, &timeout), true); |
236 if (nav_status.IsError()) | 239 if (nav_status.IsError()) |
237 return nav_status; | 240 return nav_status; |
238 | 241 |
239 status = command.Run(session, web_view, params, value); | 242 status = command.Run(session, web_view, params, value, &timeout); |
240 if (status.code() == kNoSuchExecutionContext) { | 243 if (status.code() == kNoSuchExecutionContext || status.code() == kTimeout) { |
| 244 // If the command timed out, let WaitForPendingNavigations cancel |
| 245 // the navigation if there is one. |
241 continue; | 246 continue; |
242 } else if (status.IsError()) { | 247 } else if (status.IsError()) { |
243 // If the command failed while a new page or frame started loading, retry | 248 // If the command failed while a new page or frame started loading, retry |
244 // the command after the pending navigation has completed. | 249 // the command after the pending navigation has completed. |
245 bool is_pending = false; | 250 bool is_pending = false; |
246 nav_status = web_view->IsPendingNavigation(session->GetCurrentFrameId(), | 251 nav_status = web_view->IsPendingNavigation(session->GetCurrentFrameId(), |
247 &is_pending); | 252 &timeout, &is_pending); |
248 if (nav_status.IsError()) | 253 if (nav_status.IsError()) |
249 return nav_status; | 254 return nav_status; |
250 else if (is_pending) | 255 else if (is_pending) |
251 continue; | 256 continue; |
252 } | 257 } |
253 break; | 258 break; |
254 } | 259 } |
255 | 260 |
256 nav_status = web_view->WaitForPendingNavigations( | 261 nav_status = web_view->WaitForPendingNavigations( |
257 session->GetCurrentFrameId(), session->page_load_timeout, true); | 262 session->GetCurrentFrameId(), |
| 263 Timeout(session->page_load_timeout, &timeout), true); |
258 | 264 |
259 if (status.IsOk() && nav_status.IsError() && | 265 if (status.IsOk() && nav_status.IsError() && |
260 nav_status.code() != kUnexpectedAlertOpen) | 266 nav_status.code() != kUnexpectedAlertOpen) |
261 return nav_status; | 267 return nav_status; |
262 if (status.code() == kUnexpectedAlertOpen) | 268 if (status.code() == kUnexpectedAlertOpen) |
263 return Status(kOk); | 269 return Status(kOk); |
264 return status; | 270 return status; |
265 } | 271 } |
266 | 272 |
267 Status ExecuteGet(Session* session, | 273 Status ExecuteGet(Session* session, |
268 WebView* web_view, | 274 WebView* web_view, |
269 const base::DictionaryValue& params, | 275 const base::DictionaryValue& params, |
270 std::unique_ptr<base::Value>* value) { | 276 std::unique_ptr<base::Value>* value, |
| 277 Timeout* timeout) { |
| 278 timeout->SetDuration(session->page_load_timeout); |
271 std::string url; | 279 std::string url; |
272 if (!params.GetString("url", &url)) | 280 if (!params.GetString("url", &url)) |
273 return Status(kUnknownError, "'url' must be a string"); | 281 return Status(kUnknownError, "'url' must be a string"); |
274 Status status = web_view->Load(url); | 282 Status status = web_view->Load(url, timeout); |
275 if (status.IsError()) | 283 if (status.IsError()) |
276 return status; | 284 return status; |
277 session->SwitchToTopFrame(); | 285 session->SwitchToTopFrame(); |
278 return Status(kOk); | 286 return Status(kOk); |
279 } | 287 } |
280 | 288 |
281 Status ExecuteExecuteScript(Session* session, | 289 Status ExecuteExecuteScript(Session* session, |
282 WebView* web_view, | 290 WebView* web_view, |
283 const base::DictionaryValue& params, | 291 const base::DictionaryValue& params, |
284 std::unique_ptr<base::Value>* value) { | 292 std::unique_ptr<base::Value>* value, |
| 293 Timeout* timeout) { |
285 std::string script; | 294 std::string script; |
286 if (!params.GetString("script", &script)) | 295 if (!params.GetString("script", &script)) |
287 return Status(kUnknownError, "'script' must be a string"); | 296 return Status(kUnknownError, "'script' must be a string"); |
288 if (script == ":takeHeapSnapshot") { | 297 if (script == ":takeHeapSnapshot") { |
289 return web_view->TakeHeapSnapshot(value); | 298 return web_view->TakeHeapSnapshot(value); |
290 } else if (script == ":startProfile") { | 299 } else if (script == ":startProfile") { |
291 return web_view->StartProfile(); | 300 return web_view->StartProfile(); |
292 } else if (script == ":endProfile") { | 301 } else if (script == ":endProfile") { |
293 return web_view->EndProfile(value); | 302 return web_view->EndProfile(value); |
294 } else { | 303 } else { |
295 const base::ListValue* args; | 304 const base::ListValue* args; |
296 if (!params.GetList("args", &args)) | 305 if (!params.GetList("args", &args)) |
297 return Status(kUnknownError, "'args' must be a list"); | 306 return Status(kUnknownError, "'args' must be a list"); |
298 | 307 |
299 return web_view->CallFunction(session->GetCurrentFrameId(), | 308 return web_view->CallFunction(session->GetCurrentFrameId(), |
300 "function(){" + script + "}", *args, value); | 309 "function(){" + script + "}", *args, value); |
301 } | 310 } |
302 } | 311 } |
303 | 312 |
304 Status ExecuteExecuteAsyncScript(Session* session, | 313 Status ExecuteExecuteAsyncScript(Session* session, |
305 WebView* web_view, | 314 WebView* web_view, |
306 const base::DictionaryValue& params, | 315 const base::DictionaryValue& params, |
307 std::unique_ptr<base::Value>* value) { | 316 std::unique_ptr<base::Value>* value, |
| 317 Timeout* timeout) { |
308 std::string script; | 318 std::string script; |
309 if (!params.GetString("script", &script)) | 319 if (!params.GetString("script", &script)) |
310 return Status(kUnknownError, "'script' must be a string"); | 320 return Status(kUnknownError, "'script' must be a string"); |
311 const base::ListValue* args; | 321 const base::ListValue* args; |
312 if (!params.GetList("args", &args)) | 322 if (!params.GetList("args", &args)) |
313 return Status(kUnknownError, "'args' must be a list"); | 323 return Status(kUnknownError, "'args' must be a list"); |
314 | 324 |
315 return web_view->CallUserAsyncFunction( | 325 return web_view->CallUserAsyncFunction( |
316 session->GetCurrentFrameId(), "function(){" + script + "}", *args, | 326 session->GetCurrentFrameId(), "function(){" + script + "}", *args, |
317 session->script_timeout, value); | 327 session->script_timeout, value); |
318 } | 328 } |
319 | 329 |
320 Status ExecuteSwitchToFrame(Session* session, | 330 Status ExecuteSwitchToFrame(Session* session, |
321 WebView* web_view, | 331 WebView* web_view, |
322 const base::DictionaryValue& params, | 332 const base::DictionaryValue& params, |
323 std::unique_ptr<base::Value>* value) { | 333 std::unique_ptr<base::Value>* value, |
| 334 Timeout* timeout) { |
324 const base::Value* id; | 335 const base::Value* id; |
325 if (!params.Get("id", &id)) | 336 if (!params.Get("id", &id)) |
326 return Status(kUnknownError, "missing 'id'"); | 337 return Status(kUnknownError, "missing 'id'"); |
327 | 338 |
328 if (id->IsType(base::Value::TYPE_NULL)) { | 339 if (id->IsType(base::Value::TYPE_NULL)) { |
329 session->SwitchToTopFrame(); | 340 session->SwitchToTopFrame(); |
330 return Status(kOk); | 341 return Status(kOk); |
331 } | 342 } |
332 | 343 |
333 std::string script; | 344 std::string script; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
383 session->GetCurrentFrameId(), kSetFrameIdentifier, new_args, &result); | 394 session->GetCurrentFrameId(), kSetFrameIdentifier, new_args, &result); |
384 if (status.IsError()) | 395 if (status.IsError()) |
385 return status; | 396 return status; |
386 session->SwitchToSubFrame(frame, chrome_driver_id); | 397 session->SwitchToSubFrame(frame, chrome_driver_id); |
387 return Status(kOk); | 398 return Status(kOk); |
388 } | 399 } |
389 | 400 |
390 Status ExecuteSwitchToParentFrame(Session* session, | 401 Status ExecuteSwitchToParentFrame(Session* session, |
391 WebView* web_view, | 402 WebView* web_view, |
392 const base::DictionaryValue& params, | 403 const base::DictionaryValue& params, |
393 std::unique_ptr<base::Value>* value) { | 404 std::unique_ptr<base::Value>* value, |
| 405 Timeout* timeout) { |
394 session->SwitchToParentFrame(); | 406 session->SwitchToParentFrame(); |
395 return Status(kOk); | 407 return Status(kOk); |
396 } | 408 } |
397 | 409 |
398 Status ExecuteGetTitle(Session* session, | 410 Status ExecuteGetTitle(Session* session, |
399 WebView* web_view, | 411 WebView* web_view, |
400 const base::DictionaryValue& params, | 412 const base::DictionaryValue& params, |
401 std::unique_ptr<base::Value>* value) { | 413 std::unique_ptr<base::Value>* value, |
| 414 Timeout* timeout) { |
402 const char kGetTitleScript[] = "function() { return document.title;}"; | 415 const char kGetTitleScript[] = "function() { return document.title;}"; |
403 base::ListValue args; | 416 base::ListValue args; |
404 return web_view->CallFunction(std::string(), kGetTitleScript, args, value); | 417 return web_view->CallFunction(std::string(), kGetTitleScript, args, value); |
405 } | 418 } |
406 | 419 |
407 Status ExecuteGetPageSource(Session* session, | 420 Status ExecuteGetPageSource(Session* session, |
408 WebView* web_view, | 421 WebView* web_view, |
409 const base::DictionaryValue& params, | 422 const base::DictionaryValue& params, |
410 std::unique_ptr<base::Value>* value) { | 423 std::unique_ptr<base::Value>* value, |
| 424 Timeout* timeout) { |
411 const char kGetPageSource[] = | 425 const char kGetPageSource[] = |
412 "function() {" | 426 "function() {" |
413 " return new XMLSerializer().serializeToString(document);" | 427 " return new XMLSerializer().serializeToString(document);" |
414 "}"; | 428 "}"; |
415 base::ListValue args; | 429 base::ListValue args; |
416 return web_view->CallFunction( | 430 return web_view->CallFunction( |
417 session->GetCurrentFrameId(), kGetPageSource, args, value); | 431 session->GetCurrentFrameId(), kGetPageSource, args, value); |
418 } | 432 } |
419 | 433 |
420 Status ExecuteFindElement(int interval_ms, | 434 Status ExecuteFindElement(int interval_ms, |
421 Session* session, | 435 Session* session, |
422 WebView* web_view, | 436 WebView* web_view, |
423 const base::DictionaryValue& params, | 437 const base::DictionaryValue& params, |
424 std::unique_ptr<base::Value>* value) { | 438 std::unique_ptr<base::Value>* value, |
| 439 Timeout* timeout) { |
425 return FindElement(interval_ms, true, NULL, session, web_view, params, value); | 440 return FindElement(interval_ms, true, NULL, session, web_view, params, value); |
426 } | 441 } |
427 | 442 |
428 Status ExecuteFindElements(int interval_ms, | 443 Status ExecuteFindElements(int interval_ms, |
429 Session* session, | 444 Session* session, |
430 WebView* web_view, | 445 WebView* web_view, |
431 const base::DictionaryValue& params, | 446 const base::DictionaryValue& params, |
432 std::unique_ptr<base::Value>* value) { | 447 std::unique_ptr<base::Value>* value, |
| 448 Timeout* timeout) { |
433 return FindElement( | 449 return FindElement( |
434 interval_ms, false, NULL, session, web_view, params, value); | 450 interval_ms, false, NULL, session, web_view, params, value); |
435 } | 451 } |
436 | 452 |
437 Status ExecuteGetCurrentUrl(Session* session, | 453 Status ExecuteGetCurrentUrl(Session* session, |
438 WebView* web_view, | 454 WebView* web_view, |
439 const base::DictionaryValue& params, | 455 const base::DictionaryValue& params, |
440 std::unique_ptr<base::Value>* value) { | 456 std::unique_ptr<base::Value>* value, |
| 457 Timeout* timeout) { |
441 std::string url; | 458 std::string url; |
442 Status status = GetUrl(web_view, std::string(), &url); | 459 Status status = GetUrl(web_view, std::string(), &url); |
443 if (status.IsError()) | 460 if (status.IsError()) |
444 return status; | 461 return status; |
445 if (url == kUnreachableWebDataURL) { | 462 if (url == kUnreachableWebDataURL) { |
446 // https://bugs.chromium.org/p/chromedriver/issues/detail?id=1272 | 463 // https://bugs.chromium.org/p/chromedriver/issues/detail?id=1272 |
447 const BrowserInfo* browser_info = session->chrome->GetBrowserInfo(); | 464 const BrowserInfo* browser_info = session->chrome->GetBrowserInfo(); |
448 bool is_kitkat_webview = browser_info->browser_name == "webview" && | 465 bool is_kitkat_webview = browser_info->browser_name == "webview" && |
449 browser_info->major_version <= 30 && | 466 browser_info->major_version <= 30 && |
450 browser_info->is_android; | 467 browser_info->is_android; |
451 if (!is_kitkat_webview) { | 468 if (!is_kitkat_webview) { |
452 // Page.getNavigationHistory isn't implemented in WebView for KitKat and | 469 // Page.getNavigationHistory isn't implemented in WebView for KitKat and |
453 // older Android releases. | 470 // older Android releases. |
454 status = web_view->GetUrl(&url); | 471 status = web_view->GetUrl(&url); |
455 if (status.IsError()) | 472 if (status.IsError()) |
456 return status; | 473 return status; |
457 } | 474 } |
458 } | 475 } |
459 value->reset(new base::StringValue(url)); | 476 value->reset(new base::StringValue(url)); |
460 return Status(kOk); | 477 return Status(kOk); |
461 } | 478 } |
462 | 479 |
463 Status ExecuteGoBack(Session* session, | 480 Status ExecuteGoBack(Session* session, |
464 WebView* web_view, | 481 WebView* web_view, |
465 const base::DictionaryValue& params, | 482 const base::DictionaryValue& params, |
466 std::unique_ptr<base::Value>* value) { | 483 std::unique_ptr<base::Value>* value, |
| 484 Timeout* timeout) { |
467 Status status = web_view->TraverseHistory(-1); | 485 Status status = web_view->TraverseHistory(-1); |
468 if (status.IsError()) | 486 if (status.IsError()) |
469 return status; | 487 return status; |
470 session->SwitchToTopFrame(); | 488 session->SwitchToTopFrame(); |
471 return Status(kOk); | 489 return Status(kOk); |
472 } | 490 } |
473 | 491 |
474 Status ExecuteGoForward(Session* session, | 492 Status ExecuteGoForward(Session* session, |
475 WebView* web_view, | 493 WebView* web_view, |
476 const base::DictionaryValue& params, | 494 const base::DictionaryValue& params, |
477 std::unique_ptr<base::Value>* value) { | 495 std::unique_ptr<base::Value>* value, |
| 496 Timeout* timeout) { |
478 Status status = web_view->TraverseHistory(1); | 497 Status status = web_view->TraverseHistory(1); |
479 if (status.IsError()) | 498 if (status.IsError()) |
480 return status; | 499 return status; |
481 session->SwitchToTopFrame(); | 500 session->SwitchToTopFrame(); |
482 return Status(kOk); | 501 return Status(kOk); |
483 } | 502 } |
484 | 503 |
485 Status ExecuteRefresh(Session* session, | 504 Status ExecuteRefresh(Session* session, |
486 WebView* web_view, | 505 WebView* web_view, |
487 const base::DictionaryValue& params, | 506 const base::DictionaryValue& params, |
488 std::unique_ptr<base::Value>* value) { | 507 std::unique_ptr<base::Value>* value, |
| 508 Timeout* timeout) { |
489 Status status = web_view->Reload(); | 509 Status status = web_view->Reload(); |
490 if (status.IsError()) | 510 if (status.IsError()) |
491 return status; | 511 return status; |
492 session->SwitchToTopFrame(); | 512 session->SwitchToTopFrame(); |
493 return Status(kOk); | 513 return Status(kOk); |
494 } | 514 } |
495 | 515 |
496 Status ExecuteMouseMoveTo(Session* session, | 516 Status ExecuteMouseMoveTo(Session* session, |
497 WebView* web_view, | 517 WebView* web_view, |
498 const base::DictionaryValue& params, | 518 const base::DictionaryValue& params, |
499 std::unique_ptr<base::Value>* value) { | 519 std::unique_ptr<base::Value>* value, |
| 520 Timeout* timeout) { |
500 std::string element_id; | 521 std::string element_id; |
501 bool has_element = params.GetString("element", &element_id); | 522 bool has_element = params.GetString("element", &element_id); |
502 int x_offset = 0; | 523 int x_offset = 0; |
503 int y_offset = 0; | 524 int y_offset = 0; |
504 bool has_offset = params.GetInteger("xoffset", &x_offset) && | 525 bool has_offset = params.GetInteger("xoffset", &x_offset) && |
505 params.GetInteger("yoffset", &y_offset); | 526 params.GetInteger("yoffset", &y_offset); |
506 if (!has_element && !has_offset) | 527 if (!has_element && !has_offset) |
507 return Status(kUnknownError, "at least an element or offset should be set"); | 528 return Status(kUnknownError, "at least an element or offset should be set"); |
508 | 529 |
509 WebPoint location; | 530 WebPoint location; |
(...skipping 16 matching lines...) Expand all Loading... |
526 Status status = | 547 Status status = |
527 web_view->DispatchMouseEvents(events, session->GetCurrentFrameId()); | 548 web_view->DispatchMouseEvents(events, session->GetCurrentFrameId()); |
528 if (status.IsOk()) | 549 if (status.IsOk()) |
529 session->mouse_position = location; | 550 session->mouse_position = location; |
530 return status; | 551 return status; |
531 } | 552 } |
532 | 553 |
533 Status ExecuteMouseClick(Session* session, | 554 Status ExecuteMouseClick(Session* session, |
534 WebView* web_view, | 555 WebView* web_view, |
535 const base::DictionaryValue& params, | 556 const base::DictionaryValue& params, |
536 std::unique_ptr<base::Value>* value) { | 557 std::unique_ptr<base::Value>* value, |
| 558 Timeout* timeout) { |
537 MouseButton button; | 559 MouseButton button; |
538 Status status = GetMouseButton(params, &button); | 560 Status status = GetMouseButton(params, &button); |
539 if (status.IsError()) | 561 if (status.IsError()) |
540 return status; | 562 return status; |
541 std::list<MouseEvent> events; | 563 std::list<MouseEvent> events; |
542 events.push_back( | 564 events.push_back( |
543 MouseEvent(kPressedMouseEventType, button, | 565 MouseEvent(kPressedMouseEventType, button, |
544 session->mouse_position.x, session->mouse_position.y, | 566 session->mouse_position.x, session->mouse_position.y, |
545 session->sticky_modifiers, 1)); | 567 session->sticky_modifiers, 1)); |
546 events.push_back( | 568 events.push_back( |
547 MouseEvent(kReleasedMouseEventType, button, | 569 MouseEvent(kReleasedMouseEventType, button, |
548 session->mouse_position.x, session->mouse_position.y, | 570 session->mouse_position.x, session->mouse_position.y, |
549 session->sticky_modifiers, 1)); | 571 session->sticky_modifiers, 1)); |
550 return web_view->DispatchMouseEvents(events, session->GetCurrentFrameId()); | 572 return web_view->DispatchMouseEvents(events, session->GetCurrentFrameId()); |
551 } | 573 } |
552 | 574 |
553 Status ExecuteMouseButtonDown(Session* session, | 575 Status ExecuteMouseButtonDown(Session* session, |
554 WebView* web_view, | 576 WebView* web_view, |
555 const base::DictionaryValue& params, | 577 const base::DictionaryValue& params, |
556 std::unique_ptr<base::Value>* value) { | 578 std::unique_ptr<base::Value>* value, |
| 579 Timeout* timeout) { |
557 MouseButton button; | 580 MouseButton button; |
558 Status status = GetMouseButton(params, &button); | 581 Status status = GetMouseButton(params, &button); |
559 if (status.IsError()) | 582 if (status.IsError()) |
560 return status; | 583 return status; |
561 std::list<MouseEvent> events; | 584 std::list<MouseEvent> events; |
562 events.push_back( | 585 events.push_back( |
563 MouseEvent(kPressedMouseEventType, button, | 586 MouseEvent(kPressedMouseEventType, button, |
564 session->mouse_position.x, session->mouse_position.y, | 587 session->mouse_position.x, session->mouse_position.y, |
565 session->sticky_modifiers, 1)); | 588 session->sticky_modifiers, 1)); |
566 return web_view->DispatchMouseEvents(events, session->GetCurrentFrameId()); | 589 return web_view->DispatchMouseEvents(events, session->GetCurrentFrameId()); |
567 } | 590 } |
568 | 591 |
569 Status ExecuteMouseButtonUp(Session* session, | 592 Status ExecuteMouseButtonUp(Session* session, |
570 WebView* web_view, | 593 WebView* web_view, |
571 const base::DictionaryValue& params, | 594 const base::DictionaryValue& params, |
572 std::unique_ptr<base::Value>* value) { | 595 std::unique_ptr<base::Value>* value, |
| 596 Timeout* timeout) { |
573 MouseButton button; | 597 MouseButton button; |
574 Status status = GetMouseButton(params, &button); | 598 Status status = GetMouseButton(params, &button); |
575 if (status.IsError()) | 599 if (status.IsError()) |
576 return status; | 600 return status; |
577 std::list<MouseEvent> events; | 601 std::list<MouseEvent> events; |
578 events.push_back( | 602 events.push_back( |
579 MouseEvent(kReleasedMouseEventType, button, | 603 MouseEvent(kReleasedMouseEventType, button, |
580 session->mouse_position.x, session->mouse_position.y, | 604 session->mouse_position.x, session->mouse_position.y, |
581 session->sticky_modifiers, 1)); | 605 session->sticky_modifiers, 1)); |
582 return web_view->DispatchMouseEvents(events, session->GetCurrentFrameId()); | 606 return web_view->DispatchMouseEvents(events, session->GetCurrentFrameId()); |
583 } | 607 } |
584 | 608 |
585 Status ExecuteMouseDoubleClick(Session* session, | 609 Status ExecuteMouseDoubleClick(Session* session, |
586 WebView* web_view, | 610 WebView* web_view, |
587 const base::DictionaryValue& params, | 611 const base::DictionaryValue& params, |
588 std::unique_ptr<base::Value>* value) { | 612 std::unique_ptr<base::Value>* value, |
| 613 Timeout* timeout) { |
589 MouseButton button; | 614 MouseButton button; |
590 Status status = GetMouseButton(params, &button); | 615 Status status = GetMouseButton(params, &button); |
591 if (status.IsError()) | 616 if (status.IsError()) |
592 return status; | 617 return status; |
593 std::list<MouseEvent> events; | 618 std::list<MouseEvent> events; |
594 events.push_back( | 619 events.push_back( |
595 MouseEvent(kPressedMouseEventType, button, | 620 MouseEvent(kPressedMouseEventType, button, |
596 session->mouse_position.x, session->mouse_position.y, | 621 session->mouse_position.x, session->mouse_position.y, |
597 session->sticky_modifiers, 2)); | 622 session->sticky_modifiers, 2)); |
598 events.push_back( | 623 events.push_back( |
599 MouseEvent(kReleasedMouseEventType, button, | 624 MouseEvent(kReleasedMouseEventType, button, |
600 session->mouse_position.x, session->mouse_position.y, | 625 session->mouse_position.x, session->mouse_position.y, |
601 session->sticky_modifiers, 2)); | 626 session->sticky_modifiers, 2)); |
602 return web_view->DispatchMouseEvents(events, session->GetCurrentFrameId()); | 627 return web_view->DispatchMouseEvents(events, session->GetCurrentFrameId()); |
603 } | 628 } |
604 | 629 |
605 Status ExecuteTouchDown(Session* session, | 630 Status ExecuteTouchDown(Session* session, |
606 WebView* web_view, | 631 WebView* web_view, |
607 const base::DictionaryValue& params, | 632 const base::DictionaryValue& params, |
608 std::unique_ptr<base::Value>* value) { | 633 std::unique_ptr<base::Value>* value, |
| 634 Timeout* timeout) { |
609 return ExecuteTouchEvent(session, web_view, kTouchStart, params); | 635 return ExecuteTouchEvent(session, web_view, kTouchStart, params); |
610 } | 636 } |
611 | 637 |
612 Status ExecuteTouchUp(Session* session, | 638 Status ExecuteTouchUp(Session* session, |
613 WebView* web_view, | 639 WebView* web_view, |
614 const base::DictionaryValue& params, | 640 const base::DictionaryValue& params, |
615 std::unique_ptr<base::Value>* value) { | 641 std::unique_ptr<base::Value>* value, |
| 642 Timeout* timeout) { |
616 return ExecuteTouchEvent(session, web_view, kTouchEnd, params); | 643 return ExecuteTouchEvent(session, web_view, kTouchEnd, params); |
617 } | 644 } |
618 | 645 |
619 Status ExecuteTouchMove(Session* session, | 646 Status ExecuteTouchMove(Session* session, |
620 WebView* web_view, | 647 WebView* web_view, |
621 const base::DictionaryValue& params, | 648 const base::DictionaryValue& params, |
622 std::unique_ptr<base::Value>* value) { | 649 std::unique_ptr<base::Value>* value, |
| 650 Timeout* timeout) { |
623 return ExecuteTouchEvent(session, web_view, kTouchMove, params); | 651 return ExecuteTouchEvent(session, web_view, kTouchMove, params); |
624 } | 652 } |
625 | 653 |
626 Status ExecuteTouchScroll(Session* session, | 654 Status ExecuteTouchScroll(Session* session, |
627 WebView* web_view, | 655 WebView* web_view, |
628 const base::DictionaryValue& params, | 656 const base::DictionaryValue& params, |
629 std::unique_ptr<base::Value>* value) { | 657 std::unique_ptr<base::Value>* value, |
| 658 Timeout* timeout) { |
630 if (session->chrome->GetBrowserInfo()->build_no < 2286) { | 659 if (session->chrome->GetBrowserInfo()->build_no < 2286) { |
631 // TODO(samuong): remove this once we stop supporting M41. | 660 // TODO(samuong): remove this once we stop supporting M41. |
632 return Status(kUnknownCommand, "Touch scroll action requires Chrome 42+"); | 661 return Status(kUnknownCommand, "Touch scroll action requires Chrome 42+"); |
633 } | 662 } |
634 WebPoint location = session->mouse_position; | 663 WebPoint location = session->mouse_position; |
635 std::string element; | 664 std::string element; |
636 if (params.GetString("element", &element)) { | 665 if (params.GetString("element", &element)) { |
637 Status status = GetElementClickableLocation( | 666 Status status = GetElementClickableLocation( |
638 session, web_view, element, &location); | 667 session, web_view, element, &location); |
639 if (status.IsError()) | 668 if (status.IsError()) |
640 return status; | 669 return status; |
641 } | 670 } |
642 int xoffset; | 671 int xoffset; |
643 if (!params.GetInteger("xoffset", &xoffset)) | 672 if (!params.GetInteger("xoffset", &xoffset)) |
644 return Status(kUnknownError, "'xoffset' must be an integer"); | 673 return Status(kUnknownError, "'xoffset' must be an integer"); |
645 int yoffset; | 674 int yoffset; |
646 if (!params.GetInteger("yoffset", &yoffset)) | 675 if (!params.GetInteger("yoffset", &yoffset)) |
647 return Status(kUnknownError, "'yoffset' must be an integer"); | 676 return Status(kUnknownError, "'yoffset' must be an integer"); |
648 return web_view->SynthesizeScrollGesture( | 677 return web_view->SynthesizeScrollGesture( |
649 location.x, location.y, xoffset, yoffset); | 678 location.x, location.y, xoffset, yoffset); |
650 } | 679 } |
651 | 680 |
652 Status ExecuteTouchPinch(Session* session, | 681 Status ExecuteTouchPinch(Session* session, |
653 WebView* web_view, | 682 WebView* web_view, |
654 const base::DictionaryValue& params, | 683 const base::DictionaryValue& params, |
655 std::unique_ptr<base::Value>* value) { | 684 std::unique_ptr<base::Value>* value, |
| 685 Timeout* timeout) { |
656 if (session->chrome->GetBrowserInfo()->build_no < 2286) { | 686 if (session->chrome->GetBrowserInfo()->build_no < 2286) { |
657 // TODO(samuong): remove this once we stop supporting M41. | 687 // TODO(samuong): remove this once we stop supporting M41. |
658 return Status(kUnknownCommand, "Pinch action requires Chrome 42+"); | 688 return Status(kUnknownCommand, "Pinch action requires Chrome 42+"); |
659 } | 689 } |
660 WebPoint location; | 690 WebPoint location; |
661 if (!params.GetInteger("x", &location.x)) | 691 if (!params.GetInteger("x", &location.x)) |
662 return Status(kUnknownError, "'x' must be an integer"); | 692 return Status(kUnknownError, "'x' must be an integer"); |
663 if (!params.GetInteger("y", &location.y)) | 693 if (!params.GetInteger("y", &location.y)) |
664 return Status(kUnknownError, "'y' must be an integer"); | 694 return Status(kUnknownError, "'y' must be an integer"); |
665 double scale_factor; | 695 double scale_factor; |
666 if (!params.GetDouble("scale", &scale_factor)) | 696 if (!params.GetDouble("scale", &scale_factor)) |
667 return Status(kUnknownError, "'scale' must be an integer"); | 697 return Status(kUnknownError, "'scale' must be an integer"); |
668 return web_view->SynthesizePinchGesture(location.x, location.y, scale_factor); | 698 return web_view->SynthesizePinchGesture(location.x, location.y, scale_factor); |
669 } | 699 } |
670 | 700 |
671 Status ExecuteGetActiveElement(Session* session, | 701 Status ExecuteGetActiveElement(Session* session, |
672 WebView* web_view, | 702 WebView* web_view, |
673 const base::DictionaryValue& params, | 703 const base::DictionaryValue& params, |
674 std::unique_ptr<base::Value>* value) { | 704 std::unique_ptr<base::Value>* value, |
| 705 Timeout* timeout) { |
675 return GetActiveElement(session, web_view, value); | 706 return GetActiveElement(session, web_view, value); |
676 } | 707 } |
677 | 708 |
678 Status ExecuteSendKeysToActiveElement(Session* session, | 709 Status ExecuteSendKeysToActiveElement(Session* session, |
679 WebView* web_view, | 710 WebView* web_view, |
680 const base::DictionaryValue& params, | 711 const base::DictionaryValue& params, |
681 std::unique_ptr<base::Value>* value) { | 712 std::unique_ptr<base::Value>* value, |
| 713 Timeout* timeout) { |
682 const base::ListValue* key_list; | 714 const base::ListValue* key_list; |
683 if (!params.GetList("value", &key_list)) | 715 if (!params.GetList("value", &key_list)) |
684 return Status(kUnknownError, "'value' must be a list"); | 716 return Status(kUnknownError, "'value' must be a list"); |
685 return SendKeysOnWindow( | 717 return SendKeysOnWindow( |
686 web_view, key_list, false, &session->sticky_modifiers); | 718 web_view, key_list, false, &session->sticky_modifiers); |
687 } | 719 } |
688 | 720 |
689 Status ExecuteGetAppCacheStatus(Session* session, | 721 Status ExecuteGetAppCacheStatus(Session* session, |
690 WebView* web_view, | 722 WebView* web_view, |
691 const base::DictionaryValue& params, | 723 const base::DictionaryValue& params, |
692 std::unique_ptr<base::Value>* value) { | 724 std::unique_ptr<base::Value>* value, |
| 725 Timeout* timeout) { |
693 return web_view->EvaluateScript( | 726 return web_view->EvaluateScript( |
694 session->GetCurrentFrameId(), | 727 session->GetCurrentFrameId(), |
695 "applicationCache.status", | 728 "applicationCache.status", |
696 value); | 729 value); |
697 } | 730 } |
698 | 731 |
699 Status ExecuteIsBrowserOnline(Session* session, | 732 Status ExecuteIsBrowserOnline(Session* session, |
700 WebView* web_view, | 733 WebView* web_view, |
701 const base::DictionaryValue& params, | 734 const base::DictionaryValue& params, |
702 std::unique_ptr<base::Value>* value) { | 735 std::unique_ptr<base::Value>* value, |
| 736 Timeout* timeout) { |
703 return web_view->EvaluateScript( | 737 return web_view->EvaluateScript( |
704 session->GetCurrentFrameId(), | 738 session->GetCurrentFrameId(), |
705 "navigator.onLine", | 739 "navigator.onLine", |
706 value); | 740 value); |
707 } | 741 } |
708 | 742 |
709 Status ExecuteGetStorageItem(const char* storage, | 743 Status ExecuteGetStorageItem(const char* storage, |
710 Session* session, | 744 Session* session, |
711 WebView* web_view, | 745 WebView* web_view, |
712 const base::DictionaryValue& params, | 746 const base::DictionaryValue& params, |
713 std::unique_ptr<base::Value>* value) { | 747 std::unique_ptr<base::Value>* value, |
| 748 Timeout* timeout) { |
714 std::string key; | 749 std::string key; |
715 if (!params.GetString("key", &key)) | 750 if (!params.GetString("key", &key)) |
716 return Status(kUnknownError, "'key' must be a string"); | 751 return Status(kUnknownError, "'key' must be a string"); |
717 base::ListValue args; | 752 base::ListValue args; |
718 args.Append(new base::StringValue(key)); | 753 args.Append(new base::StringValue(key)); |
719 return web_view->CallFunction( | 754 return web_view->CallFunction( |
720 session->GetCurrentFrameId(), | 755 session->GetCurrentFrameId(), |
721 base::StringPrintf("function(key) { return %s[key]; }", storage), | 756 base::StringPrintf("function(key) { return %s[key]; }", storage), |
722 args, | 757 args, |
723 value); | 758 value); |
724 } | 759 } |
725 | 760 |
726 Status ExecuteGetStorageKeys(const char* storage, | 761 Status ExecuteGetStorageKeys(const char* storage, |
727 Session* session, | 762 Session* session, |
728 WebView* web_view, | 763 WebView* web_view, |
729 const base::DictionaryValue& params, | 764 const base::DictionaryValue& params, |
730 std::unique_ptr<base::Value>* value) { | 765 std::unique_ptr<base::Value>* value, |
| 766 Timeout* timeout) { |
731 const char script[] = | 767 const char script[] = |
732 "var keys = [];" | 768 "var keys = [];" |
733 "for (var key in %s) {" | 769 "for (var key in %s) {" |
734 " keys.push(key);" | 770 " keys.push(key);" |
735 "}" | 771 "}" |
736 "keys"; | 772 "keys"; |
737 return web_view->EvaluateScript( | 773 return web_view->EvaluateScript( |
738 session->GetCurrentFrameId(), | 774 session->GetCurrentFrameId(), |
739 base::StringPrintf(script, storage), | 775 base::StringPrintf(script, storage), |
740 value); | 776 value); |
741 } | 777 } |
742 | 778 |
743 Status ExecuteSetStorageItem(const char* storage, | 779 Status ExecuteSetStorageItem(const char* storage, |
744 Session* session, | 780 Session* session, |
745 WebView* web_view, | 781 WebView* web_view, |
746 const base::DictionaryValue& params, | 782 const base::DictionaryValue& params, |
747 std::unique_ptr<base::Value>* value) { | 783 std::unique_ptr<base::Value>* value, |
| 784 Timeout* timeout) { |
748 std::string key; | 785 std::string key; |
749 if (!params.GetString("key", &key)) | 786 if (!params.GetString("key", &key)) |
750 return Status(kUnknownError, "'key' must be a string"); | 787 return Status(kUnknownError, "'key' must be a string"); |
751 std::string storage_value; | 788 std::string storage_value; |
752 if (!params.GetString("value", &storage_value)) | 789 if (!params.GetString("value", &storage_value)) |
753 return Status(kUnknownError, "'value' must be a string"); | 790 return Status(kUnknownError, "'value' must be a string"); |
754 base::ListValue args; | 791 base::ListValue args; |
755 args.Append(new base::StringValue(key)); | 792 args.Append(new base::StringValue(key)); |
756 args.Append(new base::StringValue(storage_value)); | 793 args.Append(new base::StringValue(storage_value)); |
757 return web_view->CallFunction( | 794 return web_view->CallFunction( |
758 session->GetCurrentFrameId(), | 795 session->GetCurrentFrameId(), |
759 base::StringPrintf("function(key, value) { %s[key] = value; }", storage), | 796 base::StringPrintf("function(key, value) { %s[key] = value; }", storage), |
760 args, | 797 args, |
761 value); | 798 value); |
762 } | 799 } |
763 | 800 |
764 Status ExecuteRemoveStorageItem(const char* storage, | 801 Status ExecuteRemoveStorageItem(const char* storage, |
765 Session* session, | 802 Session* session, |
766 WebView* web_view, | 803 WebView* web_view, |
767 const base::DictionaryValue& params, | 804 const base::DictionaryValue& params, |
768 std::unique_ptr<base::Value>* value) { | 805 std::unique_ptr<base::Value>* value, |
| 806 Timeout* timeout) { |
769 std::string key; | 807 std::string key; |
770 if (!params.GetString("key", &key)) | 808 if (!params.GetString("key", &key)) |
771 return Status(kUnknownError, "'key' must be a string"); | 809 return Status(kUnknownError, "'key' must be a string"); |
772 base::ListValue args; | 810 base::ListValue args; |
773 args.Append(new base::StringValue(key)); | 811 args.Append(new base::StringValue(key)); |
774 return web_view->CallFunction( | 812 return web_view->CallFunction( |
775 session->GetCurrentFrameId(), | 813 session->GetCurrentFrameId(), |
776 base::StringPrintf("function(key) { %s.removeItem(key) }", storage), | 814 base::StringPrintf("function(key) { %s.removeItem(key) }", storage), |
777 args, | 815 args, |
778 value); | 816 value); |
779 } | 817 } |
780 | 818 |
781 Status ExecuteClearStorage(const char* storage, | 819 Status ExecuteClearStorage(const char* storage, |
782 Session* session, | 820 Session* session, |
783 WebView* web_view, | 821 WebView* web_view, |
784 const base::DictionaryValue& params, | 822 const base::DictionaryValue& params, |
785 std::unique_ptr<base::Value>* value) { | 823 std::unique_ptr<base::Value>* value, |
| 824 Timeout* timeout) { |
786 return web_view->EvaluateScript( | 825 return web_view->EvaluateScript( |
787 session->GetCurrentFrameId(), | 826 session->GetCurrentFrameId(), |
788 base::StringPrintf("%s.clear()", storage), | 827 base::StringPrintf("%s.clear()", storage), |
789 value); | 828 value); |
790 } | 829 } |
791 | 830 |
792 Status ExecuteGetStorageSize(const char* storage, | 831 Status ExecuteGetStorageSize(const char* storage, |
793 Session* session, | 832 Session* session, |
794 WebView* web_view, | 833 WebView* web_view, |
795 const base::DictionaryValue& params, | 834 const base::DictionaryValue& params, |
796 std::unique_ptr<base::Value>* value) { | 835 std::unique_ptr<base::Value>* value, |
| 836 Timeout* timeout) { |
797 return web_view->EvaluateScript( | 837 return web_view->EvaluateScript( |
798 session->GetCurrentFrameId(), | 838 session->GetCurrentFrameId(), |
799 base::StringPrintf("%s.length", storage), | 839 base::StringPrintf("%s.length", storage), |
800 value); | 840 value); |
801 } | 841 } |
802 | 842 |
803 Status ExecuteScreenshot(Session* session, | 843 Status ExecuteScreenshot(Session* session, |
804 WebView* web_view, | 844 WebView* web_view, |
805 const base::DictionaryValue& params, | 845 const base::DictionaryValue& params, |
806 std::unique_ptr<base::Value>* value) { | 846 std::unique_ptr<base::Value>* value, |
| 847 Timeout* timeout) { |
807 Status status = session->chrome->ActivateWebView(web_view->GetId()); | 848 Status status = session->chrome->ActivateWebView(web_view->GetId()); |
808 if (status.IsError()) | 849 if (status.IsError()) |
809 return status; | 850 return status; |
810 | 851 |
811 std::string screenshot; | 852 std::string screenshot; |
812 ChromeDesktopImpl* desktop = NULL; | 853 ChromeDesktopImpl* desktop = NULL; |
813 status = session->chrome->GetAsDesktop(&desktop); | 854 status = session->chrome->GetAsDesktop(&desktop); |
814 if (status.IsOk() && !session->force_devtools_screenshot) { | 855 if (status.IsOk() && !session->force_devtools_screenshot) { |
815 AutomationExtension* extension = NULL; | 856 AutomationExtension* extension = NULL; |
816 status = desktop->GetAutomationExtension(&extension); | 857 status = desktop->GetAutomationExtension(&extension); |
(...skipping 10 matching lines...) Expand all Loading... |
827 if (status.IsError()) | 868 if (status.IsError()) |
828 return status; | 869 return status; |
829 | 870 |
830 value->reset(new base::StringValue(screenshot)); | 871 value->reset(new base::StringValue(screenshot)); |
831 return Status(kOk); | 872 return Status(kOk); |
832 } | 873 } |
833 | 874 |
834 Status ExecuteGetCookies(Session* session, | 875 Status ExecuteGetCookies(Session* session, |
835 WebView* web_view, | 876 WebView* web_view, |
836 const base::DictionaryValue& params, | 877 const base::DictionaryValue& params, |
837 std::unique_ptr<base::Value>* value) { | 878 std::unique_ptr<base::Value>* value, |
| 879 Timeout* timeout) { |
838 std::list<Cookie> cookies; | 880 std::list<Cookie> cookies; |
839 Status status = GetVisibleCookies(web_view, &cookies); | 881 Status status = GetVisibleCookies(web_view, &cookies); |
840 if (status.IsError()) | 882 if (status.IsError()) |
841 return status; | 883 return status; |
842 std::unique_ptr<base::ListValue> cookie_list(new base::ListValue()); | 884 std::unique_ptr<base::ListValue> cookie_list(new base::ListValue()); |
843 for (std::list<Cookie>::const_iterator it = cookies.begin(); | 885 for (std::list<Cookie>::const_iterator it = cookies.begin(); |
844 it != cookies.end(); ++it) { | 886 it != cookies.end(); ++it) { |
845 cookie_list->Append(CreateDictionaryFrom(*it)); | 887 cookie_list->Append(CreateDictionaryFrom(*it)); |
846 } | 888 } |
847 value->reset(cookie_list.release()); | 889 value->reset(cookie_list.release()); |
848 return Status(kOk); | 890 return Status(kOk); |
849 } | 891 } |
850 | 892 |
851 Status ExecuteAddCookie(Session* session, | 893 Status ExecuteAddCookie(Session* session, |
852 WebView* web_view, | 894 WebView* web_view, |
853 const base::DictionaryValue& params, | 895 const base::DictionaryValue& params, |
854 std::unique_ptr<base::Value>* value) { | 896 std::unique_ptr<base::Value>* value, |
| 897 Timeout* timeout) { |
855 const base::DictionaryValue* cookie; | 898 const base::DictionaryValue* cookie; |
856 if (!params.GetDictionary("cookie", &cookie)) | 899 if (!params.GetDictionary("cookie", &cookie)) |
857 return Status(kUnknownError, "missing 'cookie'"); | 900 return Status(kUnknownError, "missing 'cookie'"); |
858 base::ListValue args; | 901 base::ListValue args; |
859 args.Append(cookie->DeepCopy()); | 902 args.Append(cookie->DeepCopy()); |
860 std::unique_ptr<base::Value> result; | 903 std::unique_ptr<base::Value> result; |
861 return web_view->CallFunction( | 904 return web_view->CallFunction( |
862 session->GetCurrentFrameId(), kAddCookieScript, args, &result); | 905 session->GetCurrentFrameId(), kAddCookieScript, args, &result); |
863 } | 906 } |
864 | 907 |
865 Status ExecuteDeleteCookie(Session* session, | 908 Status ExecuteDeleteCookie(Session* session, |
866 WebView* web_view, | 909 WebView* web_view, |
867 const base::DictionaryValue& params, | 910 const base::DictionaryValue& params, |
868 std::unique_ptr<base::Value>* value) { | 911 std::unique_ptr<base::Value>* value, |
| 912 Timeout* timeout) { |
869 std::string name; | 913 std::string name; |
870 if (!params.GetString("name", &name)) | 914 if (!params.GetString("name", &name)) |
871 return Status(kUnknownError, "missing 'name'"); | 915 return Status(kUnknownError, "missing 'name'"); |
872 base::DictionaryValue params_url; | 916 base::DictionaryValue params_url; |
873 std::unique_ptr<base::Value> value_url; | 917 std::unique_ptr<base::Value> value_url; |
874 std::string url; | 918 std::string url; |
875 Status status = GetUrl(web_view, session->GetCurrentFrameId(), &url); | 919 Status status = GetUrl(web_view, session->GetCurrentFrameId(), &url); |
876 if (status.IsError()) | 920 if (status.IsError()) |
877 return status; | 921 return status; |
878 return web_view->DeleteCookie(name, url); | 922 return web_view->DeleteCookie(name, url); |
879 } | 923 } |
880 | 924 |
881 Status ExecuteDeleteAllCookies(Session* session, | 925 Status ExecuteDeleteAllCookies(Session* session, |
882 WebView* web_view, | 926 WebView* web_view, |
883 const base::DictionaryValue& params, | 927 const base::DictionaryValue& params, |
884 std::unique_ptr<base::Value>* value) { | 928 std::unique_ptr<base::Value>* value, |
| 929 Timeout* timeout) { |
885 std::list<Cookie> cookies; | 930 std::list<Cookie> cookies; |
886 Status status = GetVisibleCookies(web_view, &cookies); | 931 Status status = GetVisibleCookies(web_view, &cookies); |
887 if (status.IsError()) | 932 if (status.IsError()) |
888 return status; | 933 return status; |
889 | 934 |
890 if (!cookies.empty()) { | 935 if (!cookies.empty()) { |
891 base::DictionaryValue params_url; | 936 base::DictionaryValue params_url; |
892 std::unique_ptr<base::Value> value_url; | 937 std::unique_ptr<base::Value> value_url; |
893 std::string url; | 938 std::string url; |
894 status = GetUrl(web_view, session->GetCurrentFrameId(), &url); | 939 status = GetUrl(web_view, session->GetCurrentFrameId(), &url); |
895 if (status.IsError()) | 940 if (status.IsError()) |
896 return status; | 941 return status; |
897 for (std::list<Cookie>::const_iterator it = cookies.begin(); | 942 for (std::list<Cookie>::const_iterator it = cookies.begin(); |
898 it != cookies.end(); ++it) { | 943 it != cookies.end(); ++it) { |
899 status = web_view->DeleteCookie(it->name, url); | 944 status = web_view->DeleteCookie(it->name, url); |
900 if (status.IsError()) | 945 if (status.IsError()) |
901 return status; | 946 return status; |
902 } | 947 } |
903 } | 948 } |
904 | 949 |
905 return Status(kOk); | 950 return Status(kOk); |
906 } | 951 } |
907 | 952 |
908 Status ExecuteSetLocation(Session* session, | 953 Status ExecuteSetLocation(Session* session, |
909 WebView* web_view, | 954 WebView* web_view, |
910 const base::DictionaryValue& params, | 955 const base::DictionaryValue& params, |
911 std::unique_ptr<base::Value>* value) { | 956 std::unique_ptr<base::Value>* value, |
| 957 Timeout* timeout) { |
912 const base::DictionaryValue* location = NULL; | 958 const base::DictionaryValue* location = NULL; |
913 Geoposition geoposition; | 959 Geoposition geoposition; |
914 if (!params.GetDictionary("location", &location) || | 960 if (!params.GetDictionary("location", &location) || |
915 !location->GetDouble("latitude", &geoposition.latitude) || | 961 !location->GetDouble("latitude", &geoposition.latitude) || |
916 !location->GetDouble("longitude", &geoposition.longitude)) | 962 !location->GetDouble("longitude", &geoposition.longitude)) |
917 return Status(kUnknownError, "missing or invalid 'location'"); | 963 return Status(kUnknownError, "missing or invalid 'location'"); |
918 if (location->HasKey("accuracy") && | 964 if (location->HasKey("accuracy") && |
919 !location->GetDouble("accuracy", &geoposition.accuracy)) { | 965 !location->GetDouble("accuracy", &geoposition.accuracy)) { |
920 return Status(kUnknownError, "invalid 'accuracy'"); | 966 return Status(kUnknownError, "invalid 'accuracy'"); |
921 } else { | 967 } else { |
922 // |accuracy| is not part of the WebDriver spec yet, so if it is not given | 968 // |accuracy| is not part of the WebDriver spec yet, so if it is not given |
923 // default to 100 meters accuracy. | 969 // default to 100 meters accuracy. |
924 geoposition.accuracy = 100; | 970 geoposition.accuracy = 100; |
925 } | 971 } |
926 | 972 |
927 Status status = web_view->OverrideGeolocation(geoposition); | 973 Status status = web_view->OverrideGeolocation(geoposition); |
928 if (status.IsOk()) | 974 if (status.IsOk()) |
929 session->overridden_geoposition.reset(new Geoposition(geoposition)); | 975 session->overridden_geoposition.reset(new Geoposition(geoposition)); |
930 return status; | 976 return status; |
931 } | 977 } |
932 | 978 |
933 Status ExecuteSetNetworkConditions(Session* session, | 979 Status ExecuteSetNetworkConditions(Session* session, |
934 WebView* web_view, | 980 WebView* web_view, |
935 const base::DictionaryValue& params, | 981 const base::DictionaryValue& params, |
936 std::unique_ptr<base::Value>* value) { | 982 std::unique_ptr<base::Value>* value, |
| 983 Timeout* timeout) { |
937 std::string network_name; | 984 std::string network_name; |
938 const base::DictionaryValue* conditions = NULL; | 985 const base::DictionaryValue* conditions = NULL; |
939 std::unique_ptr<NetworkConditions> network_conditions( | 986 std::unique_ptr<NetworkConditions> network_conditions( |
940 new NetworkConditions()); | 987 new NetworkConditions()); |
941 if (params.GetString("network_name", &network_name)) { | 988 if (params.GetString("network_name", &network_name)) { |
942 // Get conditions from preset list. | 989 // Get conditions from preset list. |
943 Status status = FindPresetNetwork(network_name, network_conditions.get()); | 990 Status status = FindPresetNetwork(network_name, network_conditions.get()); |
944 if (status.IsError()) | 991 if (status.IsError()) |
945 return status; | 992 return status; |
946 } else if (params.GetDictionary("network_conditions", &conditions)) { | 993 } else if (params.GetDictionary("network_conditions", &conditions)) { |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
986 | 1033 |
987 session->overridden_network_conditions.reset( | 1034 session->overridden_network_conditions.reset( |
988 network_conditions.release()); | 1035 network_conditions.release()); |
989 return web_view->OverrideNetworkConditions( | 1036 return web_view->OverrideNetworkConditions( |
990 *session->overridden_network_conditions); | 1037 *session->overridden_network_conditions); |
991 } | 1038 } |
992 | 1039 |
993 Status ExecuteDeleteNetworkConditions(Session* session, | 1040 Status ExecuteDeleteNetworkConditions(Session* session, |
994 WebView* web_view, | 1041 WebView* web_view, |
995 const base::DictionaryValue& params, | 1042 const base::DictionaryValue& params, |
996 std::unique_ptr<base::Value>* value) { | 1043 std::unique_ptr<base::Value>* value, |
| 1044 Timeout* timeout) { |
997 // Chrome does not have any command to stop overriding network conditions, so | 1045 // Chrome does not have any command to stop overriding network conditions, so |
998 // we just override the network conditions with the "No throttling" preset. | 1046 // we just override the network conditions with the "No throttling" preset. |
999 NetworkConditions network_conditions; | 1047 NetworkConditions network_conditions; |
1000 // Get conditions from preset list. | 1048 // Get conditions from preset list. |
1001 Status status = FindPresetNetwork("No throttling", &network_conditions); | 1049 Status status = FindPresetNetwork("No throttling", &network_conditions); |
1002 if (status.IsError()) | 1050 if (status.IsError()) |
1003 return status; | 1051 return status; |
1004 | 1052 |
1005 status = web_view->OverrideNetworkConditions(network_conditions); | 1053 status = web_view->OverrideNetworkConditions(network_conditions); |
1006 if (status.IsError()) | 1054 if (status.IsError()) |
1007 return status; | 1055 return status; |
1008 | 1056 |
1009 // After we've successfully overridden the network conditions with | 1057 // After we've successfully overridden the network conditions with |
1010 // "No throttling", we can delete them from |session|. | 1058 // "No throttling", we can delete them from |session|. |
1011 session->overridden_network_conditions.reset(); | 1059 session->overridden_network_conditions.reset(); |
1012 return status; | 1060 return status; |
1013 } | 1061 } |
1014 | 1062 |
1015 Status ExecuteTakeHeapSnapshot(Session* session, | 1063 Status ExecuteTakeHeapSnapshot(Session* session, |
1016 WebView* web_view, | 1064 WebView* web_view, |
1017 const base::DictionaryValue& params, | 1065 const base::DictionaryValue& params, |
1018 std::unique_ptr<base::Value>* value) { | 1066 std::unique_ptr<base::Value>* value, |
| 1067 Timeout* timeout) { |
1019 return web_view->TakeHeapSnapshot(value); | 1068 return web_view->TakeHeapSnapshot(value); |
1020 } | 1069 } |
OLD | NEW |