diff --git a/components/script/dom/document/document_event_handler.rs b/components/script/dom/document/document_event_handler.rs index 1a459f70f02..1f1789d7b66 100644 --- a/components/script/dom/document/document_event_handler.rs +++ b/components/script/dom/document/document_event_handler.rs @@ -1380,10 +1380,7 @@ impl DocumentEventHandler { let event = keyevent.upcast::(); - // FIXME: https://github.com/servo/servo/issues/43809 - if event.type_() != atom!("keydown") { - event.set_composed(true); - } + event.set_composed(true); event.fire(target, can_gc); diff --git a/components/script/dom/event/event.rs b/components/script/dom/event/event.rs index e102df16075..78cddb407bc 100644 --- a/components/script/dom/event/event.rs +++ b/components/script/dom/event/event.rs @@ -327,6 +327,10 @@ impl Event { let mut target = DomRoot::from_ref(target); + // Save the original dispatch target. Keyboard default actions need the + // element the event was originally fired on, not the retargeted host. + let original_target = target.clone(); + // Step 1. Set event’s dispatch flag. self.set_flags(EventFlags::Dispatch); @@ -637,7 +641,16 @@ impl Event { // https://w3c.github.io/uievents/#default-action // https://dom.spec.whatwg.org/#action-versus-occurance if !self.DefaultPrevented() { - if let Some(target) = self.GetTarget() { + if self.is::() { + // For keyboard events, use the original dispatch target rather than + // event.GetTarget(). Composed keyboard events may retarget across + // shadow boundaries, but the default action (character input, Tab + // navigation) should use the element the event was originally fired on. + if let Some(node) = original_target.downcast::() { + let vtable = vtable_for(node); + vtable.handle_event(self, can_gc); + } + } else if let Some(target) = self.GetTarget() { if let Some(node) = target.downcast::() { let vtable = vtable_for(node); vtable.handle_event(self, can_gc); diff --git a/tests/wpt/meta/html/semantics/disabled-elements/event-propagate-disabled-keyboard.tentative.html.ini b/tests/wpt/meta/html/semantics/disabled-elements/event-propagate-disabled-keyboard.tentative.html.ini index bc6c7e32d5c..2b54ffe04a2 100644 --- a/tests/wpt/meta/html/semantics/disabled-elements/event-propagate-disabled-keyboard.tentative.html.ini +++ b/tests/wpt/meta/html/semantics/disabled-elements/event-propagate-disabled-keyboard.tentative.html.ini @@ -1,6 +1,3 @@ [event-propagate-disabled-keyboard.tentative.html] [Untrusted key events on Text, observed from
] expected: FAIL - - [Trusted key events on Text, observed from ] - expected: FAIL diff --git a/tests/wpt/meta/uievents/keyboard/keyboardevent-composed.html.ini b/tests/wpt/meta/uievents/keyboard/keyboardevent-composed.html.ini deleted file mode 100644 index b8b2bf2a036..00000000000 --- a/tests/wpt/meta/uievents/keyboard/keyboardevent-composed.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[keyboardevent-composed.html] - [keydown event must be composed] - expected: FAIL