make the concept of has_listeners_for follow other implementations (#21044)

Co-authored-by: Gregory Terzian <gterzian@users.noreply.github.com>
This commit is contained in:
Gregory Terzian 2023-07-19 23:27:32 +08:00 committed by GitHub
parent 4f4c2a5922
commit cf9ec700de
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 4 additions and 14 deletions

View file

@ -2127,7 +2127,7 @@ impl Document {
let event = beforeunload_event.upcast::<Event>(); let event = beforeunload_event.upcast::<Event>();
event.set_trusted(true); event.set_trusted(true);
let event_target = self.window.upcast::<EventTarget>(); let event_target = self.window.upcast::<EventTarget>();
let has_listeners = event.has_listeners_for(&event_target, &atom!("beforeunload")); let has_listeners = event_target.has_listeners_for(&atom!("beforeunload"));
self.window.dispatch_event_with_target_override(&event); self.window.dispatch_event_with_target_override(&event);
// TODO: Step 6, decrease the event loop's termination nesting level by 1. // TODO: Step 6, decrease the event loop's termination nesting level by 1.
// Step 7 // Step 7
@ -2197,7 +2197,7 @@ impl Document {
); );
event.set_trusted(true); event.set_trusted(true);
let event_target = self.window.upcast::<EventTarget>(); let event_target = self.window.upcast::<EventTarget>();
let has_listeners = event.has_listeners_for(&event_target, &atom!("unload")); let has_listeners = event_target.has_listeners_for(&atom!("unload"));
let _ = self.window.dispatch_event_with_target_override(&event); let _ = self.window.dispatch_event_with_target_override(&event);
self.fired_unload.set(true); self.fired_unload.set(true);
// Step 9 // Step 9

View file

@ -138,18 +138,6 @@ impl Event {
self.cancelable.set(cancelable); self.cancelable.set(cancelable);
} }
// Determine if there are any listeners for a given target and type.
// See https://github.com/whatwg/dom/issues/453
pub fn has_listeners_for(&self, target: &EventTarget, type_: &Atom) -> bool {
// TODO: take 'removed' into account? Not implemented in Servo yet.
// https://dom.spec.whatwg.org/#event-listener-removed
let mut event_path = self.construct_event_path(&target);
event_path.push(DomRoot::from_ref(target));
event_path
.iter()
.any(|target| target.has_listeners_for(type_))
}
// https://dom.spec.whatwg.org/#event-path // https://dom.spec.whatwg.org/#event-path
// TODO: shadow roots put special flags in the path, // TODO: shadow roots put special flags in the path,
// and it will stop just being a list of bare EventTargets // and it will stop just being a list of bare EventTargets

View file

@ -367,6 +367,8 @@ impl EventTarget {
Ok(EventTarget::new(global, proto)) Ok(EventTarget::new(global, proto))
} }
/// Determine if there are any listeners for a given event type.
/// See <https://github.com/whatwg/dom/issues/453>.
pub fn has_listeners_for(&self, type_: &Atom) -> bool { pub fn has_listeners_for(&self, type_: &Atom) -> bool {
match self.handlers.borrow().get(type_) { match self.handlers.borrow().get(type_) {
Some(listeners) => listeners.has_listeners(), Some(listeners) => listeners.has_listeners(),