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"
8 #include "base/values.h"
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
))
32 if (!dict
->GetInteger("top", &top
) ||
33 !dict
->GetInteger("left", &left
) ||
34 !dict
->GetInteger("bottom", &bottom
) ||
35 !dict
->GetInteger("right", &right
))
37 insets
.Set(top
, left
, bottom
, right
);
41 bool GetValue(const base::ListValue
& list
, int pos
, gfx::Size
& size
) {
42 const base::DictionaryValue
* dict
;
43 if (!list
.GetDictionary(pos
, &dict
))
47 if (!dict
->GetInteger("width", &width
) ||
48 !dict
->GetInteger("height", &height
))
50 size
.SetSize(width
, height
);
55 struct StorageTraits
{
56 typedef T StorageType
;
60 struct StorageTraits
<const T
&> {
61 typedef T StorageType
;
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_
; }
81 bool ParseAndHandle0(const base::Callback
<void(void)>& handler
,
82 const base::ListValue
& list
) {
88 bool ParseAndHandle1(const base::Callback
<void(A1
)>& handler
,
89 const base::ListValue
& list
) {
90 if (list
.GetSize() != 1)
92 Argument
<A1
> arg1(list
, 0);
95 handler
.Run(arg1
.value());
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)
104 Argument
<A1
> arg1(list
, 0);
107 Argument
<A2
> arg2(list
, 1);
110 handler
.Run(arg1
.value(), arg2
.value());
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)
119 Argument
<A1
> arg1(list
, 0);
122 Argument
<A2
> arg2(list
, 1);
125 Argument
<A3
> arg3(list
, 2);
128 handler
.Run(arg1
.value(), arg2
.value(), arg3
.value());
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)
137 Argument
<A1
> arg1(list
, 0);
140 Argument
<A2
> arg2(list
, 1);
143 Argument
<A3
> arg3(list
, 2);
146 Argument
<A4
> arg4(list
, 3);
149 handler
.Run(arg1
.value(), arg2
.value(), arg3
.value(), arg4
.value());
153 typedef base::Callback
<bool(const base::ListValue
&)> ListValueParser
;
155 ListValueParser
BindToListParser(const base::Callback
<void()>& handler
) {
156 return base::Bind(&ParseAndHandle0
, handler
);
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
);
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",
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
;
261 void DevToolsEmbedderMessageDispatcher::RegisterHandler(
262 const std::string
& method
, const Handler
& handler
) {
263 handlers_
[method
] = handler
;