From 56ca991023e9748aa01ada6624b7f06921acd77d Mon Sep 17 00:00:00 2001 From: Mason Freed Date: Wed, 3 Sep 2025 10:45:33 -0700 Subject: [PATCH] Make ESC lose interest in all elements that have interest This CL implements the behavior described in the spec PR: https://github.com/whatwg/html/pull/11006 That is: the ESC key is handled very much like popovers - the focus doesn't need to be on the invoker for ESC to work. Also, hitting ESC loses interest in all elements that currently have interest, in reverse order. A test is added to confirm this. Note: I purposely did not use close watcher here, since I don't believe the close watcher stack should get involved. E.g. the android Back button should just navigate back, and not first lose interest in things. Closing a popover or modal dialog is different than a tooltip being open on a page. Bug: 326681249 Change-Id: I33cc2742a677f330d90b83c29b18b22bf49b716e Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6900679 Reviewed-by: Joey Arhar Auto-Submit: Mason Freed Commit-Queue: Mason Freed Cr-Commit-Position: refs/heads/main@{#1510373} --- ...terestfor-keyboard-behavior.tentative.html | 65 +++++++++++++++++-- 1 file changed, 59 insertions(+), 6 deletions(-) diff --git a/html/semantics/the-button-element/interest-for/interestfor-keyboard-behavior.tentative.html b/html/semantics/the-button-element/interest-for/interestfor-keyboard-behavior.tentative.html index ccfa99b3975f99..211e6f1df38343 100644 --- a/html/semantics/the-button-element/interest-for/interestfor-keyboard-behavior.tentative.html +++ b/html/semantics/the-button-element/interest-for/interestfor-keyboard-behavior.tentative.html @@ -132,7 +132,7 @@ 'showing interest in another trigger should lose interest in the first, then gain interest in second'); verifyInterest(another,`After show interest in ${another.id}`); await sendLoseInterestHotkey(); - assert_array_equals(events,['target interest','target loseinterest (cancelable)','anothertarget interest','anothertarget loseinterest (cancelable)']); + assert_array_equals(events,['target interest','target loseinterest (cancelable)','anothertarget interest','anothertarget loseinterest (not cancelable)']); verifyInterest(undefined,`After lose interest in ${another.id}`); assert_false(target.matches(':popover-open')); assert_false(anothertarget.matches(':popover-open')); @@ -163,14 +163,67 @@ assert_false(target.matches(':popover-open'),'anothertarget popover opens, closing target'); assert_true(anothertarget.matches(':popover-open')); await sendLoseInterestHotkey(); - assert_array_equals(events,['anothertarget loseinterest (cancelable)'],'Lose interest hot key on focused element loses just interest in that element'); + assert_array_equals(events,['anothertarget loseinterest (not cancelable)', 'target loseinterest (not cancelable)'],'Lose interest hot key loses interest in all elements'); assert_false(target.matches(':popover-open')); assert_false(anothertarget.matches(':popover-open')); - shouldCancelLoseInterest = false; - await focusOn(el); - await sendLoseInterestHotkey(); - assert_array_equals(events,['anothertarget loseinterest (cancelable)','target loseinterest (cancelable)'],'Now both lost interest'); verifyInterest(undefined,`Nothing has interest now`); }, `Canceling loseinterest caused by keyboard-gained interest cancels interest, ${description}`); }); + + +
Non-popover target for ESC test
+ +
Non-popover target for ESC test
+ +
Non-popover target for ESC test
+ +