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

Side by Side Diff: Source/core/frame/EventHandlerRegistry.cpp

Issue 225823007: Migrate wheel events to EventHandlerRegistry (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebased. Created 6 years, 6 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 #include "config.h" 5 #include "config.h"
6 #include "core/frame/EventHandlerRegistry.h" 6 #include "core/frame/EventHandlerRegistry.h"
7 7
8 #include "core/events/ThreadLocalEventNames.h" 8 #include "core/events/ThreadLocalEventNames.h"
9 #include "core/frame/DOMWindow.h" 9 #include "core/frame/DOMWindow.h"
10 #include "core/frame/LocalFrame.h" 10 #include "core/frame/LocalFrame.h"
11 #include "core/html/HTMLFrameOwnerElement.h" 11 #include "core/html/HTMLFrameOwnerElement.h"
12 #include "core/page/Page.h" 12 #include "core/page/Page.h"
13 #include "core/page/scrolling/ScrollingCoordinator.h" 13 #include "core/page/scrolling/ScrollingCoordinator.h"
14 14
15 namespace WebCore { 15 namespace WebCore {
16 16
17 EventHandlerRegistry::HandlerState::HandlerState()
18 : externalHandlerCount(0)
19 {
20 }
21
22 EventHandlerRegistry::HandlerState::~HandlerState()
23 {
24 }
25
17 EventHandlerRegistry::EventHandlerRegistry(FrameHost& frameHost) 26 EventHandlerRegistry::EventHandlerRegistry(FrameHost& frameHost)
18 : m_frameHost(frameHost) 27 : m_frameHost(frameHost)
19 { 28 {
20 } 29 }
21 30
22 EventHandlerRegistry::~EventHandlerRegistry() 31 EventHandlerRegistry::~EventHandlerRegistry()
23 { 32 {
24 checkConsistency(); 33 checkConsistency();
25 } 34 }
26 35
27 bool EventHandlerRegistry::eventTypeToClass(const AtomicString& eventType, Event HandlerClass* result) 36 bool EventHandlerRegistry::eventTypeToClass(const AtomicString& eventType, Event HandlerClass* result)
28 { 37 {
29 if (eventType == EventTypeNames::scroll) { 38 if (eventType == EventTypeNames::scroll) {
30 *result = ScrollEvent; 39 *result = ScrollEvent;
40 } else if (eventType == EventTypeNames::wheel || eventType == EventTypeNames ::mousewheel) {
41 *result = WheelEvent;
31 #if ASSERT_ENABLED 42 #if ASSERT_ENABLED
32 } else if (eventType == EventTypeNames::load || eventType == EventTypeNames: :mousemove || eventType == EventTypeNames::touchstart) { 43 } else if (eventType == EventTypeNames::load || eventType == EventTypeNames: :mousemove || eventType == EventTypeNames::touchstart) {
33 *result = EventsForTesting; 44 *result = EventsForTesting;
34 #endif 45 #endif
35 } else { 46 } else {
36 return false; 47 return false;
37 } 48 }
38 return true; 49 return true;
39 } 50 }
40 51
41 const EventTargetSet* EventHandlerRegistry::eventHandlerTargets(EventHandlerClas s handlerClass) const 52 const EventTargetSet* EventHandlerRegistry::eventHandlerTargets(EventHandlerClas s handlerClass) const
42 { 53 {
43 checkConsistency(); 54 checkConsistency();
44 return &m_targets[handlerClass]; 55 return &m_handlers[handlerClass].targets;
56 }
57
58 unsigned EventHandlerRegistry::externalEventHandlerCount(EventHandlerClass handl erClass) const
59 {
60 return m_handlers[handlerClass].externalHandlerCount;
45 } 61 }
46 62
47 bool EventHandlerRegistry::hasEventHandlers(EventHandlerClass handlerClass) cons t 63 bool EventHandlerRegistry::hasEventHandlers(EventHandlerClass handlerClass) cons t
48 { 64 {
49 return m_targets[handlerClass].size(); 65 const HandlerState& state = m_handlers[handlerClass];
66 return state.targets.size() || state.externalHandlerCount;
67 }
68
69 void EventHandlerRegistry::updateExternalHandlerCount(ChangeOperation op, EventH andlerClass handlerClass)
70 {
71 if (op == Add) {
72 m_handlers[handlerClass].externalHandlerCount++;
73 } else {
74 ASSERT(op == Remove);
75 ASSERT(m_handlers[handlerClass].externalHandlerCount > 0);
76 m_handlers[handlerClass].externalHandlerCount--;
77 }
50 } 78 }
51 79
52 bool EventHandlerRegistry::updateEventHandlerTargets(ChangeOperation op, EventHa ndlerClass handlerClass, EventTarget* target) 80 bool EventHandlerRegistry::updateEventHandlerTargets(ChangeOperation op, EventHa ndlerClass handlerClass, EventTarget* target)
53 { 81 {
54 EventTargetSet* targets = &m_targets[handlerClass]; 82 EventTargetSet* targets = &m_handlers[handlerClass].targets;
55 if (op == Add) { 83 if (op == Add) {
56 if (!targets->add(target).isNewEntry) { 84 if (!targets->add(target).isNewEntry) {
57 // Just incremented refcount, no real change. 85 // Just incremented refcount, no real change.
58 return false; 86 return false;
59 } 87 }
60 } else { 88 } else {
61 ASSERT(op == Remove || op == RemoveAll); 89 ASSERT(op == Remove || op == RemoveAll);
62 ASSERT(op == RemoveAll || targets->contains(target)); 90 ASSERT(op == RemoveAll || targets->contains(target));
63 91
64 if (op == RemoveAll) { 92 if (op == RemoveAll) {
65 if (!targets->contains(target)) 93 if (!targets->contains(target))
66 return false; 94 return false;
67 targets->removeAll(target); 95 targets->removeAll(target);
68 } else { 96 } else {
69 if (!targets->remove(target)) { 97 if (!targets->remove(target)) {
70 // Just decremented refcount, no real update. 98 // Just decremented refcount, no real update.
71 return false; 99 return false;
72 } 100 }
73 } 101 }
74 } 102 }
75 return true; 103 return true;
76 } 104 }
77 105
78 void EventHandlerRegistry::updateEventHandlerInternal(ChangeOperation op, EventH andlerClass handlerClass, EventTarget* target) 106 void EventHandlerRegistry::updateEventHandlerInternal(ChangeOperation op, EventH andlerClass handlerClass, EventTarget* target)
79 { 107 {
80 bool hadHandlers = hasEventHandlers(handlerClass); 108 bool hadHandlers = hasEventHandlers(handlerClass);
81 updateEventHandlerTargets(op, handlerClass, target); 109 if (target) {
110 updateEventHandlerTargets(op, handlerClass, target);
111 } else {
112 updateExternalHandlerCount(op, handlerClass);
113 }
82 bool hasHandlers = hasEventHandlers(handlerClass); 114 bool hasHandlers = hasEventHandlers(handlerClass);
83 115
84 if (hadHandlers != hasHandlers) { 116 if (hadHandlers != hasHandlers) {
85 notifyHasHandlersChanged(handlerClass, hasHandlers); 117 notifyHasHandlersChanged(handlerClass, hasHandlers);
86 } 118 }
87 checkConsistency(); 119 checkConsistency();
88 } 120 }
89 121
90 void EventHandlerRegistry::updateEventHandlerOfType(ChangeOperation op, const At omicString& eventType, EventTarget* target) 122 void EventHandlerRegistry::updateEventHandlerOfType(ChangeOperation op, const At omicString& eventType, EventTarget* target)
91 { 123 {
92 EventHandlerClass handlerClass; 124 EventHandlerClass handlerClass;
93 if (!eventTypeToClass(eventType, &handlerClass)) 125 if (!eventTypeToClass(eventType, &handlerClass))
94 return; 126 return;
95 updateEventHandlerInternal(op, handlerClass, target); 127 updateEventHandlerInternal(op, handlerClass, target);
96 } 128 }
97 129
130 void EventHandlerRegistry::didAddExternalEventHandler(const AtomicString& eventT ype)
131 {
132 updateEventHandlerOfType(Add, eventType, 0);
133 }
134
135 void EventHandlerRegistry::didRemoveExternalEventHandler(const AtomicString& eve ntType)
136 {
137 updateEventHandlerOfType(Remove, eventType, 0);
138 }
139
98 void EventHandlerRegistry::didAddEventHandler(EventTarget& target, const AtomicS tring& eventType) 140 void EventHandlerRegistry::didAddEventHandler(EventTarget& target, const AtomicS tring& eventType)
99 { 141 {
100 updateEventHandlerOfType(Add, eventType, &target); 142 updateEventHandlerOfType(Add, eventType, &target);
101 } 143 }
102 144
103 void EventHandlerRegistry::didRemoveEventHandler(EventTarget& target, const Atom icString& eventType) 145 void EventHandlerRegistry::didRemoveEventHandler(EventTarget& target, const Atom icString& eventType)
104 { 146 {
105 updateEventHandlerOfType(Remove, eventType, &target); 147 updateEventHandlerOfType(Remove, eventType, &target);
106 } 148 }
107 149
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 continue; 190 continue;
149 } 191 }
150 for (unsigned count = target.getEventListeners(eventTypes[i]).size(); co unt > 0; --count) 192 for (unsigned count = target.getEventListeners(eventTypes[i]).size(); co unt > 0; --count)
151 updateEventHandlerInternal(op, handlerClass, &target); 193 updateEventHandlerInternal(op, handlerClass, &target);
152 } 194 }
153 } 195 }
154 196
155 void EventHandlerRegistry::notifyHasHandlersChanged(EventHandlerClass handlerCla ss, bool hasActiveHandlers) 197 void EventHandlerRegistry::notifyHasHandlersChanged(EventHandlerClass handlerCla ss, bool hasActiveHandlers)
156 { 198 {
157 ScrollingCoordinator* scrollingCoordinator = m_frameHost.page().scrollingCoo rdinator(); 199 ScrollingCoordinator* scrollingCoordinator = m_frameHost.page().scrollingCoo rdinator();
200 LocalFrame* mainFrame = m_frameHost.page().mainFrame();
158 201
159 switch (handlerClass) { 202 switch (handlerClass) {
160 case ScrollEvent: 203 case ScrollEvent:
161 if (scrollingCoordinator) 204 if (scrollingCoordinator)
162 scrollingCoordinator->updateHaveScrollEventHandlers(); 205 scrollingCoordinator->updateHaveScrollEventHandlers();
163 break; 206 break;
207 case WheelEvent:
208 if (mainFrame) {
209 // TODO(skyostil): This notification is wired up to a black hole, so remove it.
ojan 2014/06/02 21:23:04 Blink style is: // FIXME: ...
Sami 2014/06/03 15:57:45 Done.
210 mainFrame->notifyChromeClientWheelEventHandlerCountChanged();
211 }
212 if (scrollingCoordinator)
213 scrollingCoordinator->updateHaveWheelEventHandlers();
214 break;
164 #if ASSERT_ENABLED 215 #if ASSERT_ENABLED
165 case EventsForTesting: 216 case EventsForTesting:
166 break; 217 break;
167 #endif 218 #endif
168 default: 219 default:
169 ASSERT_NOT_REACHED(); 220 ASSERT_NOT_REACHED();
170 break; 221 break;
171 } 222 }
172 } 223 }
173 224
174 void EventHandlerRegistry::trace(Visitor* visitor) 225 void EventHandlerRegistry::trace(Visitor* visitor)
175 { 226 {
176 visitor->registerWeakMembers<EventHandlerRegistry, &EventHandlerRegistry::cl earWeakMembers>(this); 227 visitor->registerWeakMembers<EventHandlerRegistry, &EventHandlerRegistry::cl earWeakMembers>(this);
177 } 228 }
178 229
179 void EventHandlerRegistry::clearWeakMembers(Visitor* visitor) 230 void EventHandlerRegistry::clearWeakMembers(Visitor* visitor)
180 { 231 {
181 Vector<EventTarget*> deadTargets; 232 Vector<EventTarget*> deadTargets;
182 for (size_t i = 0; i < EventHandlerClassCount; ++i) { 233 for (size_t i = 0; i < EventHandlerClassCount; ++i) {
183 EventHandlerClass handlerClass = static_cast<EventHandlerClass>(i); 234 EventHandlerClass handlerClass = static_cast<EventHandlerClass>(i);
184 const EventTargetSet* targets = &m_targets[handlerClass]; 235 const EventTargetSet* targets = &m_handlers[handlerClass].targets;
185 for (EventTargetSet::const_iterator it = targets->begin(); it != targets ->end(); ++it) { 236 for (EventTargetSet::const_iterator it = targets->begin(); it != targets ->end(); ++it) {
186 Node* node = it->key->toNode(); 237 Node* node = it->key->toNode();
187 DOMWindow* window = it->key->toDOMWindow(); 238 DOMWindow* window = it->key->toDOMWindow();
188 if (node && !visitor->isAlive(node)) { 239 if (node && !visitor->isAlive(node)) {
189 deadTargets.append(node); 240 deadTargets.append(node);
190 } else if (window && !visitor->isAlive(window)) { 241 } else if (window && !visitor->isAlive(window)) {
191 deadTargets.append(window); 242 deadTargets.append(window);
192 } 243 }
193 } 244 }
194 } 245 }
195 for (size_t i = 0; i < deadTargets.size(); ++i) 246 for (size_t i = 0; i < deadTargets.size(); ++i)
196 didRemoveAllEventHandlers(*deadTargets[i]); 247 didRemoveAllEventHandlers(*deadTargets[i]);
197 } 248 }
198 249
199 void EventHandlerRegistry::documentDetached(Document& document) 250 void EventHandlerRegistry::documentDetached(Document& document)
200 { 251 {
201 // Remove all event targets under the detached document. 252 // Remove all event targets under the detached document.
202 for (size_t handlerClassIndex = 0; handlerClassIndex < EventHandlerClassCoun t; ++handlerClassIndex) { 253 for (size_t handlerClassIndex = 0; handlerClassIndex < EventHandlerClassCoun t; ++handlerClassIndex) {
203 EventHandlerClass handlerClass = static_cast<EventHandlerClass>(handlerC lassIndex); 254 EventHandlerClass handlerClass = static_cast<EventHandlerClass>(handlerC lassIndex);
204 Vector<EventTarget*> targetsToRemove; 255 Vector<EventTarget*> targetsToRemove;
205 const EventTargetSet* targets = &m_targets[handlerClass]; 256 const EventTargetSet* targets = &m_handlers[handlerClass].targets;
206 for (EventTargetSet::const_iterator iter = targets->begin(); iter != tar gets->end(); ++iter) { 257 for (EventTargetSet::const_iterator iter = targets->begin(); iter != tar gets->end(); ++iter) {
207 if (Node* node = iter->key->toNode()) { 258 if (Node* node = iter->key->toNode()) {
208 for (Document* doc = &node->document(); doc; doc = doc->ownerEle ment() ? &doc->ownerElement()->document() : 0) { 259 for (Document* doc = &node->document(); doc; doc = doc->ownerEle ment() ? &doc->ownerElement()->document() : 0) {
209 if (doc == &document) { 260 if (doc == &document) {
210 targetsToRemove.append(iter->key); 261 targetsToRemove.append(iter->key);
211 break; 262 break;
212 } 263 }
213 } 264 }
214 } else if (iter->key->toDOMWindow()) { 265 } else if (iter->key->toDOMWindow()) {
215 // DOMWindows may outlive their documents, so we shouldn't remov e their handlers 266 // DOMWindows may outlive their documents, so we shouldn't remov e their handlers
216 // here. 267 // here.
217 } else { 268 } else {
218 ASSERT_NOT_REACHED(); 269 ASSERT_NOT_REACHED();
219 } 270 }
220 } 271 }
221 for (size_t i = 0; i < targetsToRemove.size(); ++i) 272 for (size_t i = 0; i < targetsToRemove.size(); ++i)
222 updateEventHandlerInternal(RemoveAll, handlerClass, targetsToRemove[ i]); 273 updateEventHandlerInternal(RemoveAll, handlerClass, targetsToRemove[ i]);
223 } 274 }
224 } 275 }
225 276
226 void EventHandlerRegistry::checkConsistency() const 277 void EventHandlerRegistry::checkConsistency() const
227 { 278 {
228 #if ASSERT_ENABLED 279 #if ASSERT_ENABLED
229 for (size_t i = 0; i < EventHandlerClassCount; ++i) { 280 for (size_t i = 0; i < EventHandlerClassCount; ++i) {
230 EventHandlerClass handlerClass = static_cast<EventHandlerClass>(i); 281 EventHandlerClass handlerClass = static_cast<EventHandlerClass>(i);
231 const EventTargetSet* targets = &m_targets[handlerClass]; 282 const EventTargetSet* targets = &m_handlers[handlerClass].targets;
232 for (EventTargetSet::const_iterator iter = targets->begin(); iter != tar gets->end(); ++iter) { 283 for (EventTargetSet::const_iterator iter = targets->begin(); iter != tar gets->end(); ++iter) {
233 if (Node* node = iter->key->toNode()) { 284 if (Node* node = iter->key->toNode()) {
234 // See the comment for |documentDetached| if either of these ass ertions fails. 285 // See the comment for |documentDetached| if either of these ass ertions fails.
235 ASSERT(node->document().frameHost()); 286 ASSERT(node->document().frameHost());
236 ASSERT(node->document().frameHost() == &m_frameHost); 287 ASSERT(node->document().frameHost() == &m_frameHost);
237 } else if (DOMWindow* window = iter->key->toDOMWindow()) { 288 } else if (DOMWindow* window = iter->key->toDOMWindow()) {
238 // If any of these assertions fail, DOMWindow failed to unregist er its handlers 289 // If any of these assertions fail, DOMWindow failed to unregist er its handlers
239 // properly. 290 // properly.
240 ASSERT(window->frame()); 291 ASSERT(window->frame());
241 ASSERT(window->frame()->host()); 292 ASSERT(window->frame()->host());
242 ASSERT(window->frame()->host() == &m_frameHost); 293 ASSERT(window->frame()->host() == &m_frameHost);
243 } 294 }
244 } 295 }
245 } 296 }
246 #endif // ASSERT_ENABLED 297 #endif // ASSERT_ENABLED
247 } 298 }
248 299
249 } // namespace WebCore 300 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698