| Index: third_party/WebKit/WebCore/bindings/v8/V8EventListenerList.h
|
| ===================================================================
|
| --- third_party/WebKit/WebCore/bindings/v8/V8EventListenerList.h (revision 14992)
|
| +++ third_party/WebKit/WebCore/bindings/v8/V8EventListenerList.h (working copy)
|
| @@ -33,38 +33,66 @@
|
|
|
| #include <v8.h>
|
| #include <wtf/Vector.h>
|
| +#include <wtf/HashMap.h>
|
|
|
| namespace WebCore {
|
| class V8EventListener;
|
| + class V8EventListenerListIterator;
|
|
|
| - // This is a container for V8EventListener objects that also does some caching to speed up finding entries by v8::Object.
|
| + // This is a container for V8EventListener objects that uses the identity hash of the v8::Object to
|
| + // speed up lookups
|
| class V8EventListenerList {
|
| public:
|
| - static const size_t maxKeyNameLength = 254;
|
| + // Because v8::Object identity hashes are not guaranteed to be unique, we unfortunately can't just map
|
| + // an int to V8EventListener. Instead we define a HashMap of int to Vector of V8EventListener
|
| + // called a ListenerMultiMap.
|
| + typedef Vector<V8EventListener*>* Values;
|
| + struct ValuesTraits : HashTraits<Values> {
|
| + static const bool needsDestruction = true;
|
| + };
|
| + typedef HashMap<int, Values, DefaultHash<int>::Hash, HashTraits<int>, ValuesTraits> ListenerMultiMap;
|
|
|
| - // The name should be distinct from any other V8EventListenerList within the same process, and <= maxKeyNameLength characters.
|
| - explicit V8EventListenerList(const char* name);
|
| + V8EventListenerList();
|
| ~V8EventListenerList();
|
|
|
| - typedef Vector<V8EventListener*>::iterator iterator;
|
| - V8EventListenerList::iterator begin();
|
| + friend class V8EventListenerListIterator;
|
| + typedef V8EventListenerListIterator iterator;
|
| +
|
| + iterator begin();
|
| iterator end();
|
|
|
| - // In addition to adding the listener to this list, this also caches the V8EventListener as a hidden property on its wrapped
|
| - // v8 listener object, so we can quickly look it up later.
|
| void add(V8EventListener*);
|
| void remove(V8EventListener*);
|
| - V8EventListener* find(v8::Local<v8::Object>, bool isInline);
|
| + V8EventListener* find(v8::Local<v8::Object>, bool isAttribute);
|
| void clear();
|
| - size_t size() { return m_list.size(); }
|
| + size_t size() { return m_table.size(); }
|
|
|
| private:
|
| - v8::Handle<v8::String> getKey(bool isInline);
|
| - v8::Persistent<v8::String> m_inlineKey;
|
| - v8::Persistent<v8::String> m_nonInlineKey;
|
| - Vector<V8EventListener*> m_list;
|
| + ListenerMultiMap m_table;
|
| +
|
| + // we also keep a reverse mapping of V8EventListener to v8::Object identity hash,
|
| + // in order to speed up removal by V8EventListener
|
| + HashMap<V8EventListener*, int> m_reverseTable;
|
| };
|
|
|
| + class V8EventListenerListIterator {
|
| + public:
|
| + ~V8EventListenerListIterator();
|
| + void operator++();
|
| + bool operator==(const V8EventListenerListIterator&);
|
| + bool operator!=(const V8EventListenerListIterator&);
|
| + V8EventListener* operator*();
|
| + private:
|
| + friend class V8EventListenerList;
|
| + explicit V8EventListenerListIterator(V8EventListenerList*);
|
| + V8EventListenerListIterator(V8EventListenerList*, bool shouldSeekToEnd);
|
| + void seekToEnd();
|
| +
|
| + V8EventListenerList* m_list;
|
| + V8EventListenerList::ListenerMultiMap::iterator m_iter;
|
| + size_t m_vectorIndex;
|
| + };
|
| +
|
| } // namespace WebCore
|
|
|
| #endif // V8EventListenerList_h
|
|
|