1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/automation/automation_provider_json.h"
6
7 #include "base/json/json_writer.h"
8 #include "base/json/string_escape.h"
9 #include "base/values.h"
10 #include "chrome/browser/autocomplete/autocomplete_match.h"
11 #include "chrome/browser/automation/automation_provider.h"
12 #include "chrome/browser/automation/automation_util.h"
13 #include "chrome/common/automation_messages.h"
14
15 namespace {
16
17 // Util for creating a JSON error return string (dict with key
18 // 'error' and error string value). No need to quote input.
JSONErrorString(const std::string & err)19 std::string JSONErrorString(const std::string& err) {
20 std::string prefix = "{\"error\": \"";
21 std::string no_quote_err;
22 std::string suffix = "\"}";
23
24 base::JsonDoubleQuote(err, false, &no_quote_err);
25 return prefix + no_quote_err + suffix;
26 }
27
28 } // namespace
29
AutomationJSONReply(AutomationProvider * provider,IPC::Message * reply_message)30 AutomationJSONReply::AutomationJSONReply(AutomationProvider* provider,
31 IPC::Message* reply_message)
32 : provider_(provider),
33 message_(reply_message) {
34 }
35
~AutomationJSONReply()36 AutomationJSONReply::~AutomationJSONReply() {
37 DCHECK(!message_) << "JSON automation request not replied!";
38 }
39
SendSuccess(const Value * value)40 void AutomationJSONReply::SendSuccess(const Value* value) {
41 DCHECK(message_) << "Resending reply for JSON automation request";
42 std::string json_string = "{}";
43 if (value)
44 base::JSONWriter::Write(value, false, &json_string);
45 AutomationMsg_SendJSONRequest::WriteReplyParams(
46 message_, json_string, true);
47 provider_->Send(message_);
48 message_ = NULL;
49 }
50
SendError(const std::string & error_message)51 void AutomationJSONReply::SendError(const std::string& error_message) {
52 DCHECK(message_) << "Resending reply for JSON automation request";
53 std::string json_string = JSONErrorString(error_message);
54 AutomationMsg_SendJSONRequest::WriteReplyParams(
55 message_, json_string, false);
56 provider_->Send(message_);
57 message_ = NULL;
58 }
59
GetBrowserFromJSONArgs(DictionaryValue * args,Browser ** browser,std::string * error)60 bool GetBrowserFromJSONArgs(
61 DictionaryValue* args,
62 Browser** browser,
63 std::string* error) {
64 int browser_index;
65 if (!args->GetInteger("windex", &browser_index)) {
66 *error = "'windex' missing or invalid";
67 return false;
68 }
69 *browser = automation_util::GetBrowserAt(browser_index);
70 if (!*browser) {
71 *error = "Cannot locate browser from given index";
72 return false;
73 }
74 return true;
75 }
76
GetTabFromJSONArgs(DictionaryValue * args,TabContents ** tab,std::string * error)77 bool GetTabFromJSONArgs(
78 DictionaryValue* args,
79 TabContents** tab,
80 std::string* error) {
81 int browser_index, tab_index;
82 if (!args->GetInteger("windex", &browser_index)) {
83 *error = "'windex' missing or invalid";
84 return false;
85 }
86 if (!args->GetInteger("tab_index", &tab_index)) {
87 *error = "'tab_index' missing or invalid";
88 return false;
89 }
90 *tab = automation_util::GetTabContentsAt(browser_index, tab_index);
91 if (!*tab) {
92 *error = "Cannot locate tab from given indices";
93 return false;
94 }
95 return true;
96 }
97
GetBrowserAndTabFromJSONArgs(DictionaryValue * args,Browser ** browser,TabContents ** tab,std::string * error)98 bool GetBrowserAndTabFromJSONArgs(
99 DictionaryValue* args,
100 Browser** browser,
101 TabContents** tab,
102 std::string* error) {
103 return GetBrowserFromJSONArgs(args, browser, error) &&
104 GetTabFromJSONArgs(args, tab, error);
105 }
106