| 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 |