Chromium Code Reviews| Index: chrome/browser/extensions/event_listener_map.h |
| diff --git a/chrome/browser/extensions/event_listener_map.h b/chrome/browser/extensions/event_listener_map.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..a1a4763398ed77e36b7b3b3c484f3f5a8c571f5e |
| --- /dev/null |
| +++ b/chrome/browser/extensions/event_listener_map.h |
| @@ -0,0 +1,149 @@ |
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#ifndef CHROME_BROWSER_EXTENSIONS_EVENT_LISTENER_MAP_H_ |
| +#define CHROME_BROWSER_EXTENSIONS_EVENT_LISTENER_MAP_H_ |
| +#pragma once |
| + |
| +#include "base/memory/scoped_ptr.h" |
| +#include "chrome/common/extensions/event_filter.h" |
| + |
| +#include <map> |
| +#include <set> |
| +#include <string> |
| +#include <vector> |
| + |
| +namespace base { |
| +class DictionaryValue; |
| +} |
| + |
| +namespace content { |
| +class RenderProcessHost; |
| +} |
| + |
| +struct ExtensionEvent; |
| +class ListenerRemovalListener; |
| + |
| +using base::DictionaryValue; |
| + |
| +namespace extensions { |
| + |
| +// A listener for an extension event. A listener is essentially an endpoint |
| +// that an event can be dispatched to. This is a lazy listener if |process| is |
| +// NULL and a filtered listener if |filter| is defined. |
| +// |
| +// A lazy listener is added to an event to indicate that a lazy background page |
| +// is listening to the event. It is associated with no process, so to dispatch |
| +// an event to a lazy listener one must start a process running the associated |
| +// extension and dispatch the event to that. |
| +// |
| +struct EventListener { |
| + // |filter| represents a generic filter structure that EventFilter knows how |
| + // to filter events with. A typical filter instance will look like |
| + // |
| + // { |
| + // url: [{hostSuffix: 'google.com'}], |
| + // tabId: 5 |
| + // } |
| + EventListener(const std::string& event_name, |
| + const std::string& extension_id, |
| + content::RenderProcessHost* process, |
| + scoped_ptr<DictionaryValue> filter); |
| + ~EventListener(); |
| + |
| + bool Equals(const EventListener* other) const; |
| + |
| + scoped_ptr<EventListener> Copy() const; |
| + |
| + const std::string event_name; |
| + const std::string extension_id; |
| + content::RenderProcessHost* process; |
| + scoped_ptr<DictionaryValue> filter; |
| + int matcher_id; |
|
battre
2012/06/19 14:26:23
nit: replace int with the correct typedef?
koz (OOO until 15th September)
2012/06/20 08:05:56
Done.
|
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(EventListener); |
| +}; |
| + |
| +// Holds listeners for extension events and can answer questions about which |
| +// listeners are interested in what events. |
| +class EventListenerMap { |
| + public: |
| + typedef std::vector<linked_ptr<EventListener> > ListenerList; |
| + |
| + class Delegate { |
| + public: |
| + virtual void OnListenerAdded(const EventListener* listener) = 0; |
| + virtual void OnListenerRemoved(const EventListener* listener) = 0; |
| + }; |
| + |
| + explicit EventListenerMap(Delegate* delegate); |
| + ~EventListenerMap(); |
| + |
| + // Add a listener for a particular event. GetEventListeners() will include a |
| + // weak pointer to |listener| in its results if passed a relevant |
| + // ExtensionEvent. |
|
battre
2012/06/19 14:26:23
Return value?
koz (OOO until 15th September)
2012/06/20 08:05:56
Done.
|
| + bool AddListener(scoped_ptr<EventListener> listener); |
| + |
| + // Remove a listener that .Equals() |listener|. |
|
battre
2012/06/19 14:26:23
Return value?
koz (OOO until 15th September)
2012/06/20 08:05:56
Done.
|
| + bool RemoveListener(const EventListener* listener); |
| + |
| + // Returns the set of listeners that want to be notified of |event|. |
| + std::set<const EventListener*> GetEventListeners( |
| + const ExtensionEvent& event); |
| + |
| + // Removes all listeners with process equal to |process|. |
| + void RemoveListenersForProcess(const content::RenderProcessHost* process); |
| + |
| + // Returns true if there are any listeners on the event named |event_name|. |
| + bool HasListenerForEvent(const std::string& event_name); |
| + |
| + // Returns true if there are any listeners on |event_name| from |
| + // |extension_id|. |
| + bool HasListenerForExtension(const std::string& extension_id, |
| + const std::string& event_name); |
| + |
| + // Returns true if this map contains an EventListener that .Equals() |
| + // |listener|. |
| + bool HasListener(const EventListener* listener); |
| + |
| + // Returns true if there is a listener for |extension_id| in |process|. |
| + bool HasProcessListener(content::RenderProcessHost* process, |
| + const std::string& extension_id); |
| + |
| + // Removes any lazy listeners that |extension_id| has added. |
| + void RemoveLazyListenersFor(const std::string& extension_id); |
|
battre
2012/06/19 14:26:23
RemoveLazyListenersForExtension(...)? In the unit
koz (OOO until 15th September)
2012/06/20 08:05:56
Done.
|
| + |
| + // Adds lazy listeners as described by |unfiltered| and |filtered|, which |
| + // contain serialised descriptions of listeners. We can only load lazy |
| + // listeners in this fashion, because there is no way to serialise a |
| + // RenderProcessHost*. |
|
battre
2012/06/19 14:26:23
The meaning of |unfiltered| and |filtered| remains
koz (OOO until 15th September)
2012/06/20 08:05:56
I've added a bit more explanation.
|
| + void AddLazyListenersFromPreferences( |
| + const std::string& extension_id, |
| + const std::set<std::string>& unfiltered, |
| + const DictionaryValue& filtered); |
| + |
| + private: |
| + typedef std::map<std::string, ListenerList> ListenerMap; |
|
battre
2012/06/19 14:26:23
Can you add a comment that the key is an event nam
koz (OOO until 15th September)
2012/06/20 08:05:56
Done.
|
| + |
| + void CleanupListener(EventListener* listener); |
| + bool IsFilteredEvent(const ExtensionEvent& event) const; |
| + scoped_ptr<EventMatcher> ParseEventMatcher(DictionaryValue* filter_dict); |
| + |
| + // Listens for removals from this map. |
| + Delegate* delegate_; |
| + |
| + std::set<std::string> filtered_events_; |
| + ListenerMap listeners_; |
| + |
| + std::map<int, EventListener*> listeners_by_matcher_id_; |
|
battre
2012/06/19 14:26:23
nit: replace int with typedef?
koz (OOO until 15th September)
2012/06/20 08:05:56
Done.
|
| + |
| + EventFilter event_filter_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(EventListenerMap); |
| +}; |
| + |
| +} // namespace extensions |
| + |
| +#endif // CHROME_BROWSER_EXTENSIONS_EVENT_LISTENER_MAP_H_ |