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 @@ ...@@ -5,6 +5,7 @@
#include "content/web_test/browser/web_test_shell_platform_delegate.h" #include "content/web_test/browser/web_test_shell_platform_delegate.h"
#include "base/command_line.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_control_host.h"
#include "content/web_test/browser/web_test_javascript_dialog_manager.h" #include "content/web_test/browser/web_test_javascript_dialog_manager.h"
#include "content/web_test/common/web_test_switches.h" #include "content/web_test/common/web_test_switches.h"
...@@ -46,6 +47,11 @@ bool WebTestShellPlatformDelegate::HandleRequestToLockMouse( ...@@ -46,6 +47,11 @@ bool WebTestShellPlatformDelegate::HandleRequestToLockMouse(
WebContents* web_contents, WebContents* web_contents,
bool user_gesture, bool user_gesture,
bool last_unlocked_by_target) { bool last_unlocked_by_target) {
if (!user_gesture && !last_unlocked_by_target) {
web_contents->GotResponseToLockMouseRequest(
blink::mojom::PointerLockResult::kRequiresUserGesture);
}
WebTestControlHost::Get()->RequestToLockMouse(web_contents); WebTestControlHost::Get()->RequestToLockMouse(web_contents);
// Always indicate that we have handled the request to lock the mouse. // Always indicate that we have handled the request to lock the mouse.
return true; 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> <!DOCTYPE HTML>
<html> <html>
<head> <head>
<script src="/js-test-resources/js-test.js"></script>
<script src="../resources/pointer-lock/pointer-lock-test-harness.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> </head>
<body> <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> <script>
description("Test sandboxed iframe with allow-pointer-lock allows pointer lock."); promise_test(() => {
window.jsTestIsAsync = true; return new Promise((resolve, reject) => {
window.addEventListener('message', (event) => {
targetDiv1 = document.getElementById("target1"); if (event.data == "inner-iframe.html onpointerlockchange, document.pointerLockElement = [object HTMLBodyElement]") {
iframe = document.getElementsByTagName("iframe")[0]; resolve();
} else {
todo = [ reject(event.data);
function () { }
iframe.contentWindow.postMessage(["eval", 'document.body.requestPointerLock()'], "*"); });
window.onmessage = function (messageEvent) { function onIframeLoaded() {
message = messageEvent.data; clickOnElement(iframe);
shouldBeEqualToString("message", "inner-iframe.html onpointerlockchange, document.pointerLockElement = [object HTMLBodyElement]"); }
window.onmessage = null; var iframe = document.createElement('iframe');
doNextStep(); iframe.sandbox = 'allow-pointer-lock allow-scripts';
} iframe.onload = onIframeLoaded;
}, iframe.src = '../resources/pointer-lock/inner-iframe.html';
]; document.body.appendChild(iframe);
// doNextStep() called by iframe onload handler. });
}, 'Test sandboxed iframe with allow-pointer-lock allows pointer lock.');
</script> </script>
</body> </body>
</html> </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> <!DOCTYPE HTML>
<html> <html>
<head> <head>
<script src="/js-test-resources/js-test.js"></script>
<script src="../resources/pointer-lock/pointer-lock-test-harness.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> </head>
<body> <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>
<script> <script>
description("Test nested sandboxed iframes with allow-pointer-lock allow pointer lock."); promise_test(() => {
window.jsTestIsAsync = true; return new Promise((resolve, reject) => {
window.addEventListener('message', (event) => {
targetDiv1 = document.getElementById("target1"); if (event.data == "inner-iframe.html onpointerlockchange, document.pointerLockElement = [object HTMLBodyElement]") {
iframe = document.getElementsByTagName("iframe")[0]; resolve();
} else if (event.data != 'inner frame load') {
todo = [ reject(event.data);
function () { }
iframe.contentWindow.postMessage(["pass message down", "eval", 'document.body.requestPointerLock()'], "*"); });
window.onmessage = function (messageEvent) { window.addEventListener('message', (event) => {
message = messageEvent.data; if (event.data == 'inner frame load') {
shouldBeEqualToString("message", "inner-iframe.html onpointerlockchange, document.pointerLockElement = [object HTMLBodyElement]"); clickOnElement(iframe);
window.onmessage = null; }
doNextStep(); });
} var iframe = document.createElement('iframe');
}, iframe.sandbox = 'allow-pointer-lock allow-scripts';
]; iframe.src = '../resources/pointer-lock/iframe-allows-inner-iframe.html';
// doNextStep() called by iframe onload handler. document.body.appendChild(iframe);
});
}, 'Test sandboxed nested iframe with allow-pointer-lock allows pointer lock.');
</script> </script>
</body> </body>
</html> </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> <!DOCTYPE HTML>
<html> <html>
<head> <head>
<script src="/js-test-resources/js-test.js"></script>
<script src="../resources/pointer-lock/pointer-lock-test-harness.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> </head>
<body> <body>
<div>
<div id="target1"></div>
<iframe src="../resources/pointer-lock/iframe-allows-inner-iframe.html" sandbox="allow-scripts" onload="doNextStepWithUserGesture()"></iframe>
</div>
<script> <script>
description("Test nested sandboxed iframes without and then with allow-pointer-lock disallow pointer lock."); promise_test(() => {
window.jsTestIsAsync = true; return new Promise((resolve, reject) => {
window.addEventListener('message', (event) => {
targetDiv1 = document.getElementById("target1"); if (event.data == "inner-iframe.html onpointerlockerror") {
iframe = document.getElementsByTagName("iframe")[0]; resolve();
} else if (event.data != 'inner frame load') {
todo = [ reject(event.data);
function () { }
iframe.contentWindow.postMessage(["pass message down", "eval", 'document.body.requestPointerLock()'], "*"); });
window.onmessage = function (messageEvent) { window.addEventListener('message', (event) => {
message = messageEvent.data; if (event.data == 'inner frame load') {
shouldBeEqualToString("message", "inner-iframe.html onpointerlockerror"); clickOnElement(iframe);
window.onmessage = null; }
doNextStep(); });
} var iframe = document.createElement('iframe');
}, iframe.sandbox = 'allow-scripts';
]; iframe.src = '../resources/pointer-lock/iframe-allows-inner-iframe.html';
// doNextStep() called by iframe onload handler. document.body.appendChild(iframe);
});
}, 'Test sandboxed nested iframe without allow-pointer-lock does not allow pointer lock.');
</script> </script>
</body> </body>
</html> </html>
...@@ -3,9 +3,16 @@ ...@@ -3,9 +3,16 @@
<head> <head>
<script src="iframe-common.js"></script> <script src="iframe-common.js"></script>
</head> </head>
<script>
function onInnerFrameLoad() {
parent.postMessage('inner frame load', '*');
}
window.addEventListener('message', (event) => {
parent.postMessage(event.data, '*');
});
</script>
<body> <body>
<iframe src="inner-iframe.html" sandbox="allow-pointer-lock allow-scripts" onload="onInnerFrameLoad()"></iframe>
iframe-allows-inner-iframe.html iframe-allows-inner-iframe.html
<iframe src="inner-iframe.html" sandbox="allow-pointer-lock allow-scripts"></iframe>
</body> </body>
</html> </html>
\ No newline at end of file
...@@ -2,6 +2,11 @@ ...@@ -2,6 +2,11 @@
<html> <html>
<head> <head>
<script src="iframe-common.js"></script> <script src="iframe-common.js"></script>
<script>
document.addEventListener('click', () => {
document.body.requestPointerLock();
})
</script>
</head> </head>
<body> <body>
inner-iframe.html inner-iframe.html
......
...@@ -49,6 +49,23 @@ function doNextStepWithUserGesture() ...@@ -49,6 +49,23 @@ function doNextStepWithUserGesture()
doNextStep({withUserGesture: true}); 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) function eventExpected(eventHandlerName, message, expectedCalls, targetHanderNode)
{ {
targetHanderNode[eventHandlerName] = function () { targetHanderNode[eventHandlerName] = function () {
......
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
doNextStep(); doNextStep();
}, },
]; ];
doNextStep(); doNextStepWithUserGesture();
</script> </script>
</body> </body>
</html> </html>
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
<script src='../resources/testharness.js'></script> <script src='../resources/testharness.js'></script>
<script src='../resources/testharnessreport.js'></script> <script src='../resources/testharnessreport.js'></script>
<script src='resources/shadow-dom.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'> <div id='host'>
<template data-mode='open'> <template data-mode='open'>
...@@ -29,7 +31,7 @@ ...@@ -29,7 +31,7 @@
</div> </div>
<script> <script>
async_test((test) => { promise_test(async (test) => {
document.onpointerlockerror = test.unreached_func('onpointerlockerror is not expected.'); document.onpointerlockerror = test.unreached_func('onpointerlockerror is not expected.');
document.onpointerlockchange = test.step_func(() => { document.onpointerlockchange = test.step_func(() => {
...@@ -64,6 +66,8 @@ async_test((test) => { ...@@ -64,6 +66,8 @@ async_test((test) => {
}); });
var canvas = host3.shadowRoot.querySelector('canvas'); var canvas = host3.shadowRoot.querySelector('canvas');
canvas.requestPointerLock(); await test_driver.bless('user gesture requests pointer lock', async () => {
canvas.requestPointerLock();
});
}, 'Test for pointerLockElement adjustment for Shadow DOM.'); }, 'Test for pointerLockElement adjustment for Shadow DOM.');
</script> </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