Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(620)

Side by Side Diff: chrome/test/chromedriver/window_commands.cc

Issue 1669453002: [chromedriver] Apply page load timeout to slow cross-process navigations (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: pure virtual Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/test/chromedriver/window_commands.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « chrome/test/chromedriver/window_commands.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698