1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/workers/test/test_multi_sharedWorker_lifetimes.html Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,162 @@ 1.4 +<!-- 1.5 + Any copyright is dedicated to the Public Domain. 1.6 + http://creativecommons.org/publicdomain/zero/1.0/ 1.7 +--> 1.8 +<!DOCTYPE HTML> 1.9 +<html> 1.10 + <head> 1.11 + <title>Test for SharedWorker</title> 1.12 + <script src="/tests/SimpleTest/SimpleTest.js"></script> 1.13 + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"> 1.14 + <script class="testbody" type="text/javascript;version=1.7"> 1.15 + "use strict"; 1.16 + 1.17 + const swPref = "dom.workers.sharedWorkers.enabled"; 1.18 + const scrollbarPref = "layout.testing.overlay-scrollbars.always-visible"; 1.19 + const bfCacheEnabledPref = "browser.sessionhistory.cache_subframes"; 1.20 + const bfCacheDepthPref = "browser.sessionhistory.max_total_viewers"; 1.21 + const bfCacheDepth = 10; 1.22 + 1.23 + const frameRelativeURL = "multi_sharedWorker_frame.html"; 1.24 + const storedData = "0123456789abcdefghijklmnopqrstuvwxyz"; 1.25 + 1.26 + let testGenerator = (function() { 1.27 + SimpleTest.waitForExplicitFinish(); 1.28 + 1.29 + if (!SpecialPowers.getBoolPref(swPref)) { 1.30 + ok(!("SharedWorker" in window), "No SharedWorker without pref set"); 1.31 + } 1.32 + 1.33 + // Enable SharedWorkers and force scrollbar to always be shown. The 1.34 + // scrollbar setting is necessary to avoid the fade-in/fade-out from 1.35 + // evicting our document from the BF cache below. If bug 1049277 1.36 + // is fixed, then we can stop setting the scrollbar pref here. 1.37 + SpecialPowers.pushPrefEnv({ set: [[swPref, true], 1.38 + [scrollbarPref, true]] }, 1.39 + sendToGenerator); 1.40 + yield undefined; 1.41 + 1.42 + window.addEventListener("message", function(event) { 1.43 + if (typeof(event.data) == "string") { 1.44 + info(event.data); 1.45 + } else { 1.46 + sendToGenerator(event); 1.47 + } 1.48 + }); 1.49 + 1.50 + let frame = document.getElementById("frame"); 1.51 + frame.src = frameRelativeURL; 1.52 + frame.onload = sendToGenerator; 1.53 + 1.54 + yield undefined; 1.55 + 1.56 + frame = frame.contentWindow; 1.57 + frame.postMessage({ command: "retrieve" }, "*"); 1.58 + 1.59 + let event = yield undefined; 1.60 + ok(event instanceof MessageEvent, "Got a MessageEvent"); 1.61 + is(event.source, frame, "Correct window got the event"); 1.62 + is(event.data.type, "result", "Got a result message"); 1.63 + is(event.data.data, undefined, "No data stored yet"); 1.64 + 1.65 + frame.postMessage({ command: "store", data: storedData }, "*"); 1.66 + frame.postMessage({ command: "retrieve" }, "*"); 1.67 + 1.68 + event = yield undefined; 1.69 + ok(event instanceof MessageEvent, "Got a MessageEvent"); 1.70 + is(event.source, frame, "Correct window got the event"); 1.71 + is(event.data.type, "result", "Got a result message"); 1.72 + is(event.data.data, storedData, "Got stored data"); 1.73 + 1.74 + // Navigate when the bfcache is disabled. 1.75 + info("Navigating to about:blank"); 1.76 + let frame = document.getElementById("frame"); 1.77 + frame.onload = sendToGenerator; 1.78 + frame.src = "about:blank"; 1.79 + frame.contentWindow.document.body.offsetTop; 1.80 + 1.81 + yield undefined; 1.82 + 1.83 + info("Navigating to " + frameRelativeURL); 1.84 + frame.src = frameRelativeURL; 1.85 + frame.contentWindow.document.body.offsetTop; 1.86 + 1.87 + yield undefined; 1.88 + 1.89 + frame = frame.contentWindow; 1.90 + frame.postMessage({ command: "retrieve" }, "*"); 1.91 + 1.92 + let event = yield undefined; 1.93 + ok(event instanceof MessageEvent, "Got a MessageEvent"); 1.94 + is(event.source, frame, "Correct window got the event"); 1.95 + is(event.data.type, "result", "Got a result message"); 1.96 + is(event.data.data, undefined, "No data stored"); 1.97 + 1.98 + frame.postMessage({ command: "store", data: storedData }, "*"); 1.99 + frame.postMessage({ command: "retrieve" }, "*"); 1.100 + 1.101 + event = yield undefined; 1.102 + ok(event instanceof MessageEvent, "Got a MessageEvent"); 1.103 + is(event.source, frame, "Correct window got the event"); 1.104 + is(event.data.type, "result", "Got a result message"); 1.105 + is(event.data.data, storedData, "Got stored data"); 1.106 + 1.107 + info("Enabling '" + bfCacheEnabledPref + "' pref"); 1.108 + SpecialPowers.pushPrefEnv({ set: [[bfCacheEnabledPref, true], 1.109 + [bfCacheDepthPref, bfCacheDepth]] }, 1.110 + sendToGenerator); 1.111 + yield undefined; 1.112 + 1.113 + // Navigate when the bfcache is enabled. 1.114 + let frame = document.getElementById("frame"); 1.115 + frame.onload = sendToGenerator; 1.116 + 1.117 + info("Navigating to about:blank"); 1.118 + frame.src = "about:blank"; 1.119 + frame.contentWindow.document.body.offsetTop; 1.120 + 1.121 + yield undefined; 1.122 + 1.123 + for (let i = 0; i < 3; i++) { 1.124 + info("Running GC"); 1.125 + SpecialPowers.exactGC(window, sendToGenerator); 1.126 + yield undefined; 1.127 + 1.128 + info("Waiting the event queue to clear"); 1.129 + SpecialPowers.executeSoon(sendToGenerator); 1.130 + yield undefined; 1.131 + } 1.132 + 1.133 + info("Navigating to " + frameRelativeURL); 1.134 + frame.src = frameRelativeURL; 1.135 + frame.contentWindow.document.body.offsetTop; 1.136 + 1.137 + yield undefined; 1.138 + 1.139 + frame = frame.contentWindow; 1.140 + frame.postMessage({ command: "retrieve" }, "*"); 1.141 + 1.142 + let event = yield undefined; 1.143 + ok(event instanceof MessageEvent, "Got a MessageEvent"); 1.144 + is(event.source, frame, "Correct window got the event"); 1.145 + is(event.data.type, "result", "Got a result message"); 1.146 + is(event.data.data, storedData, "Still have data stored"); 1.147 + 1.148 + info("Resetting '" + bfCacheEnabledPref + "' pref"); 1.149 + SpecialPowers.popPrefEnv(sendToGenerator); 1.150 + yield undefined; 1.151 + 1.152 + window.removeEventListener("message", sendToGenerator); 1.153 + 1.154 + SimpleTest.finish(); 1.155 + yield undefined; 1.156 + })(); 1.157 + 1.158 + let sendToGenerator = testGenerator.send.bind(testGenerator); 1.159 + 1.160 + </script> 1.161 + </head> 1.162 + <body onload="testGenerator.next();"> 1.163 + <iframe id="frame"></iframe> 1.164 + </body> 1.165 +</html>