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

Side by Side Diff: extensions/renderer/api_binding.cc

Issue 2697363003: [Extensions Bindings] Move request dispatch to APIRequestHandler (Closed)
Patch Set: . Created 3 years, 10 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 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "extensions/renderer/api_binding.h" 5 #include "extensions/renderer/api_binding.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
125 CHECK(dict->GetDictionary("properties", &property_dict)); 125 CHECK(dict->GetDictionary("properties", &property_dict));
126 DecorateTemplateWithProperties(isolate, property_template, 126 DecorateTemplateWithProperties(isolate, property_template,
127 *property_dict); 127 *property_dict);
128 object_template->Set(isolate, iter.key().c_str(), property_template); 128 object_template->Set(isolate, iter.key().c_str(), property_template);
129 } 129 }
130 } 130 }
131 } 131 }
132 132
133 } // namespace 133 } // namespace
134 134
135 APIBinding::Request::Request() {}
136 APIBinding::Request::~Request() {}
137
138 struct APIBinding::MethodData { 135 struct APIBinding::MethodData {
139 MethodData(std::string full_name, 136 MethodData(std::string full_name,
140 const base::ListValue& method_signature) 137 const base::ListValue& method_signature)
141 : full_name(std::move(full_name)), 138 : full_name(std::move(full_name)),
142 signature(method_signature) {} 139 signature(method_signature) {}
143 140
144 // The fully-qualified name of this api (e.g. runtime.sendMessage instead of 141 // The fully-qualified name of this api (e.g. runtime.sendMessage instead of
145 // sendMessage). 142 // sendMessage).
146 std::string full_name; 143 std::string full_name;
147 // The expected API signature. 144 // The expected API signature.
(...skipping 19 matching lines...) Expand all
167 // APIBinding, and both the APIBinding and APIEventHandler are owned by the 164 // APIBinding, and both the APIBinding and APIEventHandler are owned by the
168 // same object (the APIBindingsSystem). 165 // same object (the APIBindingsSystem).
169 APIEventHandler* event_handler; 166 APIEventHandler* event_handler;
170 }; 167 };
171 168
172 APIBinding::APIBinding(const std::string& api_name, 169 APIBinding::APIBinding(const std::string& api_name,
173 const base::ListValue* function_definitions, 170 const base::ListValue* function_definitions,
174 const base::ListValue* type_definitions, 171 const base::ListValue* type_definitions,
175 const base::ListValue* event_definitions, 172 const base::ListValue* event_definitions,
176 const base::DictionaryValue* property_definitions, 173 const base::DictionaryValue* property_definitions,
177 const SendRequestMethod& callback,
178 std::unique_ptr<APIBindingHooks> binding_hooks, 174 std::unique_ptr<APIBindingHooks> binding_hooks,
179 APITypeReferenceMap* type_refs, 175 APITypeReferenceMap* type_refs,
180 APIRequestHandler* request_handler, 176 APIRequestHandler* request_handler,
181 APIEventHandler* event_handler) 177 APIEventHandler* event_handler)
182 : api_name_(api_name), 178 : api_name_(api_name),
183 property_definitions_(property_definitions), 179 property_definitions_(property_definitions),
184 method_callback_(callback),
185 binding_hooks_(std::move(binding_hooks)), 180 binding_hooks_(std::move(binding_hooks)),
186 type_refs_(type_refs), 181 type_refs_(type_refs),
187 request_handler_(request_handler), 182 request_handler_(request_handler),
188 weak_factory_(this) { 183 weak_factory_(this) {
189 DCHECK(!method_callback_.is_null());
190
191 // TODO(devlin): It might make sense to instantiate the object_template_ 184 // TODO(devlin): It might make sense to instantiate the object_template_
192 // directly here, which would avoid the need to hold on to 185 // directly here, which would avoid the need to hold on to
193 // |property_definitions_| and |enums_|. However, there are *some* cases where 186 // |property_definitions_| and |enums_|. However, there are *some* cases where
194 // we don't immediately stamp out an API from the template following 187 // we don't immediately stamp out an API from the template following
195 // construction. 188 // construction.
196 189
197 if (function_definitions) { 190 if (function_definitions) {
198 for (const auto& func : *function_definitions) { 191 for (const auto& func : *function_definitions) {
199 const base::DictionaryValue* func_dict = nullptr; 192 const base::DictionaryValue* func_dict = nullptr;
200 CHECK(func->GetAsDictionary(&func_dict)); 193 CHECK(func->GetAsDictionary(&func_dict));
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 DCHECK(!converted_arguments); 404 DCHECK(!converted_arguments);
412 try_catch.ReThrow(); 405 try_catch.ReThrow();
413 return; 406 return;
414 } 407 }
415 } 408 }
416 if (invalid_invocation) { 409 if (invalid_invocation) {
417 arguments->ThrowTypeError("Invalid invocation"); 410 arguments->ThrowTypeError("Invalid invocation");
418 return; 411 return;
419 } 412 }
420 413
421 auto request = base::MakeUnique<Request>(); 414 request_handler_->StartRequest(context, name, std::move(converted_arguments),
422 if (!callback.IsEmpty()) { 415 callback, custom_callback);
423 // In the JS bindings, custom callbacks are called with the arguments of
424 // name, the full request object (see below), the original callback, and
425 // the responses from the API. The responses from the API are handled by the
426 // APIRequestHandler, but we need to curry in the other values.
427 std::vector<v8::Local<v8::Value>> callback_args;
428 if (!custom_callback.IsEmpty()) {
429 // TODO(devlin): The |request| object in the JS bindings includes
430 // properties for callback, callbackSchema, args, stack, id, and
431 // customCallback. Of those, it appears that we only use stack, args, and
432 // id (since callback is curried in separately). We may be able to update
433 // bindings to get away from some of those. For now, just pass in an empty
434 // object (most APIs don't rely on it).
435 v8::Local<v8::Object> request = v8::Object::New(isolate);
436 callback_args = { gin::StringToSymbol(isolate, name), request, callback };
437 callback = custom_callback;
438 }
439 request->request_id = request_handler_->AddPendingRequest(
440 isolate, callback, context, callback_args);
441 request->has_callback = true;
442 }
443 request->has_user_gesture =
444 blink::WebUserGestureIndicator::isProcessingUserGestureThreadSafe();
445 request->arguments = std::move(converted_arguments);
446 request->method_name = name;
447
448 method_callback_.Run(std::move(request), context);
449 } 416 }
450 417
451 } // namespace extensions 418 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698