gecko-dev/dom/workers/test/test_suspend.html

149 lines
3.9 KiB
HTML

<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
-->
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Test for DOM Worker Threads</title>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<p id="display"></p>
<div id="content" style="display: none"></div>
<pre id="test">
<iframe id="workerFrame" src="suspend_iframe.html" onload="subframeLoaded();">
</iframe>
<script class="testbody" type="text/javascript">
SimpleTest.waitForExplicitFinish();
var iframe;
var lastCount;
var suspended = false;
var resumed = false;
var finished = false;
var interval;
var oldMessageCount;
var waitCount = 0;
function setCachePref(enabled) {
var prefBranch = SpecialPowers.Cc["@mozilla.org/preferences-service;1"]
.getService(SpecialPowers.Ci.nsIPrefBranch);
if (enabled) {
prefBranch.setBoolPref("browser.sessionhistory.cache_subframes", true);
}
else {
try {
prefBranch.clearUserPref("browser.sessionhistory.cache_subframes");
} catch (e) { /* Pref didn't exist, meh */ }
}
}
function finishTest() {
if (finished) {
return;
}
finished = true;
setCachePref(false);
iframe.terminateWorker();
SimpleTest.finish();
}
function waitInterval() {
if (finished) {
return;
}
is(iframe.location, "about:blank", "Wrong url!");
is(suspended, true, "Not suspended?");
is(resumed, false, "Already resumed?!");
is(lastCount, oldMessageCount, "Received a message while suspended!");
if (++waitCount == 5) {
clearInterval(interval);
resumed = true;
iframe.history.back();
}
}
function badOnloadCallback() {
if (finished) {
return;
}
ok(false, "We don't want suspend_iframe.html to fire a new load event, we want it to come out of the bfcache!");
finishTest();
}
function suspendCallback() {
if (finished) {
return;
}
is(iframe.location, "about:blank", "Wrong url!");
is(suspended, false, "Already suspended?");
is(resumed, false, "Already resumed?");
setCachePref(false);
suspended = true;
var iframeElement = document.getElementById("workerFrame");
iframeElement.onload = badOnloadCallback;
oldMessageCount = lastCount;
interval = setInterval(waitInterval, 1000);
}
function messageCallback(data) {
if (finished) {
return;
}
if (!suspended) {
ok(lastCount === undefined || lastCount == data - 1,
"Got good data, lastCount = " + lastCount + ", data = " + data);
lastCount = data;
if (lastCount == 25) {
setCachePref(true);
iframe.location = "about:blank";
// We want suspend_iframe.html to go into bfcache, so we need to flush
// out all pending notifications. Otherwise, if they're flushed too
// late, they could kick us out of the bfcache again.
iframe.document.body.offsetTop;
}
return;
}
var newLocation =
window.location.toString().replace("test_suspend.html",
"suspend_iframe.html");
is(newLocation.indexOf(iframe.location.toString()), 0, "Wrong url!");
is(resumed, true, "Got message before resumed!");
is(lastCount, data - 1, "Missed a message, suspend failed!");
finishTest();
}
function errorCallback(data) {
if (finished) {
return;
}
ok(false, "Iframe had an error: '" + data + "'");
finishTest();
}
function subframeLoaded() {
if (finished) {
return;
}
var iframeElement = document.getElementById("workerFrame");
iframeElement.onload = suspendCallback;
iframe = iframeElement.contentWindow;
ok(iframe, "No iframe?!");
iframe.startWorker(messageCallback, errorCallback);
}
</script>
</pre>
</body>
</html>