Skip to content

Commit 823024a

Browse files
committed
Make requestFullscreen() consume user activation
https://bugs.webkit.org/show_bug.cgi?id=247920 rdar://102355401 Reviewed by Youenn Fablet. Matches Chrome & Firefox implementations, we should reset the activation timestamps when requesting fullscreen. This disallows double non-user initiated requestFullscreen calls. Spec PR: whatwg/fullscreen#153 WPT upstream revision: web-platform-tests/wpt@897b406 * LayoutTests/imported/w3c/web-platform-tests/fullscreen/api/element-request-fullscreen-consume-user-activation-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/fullscreen/api/element-request-fullscreen-consume-user-activation.html: Added. * LayoutTests/imported/w3c/web-platform-tests/fullscreen/api/element-request-fullscreen-same-element-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/fullscreen/api/element-request-fullscreen-same-element.html: Added. * LayoutTests/imported/w3c/web-platform-tests/fullscreen/api/w3c-import.log: * LayoutTests/platform/mac-wk1/imported/w3c/web-platform-tests/fullscreen/api/element-request-fullscreen-same-element-expected.txt: Added. * Source/WebCore/dom/FullscreenManager.cpp: (WebCore::FullscreenManager::requestFullscreenForElement): Canonical link: https://commits.webkit.org/257554@main
1 parent 710c43c commit 823024a

File tree

7 files changed

+66
-1
lines changed

7 files changed

+66
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
2+
PASS Element#requestFullscreen() consumes user activation
3+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<!DOCTYPE html>
2+
<title>Element#requestFullscreen() consumes user activation</title>
3+
<script src="/resources/testharness.js"></script>
4+
<script src="/resources/testharnessreport.js"></script>
5+
<script src="/resources/testdriver.js"></script>
6+
<script src="/resources/testdriver-vendor.js"></script>
7+
<div id="log"></div>
8+
<script>
9+
promise_test(async (t) => {
10+
t.add_cleanup(() => {
11+
if (document.fullscreenElement) return document.exitFullscreen();
12+
});
13+
const div = document.querySelector("div");
14+
15+
await test_driver.bless("fullscreen");
16+
assert_true(navigator.userActivation.isActive, "Activation must be active");
17+
// Request fullscreen twice in a row. The first request should consume the
18+
// user activation and succeed, and the second request should fail because
19+
// of the user activation requirement.
20+
const p1 = div.requestFullscreen();
21+
assert_false(navigator.userActivation.isActive, "Transient activation is consumed");
22+
const p2 = promise_rejects_js(t, TypeError, div.requestFullscreen());
23+
await Promise.all([p1, p2]);
24+
});
25+
</script>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
2+
PASS Element#requestFullscreen() on the current fullscreen element
3+
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<!DOCTYPE html>
2+
<title>Element#requestFullscreen() on the current fullscreen element</title>
3+
<script src="/resources/testharness.js"></script>
4+
<script src="/resources/testharnessreport.js"></script>
5+
<script src="/resources/testdriver.js"></script>
6+
<script src="/resources/testdriver-vendor.js"></script>
7+
<div id="log"></div>
8+
<script>
9+
promise_test(async (t) => {
10+
t.add_cleanup(() => {
11+
if (document.fullscreenElement) return document.exitFullscreen();
12+
});
13+
14+
// Use the body element as the fullscreen element, because the second
15+
// test_driver.bless() call needs to insert a button inside of it, which
16+
// can't be clicked if another element is already fullscreen.
17+
const target = document.body;
18+
19+
// First enter fullscreen.
20+
await test_driver.bless("fullscreen", () => target.requestFullscreen());
21+
assert_equals(document.fullscreenElement, target, "fullscreen element after first request");
22+
23+
// Now request fullscreen again, which should be a no-op.
24+
await test_driver.bless("fullscreen", () => target.requestFullscreen());
25+
assert_equals(document.fullscreenElement, target, "fullscreen element after second request");
26+
});
27+
</script>

LayoutTests/imported/w3c/web-platform-tests/fullscreen/api/w3c-import.log

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@ List of files:
2424
/LayoutTests/imported/w3c/web-platform-tests/fullscreen/api/document-fullscreen-enabled.html
2525
/LayoutTests/imported/w3c/web-platform-tests/fullscreen/api/document-onfullscreenerror.html
2626
/LayoutTests/imported/w3c/web-platform-tests/fullscreen/api/element-request-fullscreen-active-document.html
27+
/LayoutTests/imported/w3c/web-platform-tests/fullscreen/api/element-request-fullscreen-consume-user-activation.html
2728
/LayoutTests/imported/w3c/web-platform-tests/fullscreen/api/element-request-fullscreen-dialog.html
2829
/LayoutTests/imported/w3c/web-platform-tests/fullscreen/api/element-request-fullscreen-not-allowed.html
2930
/LayoutTests/imported/w3c/web-platform-tests/fullscreen/api/element-request-fullscreen-options.html
3031
/LayoutTests/imported/w3c/web-platform-tests/fullscreen/api/element-request-fullscreen-options.tentative.html
32+
/LayoutTests/imported/w3c/web-platform-tests/fullscreen/api/element-request-fullscreen-same-element.html
3133
/LayoutTests/imported/w3c/web-platform-tests/fullscreen/api/element-request-fullscreen.html
3234
/LayoutTests/imported/w3c/web-platform-tests/fullscreen/api/fullscreen-display-contents-expected.html
3335
/LayoutTests/imported/w3c/web-platform-tests/fullscreen/api/fullscreen-display-contents-ref.html
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
2+
FAIL Element#requestFullscreen() on the current fullscreen element assert_equals: fullscreen element after first request expected Element node <body><div id="log"></div>
3+
<script>
4+
promise_test(async (t... but got null
5+

Source/WebCore/dom/FullscreenManager.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ void FullscreenManager::requestFullscreenForElement(Ref<Element>&& element, RefP
100100
return;
101101
}
102102

103-
if (!document().domWindow() || !document().domWindow()->hasTransientActivation()) {
103+
if (!document().domWindow() || !document().domWindow()->consumeTransientActivation()) {
104104
ERROR_LOG(LOGIDENTIFIER, "!hasTransientActivation; failing.");
105105
failedPreflights(WTFMove(element), WTFMove(promise));
106106
return;

0 commit comments

Comments
 (0)