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

Side by Side Diff: chrome/browser/devtools/devtools_embedder_message_dispatcher.cc

Issue 22972007: Migrate DevToolsWindow from specific to opaque frontend host messages (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 7 years, 3 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 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.
4
5 #include "chrome/browser/devtools/devtools_embedder_message_dispatcher.h"
6
7 #include "base/bind.h"
8 #include "base/json/json_reader.h"
9 #include "base/values.h"
10
11 namespace {
12
13 static const char kFrontendHostMethod[] = "method";
14 static const char kFrontendHostParams[] = "params";
15
16 bool GetValue(const base::ListValue& list, int pos, std::string& value) {
17 return list.GetString(pos, &value);
18 }
19
20 bool GetValue(const base::ListValue& list, int pos, int& value) {
21 return list.GetInteger(pos, &value);
22 }
23
24 bool GetValue(const base::ListValue& list, int pos, bool& value) {
25 return list.GetBoolean(pos, &value);
26 }
27
28 template <typename T>
29 struct StorageTraits {
30 typedef T StorageType;
31 };
32
33 template <typename T>
34 struct StorageTraits<const T&> {
35 typedef T StorageType;
36 };
37
38 template <class A>
39 class Argument {
40 public:
41 typedef typename StorageTraits<A>::StorageType ValueType;
42
43 Argument(const base::ListValue& list, int pos) {
44 valid_ = GetValue(list, pos, value_);
45 }
46
47 ValueType value() const { return value_; }
48 bool valid() const { return valid_; }
49
50 private:
51 ValueType value_;
52 bool valid_;
53 };
54
55 bool ParseAndHandle0(const base::Callback<void(void)>& handler,
56 const base::ListValue& list) {
57 handler.Run();
58 return true;
59 }
60
61 template <class A1>
62 bool ParseAndHandle1(const base::Callback<void(A1)>& handler,
63 const base::ListValue& list) {
64 if (list.GetSize() != 1)
65 return false;
66 Argument<A1> arg1(list, 0);
67 if (!arg1.valid())
68 return false;
69 handler.Run(arg1.value());
70 return true;
71 }
72
73 template <class A1, class A2>
74 bool ParseAndHandle2(const base::Callback<void(A1, A2)>& handler,
75 const base::ListValue& list) {
76 if (list.GetSize() != 2)
77 return false;
78 Argument<A1> arg1(list, 0);
79 if (!arg1.valid())
80 return false;
81 Argument<A2> arg2(list, 1);
82 if (!arg2.valid())
83 return false;
84 handler.Run(arg1.value(), arg2.value());
85 return true;
86 }
87
88 template <class A1, class A2, class A3>
89 bool ParseAndHandle3(const base::Callback<void(A1, A2, A3)>& handler,
90 const base::ListValue& list) {
91 if (list.GetSize() != 3)
92 return false;
93 Argument<A1> arg1(list, 0);
94 if (!arg1.valid())
95 return false;
96 Argument<A2> arg2(list, 1);
97 if (!arg2.valid())
98 return false;
99 Argument<A3> arg3(list, 2);
100 if (!arg3.valid())
101 return false;
102 handler.Run(arg1.value(), arg2.value(), arg3.value());
103 return true;
104 }
105
106 typedef base::Callback<bool(const base::ListValue&)> ListValueParser;
107
108 ListValueParser BindToListParser(const base::Callback<void()>& handler) {
109 return base::Bind(&ParseAndHandle0, handler);
110 }
111
112 template <class A1>
113 ListValueParser BindToListParser(const base::Callback<void(A1)>& handler) {
114 return base::Bind(&ParseAndHandle1<A1>, handler);
115 }
116
117 template <class A1, class A2>
118 ListValueParser BindToListParser(const base::Callback<void(A1,A2)>& handler) {
119 return base::Bind(&ParseAndHandle2<A1, A2>, handler);
120 }
121
122 template <class A1, class A2, class A3>
123 ListValueParser BindToListParser(
124 const base::Callback<void(A1,A2,A3)>& handler) {
125 return base::Bind(&ParseAndHandle3<A1, A2, A3>, handler);
126 }
127
128 } // namespace
129
130 DevToolsEmbedderMessageDispatcher::DevToolsEmbedderMessageDispatcher(
131 Delegate* delegate) {
132 RegisterHandler("bringToFront",
133 BindToListParser(base::Bind(&Delegate::ActivateWindow,
134 base::Unretained(delegate))));
135 RegisterHandler("closeWindow",
136 BindToListParser(base::Bind(&Delegate::CloseWindow,
137 base::Unretained(delegate))));
138 RegisterHandler("moveWindowBy",
139 BindToListParser(base::Bind(&Delegate::MoveWindow,
140 base::Unretained(delegate))));
141 RegisterHandler("requestSetDockSide",
142 BindToListParser(base::Bind(&Delegate::SetDockSide,
143 base::Unretained(delegate))));
144 RegisterHandler("openInNewTab",
145 BindToListParser(base::Bind(&Delegate::OpenInNewTab,
146 base::Unretained(delegate))));
147 RegisterHandler("save",
148 BindToListParser(base::Bind(&Delegate::SaveToFile,
149 base::Unretained(delegate))));
150 RegisterHandler("append",
151 BindToListParser(base::Bind(&Delegate::AppendToFile,
152 base::Unretained(delegate))));
153 RegisterHandler("requestFileSystems",
154 BindToListParser(base::Bind(&Delegate::RequestFileSystems,
155 base::Unretained(delegate))));
156 RegisterHandler("addFileSystem",
157 BindToListParser(base::Bind(&Delegate::AddFileSystem,
158 base::Unretained(delegate))));
159 RegisterHandler("removeFileSystem",
160 BindToListParser(base::Bind(&Delegate::RemoveFileSystem,
161 base::Unretained(delegate))));
162 RegisterHandler("indexPath",
163 BindToListParser(base::Bind(&Delegate::IndexPath,
164 base::Unretained(delegate))));
165 RegisterHandler("stopIndexing",
166 BindToListParser(base::Bind(&Delegate::StopIndexing,
167 base::Unretained(delegate))));
168 RegisterHandler("searchInPath",
169 BindToListParser(base::Bind(&Delegate::SearchInPath,
170 base::Unretained(delegate))));
171 }
172
173 DevToolsEmbedderMessageDispatcher::~DevToolsEmbedderMessageDispatcher() {}
174
175 void DevToolsEmbedderMessageDispatcher::Dispatch(const std::string& message) {
176 std::string method;
177 base::ListValue empty_params;
178 base::ListValue* params = &empty_params;
179
180 base::DictionaryValue* dict;
181 scoped_ptr<base::Value> parsed_message(base::JSONReader::Read(message));
182 if (!parsed_message ||
183 !parsed_message->GetAsDictionary(&dict) ||
184 !dict->GetString(kFrontendHostMethod, &method) ||
185 (dict->HasKey(kFrontendHostParams) &&
186 !dict->GetList(kFrontendHostParams, &params))) {
187 LOG(ERROR) << "Cannot parse frontend host message: " << message;
188 return;
189 }
190
191 HandlerMap::iterator it = handlers_.find(method);
192 if (it == handlers_.end()) {
193 LOG(ERROR) << "Unsupported frontend host method: " << message;
194 return;
195 }
196
197 if (!it->second.Run(*params))
198 LOG(ERROR) << "Invalid frontend host message parameters: " << message;
199 }
200
201 void DevToolsEmbedderMessageDispatcher::RegisterHandler(
202 const std::string& method, const Handler& handler) {
203 handlers_[method] = handler;
204 }
OLDNEW
« no previous file with comments | « chrome/browser/devtools/devtools_embedder_message_dispatcher.h ('k') | chrome/browser/devtools/devtools_window.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698