1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
<!--
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) {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
var prefBranch = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.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>
|