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

Unified Diff: chrome/test/automation/automation_json_requests.cc

Issue 7104085: In chromedriver, add /log handler (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ... Created 9 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/test/automation/automation_json_requests.h ('k') | chrome/test/webdriver/automation.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/test/automation/automation_json_requests.cc
diff --git a/chrome/test/automation/automation_json_requests.cc b/chrome/test/automation/automation_json_requests.cc
index c05770b023341dc81068215efe1f080aa0522064..00a654f2786b35a9aa3ffe978e6ebce320e450b8 100644
--- a/chrome/test/automation/automation_json_requests.cc
+++ b/chrome/test/automation/automation_json_requests.cc
@@ -1,637 +1,632 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/test/automation/automation_json_requests.h"
-
-#include "base/basictypes.h"
-#include "base/file_path.h"
-#include "base/format_macros.h"
-#include "base/json/json_reader.h"
-#include "base/json/json_writer.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/stringprintf.h"
-#include "base/test/test_timeouts.h"
-#include "base/time.h"
-#include "base/values.h"
-#include "chrome/common/automation_messages.h"
-#include "chrome/test/automation/automation_proxy.h"
-#include "content/common/json_value_serializer.h"
-
-namespace {
-
-bool SendAutomationJSONRequest(AutomationMessageSender* sender,
- const DictionaryValue& request_dict,
- DictionaryValue* reply_dict,
- std::string* error_msg) {
- std::string request, reply;
- base::JSONWriter::Write(&request_dict, false, &request);
- bool success = false;
- int timeout_ms = TestTimeouts::action_max_timeout_ms();
- base::Time before_sending = base::Time::Now();
- if (!SendAutomationJSONRequest(
- sender, request, timeout_ms, &reply, &success)) {
- int64 elapsed_ms = (base::Time::Now() - before_sending).InMilliseconds();
- std::string command;
- request_dict.GetString("command", &command);
- if (elapsed_ms >= timeout_ms) {
- *error_msg = base::StringPrintf(
- "Chrome did not respond to '%s'. Request may have timed out. "
- "Elapsed time was %" PRId64 " ms. Request timeout was %d ms. "
- "Request details: (%s).",
- command.c_str(),
- elapsed_ms,
- timeout_ms,
- request.c_str());
- } else {
- *error_msg = base::StringPrintf(
- "Chrome did not respond to '%s'. Elapsed time was %" PRId64 " ms. "
- "Request details: (%s).",
- command.c_str(),
- elapsed_ms,
- request.c_str());
- }
- return false;
- }
- scoped_ptr<Value> value(base::JSONReader::Read(reply, true));
- if (!value.get() || !value->IsType(Value::TYPE_DICTIONARY)) {
- std::string command;
- request_dict.GetString("command", &command);
- LOG(ERROR) << "JSON request did not return dict: " << command << "\n";
- return false;
- }
- DictionaryValue* dict = static_cast<DictionaryValue*>(value.get());
- if (!success) {
- std::string command, error;
- request_dict.GetString("command", &command);
- dict->GetString("error", &error);
- *error_msg = base::StringPrintf(
- "Internal Chrome error during '%s': (%s). Request details: (%s).",
- command.c_str(),
- error.c_str(),
- request.c_str());
- LOG(ERROR) << "JSON request failed: " << command << "\n"
- << " with error: " << error;
- return false;
- }
- reply_dict->MergeDictionary(dict);
- return true;
-}
-
-} // namespace
-
-WebKeyEvent::WebKeyEvent(automation::KeyEventTypes type,
- ui::KeyboardCode key_code,
- const std::string& unmodified_text,
- const std::string& modified_text,
- int modifiers)
- : type(type),
- key_code(key_code),
- unmodified_text(unmodified_text),
- modified_text(modified_text),
- modifiers(modifiers) {}
-
-bool SendAutomationJSONRequest(AutomationMessageSender* sender,
- const std::string& request,
- int timeout_ms,
- std::string* reply,
- bool* success) {
- return sender->Send(new AutomationMsg_SendJSONRequest(
- -1, request, reply, success), timeout_ms);
-}
-
-bool SendGetIndicesFromTabIdJSONRequest(
- AutomationMessageSender* sender,
- int tab_id,
- int* browser_index,
- int* tab_index,
- std::string* error_msg) {
- DictionaryValue request_dict;
- request_dict.SetString("command", "GetIndicesFromTab");
- request_dict.SetInteger("tab_id", tab_id);
- DictionaryValue reply_dict;
- if (!SendAutomationJSONRequest(sender, request_dict, &reply_dict, error_msg))
- return false;
- if (!reply_dict.GetInteger("windex", browser_index))
- return false;
- if (!reply_dict.GetInteger("tab_index", tab_index))
- return false;
- return true;
-}
-
-bool SendGetIndicesFromTabHandleJSONRequest(
- AutomationMessageSender* sender,
- int tab_handle,
- int* browser_index,
- int* tab_index,
- std::string* error_msg) {
- DictionaryValue request_dict;
- request_dict.SetString("command", "GetIndicesFromTab");
- request_dict.SetInteger("tab_handle", tab_handle);
- DictionaryValue reply_dict;
- if (!SendAutomationJSONRequest(sender, request_dict, &reply_dict, error_msg))
- return false;
- if (!reply_dict.GetInteger("windex", browser_index))
- return false;
- if (!reply_dict.GetInteger("tab_index", tab_index))
- return false;
- return true;
-}
-
-bool SendNavigateToURLJSONRequest(
- AutomationMessageSender* sender,
- int browser_index,
- int tab_index,
- const GURL& url,
- int navigation_count,
- AutomationMsg_NavigationResponseValues* nav_response,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "NavigateToURL");
- dict.SetInteger("windex", browser_index);
- dict.SetInteger("tab_index", tab_index);
- dict.SetString("url", url.possibly_invalid_spec());
- dict.SetInteger("navigation_count", navigation_count);
- DictionaryValue reply_dict;
- if (!SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg))
- return false;
- int response = 0;
- if (!reply_dict.GetInteger("result", &response))
- return false;
- *nav_response = static_cast<AutomationMsg_NavigationResponseValues>(response);
- return true;
-}
-
-bool SendExecuteJavascriptJSONRequest(
- AutomationMessageSender* sender,
- int browser_index,
- int tab_index,
- const std::string& frame_xpath,
- const std::string& javascript,
- Value** result,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "ExecuteJavascript");
- dict.SetInteger("windex", browser_index);
- dict.SetInteger("tab_index", tab_index);
- dict.SetString("frame_xpath", frame_xpath);
- dict.SetString("javascript", javascript);
- DictionaryValue reply_dict;
- if (!SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg))
- return false;
-
- std::string json;
- if (!reply_dict.GetString("result", &json)) {
- LOG(ERROR) << "Executed javascript but received no 'result'";
- return false;
- }
- // Wrap |json| in an array before deserializing because valid JSON has an
- // array or an object as the root.
- json.insert(0, "[");
- json.append("]");
-
- JSONStringValueSerializer deserializer(json);
- Value* value = deserializer.Deserialize(NULL, NULL);
- if (!value || !value->IsType(Value::TYPE_LIST)) {
- LOG(ERROR) << "Unable to deserialize returned JSON";
- return false;
- }
- scoped_ptr<ListValue> list(static_cast<ListValue*>(value));
- return list->Remove(0, result);
-}
-
-bool SendGoForwardJSONRequest(
- AutomationMessageSender* sender,
- int browser_index,
- int tab_index,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "GoForward");
- dict.SetInteger("windex", browser_index);
- dict.SetInteger("tab_index", tab_index);
- DictionaryValue reply_dict;
- return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
-}
-
-bool SendGoBackJSONRequest(
- AutomationMessageSender* sender,
- int browser_index,
- int tab_index,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "GoBack");
- dict.SetInteger("windex", browser_index);
- dict.SetInteger("tab_index", tab_index);
- DictionaryValue reply_dict;
- return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
-}
-
-bool SendReloadJSONRequest(
- AutomationMessageSender* sender,
- int browser_index,
- int tab_index,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "Reload");
- dict.SetInteger("windex", browser_index);
- dict.SetInteger("tab_index", tab_index);
- DictionaryValue reply_dict;
- return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
-}
-
-bool SendCaptureEntirePageJSONRequest(
- AutomationMessageSender* sender,
- int browser_index,
- int tab_index,
- const FilePath& path,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "CaptureEntirePage");
- dict.SetInteger("windex", browser_index);
- dict.SetInteger("tab_index", tab_index);
- dict.SetString("path", path.value());
- DictionaryValue reply_dict;
-
- return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
-}
-
-bool SendGetTabURLJSONRequest(
- AutomationMessageSender* sender,
- int browser_index,
- int tab_index,
- std::string* url,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "GetTabURL");
- dict.SetInteger("windex", browser_index);
- dict.SetInteger("tab_index", tab_index);
- DictionaryValue reply_dict;
- if (!SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg))
- return false;
- return reply_dict.GetString("url", url);
-}
-
-bool SendGetTabTitleJSONRequest(
- AutomationMessageSender* sender,
- int browser_index,
- int tab_index,
- std::string* tab_title,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "GetTabTitle");
- dict.SetInteger("windex", browser_index);
- dict.SetInteger("tab_index", tab_index);
- DictionaryValue reply_dict;
- if (!SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg))
- return false;
- return reply_dict.GetString("title", tab_title);
-}
-
-bool SendGetCookiesJSONRequest(
- AutomationMessageSender* sender,
- const std::string& url,
- ListValue** cookies,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "GetCookies");
- dict.SetString("url", url);
- DictionaryValue reply_dict;
- if (!SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg))
- return false;
- Value* cookies_unscoped_value;
- if (!reply_dict.Remove("cookies", &cookies_unscoped_value))
- return false;
- scoped_ptr<Value> cookies_value(cookies_unscoped_value);
- if (!cookies_value->IsType(Value::TYPE_LIST))
- return false;
- *cookies = static_cast<ListValue*>(cookies_value.release());
- return true;
-}
-
-bool SendGetCookiesJSONRequestDeprecated(
- AutomationMessageSender* sender,
- int browser_index,
- const std::string& url,
- std::string* cookies) {
- DictionaryValue dict;
- dict.SetString("command", "GetCookies");
- dict.SetInteger("windex", browser_index);
- dict.SetString("url", url);
- DictionaryValue reply_dict;
- std::string error_msg;
- if (!SendAutomationJSONRequest(sender, dict, &reply_dict, &error_msg))
- return false;
- return reply_dict.GetString("cookies", cookies);
-}
-
-bool SendDeleteCookieJSONRequest(
- AutomationMessageSender* sender,
- const std::string& url,
- const std::string& cookie_name,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "DeleteCookie");
- dict.SetString("url", url);
- dict.SetString("name", cookie_name);
- DictionaryValue reply_dict;
- return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
-}
-
-bool SendDeleteCookieJSONRequestDeprecated(
- AutomationMessageSender* sender,
- int browser_index,
- const std::string& url,
- const std::string& cookie_name) {
- DictionaryValue dict;
- dict.SetString("command", "DeleteCookie");
- dict.SetInteger("windex", browser_index);
- dict.SetString("url", url);
- dict.SetString("name", cookie_name);
- DictionaryValue reply_dict;
- std::string error_msg;
- return SendAutomationJSONRequest(sender, dict, &reply_dict, &error_msg);
-}
-
-bool SendSetCookieJSONRequest(
- AutomationMessageSender* sender,
- const std::string& url,
- DictionaryValue* cookie_dict,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "SetCookie");
- dict.SetString("url", url);
- dict.Set("cookie", cookie_dict->DeepCopy());
- DictionaryValue reply_dict;
- return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
-}
-
-bool SendSetCookieJSONRequestDeprecated(
- AutomationMessageSender* sender,
- int browser_index,
- const std::string& url,
- const std::string& cookie) {
- DictionaryValue dict;
- dict.SetString("command", "SetCookie");
- dict.SetInteger("windex", browser_index);
- dict.SetString("url", url);
- dict.SetString("cookie", cookie);
- DictionaryValue reply_dict;
- std::string error_msg;
- return SendAutomationJSONRequest(sender, dict, &reply_dict, &error_msg);
-}
-
-bool SendGetTabIdsJSONRequest(
- AutomationMessageSender* sender,
- std::vector<int>* tab_ids,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "GetTabIds");
- DictionaryValue reply_dict;
- if (!SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg))
- return false;
- ListValue* id_list;
- if (!reply_dict.GetList("ids", &id_list)) {
- LOG(ERROR) << "Returned 'ids' key is missing or invalid";
- return false;
- }
- std::vector<int> temp_ids;
- for (size_t i = 0; i < id_list->GetSize(); ++i) {
- int id;
- if (!id_list->GetInteger(i, &id)) {
- LOG(ERROR) << "Returned 'ids' key contains non-integer values";
- return false;
- }
- temp_ids.push_back(id);
- }
- *tab_ids = temp_ids;
- return true;
-}
-
-bool SendIsTabIdValidJSONRequest(
- AutomationMessageSender* sender,
- int tab_id,
- bool* is_valid,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "IsTabIdValid");
- dict.SetInteger("id", tab_id);
- DictionaryValue reply_dict;
- if (!SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg))
- return false;
- return reply_dict.GetBoolean("is_valid", is_valid);
-}
-
-bool SendCloseTabJSONRequest(
- AutomationMessageSender* sender,
- int browser_index,
- int tab_index,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "CloseTab");
- dict.SetInteger("windex", browser_index);
- dict.SetInteger("tab_index", tab_index);
- DictionaryValue reply_dict;
- return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
-}
-
-bool SendMouseMoveJSONRequest(
- AutomationMessageSender* sender,
- int browser_index,
- int tab_index,
- int x,
- int y,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "WebkitMouseMove");
- dict.SetInteger("windex", browser_index);
- dict.SetInteger("tab_index", tab_index);
- dict.SetInteger("x", x);
- dict.SetInteger("y", y);
- DictionaryValue reply_dict;
- return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
-}
-
-bool SendMouseClickJSONRequest(
- AutomationMessageSender* sender,
- int browser_index,
- int tab_index,
- automation::MouseButton button,
- int x,
- int y,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "WebkitMouseClick");
- dict.SetInteger("windex", browser_index);
- dict.SetInteger("tab_index", tab_index);
- dict.SetInteger("button", button);
- dict.SetInteger("x", x);
- dict.SetInteger("y", y);
- DictionaryValue reply_dict;
- return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
-}
-
-bool SendMouseDragJSONRequest(
- AutomationMessageSender* sender,
- int browser_index,
- int tab_index,
- int start_x,
- int start_y,
- int end_x,
- int end_y,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "WebkitMouseDrag");
- dict.SetInteger("windex", browser_index);
- dict.SetInteger("tab_index", tab_index);
- dict.SetInteger("start_x", start_x);
- dict.SetInteger("start_y", start_y);
- dict.SetInteger("end_x", end_x);
- dict.SetInteger("end_y", end_y);
- DictionaryValue reply_dict;
- return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
-}
-
-bool SendMouseButtonDownJSONRequest(
- AutomationMessageSender* sender,
- int browser_index,
- int tab_index,
- int x,
- int y,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "WebkitMouseButtonDown");
- dict.SetInteger("windex", browser_index);
- dict.SetInteger("tab_index", tab_index);
- dict.SetInteger("x", x);
- dict.SetInteger("y", y);
- DictionaryValue reply_dict;
- return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
-}
-
-bool SendMouseButtonUpJSONRequest(
- AutomationMessageSender* sender,
- int browser_index,
- int tab_index,
- int x,
- int y,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "WebkitMouseButtonUp");
- dict.SetInteger("windex", browser_index);
- dict.SetInteger("tab_index", tab_index);
- dict.SetInteger("x", x);
- dict.SetInteger("y", y);
- DictionaryValue reply_dict;
- return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
-}
-
-bool SendMouseDoubleClickJSONRequest(
- AutomationMessageSender* sender,
- int browser_index,
- int tab_index,
- int x,
- int y,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "WebkitMouseDoubleClick");
- dict.SetInteger("windex", browser_index);
- dict.SetInteger("tab_index", tab_index);
- dict.SetInteger("x", x);
- dict.SetInteger("y", y);
- DictionaryValue reply_dict;
- return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
-}
-
-bool SendWebKeyEventJSONRequest(
- AutomationMessageSender* sender,
- int browser_index,
- int tab_index,
- const WebKeyEvent& key_event,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "SendWebkitKeyEvent");
- dict.SetInteger("windex", browser_index);
- dict.SetInteger("tab_index", tab_index);
- dict.SetInteger("type", key_event.type);
- dict.SetInteger("nativeKeyCode", key_event.key_code);
- dict.SetInteger("windowsKeyCode", key_event.key_code);
- dict.SetString("unmodifiedText", key_event.unmodified_text);
- dict.SetString("text", key_event.modified_text);
- dict.SetInteger("modifiers", key_event.modifiers);
- dict.SetBoolean("isSystemKey", false);
- DictionaryValue reply_dict;
- return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
-}
-
-bool SendNativeKeyEventJSONRequest(
- AutomationMessageSender* sender,
- int browser_index,
- int tab_index,
- ui::KeyboardCode key_code,
- int modifiers,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "SendOSLevelKeyEventToTab");
- dict.SetInteger("windex", browser_index);
- dict.SetInteger("tab_index", tab_index);
- dict.SetInteger("keyCode", key_code);
- dict.SetInteger("modifiers", modifiers);
- DictionaryValue reply_dict;
- return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
-}
-
-bool SendGetAppModalDialogMessageJSONRequest(
- AutomationMessageSender* sender,
- std::string* message,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "GetAppModalDialogMessage");
- DictionaryValue reply_dict;
- if (!SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg))
- return false;
- return reply_dict.GetString("message", message);
-}
-
-bool SendAcceptOrDismissAppModalDialogJSONRequest(
- AutomationMessageSender* sender,
- bool accept,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "AcceptOrDismissAppModalDialog");
- dict.SetBoolean("accept", accept);
- DictionaryValue reply_dict;
- return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
-}
-
-bool SendAcceptPromptAppModalDialogJSONRequest(
- AutomationMessageSender* sender,
- const std::string& prompt_text,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "AcceptOrDismissAppModalDialog");
- dict.SetBoolean("accept", true);
- dict.SetString("prompt_text", prompt_text);
- DictionaryValue reply_dict;
- return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
-}
-
-bool SendWaitForAllTabsToStopLoadingJSONRequest(
- AutomationMessageSender* sender,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "WaitForAllTabsToStopLoading");
- DictionaryValue reply_dict;
- return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
-}
-
-bool SendGetChromeDriverAutomationVersion(
- AutomationMessageSender* sender,
- int* version,
- std::string* error_msg) {
- DictionaryValue dict;
- dict.SetString("command", "GetChromeDriverAutomationVersion");
- DictionaryValue reply_dict;
- if (!SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg))
- return false;
- return reply_dict.GetInteger("version", version);
-}
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/test/automation/automation_json_requests.h"
+
+#include "base/basictypes.h"
+#include "base/file_path.h"
+#include "base/format_macros.h"
+#include "base/json/json_reader.h"
+#include "base/json/json_writer.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/stringprintf.h"
+#include "base/test/test_timeouts.h"
+#include "base/time.h"
+#include "base/values.h"
+#include "chrome/common/automation_messages.h"
+#include "chrome/test/automation/automation_proxy.h"
+#include "content/common/json_value_serializer.h"
+
+namespace {
+
+bool SendAutomationJSONRequest(AutomationMessageSender* sender,
+ const DictionaryValue& request_dict,
+ DictionaryValue* reply_dict,
+ std::string* error_msg) {
+ std::string request, reply;
+ base::JSONWriter::Write(&request_dict, false, &request);
+ std::string command;
+ request_dict.GetString("command", &command);
+ LOG(INFO) << "Sending '" << command << "' command.";
+
+ base::Time before_sending = base::Time::Now();
+ bool success = false;
+ if (!SendAutomationJSONRequestWithDefaultTimeout(
+ sender, request, &reply, &success)) {
+ *error_msg = base::StringPrintf(
+ "Chrome did not respond to '%s'. Elapsed time was %" PRId64 " ms. "
+ "Request details: (%s).",
+ command.c_str(),
+ (base::Time::Now() - before_sending).InMilliseconds(),
+ request.c_str());
+ return false;
+ }
+ scoped_ptr<Value> value(base::JSONReader::Read(reply, true));
+ if (!value.get() || !value->IsType(Value::TYPE_DICTIONARY)) {
+ LOG(ERROR) << "JSON request did not return dict: " << command << "\n";
+ return false;
+ }
+ DictionaryValue* dict = static_cast<DictionaryValue*>(value.get());
+ if (!success) {
+ std::string error;
+ dict->GetString("error", &error);
+ *error_msg = base::StringPrintf(
+ "Internal Chrome error during '%s': (%s). Request details: (%s).",
+ command.c_str(),
+ error.c_str(),
+ request.c_str());
+ LOG(ERROR) << "JSON request failed: " << command << "\n"
+ << " with error: " << error;
+ return false;
+ }
+ reply_dict->MergeDictionary(dict);
+ return true;
+}
+
+} // namespace
+
+WebKeyEvent::WebKeyEvent(automation::KeyEventTypes type,
+ ui::KeyboardCode key_code,
+ const std::string& unmodified_text,
+ const std::string& modified_text,
+ int modifiers)
+ : type(type),
+ key_code(key_code),
+ unmodified_text(unmodified_text),
+ modified_text(modified_text),
+ modifiers(modifiers) {}
+
+bool SendAutomationJSONRequest(AutomationMessageSender* sender,
+ const std::string& request,
+ int timeout_ms,
+ std::string* reply,
+ bool* success) {
+ return sender->Send(new AutomationMsg_SendJSONRequest(
+ -1, request, reply, success), timeout_ms);
+}
+
+bool SendAutomationJSONRequestWithDefaultTimeout(
+ AutomationMessageSender* sender,
+ const std::string& request,
+ std::string* reply,
+ bool* success) {
+ return sender->Send(new AutomationMsg_SendJSONRequest(
+ -1, request, reply, success));
+}
+
+bool SendGetIndicesFromTabIdJSONRequest(
+ AutomationMessageSender* sender,
+ int tab_id,
+ int* browser_index,
+ int* tab_index,
+ std::string* error_msg) {
+ DictionaryValue request_dict;
+ request_dict.SetString("command", "GetIndicesFromTab");
+ request_dict.SetInteger("tab_id", tab_id);
+ DictionaryValue reply_dict;
+ if (!SendAutomationJSONRequest(sender, request_dict, &reply_dict, error_msg))
+ return false;
+ if (!reply_dict.GetInteger("windex", browser_index))
+ return false;
+ if (!reply_dict.GetInteger("tab_index", tab_index))
+ return false;
+ return true;
+}
+
+bool SendGetIndicesFromTabHandleJSONRequest(
+ AutomationMessageSender* sender,
+ int tab_handle,
+ int* browser_index,
+ int* tab_index,
+ std::string* error_msg) {
+ DictionaryValue request_dict;
+ request_dict.SetString("command", "GetIndicesFromTab");
+ request_dict.SetInteger("tab_handle", tab_handle);
+ DictionaryValue reply_dict;
+ if (!SendAutomationJSONRequest(sender, request_dict, &reply_dict, error_msg))
+ return false;
+ if (!reply_dict.GetInteger("windex", browser_index))
+ return false;
+ if (!reply_dict.GetInteger("tab_index", tab_index))
+ return false;
+ return true;
+}
+
+bool SendNavigateToURLJSONRequest(
+ AutomationMessageSender* sender,
+ int browser_index,
+ int tab_index,
+ const GURL& url,
+ int navigation_count,
+ AutomationMsg_NavigationResponseValues* nav_response,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "NavigateToURL");
+ dict.SetInteger("windex", browser_index);
+ dict.SetInteger("tab_index", tab_index);
+ dict.SetString("url", url.possibly_invalid_spec());
+ dict.SetInteger("navigation_count", navigation_count);
+ DictionaryValue reply_dict;
+ if (!SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg))
+ return false;
+ int response = 0;
+ if (!reply_dict.GetInteger("result", &response))
+ return false;
+ *nav_response = static_cast<AutomationMsg_NavigationResponseValues>(response);
+ return true;
+}
+
+bool SendExecuteJavascriptJSONRequest(
+ AutomationMessageSender* sender,
+ int browser_index,
+ int tab_index,
+ const std::string& frame_xpath,
+ const std::string& javascript,
+ Value** result,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "ExecuteJavascript");
+ dict.SetInteger("windex", browser_index);
+ dict.SetInteger("tab_index", tab_index);
+ dict.SetString("frame_xpath", frame_xpath);
+ dict.SetString("javascript", javascript);
+ DictionaryValue reply_dict;
+ if (!SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg))
+ return false;
+
+ std::string json;
+ if (!reply_dict.GetString("result", &json)) {
+ LOG(ERROR) << "Executed javascript but received no 'result'";
+ return false;
+ }
+ // Wrap |json| in an array before deserializing because valid JSON has an
+ // array or an object as the root.
+ json.insert(0, "[");
+ json.append("]");
+
+ JSONStringValueSerializer deserializer(json);
+ Value* value = deserializer.Deserialize(NULL, NULL);
+ if (!value || !value->IsType(Value::TYPE_LIST)) {
+ LOG(ERROR) << "Unable to deserialize returned JSON";
+ return false;
+ }
+ scoped_ptr<ListValue> list(static_cast<ListValue*>(value));
+ return list->Remove(0, result);
+}
+
+bool SendGoForwardJSONRequest(
+ AutomationMessageSender* sender,
+ int browser_index,
+ int tab_index,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "GoForward");
+ dict.SetInteger("windex", browser_index);
+ dict.SetInteger("tab_index", tab_index);
+ DictionaryValue reply_dict;
+ return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
+}
+
+bool SendGoBackJSONRequest(
+ AutomationMessageSender* sender,
+ int browser_index,
+ int tab_index,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "GoBack");
+ dict.SetInteger("windex", browser_index);
+ dict.SetInteger("tab_index", tab_index);
+ DictionaryValue reply_dict;
+ return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
+}
+
+bool SendReloadJSONRequest(
+ AutomationMessageSender* sender,
+ int browser_index,
+ int tab_index,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "Reload");
+ dict.SetInteger("windex", browser_index);
+ dict.SetInteger("tab_index", tab_index);
+ DictionaryValue reply_dict;
+ return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
+}
+
+bool SendCaptureEntirePageJSONRequest(
+ AutomationMessageSender* sender,
+ int browser_index,
+ int tab_index,
+ const FilePath& path,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "CaptureEntirePage");
+ dict.SetInteger("windex", browser_index);
+ dict.SetInteger("tab_index", tab_index);
+ dict.SetString("path", path.value());
+ DictionaryValue reply_dict;
+
+ return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
+}
+
+bool SendGetTabURLJSONRequest(
+ AutomationMessageSender* sender,
+ int browser_index,
+ int tab_index,
+ std::string* url,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "GetTabURL");
+ dict.SetInteger("windex", browser_index);
+ dict.SetInteger("tab_index", tab_index);
+ DictionaryValue reply_dict;
+ if (!SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg))
+ return false;
+ return reply_dict.GetString("url", url);
+}
+
+bool SendGetTabTitleJSONRequest(
+ AutomationMessageSender* sender,
+ int browser_index,
+ int tab_index,
+ std::string* tab_title,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "GetTabTitle");
+ dict.SetInteger("windex", browser_index);
+ dict.SetInteger("tab_index", tab_index);
+ DictionaryValue reply_dict;
+ if (!SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg))
+ return false;
+ return reply_dict.GetString("title", tab_title);
+}
+
+bool SendGetCookiesJSONRequest(
+ AutomationMessageSender* sender,
+ const std::string& url,
+ ListValue** cookies,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "GetCookies");
+ dict.SetString("url", url);
+ DictionaryValue reply_dict;
+ if (!SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg))
+ return false;
+ Value* cookies_unscoped_value;
+ if (!reply_dict.Remove("cookies", &cookies_unscoped_value))
+ return false;
+ scoped_ptr<Value> cookies_value(cookies_unscoped_value);
+ if (!cookies_value->IsType(Value::TYPE_LIST))
+ return false;
+ *cookies = static_cast<ListValue*>(cookies_value.release());
+ return true;
+}
+
+bool SendGetCookiesJSONRequestDeprecated(
+ AutomationMessageSender* sender,
+ int browser_index,
+ const std::string& url,
+ std::string* cookies) {
+ DictionaryValue dict;
+ dict.SetString("command", "GetCookies");
+ dict.SetInteger("windex", browser_index);
+ dict.SetString("url", url);
+ DictionaryValue reply_dict;
+ std::string error_msg;
+ if (!SendAutomationJSONRequest(sender, dict, &reply_dict, &error_msg))
+ return false;
+ return reply_dict.GetString("cookies", cookies);
+}
+
+bool SendDeleteCookieJSONRequest(
+ AutomationMessageSender* sender,
+ const std::string& url,
+ const std::string& cookie_name,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "DeleteCookie");
+ dict.SetString("url", url);
+ dict.SetString("name", cookie_name);
+ DictionaryValue reply_dict;
+ return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
+}
+
+bool SendDeleteCookieJSONRequestDeprecated(
+ AutomationMessageSender* sender,
+ int browser_index,
+ const std::string& url,
+ const std::string& cookie_name) {
+ DictionaryValue dict;
+ dict.SetString("command", "DeleteCookie");
+ dict.SetInteger("windex", browser_index);
+ dict.SetString("url", url);
+ dict.SetString("name", cookie_name);
+ DictionaryValue reply_dict;
+ std::string error_msg;
+ return SendAutomationJSONRequest(sender, dict, &reply_dict, &error_msg);
+}
+
+bool SendSetCookieJSONRequest(
+ AutomationMessageSender* sender,
+ const std::string& url,
+ DictionaryValue* cookie_dict,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "SetCookie");
+ dict.SetString("url", url);
+ dict.Set("cookie", cookie_dict->DeepCopy());
+ DictionaryValue reply_dict;
+ return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
+}
+
+bool SendSetCookieJSONRequestDeprecated(
+ AutomationMessageSender* sender,
+ int browser_index,
+ const std::string& url,
+ const std::string& cookie) {
+ DictionaryValue dict;
+ dict.SetString("command", "SetCookie");
+ dict.SetInteger("windex", browser_index);
+ dict.SetString("url", url);
+ dict.SetString("cookie", cookie);
+ DictionaryValue reply_dict;
+ std::string error_msg;
+ return SendAutomationJSONRequest(sender, dict, &reply_dict, &error_msg);
+}
+
+bool SendGetTabIdsJSONRequest(
+ AutomationMessageSender* sender,
+ std::vector<int>* tab_ids,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "GetTabIds");
+ DictionaryValue reply_dict;
+ if (!SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg))
+ return false;
+ ListValue* id_list;
+ if (!reply_dict.GetList("ids", &id_list)) {
+ LOG(ERROR) << "Returned 'ids' key is missing or invalid";
+ return false;
+ }
+ std::vector<int> temp_ids;
+ for (size_t i = 0; i < id_list->GetSize(); ++i) {
+ int id;
+ if (!id_list->GetInteger(i, &id)) {
+ LOG(ERROR) << "Returned 'ids' key contains non-integer values";
+ return false;
+ }
+ temp_ids.push_back(id);
+ }
+ *tab_ids = temp_ids;
+ return true;
+}
+
+bool SendIsTabIdValidJSONRequest(
+ AutomationMessageSender* sender,
+ int tab_id,
+ bool* is_valid,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "IsTabIdValid");
+ dict.SetInteger("id", tab_id);
+ DictionaryValue reply_dict;
+ if (!SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg))
+ return false;
+ return reply_dict.GetBoolean("is_valid", is_valid);
+}
+
+bool SendCloseTabJSONRequest(
+ AutomationMessageSender* sender,
+ int browser_index,
+ int tab_index,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "CloseTab");
+ dict.SetInteger("windex", browser_index);
+ dict.SetInteger("tab_index", tab_index);
+ DictionaryValue reply_dict;
+ return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
+}
+
+bool SendMouseMoveJSONRequest(
+ AutomationMessageSender* sender,
+ int browser_index,
+ int tab_index,
+ int x,
+ int y,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "WebkitMouseMove");
+ dict.SetInteger("windex", browser_index);
+ dict.SetInteger("tab_index", tab_index);
+ dict.SetInteger("x", x);
+ dict.SetInteger("y", y);
+ DictionaryValue reply_dict;
+ return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
+}
+
+bool SendMouseClickJSONRequest(
+ AutomationMessageSender* sender,
+ int browser_index,
+ int tab_index,
+ automation::MouseButton button,
+ int x,
+ int y,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "WebkitMouseClick");
+ dict.SetInteger("windex", browser_index);
+ dict.SetInteger("tab_index", tab_index);
+ dict.SetInteger("button", button);
+ dict.SetInteger("x", x);
+ dict.SetInteger("y", y);
+ DictionaryValue reply_dict;
+ return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
+}
+
+bool SendMouseDragJSONRequest(
+ AutomationMessageSender* sender,
+ int browser_index,
+ int tab_index,
+ int start_x,
+ int start_y,
+ int end_x,
+ int end_y,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "WebkitMouseDrag");
+ dict.SetInteger("windex", browser_index);
+ dict.SetInteger("tab_index", tab_index);
+ dict.SetInteger("start_x", start_x);
+ dict.SetInteger("start_y", start_y);
+ dict.SetInteger("end_x", end_x);
+ dict.SetInteger("end_y", end_y);
+ DictionaryValue reply_dict;
+ return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
+}
+
+bool SendMouseButtonDownJSONRequest(
+ AutomationMessageSender* sender,
+ int browser_index,
+ int tab_index,
+ int x,
+ int y,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "WebkitMouseButtonDown");
+ dict.SetInteger("windex", browser_index);
+ dict.SetInteger("tab_index", tab_index);
+ dict.SetInteger("x", x);
+ dict.SetInteger("y", y);
+ DictionaryValue reply_dict;
+ return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
+}
+
+bool SendMouseButtonUpJSONRequest(
+ AutomationMessageSender* sender,
+ int browser_index,
+ int tab_index,
+ int x,
+ int y,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "WebkitMouseButtonUp");
+ dict.SetInteger("windex", browser_index);
+ dict.SetInteger("tab_index", tab_index);
+ dict.SetInteger("x", x);
+ dict.SetInteger("y", y);
+ DictionaryValue reply_dict;
+ return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
+}
+
+bool SendMouseDoubleClickJSONRequest(
+ AutomationMessageSender* sender,
+ int browser_index,
+ int tab_index,
+ int x,
+ int y,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "WebkitMouseDoubleClick");
+ dict.SetInteger("windex", browser_index);
+ dict.SetInteger("tab_index", tab_index);
+ dict.SetInteger("x", x);
+ dict.SetInteger("y", y);
+ DictionaryValue reply_dict;
+ return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
+}
+
+bool SendWebKeyEventJSONRequest(
+ AutomationMessageSender* sender,
+ int browser_index,
+ int tab_index,
+ const WebKeyEvent& key_event,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "SendWebkitKeyEvent");
+ dict.SetInteger("windex", browser_index);
+ dict.SetInteger("tab_index", tab_index);
+ dict.SetInteger("type", key_event.type);
+ dict.SetInteger("nativeKeyCode", key_event.key_code);
+ dict.SetInteger("windowsKeyCode", key_event.key_code);
+ dict.SetString("unmodifiedText", key_event.unmodified_text);
+ dict.SetString("text", key_event.modified_text);
+ dict.SetInteger("modifiers", key_event.modifiers);
+ dict.SetBoolean("isSystemKey", false);
+ DictionaryValue reply_dict;
+ return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
+}
+
+bool SendNativeKeyEventJSONRequest(
+ AutomationMessageSender* sender,
+ int browser_index,
+ int tab_index,
+ ui::KeyboardCode key_code,
+ int modifiers,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "SendOSLevelKeyEventToTab");
+ dict.SetInteger("windex", browser_index);
+ dict.SetInteger("tab_index", tab_index);
+ dict.SetInteger("keyCode", key_code);
+ dict.SetInteger("modifiers", modifiers);
+ DictionaryValue reply_dict;
+ return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
+}
+
+bool SendGetAppModalDialogMessageJSONRequest(
+ AutomationMessageSender* sender,
+ std::string* message,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "GetAppModalDialogMessage");
+ DictionaryValue reply_dict;
+ if (!SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg))
+ return false;
+ return reply_dict.GetString("message", message);
+}
+
+bool SendAcceptOrDismissAppModalDialogJSONRequest(
+ AutomationMessageSender* sender,
+ bool accept,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "AcceptOrDismissAppModalDialog");
+ dict.SetBoolean("accept", accept);
+ DictionaryValue reply_dict;
+ return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
+}
+
+bool SendAcceptPromptAppModalDialogJSONRequest(
+ AutomationMessageSender* sender,
+ const std::string& prompt_text,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "AcceptOrDismissAppModalDialog");
+ dict.SetBoolean("accept", true);
+ dict.SetString("prompt_text", prompt_text);
+ DictionaryValue reply_dict;
+ return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
+}
+
+bool SendWaitForAllTabsToStopLoadingJSONRequest(
+ AutomationMessageSender* sender,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "WaitForAllTabsToStopLoading");
+ DictionaryValue reply_dict;
+ return SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg);
+}
+
+bool SendGetChromeDriverAutomationVersion(
+ AutomationMessageSender* sender,
+ int* version,
+ std::string* error_msg) {
+ DictionaryValue dict;
+ dict.SetString("command", "GetChromeDriverAutomationVersion");
+ DictionaryValue reply_dict;
+ if (!SendAutomationJSONRequest(sender, dict, &reply_dict, error_msg))
+ return false;
+ return reply_dict.GetInteger("version", version);
+}
« no previous file with comments | « chrome/test/automation/automation_json_requests.h ('k') | chrome/test/webdriver/automation.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698