| Index: chrome/browser/automation/automation_provider_json.cc
|
| diff --git a/chrome/browser/automation/automation_provider_json.cc b/chrome/browser/automation/automation_provider_json.cc
|
| index 0f0918dc40b9ba4b53485bd6dcbc5bb6ba39b963..e7acc408634c1f922002e8937b5f95f77cd94474 100644
|
| --- a/chrome/browser/automation/automation_provider_json.cc
|
| +++ b/chrome/browser/automation/automation_provider_json.cc
|
| @@ -10,7 +10,18 @@
|
| #include "chrome/browser/autocomplete/autocomplete_match.h"
|
| #include "chrome/browser/automation/automation_provider.h"
|
| #include "chrome/browser/automation/automation_util.h"
|
| +#include "chrome/browser/extensions/extension_host.h"
|
| +#include "chrome/browser/extensions/extension_process_manager.h"
|
| +#include "chrome/browser/extensions/extension_service.h"
|
| +#include "chrome/browser/sessions/restore_tab_helper.h"
|
| +#include "chrome/browser/sessions/session_id.h"
|
| +#include "chrome/browser/ui/browser.h"
|
| +#include "chrome/browser/ui/browser_list.h"
|
| +#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
|
| #include "chrome/common/automation_messages.h"
|
| +#include "chrome/common/chrome_view_types.h"
|
| +#include "chrome/common/extensions/extension.h"
|
| +#include "content/browser/tab_contents/tab_contents.h"
|
|
|
| namespace {
|
|
|
| @@ -57,6 +68,52 @@ void AutomationJSONReply::SendError(const std::string& error_message) {
|
| message_ = NULL;
|
| }
|
|
|
| +// static
|
| +bool AutomationId::FromValue(
|
| + Value* value, AutomationId* id, std::string* error) {
|
| + DictionaryValue* dict;
|
| + if (!value->GetAsDictionary(&dict)) {
|
| + *error = "automation ID must be a dictionary";
|
| + return false;
|
| + }
|
| + int type;
|
| + if (!dict->GetInteger("type", &type)) {
|
| + *error = "automation ID 'type' missing or invalid";
|
| + return false;
|
| + }
|
| + std::string type_id;
|
| + if (!dict->GetString("id", &type_id)) {
|
| + *error = "automation ID 'type_id' missing or invalid";
|
| + return false;
|
| + }
|
| + *id = AutomationId(static_cast<Type>(type), type_id);
|
| + return true;
|
| +}
|
| +
|
| +AutomationId::AutomationId() : type_(kInvalidType) { }
|
| +
|
| +AutomationId::AutomationId(Type type, const std::string& id)
|
| + : type_(type), id_(id) { }
|
| +
|
| +Value* AutomationId::ToValue() const {
|
| + DictionaryValue* dict = new DictionaryValue();
|
| + dict->SetInteger("type", type_);
|
| + dict->SetString("id", id_);
|
| + return dict;
|
| +}
|
| +
|
| +bool AutomationId::is_valid() const {
|
| + return type_ != kInvalidType;
|
| +}
|
| +
|
| +AutomationId::Type AutomationId::type() const {
|
| + return type_;
|
| +}
|
| +
|
| +const std::string& AutomationId::id() const {
|
| + return id_;
|
| +}
|
| +
|
| bool GetBrowserFromJSONArgs(
|
| DictionaryValue* args,
|
| Browser** browser,
|
| @@ -103,3 +160,39 @@ bool GetBrowserAndTabFromJSONArgs(
|
| return GetBrowserFromJSONArgs(args, browser, error) &&
|
| GetTabFromJSONArgs(args, tab, error);
|
| }
|
| +
|
| +bool GetAutomationIdFromJSONArgs(
|
| + DictionaryValue* args,
|
| + AutomationId* id,
|
| + std::string* error) {
|
| + Value* id_value;
|
| + if (!args->Get("view_id", &id_value)) {
|
| + *error = "Missing or invalid 'view_id'";
|
| + return false;
|
| + }
|
| + return AutomationId::FromValue(id_value, id, error);
|
| +}
|
| +
|
| +bool GetRenderViewFromJSONArgs(
|
| + DictionaryValue* args,
|
| + Profile* profile,
|
| + RenderViewHost** rvh,
|
| + std::string* error) {
|
| + Value* id_value;
|
| + if (args->Get("view_id", &id_value)) {
|
| + AutomationId id;
|
| + if (!AutomationId::FromValue(id_value, &id, error))
|
| + return false;
|
| + if (!automation_util::GetRenderViewForId(id, profile, rvh)) {
|
| + *error = "ID does not correspond to an open view";
|
| + return false;
|
| + }
|
| + } else {
|
| + // If the render view id is not specified, check for browser/tab indices.
|
| + TabContents* tab = NULL;
|
| + if (!GetTabFromJSONArgs(args, &tab, error))
|
| + return false;
|
| + *rvh = tab->render_view_host();
|
| + }
|
| + return true;
|
| +}
|
|
|