Changeset 201735 in webkit
- Timestamp:
- Jun 6, 2016 7:35:39 PM (8 years ago)
- Location:
- trunk
- Files:
-
- 23 added
- 25 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r201734 r201735 1 2016-06-06 Chris Dumez <cdumez@apple.com> 2 3 Implement EventListenerOptions argument to addEventListener 4 https://bugs.webkit.org/show_bug.cgi?id=149466 5 <rdar://problem/22802031> 6 7 Reviewed by Dean Jackson. 8 9 * fast/events/AddEventListenerOptions-once-expected.txt: Added. 10 * fast/events/AddEventListenerOptions-once-recursive-expected.txt: Added. 11 * fast/events/AddEventListenerOptions-once-recursive.html: Added. 12 * fast/events/AddEventListenerOptions-once.html: Added. 13 * fast/events/AddEventListenerOptions-passive-expected.txt: Added. 14 * fast/events/AddEventListenerOptions-passive.html: Added. 15 * fast/events/removeEventListener-EventListenerOptions-capture-expected.txt: Added. 16 * fast/events/removeEventListener-EventListenerOptions-capture.html: Added. 17 18 Add layout testing coverage for various aspects of the functionality. 19 20 * imported/blink/fast/events/eventlisteneroptions/capture_default-expected.txt: Added. 21 * imported/blink/fast/events/eventlisteneroptions/capture_default.html: Added. 22 * imported/blink/fast/events/eventlisteneroptions/capture_equality-expected.txt: Added. 23 * imported/blink/fast/events/eventlisteneroptions/capture_equality.html: Added. 24 * imported/blink/fast/events/eventlisteneroptions/capture_query-expected.txt: Added. 25 * imported/blink/fast/events/eventlisteneroptions/capture_query.html: Added. 26 * imported/blink/fast/events/eventlisteneroptions/passive_dispatch-expected.txt: Added. 27 * imported/blink/fast/events/eventlisteneroptions/passive_dispatch.html: Added. 28 * imported/blink/fast/events/eventlisteneroptions/passive_inequality-expected.txt: Added. 29 * imported/blink/fast/events/eventlisteneroptions/passive_inequality.html: Added. 30 * imported/blink/fast/events/eventlisteneroptions/passive_query-expected.txt: Added. 31 * imported/blink/fast/events/eventlisteneroptions/passive_query.html: Added. 32 33 Import blink tests for this functionality. 34 1 35 2016-06-06 Commit Queue <commit-queue@webkit.org> 2 36 -
trunk/LayoutTests/imported/w3c/ChangeLog
r201734 r201735 1 2016-06-06 Chris Dumez <cdumez@apple.com> 2 3 Implement EventListenerOptions argument to addEventListener 4 https://bugs.webkit.org/show_bug.cgi?id=149466 5 <rdar://problem/22802031> 6 7 Reviewed by Dean Jackson. 8 9 Import new test from W3C that covers EventListenerOptions. 10 11 * web-platform-tests/dom/events/EventListenerOptions-capture-expected.txt: Added. 12 * web-platform-tests/dom/events/EventListenerOptions-capture.html: Added. 13 1 14 2016-06-06 Commit Queue <commit-queue@webkit.org> 2 15 -
trunk/Source/WebCore/ChangeLog
r201734 r201735 1 2016-06-06 Chris Dumez <cdumez@apple.com> 2 3 Implement EventListenerOptions argument to addEventListener 4 https://bugs.webkit.org/show_bug.cgi?id=149466 5 <rdar://problem/22802031> 6 7 Reviewed by Dean Jackson. 8 9 Implement AddEventListenerOptions dictionary argument to addEventListener() 10 and EventListenerOptions dictionary argument to removeEventListener(), as 11 per the latest DOM specification: 12 - https://dom.spec.whatwg.org/#interface-eventtarget 13 14 Firefox and Chrome already support this. 15 16 Support for AddEventListenerOptions in this patch is as follows: 17 - 'capture': fully supported. 18 - 'once': fully supported. 19 - 'passive': supported in the sense that preventDefault() will be ignored 20 for passive event listeners. There are however currently no 21 performance benefits from passing this flag. Those optimizations 22 will be implemented in follow-up patches (in particular for 23 Touch and Scroll events). 24 25 Tests: fast/events/AddEventListenerOptions-once-recursive.html 26 fast/events/AddEventListenerOptions-once.html 27 fast/events/AddEventListenerOptions-passive.html 28 fast/events/removeEventListener-EventListenerOptions-capture.html 29 imported/w3c/web-platform-tests/dom/events/EventListenerOptions-capture.html 30 31 * Modules/webaudio/AudioScheduledSourceNode.cpp: 32 (WebCore::AudioScheduledSourceNode::addEventListener): 33 (WebCore::AudioScheduledSourceNode::removeEventListener): 34 * Modules/webaudio/AudioScheduledSourceNode.h: 35 * Modules/webaudio/ScriptProcessorNode.cpp: 36 (WebCore::ScriptProcessorNode::addEventListener): 37 (WebCore::ScriptProcessorNode::removeEventListener): 38 * Modules/webaudio/ScriptProcessorNode.h: 39 * bindings/scripts/CodeGeneratorJS.pm: 40 (GenerateParametersCheckExpression): 41 * dom/Event.h: 42 (WebCore::Event::preventDefault): 43 (WebCore::Event::setInPassiveListener): 44 * dom/EventListenerMap.cpp: 45 (WebCore::addListenerToVector): 46 (WebCore::EventListenerMap::add): 47 * dom/EventListenerMap.h: 48 * dom/EventTarget.cpp: 49 (WebCore::EventTarget::addEventListener): 50 (WebCore::EventTarget::addEventListenerForBindings): 51 (WebCore::EventTarget::removeEventListenerForBindings): 52 (WebCore::EventTarget::removeEventListener): 53 (WebCore::EventTarget::setAttributeEventListener): 54 (WebCore::EventTarget::fireEventListeners): 55 * dom/EventTarget.h: 56 (WebCore::EventTarget::ListenerOptions::ListenerOptions): 57 (WebCore::EventTarget::AddEventListenerOptions::AddEventListenerOptions): 58 (WebCore::EventTarget::addEventListener): 59 (WebCore::EventTarget::addEventListenerForBindings): 60 (WebCore::EventTarget::removeEventListenerForBindings): 61 * dom/EventTarget.idl: 62 * dom/MessagePort.cpp: 63 (WebCore::MessagePort::addEventListener): 64 * dom/MessagePort.h: 65 * dom/Node.cpp: 66 (WebCore::tryAddEventListener): 67 (WebCore::Node::addEventListener): 68 (WebCore::tryRemoveEventListener): 69 (WebCore::Node::removeEventListener): 70 * dom/Node.h: 71 * dom/RegisteredEventListener.h: 72 (WebCore::RegisteredEventListener::Options::Options): 73 (WebCore::RegisteredEventListener::RegisteredEventListener): 74 (WebCore::operator==): 75 * html/HTMLMediaElement.cpp: 76 (WebCore::HTMLMediaElement::addEventListener): 77 (WebCore::HTMLMediaElement::removeEventListener): 78 * html/HTMLMediaElement.h: 79 * page/DOMWindow.cpp: 80 (WebCore::DOMWindow::addEventListener): 81 (WebCore::DOMWindow::removeEventListener): 82 * page/DOMWindow.h: 83 * svg/SVGElement.cpp: 84 (WebCore::SVGElement::addEventListener): 85 (WebCore::SVGElement::removeEventListener): 86 * svg/SVGElement.h: 87 1 88 2016-06-06 Commit Queue <commit-queue@webkit.org> 2 89 -
trunk/Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.cpp
r201734 r201735 202 202 } 203 203 204 bool AudioScheduledSourceNode::addEventListener(const AtomicString& eventType, Ref<EventListener>&& listener, bool useCapture)205 { 206 bool success = AudioNode::addEventListener(eventType, WTFMove(listener), useCapture);204 bool AudioScheduledSourceNode::addEventListener(const AtomicString& eventType, Ref<EventListener>&& listener, const AddEventListenerOptions& options) 205 { 206 bool success = AudioNode::addEventListener(eventType, WTFMove(listener), options); 207 207 if (success && eventType == eventNames().endedEvent) 208 208 m_hasEndedListener = hasEventListeners(eventNames().endedEvent); … … 210 210 } 211 211 212 bool AudioScheduledSourceNode::removeEventListener(const AtomicString& eventType, EventListener& listener, bool useCapture)213 { 214 bool success = AudioNode::removeEventListener(eventType, listener, useCapture);212 bool AudioScheduledSourceNode::removeEventListener(const AtomicString& eventType, EventListener& listener, const ListenerOptions& options) 213 { 214 bool success = AudioNode::removeEventListener(eventType, listener, options); 215 215 if (success && eventType == eventNames().endedEvent) 216 216 m_hasEndedListener = hasEventListeners(eventNames().endedEvent); -
trunk/Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.h
r201734 r201735 102 102 103 103 private: 104 bool addEventListener(const AtomicString& eventType, Ref<EventListener>&&, bool useCapture) override;105 bool removeEventListener(const AtomicString& eventType, EventListener&, bool useCapture) override;104 bool addEventListener(const AtomicString& eventType, Ref<EventListener>&&, const AddEventListenerOptions&) override; 105 bool removeEventListener(const AtomicString& eventType, EventListener&, const ListenerOptions&) override; 106 106 void removeAllEventListeners() override; 107 107 }; -
trunk/Source/WebCore/Modules/webaudio/ScriptProcessorNode.cpp
r201734 r201735 274 274 } 275 275 276 bool ScriptProcessorNode::addEventListener(const AtomicString& eventType, Ref<EventListener>&& listener, bool useCapture)277 { 278 bool success = AudioNode::addEventListener(eventType, WTFMove(listener), useCapture);276 bool ScriptProcessorNode::addEventListener(const AtomicString& eventType, Ref<EventListener>&& listener, const AddEventListenerOptions& options) 277 { 278 bool success = AudioNode::addEventListener(eventType, WTFMove(listener), options); 279 279 if (success && eventType == eventNames().audioprocessEvent) 280 280 m_hasAudioProcessListener = hasEventListeners(eventNames().audioprocessEvent); … … 282 282 } 283 283 284 bool ScriptProcessorNode::removeEventListener(const AtomicString& eventType, EventListener& listener, bool useCapture)285 { 286 bool success = AudioNode::removeEventListener(eventType, listener, useCapture);284 bool ScriptProcessorNode::removeEventListener(const AtomicString& eventType, EventListener& listener, const ListenerOptions& options) 285 { 286 bool success = AudioNode::removeEventListener(eventType, listener, options); 287 287 if (success && eventType == eventNames().audioprocessEvent) 288 288 m_hasAudioProcessListener = hasEventListeners(eventNames().audioprocessEvent); -
trunk/Source/WebCore/Modules/webaudio/ScriptProcessorNode.h
r201734 r201735 74 74 void fireProcessEvent(); 75 75 76 bool addEventListener(const AtomicString& eventType, Ref<EventListener>&&, bool useCapture) override;77 bool removeEventListener(const AtomicString& eventType, EventListener&, bool useCapture) override;76 bool addEventListener(const AtomicString& eventType, Ref<EventListener>&&, const AddEventListenerOptions&) override; 77 bool removeEventListener(const AtomicString& eventType, EventListener&, const ListenerOptions&) override; 78 78 void removeAllEventListeners() override; 79 79 -
trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
r201734 r201735 1679 1679 } 1680 1680 $usedArguments{$parameterIndex} = 1; 1681 } elsif ($codeGenerator->GetArrayOrSequenceType($type) || $codeGenerator->IsTypedArrayType($type) || $codeGenerator->IsWrapperType($type)) { 1681 } elsif ($codeGenerator->IsDictionaryType($parameter->type)) { 1682 push(@andExpression, "(${value}.isUndefinedOrNull() || ${value}.isObject())"); 1683 $usedArguments{$parameterIndex} = 1; 1684 } elsif (($codeGenerator->GetArrayOrSequenceType($type) || $codeGenerator->IsTypedArrayType($type) || $codeGenerator->IsWrapperType($type)) && $type ne "EventListener") { 1682 1685 my $condition = ""; 1683 1686 -
trunk/Source/WebCore/dom/Event.h
r201734 r201735 173 173 void preventDefault() 174 174 { 175 if (m_cancelable )175 if (m_cancelable && !m_isExecutingPassiveEventListener) 176 176 m_defaultPrevented = true; 177 177 } … … 180 180 bool defaultHandled() const { return m_defaultHandled; } 181 181 void setDefaultHandled() { m_defaultHandled = true; } 182 183 void setInPassiveListener(bool value) { m_isExecutingPassiveEventListener = value; } 182 184 183 185 bool cancelBubble() const { return m_cancelBubble; } … … 218 220 bool m_cancelBubble { false }; 219 221 bool m_isTrusted { false }; 222 bool m_isExecutingPassiveEventListener { false }; 220 223 221 224 unsigned short m_eventPhase { 0 }; -
trunk/Source/WebCore/dom/EventListenerMap.cpp
r201734 r201735 96 96 } 97 97 98 static bool addListenerToVector(EventListenerVector* vector, Ref<EventListener>&& listener, bool useCapture)99 { 100 RegisteredEventListener registeredListener(WTFMove(listener), useCapture);98 static bool addListenerToVector(EventListenerVector* vector, Ref<EventListener>&& listener, const RegisteredEventListener::Options& options) 99 { 100 RegisteredEventListener registeredListener(WTFMove(listener), options); 101 101 102 102 if (vector->find(registeredListener) != notFound) … … 107 107 } 108 108 109 bool EventListenerMap::add(const AtomicString& eventType, Ref<EventListener>&& listener, bool useCapture)109 bool EventListenerMap::add(const AtomicString& eventType, Ref<EventListener>&& listener, const RegisteredEventListener::Options& options) 110 110 { 111 111 assertNoActiveIterators(); … … 113 113 for (auto& entry : m_entries) { 114 114 if (entry.first == eventType) 115 return addListenerToVector(entry.second.get(), WTFMove(listener), useCapture);115 return addListenerToVector(entry.second.get(), WTFMove(listener), options); 116 116 } 117 117 118 118 m_entries.append(std::make_pair(eventType, std::make_unique<EventListenerVector>())); 119 return addListenerToVector(m_entries.last().second.get(), WTFMove(listener), useCapture);119 return addListenerToVector(m_entries.last().second.get(), WTFMove(listener), options); 120 120 } 121 121 -
trunk/Source/WebCore/dom/EventListenerMap.h
r201734 r201735 55 55 56 56 void clear(); 57 bool add(const AtomicString& eventType, Ref<EventListener>&&, bool useCapture); 57 58 bool add(const AtomicString& eventType, Ref<EventListener>&&, const RegisteredEventListener::Options&); 58 59 bool remove(const AtomicString& eventType, EventListener&, bool useCapture, size_t& indexOfRemovedListener); 59 60 EventListenerVector* find(const AtomicString& eventType); -
trunk/Source/WebCore/dom/EventTarget.cpp
r201734 r201735 76 76 } 77 77 78 bool EventTarget::addEventListener(const AtomicString& eventType, Ref<EventListener>&& listener, bool useCapture) 79 { 80 return ensureEventTargetData().eventListenerMap.add(eventType, WTFMove(listener), useCapture); 81 } 82 83 void EventTarget::addEventListenerForBindings(const AtomicString& eventType, RefPtr<EventListener>&& listener, bool useCapture) 84 { 85 // FIXME: listener is not supposed to be nullable. 78 bool EventTarget::addEventListener(const AtomicString& eventType, Ref<EventListener>&& listener, const AddEventListenerOptions& options) 79 { 80 return ensureEventTargetData().eventListenerMap.add(eventType, WTFMove(listener), { options.capture, options.passive, options.once }); 81 } 82 83 void EventTarget::addEventListenerForBindings(const AtomicString& eventType, RefPtr<EventListener>&& listener, const AddEventListenerOptions& options) 84 { 86 85 if (!listener) 87 86 return; 88 addEventListener(eventType, listener.releaseNonNull(), useCapture); 89 } 90 91 void EventTarget::removeEventListenerForBindings(const AtomicString& eventType, RefPtr<EventListener>&& listener, bool useCapture) 92 { 93 // FIXME: listener is not supposed to be nullable. 87 addEventListener(eventType, listener.releaseNonNull(), options); 88 } 89 90 void EventTarget::removeEventListenerForBindings(const AtomicString& eventType, RefPtr<EventListener>&& listener, const ListenerOptions& options) 91 { 94 92 if (!listener) 95 93 return; 96 removeEventListener(eventType, *listener, useCapture);97 } 98 99 bool EventTarget::removeEventListener(const AtomicString& eventType, EventListener& listener, bool useCapture)94 removeEventListener(eventType, *listener, options); 95 } 96 97 bool EventTarget::removeEventListener(const AtomicString& eventType, EventListener& listener, const ListenerOptions& options) 100 98 { 101 99 EventTargetData* d = eventTargetData(); … … 105 103 size_t indexOfRemovedListener; 106 104 107 if (!d->eventListenerMap.remove(eventType, listener, useCapture, indexOfRemovedListener))105 if (!d->eventListenerMap.remove(eventType, listener, options.capture, indexOfRemovedListener)) 108 106 return false; 109 107 … … 132 130 if (!listener) 133 131 return false; 134 return addEventListener(eventType, listener.releaseNonNull() , false);132 return addEventListener(eventType, listener.releaseNonNull()); 135 133 } 136 134 … … 260 258 261 259 for (; i < size; ++i) { 262 RegisteredEventListener& registeredListener = entry[i]; 260 RegisteredEventListener registeredListener = entry[i]; 261 262 if (registeredListener.isMarkedForRemoval) 263 continue; 264 263 265 if (event.eventPhase() == Event::CAPTURING_PHASE && !registeredListener.useCapture) 264 266 continue; … … 270 272 if (event.immediatePropagationStopped()) 271 273 break; 274 275 if (registeredListener.isPassive) 276 event.setInPassiveListener(true); 277 278 // Mark listener for removal before executing the listener, in case the listener tries to 279 // dispatch an event that would cause it to get executed again. 280 if (registeredListener.isOnce) 281 registeredListener.isMarkedForRemoval = true; 272 282 273 283 InspectorInstrumentationCookie cookie = InspectorInstrumentation::willHandleEvent(context, event); … … 276 286 registeredListener.listener->handleEvent(context, &event); 277 287 InspectorInstrumentation::didHandleEvent(cookie); 278 } 288 289 if (registeredListener.isPassive) 290 event.setInPassiveListener(false); 291 292 if (registeredListener.isOnce) 293 removeEventListener(event.type(), *registeredListener.listener, ListenerOptions(registeredListener.useCapture)); 294 } 295 279 296 d->firingEventIterators->removeLast(); 280 297 -
trunk/Source/WebCore/dom/EventTarget.h
r201734 r201735 122 122 virtual bool isMessagePort() const; 123 123 124 struct ListenerOptions { 125 ListenerOptions(bool capture = false) 126 : capture(capture) 127 { } 128 129 bool capture; 130 }; 131 132 struct AddEventListenerOptions : public ListenerOptions { 133 AddEventListenerOptions(bool capture = false, bool passive = false, bool once = false) 134 : ListenerOptions(capture) 135 , passive(passive) 136 , once(once) 137 { } 138 139 bool passive; 140 bool once; 141 }; 142 124 143 void addEventListenerForBindings(const AtomicString& eventType, RefPtr<EventListener>&&, bool useCapture); 125 144 void removeEventListenerForBindings(const AtomicString& eventType, RefPtr<EventListener>&&, bool useCapture); 126 virtual bool addEventListener(const AtomicString& eventType, Ref<EventListener>&&, bool useCapture); 127 virtual bool removeEventListener(const AtomicString& eventType, EventListener&, bool useCapture); 145 void addEventListenerForBindings(const AtomicString& eventType, RefPtr<EventListener>&&, const AddEventListenerOptions&); 146 void removeEventListenerForBindings(const AtomicString& eventType, RefPtr<EventListener>&&, const ListenerOptions&); 147 virtual bool addEventListener(const AtomicString& eventType, Ref<EventListener>&&, const AddEventListenerOptions& = { }); 148 virtual bool removeEventListener(const AtomicString& eventType, EventListener&, const ListenerOptions&); 128 149 129 150 virtual void removeAllEventListeners(); … … 210 231 } 211 232 233 inline void EventTarget::addEventListenerForBindings(const AtomicString& eventType, RefPtr<EventListener>&& listener, bool useCapture) 234 { 235 addEventListenerForBindings(eventType, WTFMove(listener), AddEventListenerOptions(useCapture)); 236 } 237 238 inline void EventTarget::removeEventListenerForBindings(const AtomicString& eventType, RefPtr<EventListener>&& listener, bool useCapture) 239 { 240 removeEventListenerForBindings(eventType, WTFMove(listener), ListenerOptions(useCapture)); 241 } 242 212 243 } // namespace WebCore 213 244 -
trunk/Source/WebCore/dom/EventTarget.idl
r201734 r201735 26 26 ObjCProtocol, 27 27 ] interface EventTarget { 28 #if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT 29 [ImplementedAs=addEventListenerForBindings] void addEventListener([AtomicString] DOMString type, EventListener? listener, optional AddEventListenerOptions options); 30 [ImplementedAs=removeEventListenerForBindings] void removeEventListener([AtomicString] DOMString type, EventListener? listener, optional EventListenerOptions options); 31 #endif 32 28 33 // FIXME: The 'type' and 'listener' parameters should not be optional. 29 34 [ObjCLegacyUnnamedParameters, ImplementedAs=addEventListenerForBindings] void addEventListener([AtomicString] optional DOMString type = "undefined", optional EventListener? listener, optional boolean useCapture = false); … … 33 38 [ImplementedAs=dispatchEventForBindings, RaisesException] boolean dispatchEvent(Event? event); 34 39 }; 40 41 dictionary EventListenerOptions { 42 boolean capture = false; 43 }; 44 45 dictionary AddEventListenerOptions { 46 boolean capture = false; 47 boolean passive = false; 48 boolean once = false; 49 }; -
trunk/Source/WebCore/dom/MessagePort.cpp
r201734 r201735 222 222 } 223 223 224 bool MessagePort::addEventListener(const AtomicString& eventType, Ref<EventListener>&& listener, bool useCapture)224 bool MessagePort::addEventListener(const AtomicString& eventType, Ref<EventListener>&& listener, const AddEventListenerOptions& options) 225 225 { 226 226 if (listener->isAttribute() && eventType == eventNames().messageEvent) 227 227 start(); 228 return EventTargetWithInlineData::addEventListener(eventType, WTFMove(listener), useCapture);228 return EventTargetWithInlineData::addEventListener(eventType, WTFMove(listener), options); 229 229 } 230 230 -
trunk/Source/WebCore/dom/MessagePort.h
r201734 r201735 93 93 bool isNeutered() { return !m_entangledChannel; } 94 94 95 bool addEventListener(const AtomicString& eventType, Ref<EventListener>&&, bool useCapture) override;95 bool addEventListener(const AtomicString& eventType, Ref<EventListener>&&, const AddEventListenerOptions&) override; 96 96 97 97 private: -
trunk/Source/WebCore/dom/Node.cpp
r201734 r201735 1908 1908 } 1909 1909 1910 static inline bool tryAddEventListener(Node* targetNode, const AtomicString& eventType, Ref<EventListener>&& listener, bool useCapture)1911 { 1912 if (!targetNode->EventTarget::addEventListener(eventType, listener.copyRef(), useCapture))1910 static inline bool tryAddEventListener(Node* targetNode, const AtomicString& eventType, Ref<EventListener>&& listener, const EventTarget::AddEventListenerOptions& options) 1911 { 1912 if (!targetNode->EventTarget::addEventListener(eventType, listener.copyRef(), options)) 1913 1913 return false; 1914 1914 … … 1928 1928 // Forward this call to addEventListener() to the window since these are window-only events. 1929 1929 if (eventType == eventNames().orientationchangeEvent || eventType == eventNames().resizeEvent) 1930 targetNode->document().domWindow()->addEventListener(eventType, WTFMove(listener), useCapture);1930 targetNode->document().domWindow()->addEventListener(eventType, WTFMove(listener), options); 1931 1931 1932 1932 #if ENABLE(TOUCH_EVENTS) … … 1944 1944 } 1945 1945 1946 bool Node::addEventListener(const AtomicString& eventType, Ref<EventListener>&& listener, bool useCapture)1947 { 1948 return tryAddEventListener(this, eventType, WTFMove(listener), useCapture);1949 } 1950 1951 static inline bool tryRemoveEventListener(Node* targetNode, const AtomicString& eventType, EventListener& listener, bool useCapture)1952 { 1953 if (!targetNode->EventTarget::removeEventListener(eventType, listener, useCapture))1946 bool Node::addEventListener(const AtomicString& eventType, Ref<EventListener>&& listener, const AddEventListenerOptions& options) 1947 { 1948 return tryAddEventListener(this, eventType, WTFMove(listener), options); 1949 } 1950 1951 static inline bool tryRemoveEventListener(Node* targetNode, const AtomicString& eventType, EventListener& listener, const EventTarget::ListenerOptions& options) 1952 { 1953 if (!targetNode->EventTarget::removeEventListener(eventType, listener, options)) 1954 1954 return false; 1955 1955 … … 1969 1969 // Forward this call to removeEventListener() to the window since these are window-only events. 1970 1970 if (eventType == eventNames().orientationchangeEvent || eventType == eventNames().resizeEvent) 1971 targetNode->document().domWindow()->removeEventListener(eventType, listener, useCapture);1971 targetNode->document().domWindow()->removeEventListener(eventType, listener, options); 1972 1972 1973 1973 #if ENABLE(TOUCH_EVENTS) … … 1985 1985 } 1986 1986 1987 bool Node::removeEventListener(const AtomicString& eventType, EventListener& listener, bool useCapture)1988 { 1989 return tryRemoveEventListener(this, eventType, listener, useCapture);1987 bool Node::removeEventListener(const AtomicString& eventType, EventListener& listener, const ListenerOptions& options) 1988 { 1989 return tryRemoveEventListener(this, eventType, listener, options); 1990 1990 } 1991 1991 -
trunk/Source/WebCore/dom/Node.h
r201734 r201735 508 508 ScriptExecutionContext* scriptExecutionContext() const final; // Implemented in Document.h 509 509 510 bool addEventListener(const AtomicString& eventType, Ref<EventListener>&&, bool useCapture) override;511 bool removeEventListener(const AtomicString& eventType, EventListener&, bool useCapture) override;510 bool addEventListener(const AtomicString& eventType, Ref<EventListener>&&, const AddEventListenerOptions&) override; 511 bool removeEventListener(const AtomicString& eventType, EventListener&, const ListenerOptions&) override; 512 512 513 513 using EventTarget::dispatchEvent; -
trunk/Source/WebCore/dom/RegisteredEventListener.h
r201734 r201735 32 32 class RegisteredEventListener { 33 33 public: 34 struct Options { 35 Options(bool capture = false, bool passive = false, bool once = false) 36 : capture(capture) 37 , passive(passive) 38 , once(once) 39 { } 40 41 bool capture; 42 bool passive; 43 bool once; 44 }; 45 46 RegisteredEventListener(Ref<EventListener>&& listener, const Options& options) 47 : listener(WTFMove(listener)) 48 , useCapture(options.capture) 49 , isPassive(options.passive) 50 , isOnce(options.once) 51 { 52 } 53 34 54 RegisteredEventListener(Ref<EventListener>&& listener, bool useCapture) 35 55 : listener(WTFMove(listener)) … … 39 59 40 60 RefPtr<EventListener> listener; 41 bool useCapture; 61 bool useCapture { false }; 62 bool isPassive { false }; 63 bool isOnce { false }; 64 bool isMarkedForRemoval { false }; 42 65 }; 43 66 44 67 inline bool operator==(const RegisteredEventListener& a, const RegisteredEventListener& b) 45 68 { 69 // Other data members are purposefully not checked. The DOM specification says that upon adding / removing 70 // EventListeners, we should only check the type and the capture flag. 46 71 return *a.listener == *b.listener && a.useCapture == b.useCapture; 47 72 } -
trunk/Source/WebCore/html/HTMLMediaElement.cpp
r201734 r201735 5229 5229 } 5230 5230 5231 bool HTMLMediaElement::addEventListener(const AtomicString& eventType, Ref<EventListener>&& listener, bool useCapture)5231 bool HTMLMediaElement::addEventListener(const AtomicString& eventType, Ref<EventListener>&& listener, const AddEventListenerOptions& options) 5232 5232 { 5233 5233 if (eventType != eventNames().webkitplaybacktargetavailabilitychangedEvent) 5234 return Node::addEventListener(eventType, WTFMove(listener), useCapture);5234 return Node::addEventListener(eventType, WTFMove(listener), options); 5235 5235 5236 5236 bool isFirstAvailabilityChangedListener = !hasEventListeners(eventNames().webkitplaybacktargetavailabilitychangedEvent); 5237 if (!Node::addEventListener(eventType, WTFMove(listener), useCapture))5237 if (!Node::addEventListener(eventType, WTFMove(listener), options)) 5238 5238 return false; 5239 5239 … … 5249 5249 } 5250 5250 5251 bool HTMLMediaElement::removeEventListener(const AtomicString& eventType, EventListener& listener, bool useCapture)5251 bool HTMLMediaElement::removeEventListener(const AtomicString& eventType, EventListener& listener, const ListenerOptions& options) 5252 5252 { 5253 5253 if (eventType != eventNames().webkitplaybacktargetavailabilitychangedEvent) 5254 return Node::removeEventListener(eventType, listener, useCapture);5255 5256 if (!Node::removeEventListener(eventType, listener, useCapture))5254 return Node::removeEventListener(eventType, listener, options); 5255 5256 if (!Node::removeEventListener(eventType, listener, options)) 5257 5257 return false; 5258 5258 -
trunk/Source/WebCore/html/HTMLMediaElement.h
r201734 r201735 343 343 #if ENABLE(WIRELESS_PLAYBACK_TARGET) 344 344 void webkitShowPlaybackTargetPicker(); 345 bool addEventListener(const AtomicString& eventType, Ref<EventListener>&&, bool useCapture) override;346 bool removeEventListener(const AtomicString& eventType, EventListener&, bool useCapture) override;345 bool addEventListener(const AtomicString& eventType, Ref<EventListener>&&, const AddEventListenerOptions&) override; 346 bool removeEventListener(const AtomicString& eventType, EventListener&, const ListenerOptions&) override; 347 347 348 348 void wirelessRoutesAvailableDidChange() override; -
trunk/Source/WebCore/page/DOMWindow.cpp
r201734 r201735 1723 1723 } 1724 1724 1725 bool DOMWindow::addEventListener(const AtomicString& eventType, Ref<EventListener>&& listener, bool useCapture)1726 { 1727 if (!EventTarget::addEventListener(eventType, WTFMove(listener), useCapture))1725 bool DOMWindow::addEventListener(const AtomicString& eventType, Ref<EventListener>&& listener, const AddEventListenerOptions& options) 1726 { 1727 if (!EventTarget::addEventListener(eventType, WTFMove(listener), options)) 1728 1728 return false; 1729 1729 … … 1826 1826 } 1827 1827 1828 bool DOMWindow::removeEventListener(const AtomicString& eventType, EventListener& listener, bool useCapture)1829 { 1830 if (!EventTarget::removeEventListener(eventType, listener, useCapture))1828 bool DOMWindow::removeEventListener(const AtomicString& eventType, EventListener& listener, const ListenerOptions& options) 1829 { 1830 if (!EventTarget::removeEventListener(eventType, listener, options.capture)) 1831 1831 return false; 1832 1832 -
trunk/Source/WebCore/page/DOMWindow.h
r201734 r201735 280 280 // Events 281 281 // EventTarget API 282 bool addEventListener(const AtomicString& eventType, Ref<EventListener>&&, bool useCapture) override;283 bool removeEventListener(const AtomicString& eventType, EventListener&, bool useCapture) override;282 bool addEventListener(const AtomicString& eventType, Ref<EventListener>&&, const AddEventListenerOptions&) override; 283 bool removeEventListener(const AtomicString& eventType, EventListener&, const ListenerOptions&) override; 284 284 void removeAllEventListeners() override; 285 285 -
trunk/Source/WebCore/svg/SVGElement.cpp
r201734 r201735 529 529 } 530 530 531 bool SVGElement::addEventListener(const AtomicString& eventType, Ref<EventListener>&& listener, bool useCapture)531 bool SVGElement::addEventListener(const AtomicString& eventType, Ref<EventListener>&& listener, const AddEventListenerOptions& options) 532 532 { 533 533 // Add event listener to regular DOM element 534 if (!Node::addEventListener(eventType, listener.copyRef(), useCapture))534 if (!Node::addEventListener(eventType, listener.copyRef(), options)) 535 535 return false; 536 536 … … 542 542 for (auto* instance : instances()) { 543 543 ASSERT(instance->correspondingElement() == this); 544 bool result = instance->Node::addEventListener(eventType, listener.copyRef(), useCapture);544 bool result = instance->Node::addEventListener(eventType, listener.copyRef(), options); 545 545 ASSERT_UNUSED(result, result); 546 546 } … … 549 549 } 550 550 551 bool SVGElement::removeEventListener(const AtomicString& eventType, EventListener& listener, bool useCapture)551 bool SVGElement::removeEventListener(const AtomicString& eventType, EventListener& listener, const ListenerOptions& options) 552 552 { 553 553 if (containingShadowRoot()) 554 return Node::removeEventListener(eventType, listener, useCapture);554 return Node::removeEventListener(eventType, listener, options); 555 555 556 556 // EventTarget::removeEventListener creates a PassRefPtr around the given EventListener … … 562 562 563 563 // Remove event listener from regular DOM element 564 if (!Node::removeEventListener(eventType, listener, useCapture))564 if (!Node::removeEventListener(eventType, listener, options)) 565 565 return false; 566 566 … … 570 570 ASSERT(instance->correspondingElement() == this); 571 571 572 if (instance->Node::removeEventListener(eventType, listener, useCapture))572 if (instance->Node::removeEventListener(eventType, listener, options)) 573 573 continue; 574 574 -
trunk/Source/WebCore/svg/SVGElement.h
r201734 r201735 134 134 virtual bool haveLoadedRequiredResources(); 135 135 136 bool addEventListener(const AtomicString& eventType, Ref<EventListener>&&, bool useCapture) override;137 bool removeEventListener(const AtomicString& eventType, EventListener&, bool useCapture) override;136 bool addEventListener(const AtomicString& eventType, Ref<EventListener>&&, const AddEventListenerOptions&) override; 137 bool removeEventListener(const AtomicString& eventType, EventListener&, const ListenerOptions&) override; 138 138 bool hasFocusEventListeners() const; 139 139
Note: See TracChangeset
for help on using the changeset viewer.