Commit cec7306c authored by James Hollyer's avatar James Hollyer Committed by Commit Bot

Check for User Gesture in Pointer Lock Requests on test.

Pointer Lock should fail without user gesture. However, the logic which
checks that is overridden in in web tests. This adds logic to mimic
those checks in the overriding class in order to test that the proper
error is routed out.

A follow up CL is planned to move the actual logic up in the flow so that the real
logic is tested.

Bug: 1142136
Change-Id: I9d62ad2df0bde3666fe987ea70131378a605ffba
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2496191Reviewed-by: default avatarReilly Grant <reillyg@chromium.org>
Reviewed-by: default avatarMike West <mkwst@chromium.org>
Commit-Queue: James Hollyer <jameshollyer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#822778}
parent 48b60845
......@@ -5,6 +5,7 @@
#include "content/web_test/browser/web_test_shell_platform_delegate.h"
#include "base/command_line.h"
#include "content/public/browser/web_contents.h"
#include "content/web_test/browser/web_test_control_host.h"
#include "content/web_test/browser/web_test_javascript_dialog_manager.h"
#include "content/web_test/common/web_test_switches.h"
......@@ -46,6 +47,11 @@ bool WebTestShellPlatformDelegate::HandleRequestToLockMouse(
WebContents* web_contents,
bool user_gesture,
bool last_unlocked_by_target) {
if (!user_gesture && !last_unlocked_by_target) {
web_contents->GotResponseToLockMouseRequest(
blink::mojom::PointerLockResult::kRequiresUserGesture);
}
WebTestControlHost::Get()->RequestToLockMouse(web_contents);
// Always indicate that we have handled the request to lock the mouse.
return true;
......
Test sandboxed iframe with allow-pointer-lock allows pointer lock.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
PASS message is "inner-iframe.html onpointerlockchange, document.pointerLockElement = [object HTMLBodyElement]"
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE HTML>
<html>
<head>
<script src="/js-test-resources/js-test.js"></script>
<script src="../resources/pointer-lock/pointer-lock-test-harness.js"></script>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<div>
<div id="target1"></div>
<iframe src="../resources/pointer-lock/inner-iframe.html" sandbox="allow-pointer-lock allow-scripts" onload="doNextStepWithUserGesture()"></iframe>
</div>
<script>
description("Test sandboxed iframe with allow-pointer-lock allows pointer lock.");
window.jsTestIsAsync = true;
targetDiv1 = document.getElementById("target1");
iframe = document.getElementsByTagName("iframe")[0];
todo = [
function () {
iframe.contentWindow.postMessage(["eval", 'document.body.requestPointerLock()'], "*");
window.onmessage = function (messageEvent) {
message = messageEvent.data;
shouldBeEqualToString("message", "inner-iframe.html onpointerlockchange, document.pointerLockElement = [object HTMLBodyElement]");
window.onmessage = null;
doNextStep();
promise_test(() => {
return new Promise((resolve, reject) => {
window.addEventListener('message', (event) => {
if (event.data == "inner-iframe.html onpointerlockchange, document.pointerLockElement = [object HTMLBodyElement]") {
resolve();
} else {
reject(event.data);
}
},
];
// doNextStep() called by iframe onload handler.
});
function onIframeLoaded() {
clickOnElement(iframe);
}
var iframe = document.createElement('iframe');
iframe.sandbox = 'allow-pointer-lock allow-scripts';
iframe.onload = onIframeLoaded;
iframe.src = '../resources/pointer-lock/inner-iframe.html';
document.body.appendChild(iframe);
});
}, 'Test sandboxed iframe with allow-pointer-lock allows pointer lock.');
</script>
</body>
</html>
Test nested sandboxed iframes with allow-pointer-lock allow pointer lock.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
PASS message is "inner-iframe.html onpointerlockchange, document.pointerLockElement = [object HTMLBodyElement]"
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE HTML>
<html>
<head>
<script src="/js-test-resources/js-test.js"></script>
<script src="../resources/pointer-lock/pointer-lock-test-harness.js"></script>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<div>
<div id="target1"></div>
<iframe src="../resources/pointer-lock/iframe-allows-inner-iframe.html" sandbox="allow-pointer-lock allow-scripts" onload="doNextStepWithUserGesture()"></iframe>
</div>
<body>>
<script>
description("Test nested sandboxed iframes with allow-pointer-lock allow pointer lock.");
window.jsTestIsAsync = true;
targetDiv1 = document.getElementById("target1");
iframe = document.getElementsByTagName("iframe")[0];
todo = [
function () {
iframe.contentWindow.postMessage(["pass message down", "eval", 'document.body.requestPointerLock()'], "*");
window.onmessage = function (messageEvent) {
message = messageEvent.data;
shouldBeEqualToString("message", "inner-iframe.html onpointerlockchange, document.pointerLockElement = [object HTMLBodyElement]");
window.onmessage = null;
doNextStep();
promise_test(() => {
return new Promise((resolve, reject) => {
window.addEventListener('message', (event) => {
if (event.data == "inner-iframe.html onpointerlockchange, document.pointerLockElement = [object HTMLBodyElement]") {
resolve();
} else if (event.data != 'inner frame load') {
reject(event.data);
}
},
];
// doNextStep() called by iframe onload handler.
});
window.addEventListener('message', (event) => {
if (event.data == 'inner frame load') {
clickOnElement(iframe);
}
});
var iframe = document.createElement('iframe');
iframe.sandbox = 'allow-pointer-lock allow-scripts';
iframe.src = '../resources/pointer-lock/iframe-allows-inner-iframe.html';
document.body.appendChild(iframe);
});
}, 'Test sandboxed nested iframe with allow-pointer-lock allows pointer lock.');
</script>
</body>
</html>
CONSOLE ERROR: Blocked pointer lock on an element because the element's frame is sandboxed and the 'allow-pointer-lock' permission is not set.
Test nested sandboxed iframes without and then with allow-pointer-lock disallow pointer lock.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
PASS message is "inner-iframe.html onpointerlockerror"
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE HTML>
<html>
<head>
<script src="/js-test-resources/js-test.js"></script>
<script src="../resources/pointer-lock/pointer-lock-test-harness.js"></script>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<div>
<div id="target1"></div>
<iframe src="../resources/pointer-lock/iframe-allows-inner-iframe.html" sandbox="allow-scripts" onload="doNextStepWithUserGesture()"></iframe>
</div>
<script>
description("Test nested sandboxed iframes without and then with allow-pointer-lock disallow pointer lock.");
window.jsTestIsAsync = true;
targetDiv1 = document.getElementById("target1");
iframe = document.getElementsByTagName("iframe")[0];
todo = [
function () {
iframe.contentWindow.postMessage(["pass message down", "eval", 'document.body.requestPointerLock()'], "*");
window.onmessage = function (messageEvent) {
message = messageEvent.data;
shouldBeEqualToString("message", "inner-iframe.html onpointerlockerror");
window.onmessage = null;
doNextStep();
promise_test(() => {
return new Promise((resolve, reject) => {
window.addEventListener('message', (event) => {
if (event.data == "inner-iframe.html onpointerlockerror") {
resolve();
} else if (event.data != 'inner frame load') {
reject(event.data);
}
},
];
// doNextStep() called by iframe onload handler.
});
window.addEventListener('message', (event) => {
if (event.data == 'inner frame load') {
clickOnElement(iframe);
}
});
var iframe = document.createElement('iframe');
iframe.sandbox = 'allow-scripts';
iframe.src = '../resources/pointer-lock/iframe-allows-inner-iframe.html';
document.body.appendChild(iframe);
});
}, 'Test sandboxed nested iframe without allow-pointer-lock does not allow pointer lock.');
</script>
</body>
</html>
......@@ -3,9 +3,16 @@
<head>
<script src="iframe-common.js"></script>
</head>
<script>
function onInnerFrameLoad() {
parent.postMessage('inner frame load', '*');
}
window.addEventListener('message', (event) => {
parent.postMessage(event.data, '*');
});
</script>
<body>
<iframe src="inner-iframe.html" sandbox="allow-pointer-lock allow-scripts" onload="onInnerFrameLoad()"></iframe>
iframe-allows-inner-iframe.html
<iframe src="inner-iframe.html" sandbox="allow-pointer-lock allow-scripts"></iframe>
</body>
</html>
\ No newline at end of file
......@@ -2,6 +2,11 @@
<html>
<head>
<script src="iframe-common.js"></script>
<script>
document.addEventListener('click', () => {
document.body.requestPointerLock();
})
</script>
</head>
<body>
inner-iframe.html
......
......@@ -49,6 +49,23 @@ function doNextStepWithUserGesture()
doNextStep({withUserGesture: true});
}
function clickOnElement(element) {
var viewportOffset = element.getBoundingClientRect();
var top = viewportOffset.top;
var bottom = viewportOffset.bottom;
var left = viewportOffset.left;
var right = viewportOffset.right;
var vertical_center = top + (bottom - top) / 2;
var horizontal_center = left + (right - left) / 2;
if (window.testRunner) {
eventSender.mouseMoveTo(horizontal_center, vertical_center);
eventSender.mouseDown(0);
eventSender.mouseUp(0);
}
}
function eventExpected(eventHandlerName, message, expectedCalls, targetHanderNode)
{
targetHanderNode[eventHandlerName] = function () {
......
......@@ -38,7 +38,7 @@
doNextStep();
},
];
doNextStep();
doNextStepWithUserGesture();
</script>
</body>
</html>
......@@ -2,6 +2,8 @@
<script src='../resources/testharness.js'></script>
<script src='../resources/testharnessreport.js'></script>
<script src='resources/shadow-dom.js'></script>
<script src="../resources/testdriver.js"></script>
<script src="../resources/testdriver-vendor.js"></script>
<div id='host'>
<template data-mode='open'>
......@@ -29,7 +31,7 @@
</div>
<script>
async_test((test) => {
promise_test(async (test) => {
document.onpointerlockerror = test.unreached_func('onpointerlockerror is not expected.');
document.onpointerlockchange = test.step_func(() => {
......@@ -64,6 +66,8 @@ async_test((test) => {
});
var canvas = host3.shadowRoot.querySelector('canvas');
await test_driver.bless('user gesture requests pointer lock', async () => {
canvas.requestPointerLock();
});
}, 'Test for pointerLockElement adjustment for Shadow DOM.');
</script>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment