зеркало из https://github.com/mozilla/gecko-dev.git
107 строки
4.0 KiB
HTML
107 строки
4.0 KiB
HTML
<head>
|
|
<meta charset="utf-8">
|
|
<title>Plugin Crash, FullScreenElement Remains, div[F];plugin</title>
|
|
<script type="text/javascript" src="/tests/SimpleTest/AddTask.js"></script>
|
|
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
|
<script type="application/javascript" src="plugin-utils.js"></script>
|
|
</head>
|
|
|
|
<body onLoad="load()">
|
|
<script class="testbody" type="application/javascript">
|
|
setTestPluginEnabledState(SpecialPowers.Ci.nsIPluginTag.STATE_ENABLED);
|
|
SimpleTest.expectChildProcessCrash();
|
|
SimpleTest.requestFlakyTimeout("This is needed in the event the " +
|
|
"fullscreen element fails to cancel fullscreen. The fullscreen " +
|
|
"element is expected to exit fullscreen but takes some time to " +
|
|
"register as having exited when using `mozCancelFullScreen`. So we " +
|
|
"can't just check that `mozFullScreenElement` is true or false after " +
|
|
"having called `mozCancelFullScreen` without the timeout because it " +
|
|
"will return the value prior to actually cancelling. A timeout is " +
|
|
"preferred here as opposed to polling methods similar to " +
|
|
"`SimpleTest.waitForCondition` in `SimpleTest.js` for reasons of" +
|
|
"idiomaticity."
|
|
);
|
|
|
|
/**
|
|
* FullScreen element is expected to remain alive after the test ends; this
|
|
* stops it.
|
|
*/
|
|
SimpleTest.registerCleanupFunction(() => {
|
|
if (this.document.mozFullScreenElement) {
|
|
let fullScreenChange = promiseFullScreenChange();
|
|
this.document.mozCancelFullScreen();
|
|
return fullScreenChange;
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Start with a fullscreen element.
|
|
* Then crash the plugin - which is expected to not be a child of the full
|
|
* screen element - and therefore remain in the fullscreen element.
|
|
*/
|
|
let load = function testCrashChildPlugin_expectFullScreenElementToRemain() {
|
|
add_task(async function() {
|
|
/* Needed to be able to programatically (without user interaction) enter
|
|
* fullscreen (has been deemed a security issue otherwise and therefore
|
|
* disabled by default)
|
|
*/
|
|
await SpecialPowers.pushPrefEnv({
|
|
"set": [
|
|
["full-screen-api.allow-trusted-requests-only", false],
|
|
["full-screen-api.unprefix.enabled", true],
|
|
],
|
|
});
|
|
});
|
|
|
|
add_task(async function() {
|
|
let fullScreenElement = document.getElementById('div1');
|
|
let plugin = document.getElementById('plugin1');
|
|
|
|
let fullScreenChange = promiseFullScreenChange();
|
|
fullScreenElement.mozRequestFullScreen();
|
|
await fullScreenChange;
|
|
ok(true, "Element is fullscreen");
|
|
|
|
await crashPlugin(plugin)
|
|
.then(() => {
|
|
ok(true, "Plugin was crashed");
|
|
})
|
|
.catch(() => {
|
|
ok(false, "Plugin was crashed");
|
|
});
|
|
});
|
|
|
|
add_task(async function() {
|
|
/**
|
|
* We expect the fullscreen mode to _not_ change in this test. We'll wait
|
|
* 5 seconds for any kind of fullscreen change to occur, and fail if it
|
|
* does. Otherwise, we'll assume fullscreen didn't change and finish the
|
|
* test.
|
|
*/
|
|
await new Promise((resolve, reject) => {
|
|
let timeoutId;
|
|
let onFullScreenChange = () => {
|
|
document.removeEventListener("fullscreenchange", onFullScreenChange);
|
|
clearTimeout(timeoutId);
|
|
reject();
|
|
}
|
|
document.addEventListener("fullscreenchange", onFullScreenChange);
|
|
timeoutId = setTimeout(() => {
|
|
document.removeEventListener("fullscreenchange", onFullScreenChange);
|
|
resolve();
|
|
}, 5000);
|
|
})
|
|
.then(() => {
|
|
ok(true, "Element is still fullscreen");
|
|
})
|
|
.catch(() => {
|
|
ok(false, "Element is still fullscreen");
|
|
});
|
|
});
|
|
}
|
|
</script>
|
|
|
|
<div id="div1"></div>
|
|
<embed id="plugin1" type="application/x-test" />
|
|
</body>
|