From f48c3a5e2ac9e70e588f2a16289a53b7b2ebfbea Mon Sep 17 00:00:00 2001 From: Andrei Volykhin Date: Mon, 31 Mar 2025 20:15:48 +0300 Subject: [PATCH] dom: Set "composed" flag on construction for some event types (#36239) "Composed" flag (https://dom.spec.whatwg.org/#composed-flag) should be properly set on event construction phase from optional "EventInit" dictionary (https://dom.spec.whatwg.org/#dom-eventinit-composed). The limited set of event types (Custom/Error/Focus/Mouse) will be affected by this CL (used in WPT tests). --- - [X] `./mach build -d` does not report any errors - [X] `./mach test-tidy` does not report any errors - [X] There are WPT shadow-dom tests which have new issues related to event "relatedTarget" property tests/wpt/tests/shadow-dom/event-composed-path-with-related-target.html tests/wpt/tests/shadow-dom/event-with-related-target.html Signed-off-by: Andrei Volykhin --- components/script/dom/customevent.rs | 6 ++++-- components/script/dom/errorevent.rs | 1 + components/script/dom/focusevent.rs | 5 ++++- components/script/dom/mouseevent.rs | 3 +++ .../events/Event-dispatch-listener-order.window.js.ini | 3 --- tests/wpt/meta/dom/events/event-global.html.ini | 3 --- .../event-composed-path-with-related-target.html.ini | 9 ++++++--- tests/wpt/meta/shadow-dom/event-composed.html.ini | 6 ------ tests/wpt/meta/shadow-dom/event-post-dispatch.html.ini | 3 --- .../meta/shadow-dom/event-with-related-target.html.ini | 6 ++++++ 10 files changed, 24 insertions(+), 21 deletions(-) delete mode 100644 tests/wpt/meta/dom/events/Event-dispatch-listener-order.window.js.ini delete mode 100644 tests/wpt/meta/dom/events/event-global.html.ini diff --git a/components/script/dom/customevent.rs b/components/script/dom/customevent.rs index e1d4e4e6e46..c461fae126e 100644 --- a/components/script/dom/customevent.rs +++ b/components/script/dom/customevent.rs @@ -93,7 +93,7 @@ impl CustomEventMethods for CustomEvent { type_: DOMString, init: RootedTraceableBox, ) -> DomRoot { - CustomEvent::new( + let event = CustomEvent::new( global, proto, Atom::from(type_), @@ -101,7 +101,9 @@ impl CustomEventMethods for CustomEvent { init.parent.cancelable, init.detail.handle(), can_gc, - ) + ); + event.upcast::().set_composed(init.parent.composed); + event } // https://dom.spec.whatwg.org/#dom-customevent-detail diff --git a/components/script/dom/errorevent.rs b/components/script/dom/errorevent.rs index 758d4f108e9..31191ec6577 100644 --- a/components/script/dom/errorevent.rs +++ b/components/script/dom/errorevent.rs @@ -142,6 +142,7 @@ impl ErrorEventMethods for ErrorEvent { init.error.handle(), can_gc, ); + event.upcast::().set_composed(init.parent.composed); Ok(event) } diff --git a/components/script/dom/focusevent.rs b/components/script/dom/focusevent.rs index a90756918ac..f59ca5927af 100644 --- a/components/script/dom/focusevent.rs +++ b/components/script/dom/focusevent.rs @@ -15,7 +15,7 @@ use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::reflector::reflect_dom_object_with_proto; use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::bindings::str::DOMString; -use crate::dom::event::{EventBubbles, EventCancelable}; +use crate::dom::event::{Event, EventBubbles, EventCancelable}; use crate::dom::eventtarget::EventTarget; use crate::dom::uievent::UIEvent; use crate::dom::window::Window; @@ -118,6 +118,9 @@ impl FocusEventMethods for FocusEvent { init.relatedTarget.as_deref(), can_gc, ); + event + .upcast::() + .set_composed(init.parent.parent.composed); Ok(event) } diff --git a/components/script/dom/mouseevent.rs b/components/script/dom/mouseevent.rs index 00304a6f565..5818eb7352f 100644 --- a/components/script/dom/mouseevent.rs +++ b/components/script/dom/mouseevent.rs @@ -342,6 +342,9 @@ impl MouseEventMethods for MouseEvent { None, can_gc, ); + event + .upcast::() + .set_composed(init.parent.parent.parent.composed); Ok(event) } diff --git a/tests/wpt/meta/dom/events/Event-dispatch-listener-order.window.js.ini b/tests/wpt/meta/dom/events/Event-dispatch-listener-order.window.js.ini deleted file mode 100644 index f8f179d9d62..00000000000 --- a/tests/wpt/meta/dom/events/Event-dispatch-listener-order.window.js.ini +++ /dev/null @@ -1,3 +0,0 @@ -[Event-dispatch-listener-order.window.html] - [Event-dispatch-listener-order] - expected: FAIL diff --git a/tests/wpt/meta/dom/events/event-global.html.ini b/tests/wpt/meta/dom/events/event-global.html.ini deleted file mode 100644 index 3b073f1a9d6..00000000000 --- a/tests/wpt/meta/dom/events/event-global.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[event-global.html] - [window.event is undefined inside window.onerror if the target is in a shadow tree (ErrorEvent dispatched inside shadow tree)] - expected: FAIL diff --git a/tests/wpt/meta/shadow-dom/event-composed-path-with-related-target.html.ini b/tests/wpt/meta/shadow-dom/event-composed-path-with-related-target.html.ini index 4e2feb09451..38fab916ff7 100644 --- a/tests/wpt/meta/shadow-dom/event-composed-path-with-related-target.html.ini +++ b/tests/wpt/meta/shadow-dom/event-composed-path-with-related-target.html.ini @@ -1,4 +1,10 @@ [event-composed-path-with-related-target.html] + [Event path for an event with a relatedTarget. Event should stop at the shadow root] + expected: FAIL + + [Event path for an event with a relatedTarget which is identical to target. Event should be dispatched and should stop at the shadow root.] + expected: FAIL + [Event path for an event with a relatedTarget. target and relaterTarget do not share any shadow-including ancestor. target is in a shadow tree.] expected: FAIL @@ -17,9 +23,6 @@ [Event path for an event with a relatedTarget. target is assigned to a slot.] expected: FAIL - [Event path for an event with a relatedTarget. relatedTarget is assigned to a slot.] - expected: FAIL - [Event path for an event with a relatedTarget. Event should be dispatched at every slots.] expected: FAIL diff --git a/tests/wpt/meta/shadow-dom/event-composed.html.ini b/tests/wpt/meta/shadow-dom/event-composed.html.ini index 73650923859..346f5bc097a 100644 --- a/tests/wpt/meta/shadow-dom/event-composed.html.ini +++ b/tests/wpt/meta/shadow-dom/event-composed.html.ini @@ -1,9 +1,3 @@ [event-composed.html] - [A synthetic MouseEvent with composed=true should not be scoped] - expected: FAIL - - [A synthetic FocusEvent with composed=true should not be scoped] - expected: FAIL - [A UA click event should not be scoped] expected: FAIL diff --git a/tests/wpt/meta/shadow-dom/event-post-dispatch.html.ini b/tests/wpt/meta/shadow-dom/event-post-dispatch.html.ini index b7ea654323c..40b8d027081 100644 --- a/tests/wpt/meta/shadow-dom/event-post-dispatch.html.ini +++ b/tests/wpt/meta/shadow-dom/event-post-dispatch.html.ini @@ -5,9 +5,6 @@ [Event properties post dispatch with relatedTarget in the same shadow tree. (composed: false)] expected: FAIL - [Event properties post dispatch with relatedTarget in the document tree and the shadow tree. (composed: true)] - expected: FAIL - [Event properties post dispatch with relatedTarget in the document tree and the shadow tree. (composed: false)] expected: FAIL diff --git a/tests/wpt/meta/shadow-dom/event-with-related-target.html.ini b/tests/wpt/meta/shadow-dom/event-with-related-target.html.ini index e40e5541cca..71e61882548 100644 --- a/tests/wpt/meta/shadow-dom/event-with-related-target.html.ini +++ b/tests/wpt/meta/shadow-dom/event-with-related-target.html.ini @@ -1,4 +1,10 @@ [event-with-related-target.html] + [Firing an event at B1a with relatedNode at B1 with open mode shadow trees] + expected: FAIL + + [Firing an event at B1a with relatedNode at B1 with closed mode shadow trees] + expected: FAIL + [Firing an event at B1a with relatedNode at B1b1 with open mode shadow trees] expected: FAIL