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

Side by Side Diff: third_party/WebKit/Source/platform/inspector_protocol/Dispatcher_cpp.template

Issue 1967933002: [DevTools] Dispatch messages to V8InspectorSession directly. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@1936593002
Patch Set: rebased Created 4 years, 7 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
OLDNEW
1 // This file is generated 1 // This file is generated
2 2
3 // Copyright (c) 2016 The Chromium Authors. All rights reserved. 3 // Copyright (c) 2016 The Chromium Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style license that can be 4 // Use of this source code is governed by a BSD-style license that can be
5 // found in the LICENSE file. 5 // found in the LICENSE file.
6 6
7 #include "platform/inspector_protocol/{{class_name}}.h" 7 #include "platform/inspector_protocol/{{class_name}}.h"
8 8
9 #include "platform/inspector_protocol/Collections.h" 9 #include "platform/inspector_protocol/Collections.h"
10 #include "platform/inspector_protocol/FrontendChannel.h" 10 #include "platform/inspector_protocol/FrontendChannel.h"
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 m_weakPtrs.clear(); 63 m_weakPtrs.clear();
64 } 64 }
65 65
66 PassOwnPtr<DispatcherImplWeakPtr> weakPtr() 66 PassOwnPtr<DispatcherImplWeakPtr> weakPtr()
67 { 67 {
68 OwnPtr<DispatcherImplWeakPtr> weak = adoptPtr(new DispatcherImplWeakPtr( this)); 68 OwnPtr<DispatcherImplWeakPtr> weak = adoptPtr(new DispatcherImplWeakPtr( this));
69 m_weakPtrs.add(weak.get()); 69 m_weakPtrs.add(weak.get());
70 return weak; 70 return weak;
71 } 71 }
72 72
73 virtual void dispatch(int sessionId, const String16& message); 73 virtual void dispatch(const String16& message);
74 virtual void reportProtocolError(int sessionId, int callId, CommonErrorCode, const String16& errorMessage, ErrorSupport* errors) const; 74 virtual void reportProtocolError(int callId, CommonErrorCode, const String16 & errorMessage, ErrorSupport* errors) const;
75 using Dispatcher::reportProtocolError; 75 using Dispatcher::reportProtocolError;
76 76
77 void sendResponse(int sessionId, int callId, const ErrorString& invocationEr ror, ErrorSupport* errors, PassOwnPtr<protocol::DictionaryValue> result); 77 void sendResponse(int callId, const ErrorString& invocationError, ErrorSuppo rt* errors, PassOwnPtr<protocol::DictionaryValue> result);
78 78
79 {% for domain in api.domains %} 79 {% for domain in api.domains %}
80 virtual void registerAgent(blink::protocol::Backend::{{domain.domain}}* agen t) { DCHECK(!m_{{domain.domain | lower}}Agent); m_{{domain.domain | lower}}Agent = agent; } 80 virtual void registerAgent(blink::protocol::Backend::{{domain.domain}}* agen t) { DCHECK(!m_{{domain.domain | lower}}Agent); m_{{domain.domain | lower}}Agent = agent; }
81 {% endfor %} 81 {% endfor %}
82 82
83 private: 83 private:
84 friend class DispatcherCallbackBase; 84 friend class DispatcherCallbackBase;
85 friend class DispatcherImplWeakPtr; 85 friend class DispatcherImplWeakPtr;
86 using CallHandler = void (DispatcherImpl::*)(int sessionId, int callId, Pass OwnPtr<DictionaryValue> messageObject, ErrorSupport* errors); 86 using CallHandler = void (DispatcherImpl::*)(int callId, PassOwnPtr<Dictiona ryValue> messageObject, ErrorSupport* errors);
87 using DispatchMap = protocol::HashMap<String16, CallHandler>; 87 using DispatchMap = protocol::HashMap<String16, CallHandler>;
88 88
89 {% for domain in api.domains %} 89 {% for domain in api.domains %}
90 {% for command in domain.commands %} 90 {% for command in domain.commands %}
91 {% if "redirect" in command %}{% continue %}{% endif %} 91 {% if "redirect" in command %}{% continue %}{% endif %}
92 {% if "handlers" in command and not ("renderer" in command["handlers"]) %}{% continue %}{% endif %} 92 {% if "handlers" in command and not ("renderer" in command["handlers"]) %}{% continue %}{% endif %}
93 void {{domain.domain}}_{{command.name}}(int sessionId, int callId, PassOwnPt r<DictionaryValue> requestMessageObject, ErrorSupport*); 93 void {{domain.domain}}_{{command.name}}(int callId, PassOwnPtr<DictionaryVal ue> requestMessageObject, ErrorSupport*);
94 {% endfor %} 94 {% endfor %}
95 {% endfor %} 95 {% endfor %}
96 96
97 FrontendChannel* m_frontendChannel; 97 FrontendChannel* m_frontendChannel;
98 98
99 {% for domain in api.domains %} 99 {% for domain in api.domains %}
100 Backend::{{domain.domain}}* m_{{domain.domain | lower}}Agent; 100 Backend::{{domain.domain}}* m_{{domain.domain | lower}}Agent;
101 {% endfor %} 101 {% endfor %}
102 102
103 void sendResponse(int sessionId, int callId, ErrorString invocationError, Pa ssOwnPtr<protocol::DictionaryValue> result) 103 void sendResponse(int callId, ErrorString invocationError, PassOwnPtr<protoc ol::DictionaryValue> result)
104 { 104 {
105 sendResponse(sessionId, callId, invocationError, nullptr, std::move(resu lt)); 105 sendResponse(callId, invocationError, nullptr, std::move(result));
106 } 106 }
107 107
108 void sendResponse(int sessionId, int callId, ErrorString invocationError) 108 void sendResponse(int callId, ErrorString invocationError)
109 { 109 {
110 sendResponse(sessionId, callId, invocationError, nullptr, DictionaryValu e::create()); 110 sendResponse(callId, invocationError, nullptr, DictionaryValue::create() );
111 } 111 }
112 112
113 static const char kInvalidRequest[]; 113 static const char kInvalidRequest[];
114 114
115 DispatchMap m_dispatchMap; 115 DispatchMap m_dispatchMap;
116 protocol::Vector<int> m_commonErrors; 116 protocol::Vector<int> m_commonErrors;
117 protocol::HashSet<DispatcherImplWeakPtr*> m_weakPtrs; 117 protocol::HashSet<DispatcherImplWeakPtr*> m_weakPtrs;
118 }; 118 };
119 119
120 class PLATFORM_EXPORT DispatcherCallbackBase : public protocol::Backend::Callbac kBase { 120 class PLATFORM_EXPORT DispatcherCallbackBase : public protocol::Backend::Callbac kBase {
121 public: 121 public:
122 DispatcherCallbackBase(PassOwnPtr<DispatcherImplWeakPtr> backendImpl, int se ssionId, int id) 122 DispatcherCallbackBase(PassOwnPtr<DispatcherImplWeakPtr> backendImpl, int ca llId)
123 : m_backendImpl(std::move(backendImpl)), m_sessionId(sessionId), m_id(id ) { } 123 : m_backendImpl(std::move(backendImpl)), m_callId(callId) { }
124 virtual ~DispatcherCallbackBase() { } 124 virtual ~DispatcherCallbackBase() { }
125 void dispose() { m_backendImpl = nullptr; } 125 void dispose() { m_backendImpl = nullptr; }
126 126
127 protected: 127 protected:
128 void sendIfActive(PassOwnPtr<protocol::DictionaryValue> partialMessage, cons t ErrorString& invocationError) 128 void sendIfActive(PassOwnPtr<protocol::DictionaryValue> partialMessage, cons t ErrorString& invocationError)
129 { 129 {
130 if (!m_backendImpl->get()) 130 if (!m_backendImpl->get())
131 return; 131 return;
132 m_backendImpl->get()->sendResponse(m_sessionId, m_id, invocationError, n ullptr, std::move(partialMessage)); 132 m_backendImpl->get()->sendResponse(m_callId, invocationError, nullptr, s td::move(partialMessage));
133 m_backendImpl = nullptr; 133 m_backendImpl = nullptr;
134 } 134 }
135 135
136 private: 136 private:
137 OwnPtr<DispatcherImplWeakPtr> m_backendImpl; 137 OwnPtr<DispatcherImplWeakPtr> m_backendImpl;
138 int m_sessionId; 138 int m_callId;
139 int m_id;
140 }; 139 };
141 140
142 DispatcherImplWeakPtr::~DispatcherImplWeakPtr() 141 DispatcherImplWeakPtr::~DispatcherImplWeakPtr()
143 { 142 {
144 if (m_dispatcher) 143 if (m_dispatcher)
145 m_dispatcher->m_weakPtrs.remove(this); 144 m_dispatcher->m_weakPtrs.remove(this);
146 } 145 }
147 146
148 const char DispatcherImpl::kInvalidRequest[] = "Invalid request"; 147 const char DispatcherImpl::kInvalidRequest[] = "Invalid request";
149 148
150 {% for domain in api.domains %} 149 {% for domain in api.domains %}
151 {% for command in domain.commands %} 150 {% for command in domain.commands %}
152 {% if "redirect" in command %}{% continue %}{% endif %} 151 {% if "redirect" in command %}{% continue %}{% endif %}
153 {% if "handlers" in command and not ("renderer" in command["handlers"]) %}{% continue %}{% endif %} 152 {% if "handlers" in command and not ("renderer" in command["handlers"]) %}{% continue %}{% endif %}
154 153
155 {% if "async" in command %} 154 {% if "async" in command %}
156 155
157 class PLATFORM_EXPORT {{domain.domain}}{{command.name | to_title_case}}Callback : public Backend::{{domain.domain}}::{{command.name | to_title_case}}Callback, p ublic DispatcherCallbackBase { 156 class PLATFORM_EXPORT {{domain.domain}}{{command.name | to_title_case}}Callback : public Backend::{{domain.domain}}::{{command.name | to_title_case}}Callback, p ublic DispatcherCallbackBase {
158 public: 157 public:
159 {{domain.domain}}{{command.name | to_title_case}}Callback(PassOwnPtr<Dispatc herImplWeakPtr> backendImpl, int sessionId, int id) 158 {{domain.domain}}{{command.name | to_title_case}}Callback(PassOwnPtr<Dispatc herImplWeakPtr> backendImpl, int callId)
160 : DispatcherCallbackBase(std::move(backendImpl), sessionId, id) { } 159 : DispatcherCallbackBase(std::move(backendImpl), callId) { }
161 160
162 void sendSuccess( 161 void sendSuccess(
163 {%- for parameter in command.returns -%} 162 {%- for parameter in command.returns -%}
164 {%- if "optional" in parameter -%} 163 {%- if "optional" in parameter -%}
165 const Maybe<{{resolve_type(parameter).raw_type}}>& {{parameter.name}} 164 const Maybe<{{resolve_type(parameter).raw_type}}>& {{parameter.name}}
166 {%- else -%} 165 {%- else -%}
167 {{resolve_type(parameter).pass_type}} {{parameter.name}} 166 {{resolve_type(parameter).pass_type}} {{parameter.name}}
168 {%- endif -%} 167 {%- endif -%}
169 {%- if not loop.last -%}, {% endif -%} 168 {%- if not loop.last -%}, {% endif -%}
170 {%- endfor -%}) override 169 {%- endfor -%}) override
(...skipping 11 matching lines...) Expand all
182 } 181 }
183 182
184 void sendFailure(const ErrorString& error) override 183 void sendFailure(const ErrorString& error) override
185 { 184 {
186 DCHECK(error.length()); 185 DCHECK(error.length());
187 sendIfActive(nullptr, error); 186 sendIfActive(nullptr, error);
188 } 187 }
189 }; 188 };
190 {% endif %} 189 {% endif %}
191 190
192 void DispatcherImpl::{{domain.domain}}_{{command.name}}(int sessionId, int callI d, PassOwnPtr<DictionaryValue> requestMessageObject, ErrorSupport* errors) 191 void DispatcherImpl::{{domain.domain}}_{{command.name}}(int callId, PassOwnPtr<D ictionaryValue> requestMessageObject, ErrorSupport* errors)
193 { 192 {
194 if (!m_{{domain.domain | lower}}Agent) 193 if (!m_{{domain.domain | lower}}Agent)
195 errors->addError("{{domain.domain}} handler is not available."); 194 errors->addError("{{domain.domain}} handler is not available.");
196 195
197 if (errors->hasErrors()) { 196 if (errors->hasErrors()) {
198 reportProtocolError(sessionId, callId, InvalidParams, kInvalidRequest, e rrors); 197 reportProtocolError(callId, InvalidParams, kInvalidRequest, errors);
199 return; 198 return;
200 } 199 }
201 {% if "parameters" in command %} 200 {% if "parameters" in command %}
202 201
203 // Prepare input parameters. 202 // Prepare input parameters.
204 protocol::DictionaryValue* object = DictionaryValue::cast(requestMessageObje ct->get("params")); 203 protocol::DictionaryValue* object = DictionaryValue::cast(requestMessageObje ct->get("params"));
205 errors->push(); 204 errors->push();
206 {% for property in command.parameters %} 205 {% for property in command.parameters %}
207 protocol::Value* {{property.name}}Value = object ? object->get("{{property.n ame}}") : nullptr; 206 protocol::Value* {{property.name}}Value = object ? object->get("{{property.n ame}}") : nullptr;
208 {% if property.optional %} 207 {% if property.optional %}
209 Maybe<{{resolve_type(property).raw_type}}> in_{{property.name}}; 208 Maybe<{{resolve_type(property).raw_type}}> in_{{property.name}};
210 if ({{property.name}}Value) { 209 if ({{property.name}}Value) {
211 errors->setName("{{property.name}}"); 210 errors->setName("{{property.name}}");
212 in_{{property.name}} = FromValue<{{resolve_type(property).raw_type}}>::p arse({{property.name}}Value, errors); 211 in_{{property.name}} = FromValue<{{resolve_type(property).raw_type}}>::p arse({{property.name}}Value, errors);
213 } 212 }
214 {% else %} 213 {% else %}
215 errors->setName("{{property.name}}"); 214 errors->setName("{{property.name}}");
216 {{resolve_type(property).type}} in_{{property.name}} = FromValue<{{resolve_t ype(property).raw_type}}>::parse({{property.name}}Value, errors); 215 {{resolve_type(property).type}} in_{{property.name}} = FromValue<{{resolve_t ype(property).raw_type}}>::parse({{property.name}}Value, errors);
217 {% endif %} 216 {% endif %}
218 {% endfor %} 217 {% endfor %}
219 errors->pop(); 218 errors->pop();
220 if (errors->hasErrors()) { 219 if (errors->hasErrors()) {
221 reportProtocolError(sessionId, callId, InvalidParams, kInvalidRequest, e rrors); 220 reportProtocolError(callId, InvalidParams, kInvalidRequest, errors);
222 return; 221 return;
223 } 222 }
224 {% endif %} 223 {% endif %}
225 224
226 {% if "async" in command %} 225 {% if "async" in command %}
227 OwnPtr<{{domain.domain}}{{command.name | to_title_case}}Callback> callback = adoptPtr(new {{domain.domain}}{{command.name | to_title_case}}Callback(weakPtr( ), sessionId, callId)); 226 OwnPtr<{{domain.domain}}{{command.name | to_title_case}}Callback> callback = adoptPtr(new {{domain.domain}}{{command.name | to_title_case}}Callback(weakPtr( ), callId));
228 {% elif "returns" in command %} 227 {% elif "returns" in command %}
229 // Declare output parameters. 228 // Declare output parameters.
230 OwnPtr<protocol::DictionaryValue> result = DictionaryValue::create(); 229 OwnPtr<protocol::DictionaryValue> result = DictionaryValue::create();
231 {% for property in command.returns %} 230 {% for property in command.returns %}
232 {% if "optional" in property %} 231 {% if "optional" in property %}
233 Maybe<{{resolve_type(property).raw_type}}> out_{{property.name}}; 232 Maybe<{{resolve_type(property).raw_type}}> out_{{property.name}};
234 {% else %} 233 {% else %}
235 {{resolve_type(property).type}} out_{{property.name}}; 234 {{resolve_type(property).type}} out_{{property.name}};
236 {% endif %} 235 {% endif %}
237 {% endfor %} 236 {% endfor %}
(...skipping 21 matching lines...) Expand all
259 {% for parameter in command.returns %} 258 {% for parameter in command.returns %}
260 {% if "optional" in parameter %} 259 {% if "optional" in parameter %}
261 if (out_{{parameter.name}}.isJust()) 260 if (out_{{parameter.name}}.isJust())
262 result->setValue("{{parameter.name}}", toValue(out_{{parameter.name} }.fromJust())); 261 result->setValue("{{parameter.name}}", toValue(out_{{parameter.name} }.fromJust()));
263 {% else %} 262 {% else %}
264 result->setValue("{{parameter.name}}", toValue({{resolve_type(parameter) .to_raw_type % ("out_" + parameter.name)}})); 263 result->setValue("{{parameter.name}}", toValue({{resolve_type(parameter) .to_raw_type % ("out_" + parameter.name)}}));
265 {% endif %} 264 {% endif %}
266 {% endfor %} 265 {% endfor %}
267 } 266 }
268 if (weak->get()) 267 if (weak->get())
269 weak->get()->sendResponse(sessionId, callId, error, std::move(result)); 268 weak->get()->sendResponse(callId, error, std::move(result));
270 {% elif not("async" in command) %} 269 {% elif not("async" in command) %}
271 if (weak->get()) 270 if (weak->get())
272 weak->get()->sendResponse(sessionId, callId, error); 271 weak->get()->sendResponse(callId, error);
273 {% endif %} 272 {% endif %}
274 } 273 }
275 {% endfor %} 274 {% endfor %}
276 {% endfor %} 275 {% endfor %}
277 276
278 PassOwnPtr<Dispatcher> Dispatcher::create(FrontendChannel* frontendChannel) 277 PassOwnPtr<Dispatcher> Dispatcher::create(FrontendChannel* frontendChannel)
279 { 278 {
280 return adoptPtr(new DispatcherImpl(frontendChannel)); 279 return adoptPtr(new DispatcherImpl(frontendChannel));
281 } 280 }
282 281
283 void DispatcherImpl::dispatch(int sessionId, const String16& message) 282 void DispatcherImpl::dispatch(const String16& message)
284 { 283 {
285 int callId = 0; 284 int callId = 0;
286 OwnPtr<protocol::Value> parsedMessage = parseJSON(message); 285 OwnPtr<protocol::Value> parsedMessage = parseJSON(message);
287 DCHECK(parsedMessage); 286 DCHECK(parsedMessage);
288 OwnPtr<protocol::DictionaryValue> messageObject = DictionaryValue::cast(std: :move(parsedMessage)); 287 OwnPtr<protocol::DictionaryValue> messageObject = DictionaryValue::cast(std: :move(parsedMessage));
289 DCHECK(messageObject); 288 DCHECK(messageObject);
290 289
291 protocol::Value* callIdValue = messageObject->get("id"); 290 protocol::Value* callIdValue = messageObject->get("id");
292 bool success = callIdValue->asNumber(&callId); 291 bool success = callIdValue->asNumber(&callId);
293 DCHECK(success); 292 DCHECK(success);
294 293
295 protocol::Value* methodValue = messageObject->get("method"); 294 protocol::Value* methodValue = messageObject->get("method");
296 String16 method; 295 String16 method;
297 success = methodValue && methodValue->asString(&method); 296 success = methodValue && methodValue->asString(&method);
298 DCHECK(success); 297 DCHECK(success);
299 298
300 protocol::HashMap<String16, CallHandler>::iterator it = m_dispatchMap.find(m ethod); 299 protocol::HashMap<String16, CallHandler>::iterator it = m_dispatchMap.find(m ethod);
301 if (it == m_dispatchMap.end()) { 300 if (it == m_dispatchMap.end()) {
302 reportProtocolError(sessionId, callId, MethodNotFound, "'" + method + "' wasn't found"); 301 reportProtocolError(callId, MethodNotFound, "'" + method + "' wasn't fou nd");
303 return; 302 return;
304 } 303 }
305 304
306 protocol::ErrorSupport errors; 305 protocol::ErrorSupport errors;
307 ((*this).*(*it->second))(sessionId, callId, std::move(messageObject), &error s); 306 ((*this).*(*it->second))(callId, std::move(messageObject), &errors);
308 } 307 }
309 308
310 void DispatcherImpl::sendResponse(int sessionId, int callId, const ErrorString& invocationError, ErrorSupport* errors, PassOwnPtr<protocol::DictionaryValue> res ult) 309 void DispatcherImpl::sendResponse(int callId, const ErrorString& invocationError , ErrorSupport* errors, PassOwnPtr<protocol::DictionaryValue> result)
311 { 310 {
312 if (invocationError.length() || (errors && errors->hasErrors())) { 311 if (invocationError.length() || (errors && errors->hasErrors())) {
313 reportProtocolError(sessionId, callId, ServerError, invocationError, err ors); 312 reportProtocolError(callId, ServerError, invocationError, errors);
314 return; 313 return;
315 } 314 }
316 315
317 OwnPtr<protocol::DictionaryValue> responseMessage = DictionaryValue::create( ); 316 OwnPtr<protocol::DictionaryValue> responseMessage = DictionaryValue::create( );
318 responseMessage->setNumber("id", callId); 317 responseMessage->setNumber("id", callId);
319 responseMessage->setObject("result", std::move(result)); 318 responseMessage->setObject("result", std::move(result));
320 if (m_frontendChannel) 319 if (m_frontendChannel)
321 m_frontendChannel->sendProtocolResponse(sessionId, callId, std::move(res ponseMessage)); 320 m_frontendChannel->sendProtocolResponse(callId, responseMessage->toJSONS tring());
322 } 321 }
323 322
324 void Dispatcher::reportProtocolError(int sessionId, int callId, CommonErrorCode code, const String16& errorMessage) const 323 void Dispatcher::reportProtocolError(int callId, CommonErrorCode code, const Str ing16& errorMessage) const
325 { 324 {
326 ErrorSupport errors; 325 ErrorSupport errors;
327 reportProtocolError(sessionId, callId, code, errorMessage, &errors); 326 reportProtocolError(callId, code, errorMessage, &errors);
328 } 327 }
329 328
330 void DispatcherImpl::reportProtocolError(int sessionId, int callId, CommonErrorC ode code, const String16& errorMessage, ErrorSupport* errors) const 329 void DispatcherImpl::reportProtocolError(int callId, CommonErrorCode code, const String16& errorMessage, ErrorSupport* errors) const
331 { 330 {
332 DCHECK(code >=0); 331 DCHECK(code >=0);
333 DCHECK((unsigned)code < m_commonErrors.size()); 332 DCHECK((unsigned)code < m_commonErrors.size());
334 DCHECK(m_commonErrors[code]); 333 DCHECK(m_commonErrors[code]);
335 OwnPtr<protocol::DictionaryValue> error = DictionaryValue::create(); 334 OwnPtr<protocol::DictionaryValue> error = DictionaryValue::create();
336 error->setNumber("code", m_commonErrors[code]); 335 error->setNumber("code", m_commonErrors[code]);
337 error->setString("message", errorMessage); 336 error->setString("message", errorMessage);
338 DCHECK(error); 337 DCHECK(error);
339 if (errors && errors->hasErrors()) 338 if (errors && errors->hasErrors())
340 error->setString("data", errors->errors()); 339 error->setString("data", errors->errors());
341 OwnPtr<protocol::DictionaryValue> message = DictionaryValue::create(); 340 OwnPtr<protocol::DictionaryValue> message = DictionaryValue::create();
342 message->setObject("error", std::move(error)); 341 message->setObject("error", std::move(error));
343 message->setNumber("id", callId); 342 message->setNumber("id", callId);
344 if (m_frontendChannel) 343 if (m_frontendChannel)
345 m_frontendChannel->sendProtocolResponse(sessionId, callId, std::move(mes sage)); 344 m_frontendChannel->sendProtocolResponse(callId, message->toJSONString()) ;
346 } 345 }
347 346
348 bool Dispatcher::getCommandName(const String16& message, String16* result) 347 bool Dispatcher::getCommandName(const String16& message, String16* result)
349 { 348 {
350 OwnPtr<protocol::Value> value = parseJSON(message); 349 OwnPtr<protocol::Value> value = parseJSON(message);
351 if (!value) 350 if (!value)
352 return false; 351 return false;
353 352
354 protocol::DictionaryValue* object = DictionaryValue::cast(value.get()); 353 protocol::DictionaryValue* object = DictionaryValue::cast(value.get());
355 if (!object) 354 if (!object)
356 return false; 355 return false;
357 356
358 if (!object->getString("method", result)) 357 if (!object->getString("method", result))
359 return false; 358 return false;
360 359
361 return true; 360 return true;
362 } 361 }
363 362
364 } // namespace protocol 363 } // namespace protocol
365 } // namespace blink 364 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698