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

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

Issue 2921013002: [Extensions Bindings] Return result from event dispatch (Closed)
Patch Set: add listener count todo Created 3 years, 6 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_event_handler.h" 5 #include "extensions/renderer/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>
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 gin::Converter<EventEmitter*>::FromV8(isolate, v8_emitter.Get(isolate), 101 gin::Converter<EventEmitter*>::FromV8(isolate, v8_emitter.Get(isolate),
102 &emitter); 102 &emitter);
103 CHECK(emitter); 103 CHECK(emitter);
104 emitter->Fire(context, &args, nullptr); 104 emitter->Fire(context, &args, nullptr);
105 } 105 }
106 106
107 } // namespace 107 } // namespace
108 108
109 APIEventHandler::APIEventHandler( 109 APIEventHandler::APIEventHandler(
110 const binding::RunJSFunction& call_js, 110 const binding::RunJSFunction& call_js,
111 const binding::RunJSFunctionSync& call_js_sync,
111 const EventListenersChangedMethod& listeners_changed) 112 const EventListenersChangedMethod& listeners_changed)
112 : call_js_(call_js), listeners_changed_(listeners_changed) {} 113 : call_js_(call_js),
114 call_js_sync_(call_js_sync),
115 listeners_changed_(listeners_changed) {}
113 APIEventHandler::~APIEventHandler() {} 116 APIEventHandler::~APIEventHandler() {}
114 117
115 v8::Local<v8::Object> APIEventHandler::CreateEventInstance( 118 v8::Local<v8::Object> APIEventHandler::CreateEventInstance(
116 const std::string& event_name, 119 const std::string& event_name,
117 bool supports_filters, 120 bool supports_filters,
118 int max_listeners, 121 int max_listeners,
119 bool notify_on_change, 122 bool notify_on_change,
120 v8::Local<v8::Context> context) { 123 v8::Local<v8::Context> context) {
121 // We need a context scope since gin::CreateHandle only takes the isolate 124 // We need a context scope since gin::CreateHandle only takes the isolate
122 // and infers the context from that. 125 // and infers the context from that.
123 // TODO(devlin): This could be avoided if gin::CreateHandle could take a 126 // TODO(devlin): This could be avoided if gin::CreateHandle could take a
124 // context directly. 127 // context directly.
125 v8::Context::Scope context_scope(context); 128 v8::Context::Scope context_scope(context);
126 129
127 APIEventPerContextData* data = GetContextData(context, true); 130 APIEventPerContextData* data = GetContextData(context, true);
128 DCHECK(data->emitters.find(event_name) == data->emitters.end()); 131 DCHECK(data->emitters.find(event_name) == data->emitters.end());
129 132
130 APIEventListeners::ListenersUpdated updated = 133 APIEventListeners::ListenersUpdated updated =
131 notify_on_change ? base::Bind(listeners_changed_, event_name) 134 notify_on_change ? base::Bind(listeners_changed_, event_name)
132 : base::Bind(&DoNothingOnListenersChanged); 135 : base::Bind(&DoNothingOnListenersChanged);
133 std::unique_ptr<APIEventListeners> listeners; 136 std::unique_ptr<APIEventListeners> listeners;
134 if (supports_filters) { 137 if (supports_filters) {
135 listeners = base::MakeUnique<FilteredEventListeners>( 138 listeners = base::MakeUnique<FilteredEventListeners>(
136 updated, event_name, max_listeners, &event_filter_); 139 updated, event_name, max_listeners, &event_filter_);
137 } else { 140 } else {
138 listeners = 141 listeners =
139 base::MakeUnique<UnfilteredEventListeners>(updated, max_listeners); 142 base::MakeUnique<UnfilteredEventListeners>(updated, max_listeners);
140 } 143 }
141 144
142 gin::Handle<EventEmitter> emitter_handle = gin::CreateHandle( 145 gin::Handle<EventEmitter> emitter_handle =
143 context->GetIsolate(), 146 gin::CreateHandle(context->GetIsolate(),
144 new EventEmitter(supports_filters, std::move(listeners), call_js_)); 147 new EventEmitter(supports_filters, std::move(listeners),
148 call_js_, call_js_sync_));
145 CHECK(!emitter_handle.IsEmpty()); 149 CHECK(!emitter_handle.IsEmpty());
146 v8::Local<v8::Value> emitter_value = emitter_handle.ToV8(); 150 v8::Local<v8::Value> emitter_value = emitter_handle.ToV8();
147 CHECK(emitter_value->IsObject()); 151 CHECK(emitter_value->IsObject());
148 v8::Local<v8::Object> emitter_object = 152 v8::Local<v8::Object> emitter_object =
149 v8::Local<v8::Object>::Cast(emitter_value); 153 v8::Local<v8::Object>::Cast(emitter_value);
150 data->emitters[event_name] = 154 data->emitters[event_name] =
151 v8::Global<v8::Object>(context->GetIsolate(), emitter_object); 155 v8::Global<v8::Object>(context->GetIsolate(), emitter_object);
152 156
153 return emitter_object; 157 return emitter_object;
154 } 158 }
155 159
156 v8::Local<v8::Object> APIEventHandler::CreateAnonymousEventInstance( 160 v8::Local<v8::Object> APIEventHandler::CreateAnonymousEventInstance(
157 v8::Local<v8::Context> context) { 161 v8::Local<v8::Context> context) {
158 v8::Context::Scope context_scope(context); 162 v8::Context::Scope context_scope(context);
159 APIEventPerContextData* data = GetContextData(context, true); 163 APIEventPerContextData* data = GetContextData(context, true);
160 bool supports_filters = false; 164 bool supports_filters = false;
161 std::unique_ptr<APIEventListeners> listeners = 165 std::unique_ptr<APIEventListeners> listeners =
162 base::MakeUnique<UnfilteredEventListeners>( 166 base::MakeUnique<UnfilteredEventListeners>(
163 base::Bind(&DoNothingOnListenersChanged), binding::kNoListenerMax); 167 base::Bind(&DoNothingOnListenersChanged), binding::kNoListenerMax);
164 gin::Handle<EventEmitter> emitter_handle = gin::CreateHandle( 168 gin::Handle<EventEmitter> emitter_handle =
165 context->GetIsolate(), 169 gin::CreateHandle(context->GetIsolate(),
166 new EventEmitter(supports_filters, std::move(listeners), call_js_)); 170 new EventEmitter(supports_filters, std::move(listeners),
171 call_js_, call_js_sync_));
167 CHECK(!emitter_handle.IsEmpty()); 172 CHECK(!emitter_handle.IsEmpty());
168 v8::Local<v8::Object> emitter_object = emitter_handle.ToV8().As<v8::Object>(); 173 v8::Local<v8::Object> emitter_object = emitter_handle.ToV8().As<v8::Object>();
169 data->anonymous_emitters.push_back( 174 data->anonymous_emitters.push_back(
170 v8::Global<v8::Object>(context->GetIsolate(), emitter_object)); 175 v8::Global<v8::Object>(context->GetIsolate(), emitter_object));
171 return emitter_object; 176 return emitter_object;
172 } 177 }
173 178
174 void APIEventHandler::InvalidateCustomEvent(v8::Local<v8::Context> context, 179 void APIEventHandler::InvalidateCustomEvent(v8::Local<v8::Context> context,
175 v8::Local<v8::Object> event) { 180 v8::Local<v8::Object> event) {
176 EventEmitter* emitter = nullptr; 181 EventEmitter* emitter = nullptr;
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 auto iter = data->emitters.find(event_name); 310 auto iter = data->emitters.find(event_name);
306 DCHECK(iter != data->emitters.end()); 311 DCHECK(iter != data->emitters.end());
307 EventEmitter* emitter = nullptr; 312 EventEmitter* emitter = nullptr;
308 gin::Converter<EventEmitter*>::FromV8( 313 gin::Converter<EventEmitter*>::FromV8(
309 context->GetIsolate(), iter->second.Get(context->GetIsolate()), &emitter); 314 context->GetIsolate(), iter->second.Get(context->GetIsolate()), &emitter);
310 CHECK(emitter); 315 CHECK(emitter);
311 return emitter->GetNumListeners(); 316 return emitter->GetNumListeners();
312 } 317 }
313 318
314 } // namespace extensions 319 } // namespace extensions
OLDNEW
« no previous file with comments | « extensions/renderer/api_event_handler.h ('k') | extensions/renderer/api_event_handler_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698