Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement EventListenerOptions for EventTarget #15803

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

Implement EventListenerOptions for EventTarget

  • Loading branch information
GuillaumeGomez committed Mar 22, 2017
commit 078931af7826e7a0e50f6b517f35c36050d5df24
@@ -14,6 +14,8 @@ use dom::bindings::codegen::Bindings::EventHandlerBinding::OnErrorEventHandlerNo
use dom::bindings::codegen::Bindings::EventListenerBinding::EventListener;
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;
@@ -225,7 +227,7 @@ impl CompiledEventListener {
/// A listener in a collection of event listeners.
struct EventListenerEntry {
phase: ListenerPhase,
listener: EventListenerType
listener: EventListenerType,
}

#[derive(JSTraceable, HeapSizeOf)]
@@ -550,11 +552,16 @@ impl EventTargetMethods for EventTarget {
fn AddEventListener(&self,
ty: DOMString,
listener: Option<Rc<EventListener>>,
capture: bool) {
options: AddEventListenerOptionsOrBoolean) {
let listener = match listener {
Some(l) => l,
None => return,
};
let capture = match options {
AddEventListenerOptionsOrBoolean::AddEventListenerOptions(options) => options.parent.capture,
AddEventListenerOptionsOrBoolean::Boolean(capture) => capture,
};

let mut handlers = self.handlers.borrow_mut();
let entry = match handlers.entry(Atom::from(ty)) {
Occupied(entry) => entry.into_mut(),
@@ -564,7 +571,7 @@ impl EventTargetMethods for EventTarget {
let phase = if capture { ListenerPhase::Capturing } else { ListenerPhase::Bubbling };
let new_entry = EventListenerEntry {
phase: phase,
listener: EventListenerType::Additive(listener)
listener: EventListenerType::Additive(listener),
};
if !entry.contains(&new_entry) {
entry.push(new_entry);
@@ -575,18 +582,22 @@ impl EventTargetMethods for EventTarget {
fn RemoveEventListener(&self,
ty: DOMString,
listener: Option<Rc<EventListener>>,
capture: bool) {
let ref listener = match listener {
options: EventListenerOptionsOrBoolean) {
let listener = match listener {
Some(l) => l,
None => return,
};
let capture = match options {
EventListenerOptionsOrBoolean::EventListenerOptions(capture) => capture.capture,
EventListenerOptionsOrBoolean::Boolean(o) => o,
};
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 old_entry = EventListenerEntry {
phase: phase,
listener: EventListenerType::Additive(listener.clone())
listener: EventListenerType::Additive(listener.clone()),
};
if let Some(position) = entry.iter().position(|e| *e == old_entry) {
entry.remove(position);
@@ -7,6 +7,8 @@ use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
use dom::bindings::codegen::Bindings::EventListenerBinding::EventListener;
use dom::bindings::codegen::Bindings::EventTargetBinding::EventTargetMethods;
use dom::bindings::codegen::Bindings::MediaQueryListBinding::{self, MediaQueryListMethods};
use dom::bindings::codegen::UnionTypes::AddEventListenerOptionsOrBoolean;
use dom::bindings::codegen::UnionTypes::EventListenerOptionsOrBoolean;
use dom::bindings::inheritance::Castable;
use dom::bindings::js::{JS, Root};
use dom::bindings::reflector::DomObject;
@@ -103,13 +105,17 @@ impl MediaQueryListMethods for MediaQueryList {
// https://drafts.csswg.org/cssom-view/#dom-mediaquerylist-addlistener
fn AddListener(&self, listener: Option<Rc<EventListener>>) {
self.upcast::<EventTarget>().AddEventListener(DOMString::from_string("change".to_owned()),
listener, false);
listener,
AddEventListenerOptionsOrBoolean::Boolean(
false));
}

// https://drafts.csswg.org/cssom-view/#dom-mediaquerylist-removelistener
fn RemoveListener(&self, listener: Option<Rc<EventListener>>) {
self.upcast::<EventTarget>().RemoveEventListener(DOMString::from_string("change".to_owned()),
listener, false);
listener,
EventListenerOptionsOrBoolean::Boolean(
false));
}

// https://drafts.csswg.org/cssom-view/#dom-mediaquerylist-onchange
@@ -9,10 +9,19 @@
interface EventTarget {
void addEventListener(DOMString type,
EventListener? listener,
optional boolean capture = false);
optional (AddEventListenerOptions or boolean) options);
void removeEventListener(DOMString type,
EventListener? listener,
optional boolean capture = false);
optional (EventListenerOptions or boolean) options);
[Throws]
boolean dispatchEvent(Event event);
};

dictionary EventListenerOptions {
boolean capture = false;
};

dictionary AddEventListenerOptions : EventListenerOptions {
// boolean passive = false;
// boolean once = false;
};
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.