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

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

Issue 2768093002: [Reland][Extensions Bindings] Add support for filtered events (Closed)
Patch Set: Fix 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
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 #ifndef EXTENSIONS_RENDERER_API_EVENT_HANDLER_H_ 5 #ifndef EXTENSIONS_RENDERER_API_EVENT_HANDLER_H_
6 #define EXTENSIONS_RENDERER_API_EVENT_HANDLER_H_ 6 #define EXTENSIONS_RENDERER_API_EVENT_HANDLER_H_
7 7
8 #include <string> 8 #include <string>
9 9
10 #include "base/callback.h" 10 #include "base/callback.h"
11 #include "base/macros.h" 11 #include "base/macros.h"
12 #include "extensions/common/event_filter.h"
12 #include "extensions/renderer/api_binding_types.h" 13 #include "extensions/renderer/api_binding_types.h"
13 #include "extensions/renderer/event_emitter.h" 14 #include "extensions/renderer/event_emitter.h"
14 #include "v8/include/v8.h" 15 #include "v8/include/v8.h"
15 16
16 namespace base { 17 namespace base {
17 class ListValue; 18 class ListValue;
18 } 19 }
19 20
20 namespace extensions { 21 namespace extensions {
22 class EventFilteringInfo;
21 23
22 // The object to handle API events. This includes vending v8::Objects for the 24 // The object to handle API events. This includes vending v8::Objects for the
23 // event; handling adding, removing, and querying listeners; and firing events 25 // event; handling adding, removing, and querying listeners; and firing events
24 // to subscribed listeners. Designed to be used across JS contexts, but on a 26 // to subscribed listeners. Designed to be used across JS contexts, but on a
25 // single thread. 27 // single thread.
26 class APIEventHandler { 28 class APIEventHandler {
27 public: 29 public:
28 using EventListenersChangedMethod = 30 using EventListenersChangedMethod =
29 base::Callback<void(const std::string& event_name, 31 base::Callback<void(const std::string& event_name,
30 binding::EventListenersChanged, 32 binding::EventListenersChanged,
33 const base::DictionaryValue* filter,
31 v8::Local<v8::Context>)>; 34 v8::Local<v8::Context>)>;
32 35
33 APIEventHandler(const binding::RunJSFunction& call_js, 36 APIEventHandler(const binding::RunJSFunction& call_js,
34 const EventListenersChangedMethod& listeners_changed); 37 const EventListenersChangedMethod& listeners_changed);
35 ~APIEventHandler(); 38 ~APIEventHandler();
36 39
37 // Returns a new v8::Object for an event with the given |event_name|. 40 // Returns a new v8::Object for an event with the given |event_name|.
38 v8::Local<v8::Object> CreateEventInstance(const std::string& event_name, 41 v8::Local<v8::Object> CreateEventInstance(const std::string& event_name,
42 bool supports_filters,
39 v8::Local<v8::Context> context); 43 v8::Local<v8::Context> context);
40 44
41 // Creates a new event without any name. This is used by custom bindings when 45 // Creates a new event without any name. This is used by custom bindings when
42 // the entirety of the logic for the event is contained in the renderer. These 46 // the entirety of the logic for the event is contained in the renderer. These
43 // events do not notify of new/removed listeners or allow for dispatching 47 // events do not notify of new/removed listeners or allow for dispatching
44 // through FireEventInContext(). 48 // through FireEventInContext().
45 v8::Local<v8::Object> CreateAnonymousEventInstance( 49 v8::Local<v8::Object> CreateAnonymousEventInstance(
46 v8::Local<v8::Context> context); 50 v8::Local<v8::Context> context);
47 51
48 // Invalidates the given |event|. 52 // Invalidates the given |event|.
49 void InvalidateCustomEvent(v8::Local<v8::Context> context, 53 void InvalidateCustomEvent(v8::Local<v8::Context> context,
50 v8::Local<v8::Object> event); 54 v8::Local<v8::Object> event);
51 55
52 // Notifies all listeners of the event with the given |event_name| in the 56 // Notifies all listeners of the event with the given |event_name| in the
53 // specified |context|, sending the included |arguments|. 57 // specified |context|, sending the included |arguments|.
54 void FireEventInContext(const std::string& event_name, 58 void FireEventInContext(const std::string& event_name,
55 v8::Local<v8::Context> context, 59 v8::Local<v8::Context> context,
56 const base::ListValue& arguments); 60 const base::ListValue& arguments,
61 const EventFilteringInfo& filter);
57 62
58 // Registers a |function| to serve as an "argument massager" for the given 63 // Registers a |function| to serve as an "argument massager" for the given
59 // |event_name|, mutating the original arguments. 64 // |event_name|, mutating the original arguments.
60 // The function is called with two arguments: the array of original arguments 65 // The function is called with two arguments: the array of original arguments
61 // being dispatched to the event, and the function to dispatch the event to 66 // being dispatched to the event, and the function to dispatch the event to
62 // listeners. 67 // listeners.
63 void RegisterArgumentMassager(v8::Local<v8::Context> context, 68 void RegisterArgumentMassager(v8::Local<v8::Context> context,
64 const std::string& event_name, 69 const std::string& event_name,
65 v8::Local<v8::Function> function); 70 v8::Local<v8::Function> function);
66 71
67 // Returns the EventListeners for a given |event_name| and |context|. 72 // Returns the EventListeners for a given |event_name| and |context|.
68 size_t GetNumEventListenersForTesting(const std::string& event_name, 73 size_t GetNumEventListenersForTesting(const std::string& event_name,
69 v8::Local<v8::Context> context); 74 v8::Local<v8::Context> context);
70 75
71 // Invalidates listeners for the given |context|. It's a shame we have to 76 // Invalidates listeners for the given |context|. It's a shame we have to
72 // have this separately (as opposed to hooking into e.g. a PerContextData 77 // have this separately (as opposed to hooking into e.g. a PerContextData
73 // destructor), but we need to do this before the context is fully removed 78 // destructor), but we need to do this before the context is fully removed
74 // (because the associated extension ScriptContext needs to be valid). 79 // (because the associated extension ScriptContext needs to be valid).
75 void InvalidateContext(v8::Local<v8::Context> context); 80 void InvalidateContext(v8::Local<v8::Context> context);
76 81
77 private: 82 private:
78 // Method to run a given v8::Function. Curried in for testing. 83 // Method to run a given v8::Function. Curried in for testing.
79 binding::RunJSFunction call_js_; 84 binding::RunJSFunction call_js_;
80 85
81 EventListenersChangedMethod listeners_changed_; 86 EventListenersChangedMethod listeners_changed_;
82 87
88 // The associated EventFilter; shared across all contexts and events.
89 EventFilter event_filter_;
90
83 DISALLOW_COPY_AND_ASSIGN(APIEventHandler); 91 DISALLOW_COPY_AND_ASSIGN(APIEventHandler);
84 }; 92 };
85 93
86 } // namespace extensions 94 } // namespace extensions
87 95
88 #endif // EXTENSIONS_RENDERER_API_EVENT_HANDLER_H_ 96 #endif // EXTENSIONS_RENDERER_API_EVENT_HANDLER_H_
OLDNEW
« no previous file with comments | « extensions/renderer/api_bindings_system_unittest.cc ('k') | extensions/renderer/api_event_handler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698