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

Side by Side Diff: third_party/WebKit/WebCore/bindings/v8/V8EventListenerList.h

Issue 79059: Switch V8EventListenerList to a hashtable implementation... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 7 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | third_party/WebKit/WebCore/bindings/v8/V8EventListenerList.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009 Google Inc. All rights reserved. 2 * Copyright (C) 2009 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 15 matching lines...) Expand all
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30 30
31 #ifndef V8EventListenerList_h 31 #ifndef V8EventListenerList_h
32 #define V8EventListenerList_h 32 #define V8EventListenerList_h
33 33
34 #include <v8.h> 34 #include <v8.h>
35 #include <wtf/Vector.h> 35 #include <wtf/Vector.h>
36 #include <wtf/HashMap.h>
36 37
37 namespace WebCore { 38 namespace WebCore {
38 class V8EventListener; 39 class V8EventListener;
40 class V8EventListenerListIterator;
39 41
40 // This is a container for V8EventListener objects that also does some cachi ng to speed up finding entries by v8::Object. 42 // This is a container for V8EventListener objects that uses the identity ha sh of the v8::Object to
43 // speed up lookups
41 class V8EventListenerList { 44 class V8EventListenerList {
42 public: 45 public:
43 static const size_t maxKeyNameLength = 254; 46 // Because v8::Object identity hashes are not guaranteed to be unique, w e unfortunately can't just map
47 // an int to V8EventListener. Instead we define a HashMap of int to Vect or of V8EventListener
48 // called a ListenerMultiMap.
49 typedef Vector<V8EventListener*>* Values;
50 struct ValuesTraits : HashTraits<Values> {
51 static const bool needsDestruction = true;
52 };
53 typedef HashMap<int, Values, DefaultHash<int>::Hash, HashTraits<int>, Va luesTraits> ListenerMultiMap;
44 54
45 // The name should be distinct from any other V8EventListenerList within the same process, and <= maxKeyNameLength characters. 55 V8EventListenerList();
46 explicit V8EventListenerList(const char* name);
47 ~V8EventListenerList(); 56 ~V8EventListenerList();
48 57
49 typedef Vector<V8EventListener*>::iterator iterator; 58 friend class V8EventListenerListIterator;
50 V8EventListenerList::iterator begin(); 59 typedef V8EventListenerListIterator iterator;
60
61 iterator begin();
51 iterator end(); 62 iterator end();
52 63
53 // In addition to adding the listener to this list, this also caches the V8EventListener as a hidden property on its wrapped
54 // v8 listener object, so we can quickly look it up later.
55 void add(V8EventListener*); 64 void add(V8EventListener*);
56 void remove(V8EventListener*); 65 void remove(V8EventListener*);
57 V8EventListener* find(v8::Local<v8::Object>, bool isInline); 66 V8EventListener* find(v8::Local<v8::Object>, bool isAttribute);
58 void clear(); 67 void clear();
59 size_t size() { return m_list.size(); } 68 size_t size() { return m_table.size(); }
60 69
61 private: 70 private:
62 v8::Handle<v8::String> getKey(bool isInline); 71 ListenerMultiMap m_table;
63 v8::Persistent<v8::String> m_inlineKey; 72
64 v8::Persistent<v8::String> m_nonInlineKey; 73 // we also keep a reverse mapping of V8EventListener to v8::Object ident ity hash,
65 Vector<V8EventListener*> m_list; 74 // in order to speed up removal by V8EventListener
75 HashMap<V8EventListener*, int> m_reverseTable;
76 };
77
78 class V8EventListenerListIterator {
79 public:
80 ~V8EventListenerListIterator();
81 void operator++();
82 bool operator==(const V8EventListenerListIterator&);
83 bool operator!=(const V8EventListenerListIterator&);
84 V8EventListener* operator*();
85 private:
86 friend class V8EventListenerList;
87 explicit V8EventListenerListIterator(V8EventListenerList*);
88 V8EventListenerListIterator(V8EventListenerList*, bool shouldSeekToEnd);
89 void seekToEnd();
90
91 V8EventListenerList* m_list;
92 V8EventListenerList::ListenerMultiMap::iterator m_iter;
93 size_t m_vectorIndex;
66 }; 94 };
67 95
68 } // namespace WebCore 96 } // namespace WebCore
69 97
70 #endif // V8EventListenerList_h 98 #endif // V8EventListenerList_h
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/WebCore/bindings/v8/V8EventListenerList.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698