| Index: chrome/browser/extensions/extension_event_router.h
|
| diff --git a/chrome/browser/extensions/extension_event_router.h b/chrome/browser/extensions/extension_event_router.h
|
| index 4bcfc0e2e76487923d249a96cd2057b9081fb581..4afc4a265f26dbb501029ad6d4d4d2483c84852c 100644
|
| --- a/chrome/browser/extensions/extension_event_router.h
|
| +++ b/chrome/browser/extensions/extension_event_router.h
|
| @@ -14,6 +14,8 @@
|
| #include "base/memory/linked_ptr.h"
|
| #include "base/memory/ref_counted.h"
|
| #include "base/values.h"
|
| +#include "chrome/browser/extensions/event_listener_map.h"
|
| +#include "chrome/common/extensions/event_filtering_info.h"
|
| #include "content/public/browser/notification_observer.h"
|
| #include "content/public/browser/notification_registrar.h"
|
| #include "ipc/ipc_sender.h"
|
| @@ -31,7 +33,14 @@ namespace extensions {
|
| class Extension;
|
| }
|
|
|
| -class ExtensionEventRouter : public content::NotificationObserver {
|
| +struct ExtensionEvent;
|
| +
|
| +using extensions::EventFilteringInfo;
|
| +using extensions::EventListener;
|
| +using extensions::EventListenerMap;
|
| +
|
| +class ExtensionEventRouter : public content::NotificationObserver,
|
| + public extensions::EventListenerMap::Delegate {
|
| public:
|
| // These constants convey the state of our knowledge of whether we're in
|
| // a user-caused gesture as part of DispatchEvent.
|
| @@ -48,7 +57,8 @@ class ExtensionEventRouter : public content::NotificationObserver {
|
| const std::string& event_name,
|
| const base::Value& event_args,
|
| const GURL& event_url,
|
| - UserGestureState user_gesture);
|
| + UserGestureState user_gesture,
|
| + const extensions::EventFilteringInfo& info);
|
|
|
| // This invocation is deprecated. All future consumers of this API should be
|
| // sending Values as event arguments, using the above version.
|
| @@ -57,7 +67,8 @@ class ExtensionEventRouter : public content::NotificationObserver {
|
| const std::string& event_name,
|
| const std::string& event_args,
|
| const GURL& event_url,
|
| - UserGestureState user_gesture);
|
| + UserGestureState user_gesture,
|
| + const extensions::EventFilteringInfo& info);
|
|
|
| explicit ExtensionEventRouter(Profile* profile);
|
| virtual ~ExtensionEventRouter();
|
| @@ -82,6 +93,21 @@ class ExtensionEventRouter : public content::NotificationObserver {
|
| void RemoveLazyEventListener(const std::string& event_name,
|
| const std::string& extension_id);
|
|
|
| + // If |add_lazy_listener| is true also add the lazy version of this listener.
|
| + void AddFilteredEventListener(const std::string& event_name,
|
| + content::RenderProcessHost* process,
|
| + const std::string& extension_id,
|
| + const base::DictionaryValue& filter,
|
| + bool add_lazy_listener);
|
| +
|
| + // If |remove_lazy_listener| is true also remove the lazy version of this
|
| + // listener.
|
| + void RemoveFilteredEventListener(const std::string& event_name,
|
| + content::RenderProcessHost* process,
|
| + const std::string& extension_id,
|
| + const base::DictionaryValue& filter,
|
| + bool remove_lazy_listener);
|
| +
|
| // Returns true if there is at least one listener for the given event.
|
| bool HasEventListener(const std::string& event_name);
|
|
|
| @@ -99,6 +125,14 @@ class ExtensionEventRouter : public content::NotificationObserver {
|
| const std::string& event_name,
|
| const std::string& event_args,
|
| Profile* restrict_to_profile,
|
| + const GURL& event_url,
|
| + extensions::EventFilteringInfo info);
|
| +
|
| + // As above, but defaults |info| to EventFilteringInfo().
|
| + void DispatchEventToRenderers(
|
| + const std::string& event_name,
|
| + const std::string& event_args,
|
| + Profile* restrict_to_profile,
|
| const GURL& event_url);
|
|
|
| // Same as above, except only send the event to the given extension.
|
| @@ -146,9 +180,6 @@ class ExtensionEventRouter : public content::NotificationObserver {
|
| void OnEventAck(Profile* profile, const std::string& extension_id);
|
|
|
| private:
|
| - // The details of an event to be dispatched.
|
| - struct ExtensionEvent;
|
| -
|
| // The extension and process that contains the event listener for a given
|
| // event.
|
| struct ListenerProcess;
|
| @@ -168,16 +199,21 @@ class ExtensionEventRouter : public content::NotificationObserver {
|
| const std::string& extension_id,
|
| const std::string& event_name);
|
|
|
| - // Shared by DispatchEvent*. If |extension_id| is empty, the event is
|
| - // broadcast. If |process| is non-NULL, the event is only dispatched to that
|
| - // particular process.
|
| + // Shared by DispatchEvent*. If |restrict_to_extension_id| is empty, the
|
| + // event is broadcast.
|
| // An event that just came off the pending list may not be delayed again.
|
| - void DispatchEventImpl(const std::string& extension_id,
|
| + void DispatchEventImpl(const std::string& restrict_to_extension_id,
|
| + const linked_ptr<ExtensionEvent>& event);
|
| +
|
| + // Ensures that all lazy background pages that are interested in the given
|
| + // event are loaded, and queues the event if the page is not ready yet.
|
| + void DispatchLazyEvent(const std::string& extension_id,
|
| const linked_ptr<ExtensionEvent>& event);
|
|
|
| - // Dispatches the event to a single listener process.
|
| - void DispatchEventToListener(const ListenerProcess& listener,
|
| - const linked_ptr<ExtensionEvent>& event);
|
| + // Dispatches the event to the specified extension running in |process|.
|
| + void DispatchEventToProcess(const std::string& extension_id,
|
| + content::RenderProcessHost* process,
|
| + const linked_ptr<ExtensionEvent>& event);
|
|
|
| // Returns false when the event is scoped to a profile and the listening
|
| // extension does not have access to events from that profile. Also fills
|
| @@ -189,17 +225,9 @@ class ExtensionEventRouter : public content::NotificationObserver {
|
| const linked_ptr<ExtensionEvent>& event,
|
| const base::Value** event_args);
|
|
|
| - // Ensures that all lazy background pages that are interested in the given
|
| - // event are loaded, and queues the event if the page is not ready yet.
|
| - // If |extension_id| is non-empty, we load only that extension's page
|
| - // (assuming it is interested in the event).
|
| - void LoadLazyBackgroundPagesForEvent(
|
| - const std::string& extension_id,
|
| - const linked_ptr<ExtensionEvent>& event);
|
| -
|
| // Possibly loads given extension's background page in preparation to
|
| // dispatch an event.
|
| - void MaybeLoadLazyBackgroundPage(
|
| + void MaybeLoadLazyBackgroundPageToDispatchEvent(
|
| Profile* profile,
|
| const extensions::Extension* extension,
|
| const linked_ptr<ExtensionEvent>& event);
|
| @@ -212,21 +240,57 @@ class ExtensionEventRouter : public content::NotificationObserver {
|
| void DispatchPendingEvent(const linked_ptr<ExtensionEvent>& event,
|
| ExtensionHost* host);
|
|
|
| + // Implementation of extensions::EventListenerMap::Delegate.
|
| + virtual void OnListenerAdded(const EventListener* listener) OVERRIDE;
|
| + virtual void OnListenerRemoved(const EventListener* listener) OVERRIDE;
|
| +
|
| Profile* profile_;
|
|
|
| content::NotificationRegistrar registrar_;
|
|
|
| scoped_refptr<ExtensionDevToolsManager> extension_devtools_manager_;
|
|
|
| - // The list of active extension processes that are listening to events.
|
| - ListenerMap listeners_;
|
| -
|
| - // The list of all the lazy (non-persistent) background pages that are
|
| - // listening to events. This is just a cache of the real list, which is
|
| - // stored on disk in the extension prefs.
|
| - ListenerMap lazy_listeners_;
|
| + EventListenerMap listeners_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(ExtensionEventRouter);
|
| };
|
|
|
| +struct ExtensionEvent {
|
| + std::string event_name;
|
| + scoped_ptr<Value> event_args;
|
| + GURL event_url;
|
| + Profile* restrict_to_profile;
|
| + scoped_ptr<Value> cross_incognito_args;
|
| + ExtensionEventRouter::UserGestureState user_gesture;
|
| + extensions::EventFilteringInfo info;
|
| +
|
| + ExtensionEvent(const std::string& event_name,
|
| + const Value& event_args,
|
| + const GURL& event_url,
|
| + Profile* restrict_to_profile,
|
| + const Value& cross_incognito_args,
|
| + ExtensionEventRouter::UserGestureState user_gesture,
|
| + const extensions::EventFilteringInfo& info);
|
| +
|
| + // TODO(gdk): This variant should be retired once the callers are switched to
|
| + // providing Values instead of just strings.
|
| + ExtensionEvent(const std::string& event_name,
|
| + const std::string& event_args,
|
| + const GURL& event_url,
|
| + Profile* restrict_to_profile,
|
| + const std::string& cross_incognito_args,
|
| + ExtensionEventRouter::UserGestureState user_gesture,
|
| + const extensions::EventFilteringInfo& info);
|
| +
|
| + ExtensionEvent(const std::string& event_name,
|
| + const Value& event_args,
|
| + const GURL& event_url,
|
| + Profile* restrict_to_profile,
|
| + ExtensionEventRouter::UserGestureState user_gesture,
|
| + const extensions::EventFilteringInfo& info);
|
| +
|
| + ~ExtensionEvent();
|
| +};
|
| +
|
| +
|
| #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_EVENT_ROUTER_H_
|
|
|