Skip to content

Commit

Permalink
Add an API to query whether the window has seen a user gesture.
Browse files Browse the repository at this point in the history
Add a variable on the navigator object to query whether the frame has
seen a user activation ever.

The postMessage part of the proposal will be done in a separate patch,
this change is limited to just adding the object definition and
exposing it on navigator.

https://github.com/dtapuska/useractivation
whatwg/html#1983

BUG=846858

Change-Id: I6ca4c80f4096bfae9ca13b175b46df6b4486a6dd
  • Loading branch information
dtapuska authored and Chrome-bot committed Jul 5, 2018
1 parent dfe2b1c commit b7284db
Show file tree
Hide file tree
Showing 6 changed files with 207 additions and 0 deletions.
34 changes: 34 additions & 0 deletions html/user-activation/activation-api-click.tentative.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<!DOCTYPE html>
<!--
Tentative due to:
https://github.com/whatwg/html/issues/1983
-->
<html>
<head>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
</head>
<body>
<h1>Clicking on document sets user activation</h1>
<p>Click anywhere in the document.</p>
<script>
async_test(function(t) {
assert_false(navigator.userActivation.hasBeenActive);
assert_false(navigator.userActivation.isActive);
window.addEventListener("click", t.step_func_done(event => {
assert_true(navigator.userActivation.hasBeenActive);
assert_true(navigator.userActivation.isActive);

// Opening a window should consume the activation.
var win = window.open('404.html');
win.close();
assert_true(navigator.userActivation.hasBeenActive);
assert_false(navigator.userActivation.isActive);
}));
test_driver.click(document.body);
}, "Values adjust on activity");
</script>
</body>
</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<!DOCTYPE html>
<!--
Tentative due to:
https://github.com/whatwg/html/issues/3739
-->
<html>
<head>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
</head>
<body>
<h1>Clicking in parent frame does not propagate state to child</h1>
<ol id="instructions">
<li>Click this instruction text.
</ol>
<iframe id="child" width="200" height="200"></iframe>
<script>
async_test(function(t) {
var child = document.getElementById("child");
assert_false(navigator.userActivation.isActive);
assert_false(navigator.userActivation.hasBeenActive);
window.addEventListener("message", t.step_func(event => {
var msg = JSON.parse(event.data);
if (msg.type == 'child-one-loaded') {
// state should be false after load
assert_false(msg.isActive);
assert_false(msg.hasBeenActive);

// click in parent document
test_driver.click(document.getElementById('instructions'));
} else if (msg.type == 'child-one-report') {
// state should be false after asked to report
assert_false(msg.isActive);
assert_false(msg.hasBeenActive);
t.done();
}
}));
window.addEventListener("click", t.step_func(event => {
assert_true(navigator.userActivation.isActive);
assert_true(navigator.userActivation.hasBeenActive);

// Opening a window should consume the activation.
var win = window.open('404.html');
win.close();
assert_false(navigator.userActivation.isActive);
assert_true(navigator.userActivation.hasBeenActive);

// ask child to report their state
child.contentWindow.postMessage('report', '*');
}));
child.src = "resources/child-one.html";
}, "Values adjust on activity");
</script>
</body>
</html>
52 changes: 52 additions & 0 deletions html/user-activation/activation-api-iframe.tenative.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<!DOCTYPE html>
<!--
Tentative due to:
https://github.com/whatwg/html/issues/3739
-->
<html>
<head>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
</head>
<body>
<h1>Clicking in iframe has activation state in child</h1>
<ol id="instructions">
<li>Click inside the red area.
</ol>
<iframe id="child" width="200" height="200"></iframe>
<script>
async_test(function(t) {
var child = document.getElementById("child");
assert_false(navigator.userActivation.isActive);
assert_false(navigator.userActivation.hasBeenActive);
window.addEventListener("message", t.step_func(event => {
var msg = JSON.parse(event.data);
if (msg.type == 'child-one-loaded') {
// values have false after load
assert_false(msg.isActive);
assert_false(msg.hasBeenActive);
test_driver.click(child);
} else if (msg.type == 'child-one-clicked') {
// values have activation state on click
assert_true(navigator.userActivation.isActive);
assert_true(navigator.userActivation.hasBeenActive);
assert_true(msg.isActive);
assert_true(msg.hasBeenActive);
child.src = "resources/child-two.html";
} else if (msg.type == 'child-two-loaded') {
// values are reset after navigation
assert_true(navigator.userActivation.isActive);
assert_true(navigator.userActivation.hasBeenActive);
assert_false(msg.isActive);
assert_false(msg.hasBeenActive);
t.done();
}
}));
child.src = "resources/child-one.html";
}, "Values adjust on activity");
</script>
</body>
</html>
36 changes: 36 additions & 0 deletions html/user-activation/activation-api-setTimeout.tentative.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<!DOCTYPE html>
<!--
Tentative due to:
https://github.com/whatwg/html/issues/1983
-->
<html>
<head>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
</head>
<body>
<h1>Clicking on document sets user activation even after setTimeout</h1>
<p>Click anywhere in the document.</p>
<script>
async_test(function(t) {
assert_false(navigator.userActivation.hasBeenActive);
assert_false(navigator.userActivation.isActive);
window.addEventListener("click", event => {
t.step_timeout(() => {
assert_true(navigator.userActivation.hasBeenActive);
assert_true(navigator.userActivation.isActive);

// Opening a window should consume the activation.
window.open('404.html');
assert_true(navigator.userActivation.hasBeenActive);
assert_false(navigator.userActivation.isActive);
t.done();
}, 0);
});
test_driver.click(document.body);
}, "Values adjust on activity");
</script>
</body>
</html>
20 changes: 20 additions & 0 deletions html/user-activation/resources/child-one.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<!DOCTYPE html>
<body style="background: red;">
<script>
window.parent.postMessage(JSON.stringify({"type": "child-one-loaded", "isActive": navigator.userActivation.isActive,
"hasBeenActive": navigator.userActivation.hasBeenActive}), "*");

window.addEventListener("click", event => {
window.parent.postMessage(JSON.stringify({"type": "child-one-clicked", "isActive": navigator.userActivation.isActive,
"hasBeenActive": navigator.userActivation.hasBeenActive}), "*");
});

window.addEventListener("message", event => {
if (event.data == "report") {
window.parent.postMessage(JSON.stringify({"type": "child-one-report", "isActive": navigator.userActivation.isActive,
"hasBeenActive": navigator.userActivation.hasBeenActive}), "*");
}
});

</script>
</body>
7 changes: 7 additions & 0 deletions html/user-activation/resources/child-two.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<!DOCTYPE html>
<body style="background: red;">
<script>
window.parent.postMessage(JSON.stringify({"type": "child-two-loaded", "isActive": navigator.userActivation.isActive,
"hasBeenActive": navigator.userActivation.hasBeenActive}), "*");
</script>
</body>

0 comments on commit b7284db

Please sign in to comment.