From 8f377a0cb144b32182938f2210360a9a124e2b16 Mon Sep 17 00:00:00 2001 From: Luke Warlow Date: Fri, 26 Jul 2024 17:03:25 +0100 Subject: [PATCH] Partially implement dialog.show() (#32681) Signed-off-by: Luke Warlow --- components/script/dom/htmldialogelement.rs | 27 ++++++++++++++++++- .../dom/webidls/HTMLDialogElement.webidl | 4 +-- .../dialog-close-event.html.ini | 3 --- .../dialog-focus-previous-outside.html.ini | 3 --- ...ialog-focusing-steps-disconnected.html.ini | 3 --- .../dialog-focusing-steps-inert.html.ini | 3 --- ...-focusing-steps-prevent-autofocus.html.ini | 4 --- .../the-dialog-element/dialog-open-2.html.ini | 3 --- .../dialog-return-value.html.ini | 4 --- ...modal-dialog-in-visibility-hidden.html.ini | 3 --- .../non-modal-dialog-layout.html.ini | 3 --- .../submit-dialog-close-event.html.ini | 2 +- .../meta/html/dom/idlharness.https.html.ini | 3 --- .../autofocus-dialog.html.ini | 2 +- .../dialog-close-event.html.ini | 3 --- .../dialog-focus-previous-outside.html.ini | 3 --- ...ialog-focusing-steps-disconnected.html.ini | 3 --- .../dialog-focusing-steps-inert.html.ini | 3 --- ...-focusing-steps-prevent-autofocus.html.ini | 3 --- .../the-dialog-element/dialog-open-2.html.ini | 3 --- .../dialog-return-value.html.ini | 3 --- ...modal-dialog-in-visibility-hidden.html.ini | 3 --- .../non-modal-dialog-layout.html.ini | 3 --- .../submit-dialog-close-event.html.ini | 3 ++- 24 files changed, 32 insertions(+), 65 deletions(-) delete mode 100644 tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-close-event.html.ini delete mode 100644 tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-focusing-steps-prevent-autofocus.html.ini delete mode 100644 tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-open-2.html.ini delete mode 100644 tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-return-value.html.ini delete mode 100644 tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/non-modal-dialog-layout.html.ini delete mode 100644 tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-close-event.html.ini delete mode 100644 tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-focusing-steps-prevent-autofocus.html.ini delete mode 100644 tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-open-2.html.ini delete mode 100644 tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-return-value.html.ini delete mode 100644 tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/non-modal-dialog-layout.html.ini diff --git a/components/script/dom/htmldialogelement.rs b/components/script/dom/htmldialogelement.rs index bd21001ab6b..888944c27ea 100644 --- a/components/script/dom/htmldialogelement.rs +++ b/components/script/dom/htmldialogelement.rs @@ -11,7 +11,7 @@ use crate::dom::bindings::codegen::Bindings::HTMLDialogElementBinding::HTMLDialo use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; -use crate::dom::document::Document; +use crate::dom::document::{Document, FocusType}; use crate::dom::element::Element; use crate::dom::eventtarget::EventTarget; use crate::dom::htmlelement::HTMLElement; @@ -70,6 +70,31 @@ impl HTMLDialogElementMethods for HTMLDialogElement { *self.return_value.borrow_mut() = return_value; } + /// + fn Show(&self) { + let element = self.upcast::(); + + // Step 1 TODO: Check is modal flag is false + if element.has_attribute(&local_name!("open")) { + return; + } + + // TODO: Step 2 If this has an open attribute, then throw an "InvalidStateError" DOMException. + + // Step 3 + element.set_bool_attribute(&local_name!("open"), true); + + // TODO: Step 4 Set this's previously focused element to the focused element. + + // TODO: Step 5 Let hideUntil be the result of running topmost popover ancestor given this, null, and false. + + // TODO: Step 6 If hideUntil is null, then set hideUntil to this's node document. + + // TODO: Step 7 Run hide all popovers until given hideUntil, false, and true. + + // TODO(Issue #32702): Step 8 Run the dialog focusing steps given this. + } + // https://html.spec.whatwg.org/multipage/#dom-dialog-close fn Close(&self, return_value: Option) { let element = self.upcast::(); diff --git a/components/script/dom/webidls/HTMLDialogElement.webidl b/components/script/dom/webidls/HTMLDialogElement.webidl index 758839e9015..e52d3caf077 100644 --- a/components/script/dom/webidls/HTMLDialogElement.webidl +++ b/components/script/dom/webidls/HTMLDialogElement.webidl @@ -10,8 +10,8 @@ interface HTMLDialogElement : HTMLElement { [CEReactions] attribute boolean open; attribute DOMString returnValue; - // [CEReactions] - // void show(); + [CEReactions] + undefined show(); // [CEReactions] // void showModal(); [CEReactions] diff --git a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-close-event.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-close-event.html.ini deleted file mode 100644 index 55fc622e734..00000000000 --- a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-close-event.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[dialog-close-event.html] - [Test that dialog receives a close event upon closing.] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-focus-previous-outside.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-focus-previous-outside.html.ini index 9702f2ea949..fc24a206a89 100644 --- a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-focus-previous-outside.html.ini +++ b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-focus-previous-outside.html.ini @@ -1,7 +1,4 @@ [dialog-focus-previous-outside.html] - [Focus should not be restored if the currently focused element is not inside the dialog.] - expected: FAIL - [Focus restore should not occur when the focused element is in a shadowroot outside of the dialog.] expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-focusing-steps-disconnected.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-focusing-steps-disconnected.html.ini index 431e978d6de..b012977caa1 100644 --- a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-focusing-steps-disconnected.html.ini +++ b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-focusing-steps-disconnected.html.ini @@ -1,6 +1,3 @@ [dialog-focusing-steps-disconnected.html] - [dialog.show(): focusing steps should not change focus on disconnected ] - expected: FAIL - [dialog.showModal() should throw on disconnected ] expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-focusing-steps-inert.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-focusing-steps-inert.html.ini index 8a87d616083..d4edcedc0e7 100644 --- a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-focusing-steps-inert.html.ini +++ b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-focusing-steps-inert.html.ini @@ -1,6 +1,3 @@ [dialog-focusing-steps-inert.html] - [dialog.show(): focusing steps should not change focus when dialog is inert] - expected: FAIL - [dialog.showModal(): focusing steps should apply focus fixup rule when dialog is inert] expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-focusing-steps-prevent-autofocus.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-focusing-steps-prevent-autofocus.html.ini deleted file mode 100644 index ef83cced9b2..00000000000 --- a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-focusing-steps-prevent-autofocus.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[dialog-focusing-steps-prevent-autofocus.html] - [After showing a dialog, non-dialog autofocus processing won't work.] - expected: FAIL - diff --git a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-open-2.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-open-2.html.ini deleted file mode 100644 index 609b0be13f4..00000000000 --- a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-open-2.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[dialog-open-2.html] - [Tests that dialog is visible after show() is called and not visible after close() is called.] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-return-value.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-return-value.html.ini deleted file mode 100644 index ea83e6cce78..00000000000 --- a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/dialog-return-value.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[dialog-return-value.html] - [Tests dialog.returnValue is settable and returns the last value set.] - expected: FAIL - diff --git a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/modal-dialog-in-visibility-hidden.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/modal-dialog-in-visibility-hidden.html.ini index 95470de83f6..80f0790373b 100644 --- a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/modal-dialog-in-visibility-hidden.html.ini +++ b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/modal-dialog-in-visibility-hidden.html.ini @@ -1,7 +1,4 @@ [modal-dialog-in-visibility-hidden.html] - [Non-modal dialog should let parent visibility inherit] - expected: FAIL - [Modal dialog should have visibility: visible by default in UA sheet] expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/non-modal-dialog-layout.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/non-modal-dialog-layout.html.ini deleted file mode 100644 index 6c65b8e6f0b..00000000000 --- a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/non-modal-dialog-layout.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[non-modal-dialog-layout.html] - [Tests layout of non-modal dialogs.] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/submit-dialog-close-event.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/submit-dialog-close-event.html.ini index 5535c3b9cba..70f8bf7ec7e 100644 --- a/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/submit-dialog-close-event.html.ini +++ b/tests/wpt/meta-legacy-layout/html/semantics/interactive-elements/the-dialog-element/submit-dialog-close-event.html.ini @@ -1,3 +1,3 @@ [submit-dialog-close-event.html] [Tests submitting a dialog on a close event triggered by a previous submission.] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/meta/html/dom/idlharness.https.html.ini b/tests/wpt/meta/html/dom/idlharness.https.html.ini index 2bc8cb01296..3555bfd253d 100644 --- a/tests/wpt/meta/html/dom/idlharness.https.html.ini +++ b/tests/wpt/meta/html/dom/idlharness.https.html.ini @@ -3165,9 +3165,6 @@ [HTMLTableElement interface: attribute summary] expected: FAIL - [HTMLDialogElement interface: operation show()] - expected: FAIL - [HTMLUListElement interface: attribute type] expected: FAIL diff --git a/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/autofocus-dialog.html.ini b/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/autofocus-dialog.html.ini index fdc27d37788..d8fc3ccf172 100644 --- a/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/autofocus-dialog.html.ini +++ b/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/autofocus-dialog.html.ini @@ -3,4 +3,4 @@ expected: FAIL [-contained autofocus element gets focused when the dialog is shown] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-close-event.html.ini b/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-close-event.html.ini deleted file mode 100644 index 55fc622e734..00000000000 --- a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-close-event.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[dialog-close-event.html] - [Test that dialog receives a close event upon closing.] - expected: FAIL diff --git a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-focus-previous-outside.html.ini b/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-focus-previous-outside.html.ini index 9702f2ea949..fc24a206a89 100644 --- a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-focus-previous-outside.html.ini +++ b/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-focus-previous-outside.html.ini @@ -1,7 +1,4 @@ [dialog-focus-previous-outside.html] - [Focus should not be restored if the currently focused element is not inside the dialog.] - expected: FAIL - [Focus restore should not occur when the focused element is in a shadowroot outside of the dialog.] expected: FAIL diff --git a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-focusing-steps-disconnected.html.ini b/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-focusing-steps-disconnected.html.ini index 431e978d6de..b012977caa1 100644 --- a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-focusing-steps-disconnected.html.ini +++ b/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-focusing-steps-disconnected.html.ini @@ -1,6 +1,3 @@ [dialog-focusing-steps-disconnected.html] - [dialog.show(): focusing steps should not change focus on disconnected ] - expected: FAIL - [dialog.showModal() should throw on disconnected ] expected: FAIL diff --git a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-focusing-steps-inert.html.ini b/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-focusing-steps-inert.html.ini index 8a87d616083..d4edcedc0e7 100644 --- a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-focusing-steps-inert.html.ini +++ b/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-focusing-steps-inert.html.ini @@ -1,6 +1,3 @@ [dialog-focusing-steps-inert.html] - [dialog.show(): focusing steps should not change focus when dialog is inert] - expected: FAIL - [dialog.showModal(): focusing steps should apply focus fixup rule when dialog is inert] expected: FAIL diff --git a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-focusing-steps-prevent-autofocus.html.ini b/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-focusing-steps-prevent-autofocus.html.ini deleted file mode 100644 index dc0bb041356..00000000000 --- a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-focusing-steps-prevent-autofocus.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[dialog-focusing-steps-prevent-autofocus.html] - [After showing a dialog, non-dialog autofocus processing won't work.] - expected: FAIL diff --git a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-open-2.html.ini b/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-open-2.html.ini deleted file mode 100644 index 609b0be13f4..00000000000 --- a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-open-2.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[dialog-open-2.html] - [Tests that dialog is visible after show() is called and not visible after close() is called.] - expected: FAIL diff --git a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-return-value.html.ini b/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-return-value.html.ini deleted file mode 100644 index 1ee6fa41bf8..00000000000 --- a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/dialog-return-value.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[dialog-return-value.html] - [Tests dialog.returnValue is settable and returns the last value set.] - expected: FAIL diff --git a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/modal-dialog-in-visibility-hidden.html.ini b/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/modal-dialog-in-visibility-hidden.html.ini index 95470de83f6..80f0790373b 100644 --- a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/modal-dialog-in-visibility-hidden.html.ini +++ b/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/modal-dialog-in-visibility-hidden.html.ini @@ -1,7 +1,4 @@ [modal-dialog-in-visibility-hidden.html] - [Non-modal dialog should let parent visibility inherit] - expected: FAIL - [Modal dialog should have visibility: visible by default in UA sheet] expected: FAIL diff --git a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/non-modal-dialog-layout.html.ini b/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/non-modal-dialog-layout.html.ini deleted file mode 100644 index 6c65b8e6f0b..00000000000 --- a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/non-modal-dialog-layout.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[non-modal-dialog-layout.html] - [Tests layout of non-modal dialogs.] - expected: FAIL diff --git a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/submit-dialog-close-event.html.ini b/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/submit-dialog-close-event.html.ini index 5535c3b9cba..cd762141b9e 100644 --- a/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/submit-dialog-close-event.html.ini +++ b/tests/wpt/meta/html/semantics/interactive-elements/the-dialog-element/submit-dialog-close-event.html.ini @@ -1,3 +1,4 @@ [submit-dialog-close-event.html] + expected: TIMEOUT [Tests submitting a dialog on a close event triggered by a previous submission.] - expected: FAIL + expected: TIMEOUT