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

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

Issue 2973903002: [Extensions Bindings] Introduce a supportsLazyListeners property (Closed)
Patch Set: . 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 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 const binding::RunJSFunctionSync& call_js_sync, 111 const binding::RunJSFunctionSync& call_js_sync,
112 const EventListenersChangedMethod& listeners_changed) 112 const EventListenersChangedMethod& listeners_changed)
113 : call_js_(call_js), 113 : call_js_(call_js),
114 call_js_sync_(call_js_sync), 114 call_js_sync_(call_js_sync),
115 listeners_changed_(listeners_changed) {} 115 listeners_changed_(listeners_changed) {}
116 APIEventHandler::~APIEventHandler() {} 116 APIEventHandler::~APIEventHandler() {}
117 117
118 v8::Local<v8::Object> APIEventHandler::CreateEventInstance( 118 v8::Local<v8::Object> APIEventHandler::CreateEventInstance(
119 const std::string& event_name, 119 const std::string& event_name,
120 bool supports_filters, 120 bool supports_filters,
121 bool supports_lazy_listeners,
121 int max_listeners, 122 int max_listeners,
122 bool notify_on_change, 123 bool notify_on_change,
123 v8::Local<v8::Context> context) { 124 v8::Local<v8::Context> context) {
124 // We need a context scope since gin::CreateHandle only takes the isolate 125 // We need a context scope since gin::CreateHandle only takes the isolate
125 // and infers the context from that. 126 // and infers the context from that.
126 // TODO(devlin): This could be avoided if gin::CreateHandle could take a 127 // TODO(devlin): This could be avoided if gin::CreateHandle could take a
127 // context directly. 128 // context directly.
128 v8::Context::Scope context_scope(context); 129 v8::Context::Scope context_scope(context);
129 130
130 APIEventPerContextData* data = GetContextData(context, true); 131 APIEventPerContextData* data = GetContextData(context, true);
131 DCHECK(data->emitters.find(event_name) == data->emitters.end()); 132 DCHECK(data->emitters.find(event_name) == data->emitters.end());
132 133
133 APIEventListeners::ListenersUpdated updated = 134 APIEventListeners::ListenersUpdated updated =
134 notify_on_change ? base::Bind(listeners_changed_, event_name) 135 notify_on_change ? base::Bind(listeners_changed_, event_name)
135 : base::Bind(&DoNothingOnListenersChanged); 136 : base::Bind(&DoNothingOnListenersChanged);
136 std::unique_ptr<APIEventListeners> listeners; 137 std::unique_ptr<APIEventListeners> listeners;
137 if (supports_filters) { 138 if (supports_filters) {
138 listeners = base::MakeUnique<FilteredEventListeners>( 139 listeners = base::MakeUnique<FilteredEventListeners>(
139 updated, event_name, max_listeners, &event_filter_); 140 updated, event_name, max_listeners, supports_lazy_listeners,
141 &event_filter_);
140 } else { 142 } else {
141 listeners = 143 listeners = base::MakeUnique<UnfilteredEventListeners>(
142 base::MakeUnique<UnfilteredEventListeners>(updated, max_listeners); 144 updated, max_listeners, supports_lazy_listeners);
143 } 145 }
144 146
145 gin::Handle<EventEmitter> emitter_handle = 147 gin::Handle<EventEmitter> emitter_handle =
146 gin::CreateHandle(context->GetIsolate(), 148 gin::CreateHandle(context->GetIsolate(),
147 new EventEmitter(supports_filters, std::move(listeners), 149 new EventEmitter(supports_filters, std::move(listeners),
148 call_js_, call_js_sync_)); 150 call_js_, call_js_sync_));
149 CHECK(!emitter_handle.IsEmpty()); 151 CHECK(!emitter_handle.IsEmpty());
150 v8::Local<v8::Value> emitter_value = emitter_handle.ToV8(); 152 v8::Local<v8::Value> emitter_value = emitter_handle.ToV8();
151 CHECK(emitter_value->IsObject()); 153 CHECK(emitter_value->IsObject());
152 v8::Local<v8::Object> emitter_object = 154 v8::Local<v8::Object> emitter_object =
153 v8::Local<v8::Object>::Cast(emitter_value); 155 v8::Local<v8::Object>::Cast(emitter_value);
154 data->emitters[event_name] = 156 data->emitters[event_name] =
155 v8::Global<v8::Object>(context->GetIsolate(), emitter_object); 157 v8::Global<v8::Object>(context->GetIsolate(), emitter_object);
156 158
157 return emitter_object; 159 return emitter_object;
158 } 160 }
159 161
160 v8::Local<v8::Object> APIEventHandler::CreateAnonymousEventInstance( 162 v8::Local<v8::Object> APIEventHandler::CreateAnonymousEventInstance(
161 v8::Local<v8::Context> context) { 163 v8::Local<v8::Context> context) {
162 v8::Context::Scope context_scope(context); 164 v8::Context::Scope context_scope(context);
163 APIEventPerContextData* data = GetContextData(context, true); 165 APIEventPerContextData* data = GetContextData(context, true);
164 bool supports_filters = false; 166 bool supports_filters = false;
165 std::unique_ptr<APIEventListeners> listeners = 167 std::unique_ptr<APIEventListeners> listeners =
166 base::MakeUnique<UnfilteredEventListeners>( 168 base::MakeUnique<UnfilteredEventListeners>(
167 base::Bind(&DoNothingOnListenersChanged), binding::kNoListenerMax); 169 base::Bind(&DoNothingOnListenersChanged), binding::kNoListenerMax,
170 false);
168 gin::Handle<EventEmitter> emitter_handle = 171 gin::Handle<EventEmitter> emitter_handle =
169 gin::CreateHandle(context->GetIsolate(), 172 gin::CreateHandle(context->GetIsolate(),
170 new EventEmitter(supports_filters, std::move(listeners), 173 new EventEmitter(supports_filters, std::move(listeners),
171 call_js_, call_js_sync_)); 174 call_js_, call_js_sync_));
172 CHECK(!emitter_handle.IsEmpty()); 175 CHECK(!emitter_handle.IsEmpty());
173 v8::Local<v8::Object> emitter_object = emitter_handle.ToV8().As<v8::Object>(); 176 v8::Local<v8::Object> emitter_object = emitter_handle.ToV8().As<v8::Object>();
174 data->anonymous_emitters.push_back( 177 data->anonymous_emitters.push_back(
175 v8::Global<v8::Object>(context->GetIsolate(), emitter_object)); 178 v8::Global<v8::Object>(context->GetIsolate(), emitter_object));
176 return emitter_object; 179 return emitter_object;
177 } 180 }
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 auto iter = data->emitters.find(event_name); 329 auto iter = data->emitters.find(event_name);
327 DCHECK(iter != data->emitters.end()); 330 DCHECK(iter != data->emitters.end());
328 EventEmitter* emitter = nullptr; 331 EventEmitter* emitter = nullptr;
329 gin::Converter<EventEmitter*>::FromV8( 332 gin::Converter<EventEmitter*>::FromV8(
330 context->GetIsolate(), iter->second.Get(context->GetIsolate()), &emitter); 333 context->GetIsolate(), iter->second.Get(context->GetIsolate()), &emitter);
331 CHECK(emitter); 334 CHECK(emitter);
332 return emitter->GetNumListeners(); 335 return emitter->GetNumListeners();
333 } 336 }
334 337
335 } // namespace extensions 338 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698