From 292fa0ef6af346067149d021468614aa07814939 Mon Sep 17 00:00:00 2001 From: Marco Castelluccio Date: Tue, 26 Nov 2024 22:45:22 +0000 Subject: [PATCH] Bug 1931875 [wpt PR 49223] - Fix dialog.requestClose() in two ways, a=testonly Automatic update from web-platform-tests Fix dialog.requestClose() in two ways 1. The prior implementation ignored the argument to requestClose. With this CL, requestClose(string) stores away string and then returns it from the CloseWatcher close event. 2. If the dialog's closedBy state is None (either explicitly or through the "Auto" state), requestClose throws an exception. I also added a more significant set of tests for requestClose() in all states. This goes along with recent discussion about throwing exceptions if requestClose() is called when the dialog isn't in the right state, relative to closedBy: https://github.com/whatwg/html/issues/10164#issuecomment-2479792309 The spec PR has been updated accordingly: https://github.com/whatwg/html/pull/10737 Bug: 376516550 Change-Id: I023845844e6afb4da9a71637d517ac78d2861329 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6026242 Auto-Submit: Mason Freed Reviewed-by: David Baron Commit-Queue: David Baron Cr-Commit-Position: refs/heads/main{#1384345} -- wpt-commits: 6f4f09f92913154e70e9214636ee0e60c65f5d05 wpt-pr: 49223 UltraBlame original commit: 6b098292cbe3fd32f9a6e982d47edfdd882c84cc --- .../dialog-requestclose.tentative.html | 1032 ++++++++++++++++- 1 file changed, 990 insertions(+), 42 deletions(-) diff --git a/testing/web-platform/tests/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.tentative.html b/testing/web-platform/tests/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.tentative.html index 1606216e1cd9..31b40b055008 100644 --- a/testing/web-platform/tests/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.tentative.html +++ b/testing/web-platform/tests/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.tentative.html @@ -404,17 +404,595 @@ cancelable ) ; +async +function +setup +( +t +closedby +) +{ +t +. +add_cleanup +( +( +) += +> +{ +dialog +. +close +( +) +; +dialog +. +removeAttribute +( +' +closedby +' +) +; +dialog +. +returnValue += +' +' +; +} +) +; +assert_false +( +dialog +. +hasAttribute +( +' +closedby +' +) +) +; +if +( +closedby +) +{ +dialog +. +setAttribute +( +' +closedby +' +closedby +) +; +} +/ +/ +Be +sure +any +pending +close +events +get +fired +. +await +new +Promise +( +resolve += +> +requestAnimationFrame +( +resolve +) +) +; +return +getSignal +( +t +) +; +} +[ +false +true +] +. +forEach +( +modal += +> +{ +[ +null +' +any +' +' +closedrequest +' +' +none +' +] +. +forEach +( +closedby += +> +{ +const +testDescription += +for +{ +modal +? +" +modal +" +: +" +modeless +" +} +dialog +with +closedby += +{ +closedby +} +; +promise_test +( +async +( +t +) += +> +{ +await +setup +( +t +closedby +) +; +openDialog +( +modal +) +; +if +( +dialog +. +closedBy +! += +" +none +" +) +{ +dialog +. +requestClose +( +) +; +assert_false +( +dialog +. +open +) +; +} +else +{ +assert_throws_dom +( +' +InvalidStateError +' +( +) += +> +dialog +. +requestClose +( +) +) +; +assert_true +( +dialog +. +open +) +; +} +} +requestClose +basic +behavior +{ +testDescription +} +) +; +promise_test +( +async +( +t +) += +> +{ +const +signal += +await +setup +( +t +closedby +) +; +let +events += +[ +] +; +dialog +. +addEventListener +( +' +cancel +' +( +) += +> +events +. +push +( +' +cancel +' +) +{ +signal +} +) +; +dialog +. +addEventListener +( +' +close +' +( +) += +> +events +. +push +( +' +close +' +) +{ +signal +} +) +; +openDialog +( +modal +) +; +assert_array_equals +( +events +[ +] +) +; +if +( +dialog +. +closedBy +! += +" +none +" +) +{ +dialog +. +requestClose +( +) +; +assert_false +( +dialog +. +open +) +; +assert_array_equals +( +events +[ +' +cancel +' +] +' +close +is +scheduled +' +) +; +await +new +Promise +( +resolve += +> +requestAnimationFrame +( +resolve +) +) +; +assert_array_equals +( +events +[ +' +cancel +' +' +close +' +] +) +; +} +else +{ +assert_throws_dom +( +' +InvalidStateError +' +( +) += +> +dialog +. +requestClose +( +) +) +; +} +} +requestClose +fires +both +cancel +and +close +{ +testDescription +} +) +; +promise_test +( +async +( +t +) += +> +{ +const +signal += +await +setup +( +t +' +none +' +) +; +let +events += [ -false -true ] +; +dialog . -forEach +addEventListener +( +' +cancel +' +( +) += +> +events +. +push +( +' +cancel +' +) +{ +signal +} +) +; +dialog +. +addEventListener +( +' +close +' +( +) += +> +events +. +push +( +' +close +' +) +{ +signal +} +) +; +openDialog ( modal +) +; +dialog +. +setAttribute +( +' +closedby +' +closedby +) +; +assert_array_equals +( +events +[ +] +) +; +if +( +dialog +. +closedBy +! += +" +none +" +) +{ +dialog +. +requestClose +( +) +; +assert_false +( +dialog +. +open +) +; +} +else +{ +assert_throws_dom +( +' +InvalidStateError +' +( +) = > +dialog +. +requestClose +( +) +) +; +} +} +changing +closedby +from +' +none +' +to +' +{ +closedby +} +' +for { +modal +? +" +modal +" +: +" +modeless +" +} +dialog +) +; promise_test ( async @@ -424,19 +1002,68 @@ = > { +const +signal += +await +setup +( t +closedby +) +; +let +events += +[ +] +; +dialog . -add_cleanup +addEventListener ( +' +cancel +' ( ) = > +events +. +push +( +' +cancel +' +) +{ +signal +} +) +; dialog . +addEventListener +( +' close +' +( +) += +> +events +. +push ( +' +close +' ) +{ +signal +} ) ; openDialog @@ -446,6 +1073,34 @@ ; dialog . +removeAttribute +( +' +closedby +' +) +; +assert_array_equals +( +events +[ +] +) +; +if +( +dialog +. +closedBy +! += +" +none +" +) +{ +dialog +. requestClose ( ) @@ -458,27 +1113,63 @@ ) ; } +else +{ +assert_throws_dom +( +' +InvalidStateError +' +( +) += +> +dialog +. +requestClose +( +) +) +; +} +} +Removing +closedby +when +closedby += +' +{ +closedby +} +' +for { modal ? " -Modal -: +modal " : " -Non -- -modal -: +modeless " } -requestClose -closes -the dialog ) -; +; +if +( +dialog +. +closedBy +! += +" +none +" +) +{ promise_test ( async @@ -488,27 +1179,14 @@ = > { -t -. -add_cleanup -( -( -) -= -> -dialog -. -close -( -) -) -; const signal = -getSignal +await +setup ( t +closedby ) ; let @@ -628,25 +1306,295 @@ ) ; } +requestClose +can +be +cancelled { +testDescription +} +) +; +promise_test +( +async +( +t +) += +> +{ +await +setup +( +t +closedby +) +; +openDialog +( modal -? -" -Modal -: -" -: -" -Non -- -modal +) +; +assert_equals +( +dialog +. +returnValue +' +' +' +Return +value +starts +out +empty +' +) +; +const +returnValue += +' +The +return +value +' +; +dialog +. +requestClose +( +returnValue +) +; +assert_false +( +dialog +. +open +) +; +assert_equals +( +dialog +. +returnValue +returnValue +' +Return +value +should +be +set +' +) +; +dialog +. +show +( +) +; +dialog +. +close +( +) +; +assert_equals +( +dialog +. +returnValue +returnValue +' +Return +value +should +not +be +changed +by +close +( +) +' +) +; +dialog +. +show +( +) +; +dialog +. +close +( +' +another +' +) +; +assert_equals +( +dialog +. +returnValue +' +another +' +' +Return +value +changes +via +close +( +value +) +' +) +; +} +requestClose +( +returnValue +) +passes +along +the +return +value +{ +testDescription +} +) +; +promise_test +( +async +( +t +) += +> +{ +await +setup +( +t +closedby +) +; +dialog +. +addEventListener +( +' +cancel +' +( +e +) += +> +e +. +preventDefault +( +) +{ +once : -" +true } +) +; +openDialog +( +modal +) +; +dialog +. +returnValue += +' +foo +' +; +assert_equals +( +dialog +. +returnValue +' +foo +' +) +; +dialog +. requestClose -can +( +' +This +should +not +get +saved +' +) +; +assert_true +( +dialog +. +open +' +cancelled +' +) +; +assert_equals +( +dialog +. +returnValue +' +foo +' +' +Return +value +should +not be +changed +' +) +; +} +requestClose +( +returnValue +) +doesn +' +t +change +returnvalue +when cancelled +{ +testDescription +} +) +; +} +} ) ; }