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

Side by Side Diff: extensions/renderer/bindings/api_event_handler.cc

Issue 2973903002: [Extensions Bindings] Introduce a supportsLazyListeners property (Closed)
Patch Set: onMessage event fix Created 3 years, 5 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/bindings/api_event_handler.h" 5 #include "extensions/renderer/bindings/api_event_handler.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 #include <memory> 9 #include <memory>
10 #include <vector> 10 #include <vector>
11 11
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/memory/ptr_util.h" 14 #include "base/memory/ptr_util.h"
15 #include "base/supports_user_data.h" 15 #include "base/supports_user_data.h"
16 #include "base/values.h" 16 #include "base/values.h"
17 #include "content/public/child/v8_value_converter.h" 17 #include "content/public/child/v8_value_converter.h"
18 #include "extensions/renderer/bindings/api_event_listeners.h" 18 #include "extensions/renderer/bindings/api_event_listeners.h"
19 #include "extensions/renderer/bindings/event_emitter.h" 19 #include "extensions/renderer/bindings/event_emitter.h"
20 #include "gin/handle.h" 20 #include "gin/handle.h"
21 #include "gin/per_context_data.h" 21 #include "gin/per_context_data.h"
22 22
23 namespace extensions { 23 namespace extensions {
24 24
25 namespace { 25 namespace {
26 26
27 void DoNothingOnListenersChanged(binding::EventListenersChanged change, 27 void DoNothingOnListenersChanged(binding::EventListenersChanged change,
28 const base::DictionaryValue* filter, 28 const base::DictionaryValue* filter,
29 bool was_manual, 29 bool update_lazy_listeners,
30 v8::Local<v8::Context> context) {} 30 v8::Local<v8::Context> context) {}
31 31
32 const char kExtensionAPIEventPerContextKey[] = "extension_api_events"; 32 const char kExtensionAPIEventPerContextKey[] = "extension_api_events";
33 33
34 struct APIEventPerContextData : public base::SupportsUserData::Data { 34 struct APIEventPerContextData : public base::SupportsUserData::Data {
35 APIEventPerContextData(v8::Isolate* isolate) : isolate(isolate) {} 35 APIEventPerContextData(v8::Isolate* isolate) : isolate(isolate) {}
36 ~APIEventPerContextData() override { 36 ~APIEventPerContextData() override {
37 DCHECK(emitters.empty()) 37 DCHECK(emitters.empty())
38 << "|emitters| should have been cleared by InvalidateContext()"; 38 << "|emitters| should have been cleared by InvalidateContext()";
39 DCHECK(massagers.empty()) 39 DCHECK(massagers.empty())
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 ExceptionHandler* exception_handler) 113 ExceptionHandler* exception_handler)
114 : call_js_(call_js), 114 : call_js_(call_js),
115 call_js_sync_(call_js_sync), 115 call_js_sync_(call_js_sync),
116 listeners_changed_(listeners_changed), 116 listeners_changed_(listeners_changed),
117 exception_handler_(exception_handler) {} 117 exception_handler_(exception_handler) {}
118 APIEventHandler::~APIEventHandler() {} 118 APIEventHandler::~APIEventHandler() {}
119 119
120 v8::Local<v8::Object> APIEventHandler::CreateEventInstance( 120 v8::Local<v8::Object> APIEventHandler::CreateEventInstance(
121 const std::string& event_name, 121 const std::string& event_name,
122 bool supports_filters, 122 bool supports_filters,
123 bool supports_lazy_listeners,
123 int max_listeners, 124 int max_listeners,
124 bool notify_on_change, 125 bool notify_on_change,
125 v8::Local<v8::Context> context) { 126 v8::Local<v8::Context> context) {
126 // We need a context scope since gin::CreateHandle only takes the isolate 127 // We need a context scope since gin::CreateHandle only takes the isolate
127 // and infers the context from that. 128 // and infers the context from that.
128 // TODO(devlin): This could be avoided if gin::CreateHandle could take a 129 // TODO(devlin): This could be avoided if gin::CreateHandle could take a
129 // context directly. 130 // context directly.
130 v8::Context::Scope context_scope(context); 131 v8::Context::Scope context_scope(context);
131 132
132 APIEventPerContextData* data = GetContextData(context, true); 133 APIEventPerContextData* data = GetContextData(context, true);
133 DCHECK(data->emitters.find(event_name) == data->emitters.end()); 134 DCHECK(data->emitters.find(event_name) == data->emitters.end());
134 135
135 APIEventListeners::ListenersUpdated updated = 136 APIEventListeners::ListenersUpdated updated =
136 notify_on_change ? base::Bind(listeners_changed_, event_name) 137 notify_on_change ? base::Bind(listeners_changed_, event_name)
137 : base::Bind(&DoNothingOnListenersChanged); 138 : base::Bind(&DoNothingOnListenersChanged);
138 std::unique_ptr<APIEventListeners> listeners; 139 std::unique_ptr<APIEventListeners> listeners;
139 if (supports_filters) { 140 if (supports_filters) {
140 listeners = base::MakeUnique<FilteredEventListeners>( 141 listeners = base::MakeUnique<FilteredEventListeners>(
141 updated, event_name, max_listeners, &event_filter_); 142 updated, event_name, max_listeners, supports_lazy_listeners,
143 &event_filter_);
142 } else { 144 } else {
143 listeners = 145 listeners = base::MakeUnique<UnfilteredEventListeners>(
144 base::MakeUnique<UnfilteredEventListeners>(updated, max_listeners); 146 updated, max_listeners, supports_lazy_listeners);
145 } 147 }
146 148
147 gin::Handle<EventEmitter> emitter_handle = gin::CreateHandle( 149 gin::Handle<EventEmitter> emitter_handle = gin::CreateHandle(
148 context->GetIsolate(), 150 context->GetIsolate(),
149 new EventEmitter(supports_filters, std::move(listeners), call_js_, 151 new EventEmitter(supports_filters, std::move(listeners), call_js_,
150 call_js_sync_, exception_handler_)); 152 call_js_sync_, exception_handler_));
151 CHECK(!emitter_handle.IsEmpty()); 153 CHECK(!emitter_handle.IsEmpty());
152 v8::Local<v8::Value> emitter_value = emitter_handle.ToV8(); 154 v8::Local<v8::Value> emitter_value = emitter_handle.ToV8();
153 CHECK(emitter_value->IsObject()); 155 CHECK(emitter_value->IsObject());
154 v8::Local<v8::Object> emitter_object = 156 v8::Local<v8::Object> emitter_object =
155 v8::Local<v8::Object>::Cast(emitter_value); 157 v8::Local<v8::Object>::Cast(emitter_value);
156 data->emitters[event_name] = 158 data->emitters[event_name] =
157 v8::Global<v8::Object>(context->GetIsolate(), emitter_object); 159 v8::Global<v8::Object>(context->GetIsolate(), emitter_object);
158 160
159 return emitter_object; 161 return emitter_object;
160 } 162 }
161 163
162 v8::Local<v8::Object> APIEventHandler::CreateAnonymousEventInstance( 164 v8::Local<v8::Object> APIEventHandler::CreateAnonymousEventInstance(
163 v8::Local<v8::Context> context) { 165 v8::Local<v8::Context> context) {
164 v8::Context::Scope context_scope(context); 166 v8::Context::Scope context_scope(context);
165 APIEventPerContextData* data = GetContextData(context, true); 167 APIEventPerContextData* data = GetContextData(context, true);
166 bool supports_filters = false; 168 bool supports_filters = false;
167 std::unique_ptr<APIEventListeners> listeners = 169 std::unique_ptr<APIEventListeners> listeners =
168 base::MakeUnique<UnfilteredEventListeners>( 170 base::MakeUnique<UnfilteredEventListeners>(
169 base::Bind(&DoNothingOnListenersChanged), binding::kNoListenerMax); 171 base::Bind(&DoNothingOnListenersChanged), binding::kNoListenerMax,
172 false);
170 gin::Handle<EventEmitter> emitter_handle = gin::CreateHandle( 173 gin::Handle<EventEmitter> emitter_handle = gin::CreateHandle(
171 context->GetIsolate(), 174 context->GetIsolate(),
172 new EventEmitter(supports_filters, std::move(listeners), call_js_, 175 new EventEmitter(supports_filters, std::move(listeners), call_js_,
173 call_js_sync_, exception_handler_)); 176 call_js_sync_, exception_handler_));
174 CHECK(!emitter_handle.IsEmpty()); 177 CHECK(!emitter_handle.IsEmpty());
175 v8::Local<v8::Object> emitter_object = emitter_handle.ToV8().As<v8::Object>(); 178 v8::Local<v8::Object> emitter_object = emitter_handle.ToV8().As<v8::Object>();
176 data->anonymous_emitters.push_back( 179 data->anonymous_emitters.push_back(
177 v8::Global<v8::Object>(context->GetIsolate(), emitter_object)); 180 v8::Global<v8::Object>(context->GetIsolate(), emitter_object));
178 return emitter_object; 181 return emitter_object;
179 } 182 }
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 auto iter = data->emitters.find(event_name); 331 auto iter = data->emitters.find(event_name);
329 DCHECK(iter != data->emitters.end()); 332 DCHECK(iter != data->emitters.end());
330 EventEmitter* emitter = nullptr; 333 EventEmitter* emitter = nullptr;
331 gin::Converter<EventEmitter*>::FromV8( 334 gin::Converter<EventEmitter*>::FromV8(
332 context->GetIsolate(), iter->second.Get(context->GetIsolate()), &emitter); 335 context->GetIsolate(), iter->second.Get(context->GetIsolate()), &emitter);
333 CHECK(emitter); 336 CHECK(emitter);
334 return emitter->GetNumListeners(); 337 return emitter->GetNumListeners();
335 } 338 }
336 339
337 } // namespace extensions 340 } // namespace extensions
OLDNEW
« no previous file with comments | « extensions/renderer/bindings/api_event_handler.h ('k') | extensions/renderer/bindings/api_event_handler_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698