diff options
author | Guillaume Gomez <guillaume1.gomez@gmail.com> | 2016-06-04 15:20:04 +0200 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2017-09-30 02:12:35 +0200 |
commit | 3d0b7fbc413f975d6302428947132366f0e339d5 (patch) | |
tree | e4afa2da4a23c7de6c91fc26486948a7e8e660cb /components/script/dom/eventtarget.rs | |
parent | 8732f6de690ae629366d44911c95dfadbb298792 (diff) | |
download | servo-3d0b7fbc413f975d6302428947132366f0e339d5.tar.gz servo-3d0b7fbc413f975d6302428947132366f0e339d5.zip |
Implement EventListenerOptions for EventTarget
For now, only "capture" is supported.
Diffstat (limited to 'components/script/dom/eventtarget.rs')
-rw-r--r-- | components/script/dom/eventtarget.rs | 87 |
1 files changed, 74 insertions, 13 deletions
diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs index a33f7703e1a..6742094068b 100644 --- a/components/script/dom/eventtarget.rs +++ b/components/script/dom/eventtarget.rs @@ -12,8 +12,12 @@ use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use dom::bindings::codegen::Bindings::EventHandlerBinding::OnBeforeUnloadEventHandlerNonNull; use dom::bindings::codegen::Bindings::EventHandlerBinding::OnErrorEventHandlerNonNull; use dom::bindings::codegen::Bindings::EventListenerBinding::EventListener; +use dom::bindings::codegen::Bindings::EventTargetBinding::AddEventListenerOptions; +use dom::bindings::codegen::Bindings::EventTargetBinding::EventListenerOptions; use dom::bindings::codegen::Bindings::EventTargetBinding::EventTargetMethods; use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; +use dom::bindings::codegen::UnionTypes::AddEventListenerOptionsOrBoolean; +use dom::bindings::codegen::UnionTypes::EventListenerOptionsOrBoolean; use dom::bindings::codegen::UnionTypes::EventOrString; use dom::bindings::error::{Error, Fallible, report_pending_exception}; use dom::bindings::inheritance::Castable; @@ -543,14 +547,13 @@ impl EventTarget { event.fire(self); event } -} - -impl EventTargetMethods for EventTarget { // https://dom.spec.whatwg.org/#dom-eventtarget-addeventlistener - fn AddEventListener(&self, - ty: DOMString, - listener: Option<Rc<EventListener>>, - capture: bool) { + pub fn add_event_listener( + &self, + ty: DOMString, + listener: Option<Rc<EventListener>>, + options: AddEventListenerOptions, + ) { let listener = match listener { Some(l) => l, None => return, @@ -561,7 +564,11 @@ impl EventTargetMethods for EventTarget { Vacant(entry) => entry.insert(EventListeners(vec!())), }; - let phase = if capture { ListenerPhase::Capturing } else { ListenerPhase::Bubbling }; + let phase = if options.parent.capture { + ListenerPhase::Capturing + } else { + ListenerPhase::Bubbling + }; let new_entry = EventListenerEntry { phase: phase, listener: EventListenerType::Additive(listener) @@ -572,10 +579,12 @@ impl EventTargetMethods for EventTarget { } // https://dom.spec.whatwg.org/#dom-eventtarget-removeeventlistener - fn RemoveEventListener(&self, - ty: DOMString, - listener: Option<Rc<EventListener>>, - capture: bool) { + pub fn remove_event_listener( + &self, + ty: DOMString, + listener: Option<Rc<EventListener>>, + options: EventListenerOptions, + ) { let ref listener = match listener { Some(l) => l, None => return, @@ -583,7 +592,11 @@ impl EventTargetMethods for EventTarget { let mut handlers = self.handlers.borrow_mut(); let entry = handlers.get_mut(&Atom::from(ty)); for entry in entry { - let phase = if capture { ListenerPhase::Capturing } else { ListenerPhase::Bubbling }; + let phase = if options.capture { + ListenerPhase::Capturing + } else { + ListenerPhase::Bubbling + }; let old_entry = EventListenerEntry { phase: phase, listener: EventListenerType::Additive(listener.clone()) @@ -593,6 +606,28 @@ impl EventTargetMethods for EventTarget { } } } +} + +impl EventTargetMethods for EventTarget { + // https://dom.spec.whatwg.org/#dom-eventtarget-addeventlistener + fn AddEventListener( + &self, + ty: DOMString, + listener: Option<Rc<EventListener>>, + options: AddEventListenerOptionsOrBoolean, + ) { + self.add_event_listener(ty, listener, options.into()) + } + + // https://dom.spec.whatwg.org/#dom-eventtarget-removeeventlistener + fn RemoveEventListener( + &self, + ty: DOMString, + listener: Option<Rc<EventListener>>, + options: EventListenerOptionsOrBoolean, + ) { + self.remove_event_listener(ty, listener, options.into()) + } // https://dom.spec.whatwg.org/#dom-eventtarget-dispatchevent fn DispatchEvent(&self, event: &Event) -> Fallible<bool> { @@ -612,3 +647,29 @@ impl VirtualMethods for EventTarget { None } } + +impl From<AddEventListenerOptionsOrBoolean> for AddEventListenerOptions { + fn from(options: AddEventListenerOptionsOrBoolean) -> Self { + match options { + AddEventListenerOptionsOrBoolean::AddEventListenerOptions(options) => { + options + }, + AddEventListenerOptionsOrBoolean::Boolean(capture) => { + Self { parent: EventListenerOptions { capture } } + }, + } + } +} + +impl From<EventListenerOptionsOrBoolean> for EventListenerOptions { + fn from(options: EventListenerOptionsOrBoolean) -> Self { + match options { + EventListenerOptionsOrBoolean::EventListenerOptions(options) => { + options + }, + EventListenerOptionsOrBoolean::Boolean(capture) => { + Self { capture } + }, + } + } +} |