NaCl: Update revision in DEPS, r12770 -> r12773
[chromium-blink-merge.git] / chrome / browser / devtools / devtools_embedder_message_dispatcher.cc
blob3fd221db4fef3f9164e77e7b3d8ba261d9f5e945
1 // Copyright 2013 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.
5 #include "chrome/browser/devtools/devtools_embedder_message_dispatcher.h"
7 #include "base/bind.h"
8 #include "base/values.h"
10 namespace {
12 bool GetValue(const base::ListValue& list, int pos, std::string& value) {
13 return list.GetString(pos, &value);
16 bool GetValue(const base::ListValue& list, int pos, int& value) {
17 return list.GetInteger(pos, &value);
20 bool GetValue(const base::ListValue& list, int pos, bool& value) {
21 return list.GetBoolean(pos, &value);
24 bool GetValue(const base::ListValue& list, int pos, gfx::Insets& insets) {
25 const base::DictionaryValue* dict;
26 if (!list.GetDictionary(pos, &dict))
27 return false;
28 int top = 0;
29 int left = 0;
30 int bottom = 0;
31 int right = 0;
32 if (!dict->GetInteger("top", &top) ||
33 !dict->GetInteger("left", &left) ||
34 !dict->GetInteger("bottom", &bottom) ||
35 !dict->GetInteger("right", &right))
36 return false;
37 insets.Set(top, left, bottom, right);
38 return true;
41 bool GetValue(const base::ListValue& list, int pos, gfx::Size& size) {
42 const base::DictionaryValue* dict;
43 if (!list.GetDictionary(pos, &dict))
44 return false;
45 int width = 0;
46 int height = 0;
47 if (!dict->GetInteger("width", &width) ||
48 !dict->GetInteger("height", &height))
49 return false;
50 size.SetSize(width, height);
51 return true;
54 template <typename T>
55 struct StorageTraits {
56 typedef T StorageType;
59 template <typename T>
60 struct StorageTraits<const T&> {
61 typedef T StorageType;
64 template <class A>
65 class Argument {
66 public:
67 typedef typename StorageTraits<A>::StorageType ValueType;
69 Argument(const base::ListValue& list, int pos) {
70 valid_ = GetValue(list, pos, value_);
73 ValueType value() const { return value_; }
74 bool valid() const { return valid_; }
76 private:
77 ValueType value_;
78 bool valid_;
81 bool ParseAndHandle0(const base::Callback<void(void)>& handler,
82 const base::ListValue& list) {
83 handler.Run();
84 return true;
87 template <class A1>
88 bool ParseAndHandle1(const base::Callback<void(A1)>& handler,
89 const base::ListValue& list) {
90 if (list.GetSize() != 1)
91 return false;
92 Argument<A1> arg1(list, 0);
93 if (!arg1.valid())
94 return false;
95 handler.Run(arg1.value());
96 return true;
99 template <class A1, class A2>
100 bool ParseAndHandle2(const base::Callback<void(A1, A2)>& handler,
101 const base::ListValue& list) {
102 if (list.GetSize() != 2)
103 return false;
104 Argument<A1> arg1(list, 0);
105 if (!arg1.valid())
106 return false;
107 Argument<A2> arg2(list, 1);
108 if (!arg2.valid())
109 return false;
110 handler.Run(arg1.value(), arg2.value());
111 return true;
114 template <class A1, class A2, class A3>
115 bool ParseAndHandle3(const base::Callback<void(A1, A2, A3)>& handler,
116 const base::ListValue& list) {
117 if (list.GetSize() != 3)
118 return false;
119 Argument<A1> arg1(list, 0);
120 if (!arg1.valid())
121 return false;
122 Argument<A2> arg2(list, 1);
123 if (!arg2.valid())
124 return false;
125 Argument<A3> arg3(list, 2);
126 if (!arg3.valid())
127 return false;
128 handler.Run(arg1.value(), arg2.value(), arg3.value());
129 return true;
132 template <class A1, class A2, class A3, class A4>
133 bool ParseAndHandle3(const base::Callback<void(A1, A2, A3, A4)>& handler,
134 const base::ListValue& list) {
135 if (list.GetSize() != 4)
136 return false;
137 Argument<A1> arg1(list, 0);
138 if (!arg1.valid())
139 return false;
140 Argument<A2> arg2(list, 1);
141 if (!arg2.valid())
142 return false;
143 Argument<A3> arg3(list, 2);
144 if (!arg3.valid())
145 return false;
146 Argument<A4> arg4(list, 3);
147 if (!arg4.valid())
148 return false;
149 handler.Run(arg1.value(), arg2.value(), arg3.value(), arg4.value());
150 return true;
153 typedef base::Callback<bool(const base::ListValue&)> ListValueParser;
155 ListValueParser BindToListParser(const base::Callback<void()>& handler) {
156 return base::Bind(&ParseAndHandle0, handler);
159 template <class A1>
160 ListValueParser BindToListParser(const base::Callback<void(A1)>& handler) {
161 return base::Bind(&ParseAndHandle1<A1>, handler);
164 template <class A1, class A2>
165 ListValueParser BindToListParser(const base::Callback<void(A1,A2)>& handler) {
166 return base::Bind(&ParseAndHandle2<A1, A2>, handler);
169 template <class A1, class A2, class A3>
170 ListValueParser BindToListParser(
171 const base::Callback<void(A1,A2,A3)>& handler) {
172 return base::Bind(&ParseAndHandle3<A1, A2, A3>, handler);
175 template <class A1, class A2, class A3, class A4>
176 ListValueParser BindToListParser(
177 const base::Callback<void(A1,A2,A3,A4)>& handler) {
178 return base::Bind(&ParseAndHandle3<A1, A2, A3, A4>, handler);
181 } // namespace
183 DevToolsEmbedderMessageDispatcher::DevToolsEmbedderMessageDispatcher(
184 Delegate* delegate) {
185 RegisterHandler("bringToFront",
186 BindToListParser(base::Bind(&Delegate::ActivateWindow,
187 base::Unretained(delegate))));
188 RegisterHandler("closeWindow",
189 BindToListParser(base::Bind(&Delegate::CloseWindow,
190 base::Unretained(delegate))));
191 RegisterHandler("setContentsInsets",
192 BindToListParser(base::Bind(&Delegate::SetContentsInsets,
193 base::Unretained(delegate))));
194 RegisterHandler("setContentsResizingStrategy",
195 BindToListParser(base::Bind(&Delegate::SetContentsResizingStrategy,
196 base::Unretained(delegate))));
197 RegisterHandler("inspectElementCompleted",
198 BindToListParser(base::Bind(&Delegate::InspectElementCompleted,
199 base::Unretained(delegate))));
200 RegisterHandler("moveWindowBy",
201 BindToListParser(base::Bind(&Delegate::MoveWindow,
202 base::Unretained(delegate))));
203 RegisterHandler("setIsDocked",
204 BindToListParser(base::Bind(&Delegate::SetIsDocked,
205 base::Unretained(delegate))));
206 RegisterHandler("openInNewTab",
207 BindToListParser(base::Bind(&Delegate::OpenInNewTab,
208 base::Unretained(delegate))));
209 RegisterHandler("save",
210 BindToListParser(base::Bind(&Delegate::SaveToFile,
211 base::Unretained(delegate))));
212 RegisterHandler("append",
213 BindToListParser(base::Bind(&Delegate::AppendToFile,
214 base::Unretained(delegate))));
215 RegisterHandler("requestFileSystems",
216 BindToListParser(base::Bind(&Delegate::RequestFileSystems,
217 base::Unretained(delegate))));
218 RegisterHandler("addFileSystem",
219 BindToListParser(base::Bind(&Delegate::AddFileSystem,
220 base::Unretained(delegate))));
221 RegisterHandler("removeFileSystem",
222 BindToListParser(base::Bind(&Delegate::RemoveFileSystem,
223 base::Unretained(delegate))));
224 RegisterHandler("upgradeDraggedFileSystemPermissions",
225 BindToListParser(
226 base::Bind(&Delegate::UpgradeDraggedFileSystemPermissions,
227 base::Unretained(delegate))));
228 RegisterHandler("indexPath",
229 BindToListParser(base::Bind(&Delegate::IndexPath,
230 base::Unretained(delegate))));
231 RegisterHandler("stopIndexing",
232 BindToListParser(base::Bind(&Delegate::StopIndexing,
233 base::Unretained(delegate))));
234 RegisterHandler("searchInPath",
235 BindToListParser(base::Bind(&Delegate::SearchInPath,
236 base::Unretained(delegate))));
237 RegisterHandler("zoomIn",
238 BindToListParser(base::Bind(&Delegate::ZoomIn,
239 base::Unretained(delegate))));
240 RegisterHandler("zoomOut",
241 BindToListParser(base::Bind(&Delegate::ZoomOut,
242 base::Unretained(delegate))));
243 RegisterHandler("resetZoom",
244 BindToListParser(base::Bind(&Delegate::ResetZoom,
245 base::Unretained(delegate))));
248 DevToolsEmbedderMessageDispatcher::~DevToolsEmbedderMessageDispatcher() {}
250 std::string DevToolsEmbedderMessageDispatcher::Dispatch(
251 const std::string& method, base::ListValue* params) {
252 HandlerMap::iterator it = handlers_.find(method);
253 if (it == handlers_.end())
254 return "Unsupported frontend host method: " + method;
256 if (!it->second.Run(*params))
257 return "Invalid frontend host message parameters: " + method;
258 return "";
261 void DevToolsEmbedderMessageDispatcher::RegisterHandler(
262 const std::string& method, const Handler& handler) {
263 handlers_[method] = handler;