Skip to content

Commit

Permalink
Make showPicker() consume user activation
Browse files Browse the repository at this point in the history
Allowing the page to call showPicker() on select elements as much as it
wants without consuming user activation may result in the user being
unable to interact with the browser UI due to popups always taking
focus.

The HTML spec also says to do this for input elements, so I added code
to do it there as well.

This patch also modified the select showPicker test because calling
showPicker on a select twice in a row in the test somehow resulted in
blink not seeing any input events on the second test_driver.bless(),
perhaps because the select's popup is still open and is somehow
intercepting the input.

HTML spec: whatwg/html#10344

Bug: 1521345
Fixed: 343302069, 343093082, 343473478
Change-Id: If6308a67bac9050f695d18d275ea86c23ac22b0d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5235516
Commit-Queue: Joey Arhar <[email protected]>
Reviewed-by: Di Zhang <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1309009}
  • Loading branch information
josepharhar authored and sadym-chromium committed Jun 3, 2024
1 parent 865b916 commit baad8ae
Showing 1 changed file with 12 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,31 +5,27 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<body></body>

<select>
<option>option</option>
</select>

<script type=module>
test(() => {
const select = document.createElement("select");
const select = document.querySelector('select');

test(() => {
assert_throws_dom('NotAllowedError', () => { select.showPicker(); });
}, `select showPicker() requires a user gesture`);

promise_test(async t => {
const select = document.createElement("select");
document.body.append(select)

await test_driver.bless('show picker');
select.showPicker();
select.blur();
}, `select showPicker() does not throw when user activation is active`);

promise_test(async t => {
const select = document.createElement("select");
document.body.append(select)

await test_driver.bless('show picker');
select.showPicker();
select.blur();
assert_false(navigator.userActivation.isActive,
'User activation should be consumed after calling showPicker().');

assert_false(navigator.userActivation.isActive);
}, `select showPicker() consumes user activation`);
assert_throws_dom('NotAllowedError', () => select.showPicker(),
'select.showPicker() should throw when there is no user activation.');
}, `select showPicker() does not throw when user activation is active.`);
</script>

0 comments on commit baad8ae

Please sign in to comment.