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

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

Issue 2727583004: [Extensions Bindings] Add a registerEventArgumentMassager (Closed)
Patch Set: . Created 3 years, 9 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
« no previous file with comments | « extensions/renderer/api_binding_bridge.h ('k') | extensions/renderer/api_bindings_system.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_bridge.h" 5 #include "extensions/renderer/api_binding_bridge.h"
6 6
7 #include "base/values.h" 7 #include "base/values.h"
8 #include "extensions/renderer/api_binding_hooks.h" 8 #include "extensions/renderer/api_binding_hooks.h"
9 #include "extensions/renderer/api_event_handler.h"
9 #include "extensions/renderer/api_request_handler.h" 10 #include "extensions/renderer/api_request_handler.h"
10 #include "extensions/renderer/api_signature.h" 11 #include "extensions/renderer/api_signature.h"
11 #include "extensions/renderer/api_type_reference_map.h" 12 #include "extensions/renderer/api_type_reference_map.h"
12 #include "gin/converter.h" 13 #include "gin/converter.h"
13 #include "gin/object_template_builder.h" 14 #include "gin/object_template_builder.h"
14 15
15 namespace extensions { 16 namespace extensions {
16 17
17 namespace { 18 namespace {
18 19
19 const char kApiObjectKey[] = "extensions::bridge::api_object"; 20 const char kApiObjectKey[] = "extensions::bridge::api_object";
20 const char kHookInterfaceKey[] = "extensions::bridge::hook_object"; 21 const char kHookInterfaceKey[] = "extensions::bridge::hook_object";
21 22
22 v8::Local<v8::Private> GetPrivatePropertyName(v8::Isolate* isolate, 23 v8::Local<v8::Private> GetPrivatePropertyName(v8::Isolate* isolate,
23 const char* key) { 24 const char* key) {
24 return v8::Private::ForApi(isolate, gin::StringToSymbol(isolate, key)); 25 return v8::Private::ForApi(isolate, gin::StringToSymbol(isolate, key));
25 } 26 }
26 27
27 } // namespace 28 } // namespace
28 29
29 gin::WrapperInfo APIBindingBridge::kWrapperInfo = {gin::kEmbedderNativeGin}; 30 gin::WrapperInfo APIBindingBridge::kWrapperInfo = {gin::kEmbedderNativeGin};
30 31
31 APIBindingBridge::APIBindingBridge(const APITypeReferenceMap* type_refs, 32 APIBindingBridge::APIBindingBridge(const APITypeReferenceMap* type_refs,
32 APIRequestHandler* request_handler, 33 APIRequestHandler* request_handler,
34 APIEventHandler* event_handler,
33 APIBindingHooks* hooks, 35 APIBindingHooks* hooks,
34 v8::Local<v8::Context> context, 36 v8::Local<v8::Context> context,
35 v8::Local<v8::Value> api_object, 37 v8::Local<v8::Value> api_object,
36 const std::string& extension_id, 38 const std::string& extension_id,
37 const std::string& context_type, 39 const std::string& context_type,
38 const binding::RunJSFunction& run_js) 40 const binding::RunJSFunction& run_js)
39 : type_refs_(type_refs), 41 : type_refs_(type_refs),
40 request_handler_(request_handler), 42 request_handler_(request_handler),
43 event_handler_(event_handler),
41 hooks_(hooks), 44 hooks_(hooks),
42 extension_id_(extension_id), 45 extension_id_(extension_id),
43 context_type_(context_type), 46 context_type_(context_type),
44 run_js_(run_js) { 47 run_js_(run_js) {
45 v8::Isolate* isolate = context->GetIsolate(); 48 v8::Isolate* isolate = context->GetIsolate();
46 v8::Local<v8::Object> wrapper = GetWrapper(isolate); 49 v8::Local<v8::Object> wrapper = GetWrapper(isolate);
47 v8::Maybe<bool> result = wrapper->SetPrivate( 50 v8::Maybe<bool> result = wrapper->SetPrivate(
48 context, GetPrivatePropertyName(isolate, kApiObjectKey), api_object); 51 context, GetPrivatePropertyName(isolate, kApiObjectKey), api_object);
49 if (!result.IsJust() || !result.FromJust()) { 52 if (!result.IsJust() || !result.FromJust()) {
50 NOTREACHED(); 53 NOTREACHED();
51 return; 54 return;
52 } 55 }
53 v8::Local<v8::Object> js_hook_interface = hooks_->GetJSHookInterface(context); 56 v8::Local<v8::Object> js_hook_interface = hooks_->GetJSHookInterface(context);
54 result = wrapper->SetPrivate(context, 57 result = wrapper->SetPrivate(context,
55 GetPrivatePropertyName(isolate, 58 GetPrivatePropertyName(isolate,
56 kHookInterfaceKey), 59 kHookInterfaceKey),
57 js_hook_interface); 60 js_hook_interface);
58 DCHECK(result.IsJust() && result.FromJust()); 61 DCHECK(result.IsJust() && result.FromJust());
59 } 62 }
60 63
61 APIBindingBridge::~APIBindingBridge() {} 64 APIBindingBridge::~APIBindingBridge() {}
62 65
63 gin::ObjectTemplateBuilder APIBindingBridge::GetObjectTemplateBuilder( 66 gin::ObjectTemplateBuilder APIBindingBridge::GetObjectTemplateBuilder(
64 v8::Isolate* isolate) { 67 v8::Isolate* isolate) {
65 return Wrappable<APIBindingBridge>::GetObjectTemplateBuilder(isolate) 68 return Wrappable<APIBindingBridge>::GetObjectTemplateBuilder(isolate)
66 .SetMethod("registerCustomHook", &APIBindingBridge::RegisterCustomHook) 69 .SetMethod("registerCustomHook", &APIBindingBridge::RegisterCustomHook)
67 .SetMethod("sendRequest", &APIBindingBridge::SendRequest); 70 .SetMethod("sendRequest", &APIBindingBridge::SendRequest)
71 .SetMethod("registerEventArgumentMassager",
72 &APIBindingBridge::RegisterEventArgumentMassager);
68 } 73 }
69 74
70 void APIBindingBridge::RegisterCustomHook(v8::Isolate* isolate, 75 void APIBindingBridge::RegisterCustomHook(v8::Isolate* isolate,
71 v8::Local<v8::Function> function) { 76 v8::Local<v8::Function> function) {
72 // The object and arguments here are meant to match those passed to the hook 77 // The object and arguments here are meant to match those passed to the hook
73 // functions in binding.js. 78 // functions in binding.js.
74 v8::Local<v8::Context> context = isolate->GetCurrentContext(); 79 v8::Local<v8::Context> context = isolate->GetCurrentContext();
75 v8::Local<v8::Object> hook_object = v8::Object::New(isolate); 80 v8::Local<v8::Object> hook_object = v8::Object::New(isolate);
76 v8::Local<v8::Object> wrapper = GetWrapper(isolate); 81 v8::Local<v8::Object> wrapper = GetWrapper(isolate);
77 v8::Local<v8::Value> hook_interface = 82 v8::Local<v8::Value> hook_interface =
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 std::string error; 131 std::string error;
127 CHECK(signature->ParseArgumentsToJSON(context, request_args, *type_refs_, 132 CHECK(signature->ParseArgumentsToJSON(context, request_args, *type_refs_,
128 &converted_arguments, &callback, 133 &converted_arguments, &callback,
129 &error)); 134 &error));
130 135
131 request_handler_->StartRequest(context, name, std::move(converted_arguments), 136 request_handler_->StartRequest(context, name, std::move(converted_arguments),
132 callback, 137 callback,
133 hooks_->GetCustomJSCallback(name, context)); 138 hooks_->GetCustomJSCallback(name, context));
134 } 139 }
135 140
141 void APIBindingBridge::RegisterEventArgumentMassager(
142 gin::Arguments* arguments,
143 const std::string& event_name,
144 v8::Local<v8::Function> massager) {
145 v8::Isolate* isolate = arguments->isolate();
146 v8::HandleScope handle_scope(isolate);
147 v8::Local<v8::Object> holder;
148 CHECK(arguments->GetHolder(&holder));
149 v8::Local<v8::Context> context = holder->CreationContext();
150
151 event_handler_->RegisterArgumentMassager(context, event_name, massager);
152 }
153
136 } // namespace extensions 154 } // namespace extensions
OLDNEW
« no previous file with comments | « extensions/renderer/api_binding_bridge.h ('k') | extensions/renderer/api_bindings_system.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698