test_claim.html (5418B)
1 <!-- 2 Any copyright is dedicated to the Public Domain. 3 http://creativecommons.org/publicdomain/zero/1.0/ 4 --> 5 <!DOCTYPE HTML> 6 <html> 7 <head> 8 <title>Bug 1130684 - Test service worker clients claim onactivate </title> 9 <script src="/tests/SimpleTest/SimpleTest.js"></script> 10 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> 11 </head> 12 <body> 13 <p id="display"></p> 14 <div id="content" style="display: none"></div> 15 <pre id="test"></pre> 16 <script class="testbody" type="text/javascript"> 17 var registration_1; 18 var registration_2; 19 var client; 20 21 function register_1() { 22 return navigator.serviceWorker.register("claim_worker_1.js", 23 { scope: "./" }) 24 .then((swr) => registration_1 = swr); 25 } 26 27 function register_2() { 28 return navigator.serviceWorker.register("claim_worker_2.js", 29 { scope: "./claim_clients/client.html" }) 30 .then((swr) => registration_2 = swr); 31 } 32 33 function unregister(reg) { 34 return reg.unregister().then(function(result) { 35 ok(result, "Unregister should return true."); 36 }); 37 } 38 39 function createClient() { 40 var p = new Promise(function(res, rej) { 41 window.onmessage = function(e) { 42 if (e.data === "READY") { 43 res(); 44 } 45 } 46 }); 47 48 content = document.getElementById("content"); 49 ok(content, "parent exists."); 50 51 client = document.createElement("iframe"); 52 client.setAttribute('src', "claim_clients/client.html"); 53 content.appendChild(client); 54 55 return p; 56 } 57 58 function testController() { 59 ok(navigator.serviceWorker.controller.scriptURL.match("claim_worker_1"), 60 "Controlling service worker has the correct url."); 61 } 62 63 function testClientWasClaimed(expected) { 64 var resolveClientMessage, resolveClientControllerChange; 65 var messageFromClient = new Promise(function(res, rej) { 66 resolveClientMessage = res; 67 }); 68 var controllerChangeFromClient = new Promise(function(res, rej) { 69 resolveClientControllerChange = res; 70 }); 71 window.onmessage = function(e) { 72 if (!e.data.event) { 73 ok(false, "Unknown message received: " + e.data); 74 } 75 76 if (e.data.event === "controllerchange") { 77 ok(e.data.controller, 78 "Client was claimed and received controllerchange event."); 79 resolveClientControllerChange(); 80 } 81 82 if (e.data.event === "message") { 83 ok(e.data.data.resolve_value === undefined, 84 "Claim should resolve with undefined."); 85 ok(e.data.data.message === expected.message, 86 "Client received message from claiming worker."); 87 ok(e.data.data.match_count_before === expected.match_count_before, 88 "MatchAll clients count before claim should be " + expected.match_count_before); 89 ok(e.data.data.match_count_after === expected.match_count_after, 90 "MatchAll clients count after claim should be " + expected.match_count_after); 91 resolveClientMessage(); 92 } 93 } 94 95 return Promise.all([messageFromClient, controllerChangeFromClient]) 96 .then(() => window.onmessage = null); 97 } 98 99 function testClaimFirstWorker() { 100 // wait for the worker to control us 101 var controllerChange = new Promise(function(res, rej) { 102 navigator.serviceWorker.oncontrollerchange = function(e) { 103 ok(true, "controller changed event received."); 104 res(); 105 }; 106 }); 107 108 var messageFromWorker = new Promise(function(res, rej) { 109 navigator.serviceWorker.onmessage = function(e) { 110 ok(e.data.resolve_value === undefined, 111 "Claim should resolve with undefined."); 112 ok(e.data.message === "claim_worker_1", 113 "Received message from claiming worker."); 114 ok(e.data.match_count_before === 0, 115 "Worker doesn't control any client before claim."); 116 ok(e.data.match_count_after === 2, "Worker should claim 2 clients."); 117 res(); 118 } 119 }); 120 121 var clientClaim = testClientWasClaimed({ 122 message: "claim_worker_1", 123 match_count_before: 0, 124 match_count_after: 2 125 }); 126 127 return Promise.all([controllerChange, messageFromWorker, clientClaim]) 128 .then(testController); 129 } 130 131 function testClaimSecondWorker() { 132 navigator.serviceWorker.oncontrollerchange = function(e) { 133 ok(false, "Claim_worker_2 shouldn't claim this window."); 134 } 135 136 navigator.serviceWorker.onmessage = function(e) { 137 ok(false, "Claim_worker_2 shouldn't claim this window."); 138 } 139 140 var clientClaim = testClientWasClaimed({ 141 message: "claim_worker_2", 142 match_count_before: 0, 143 match_count_after: 1 144 }); 145 146 return clientClaim.then(testController); 147 } 148 149 function runTest() { 150 createClient() 151 .then(register_1) 152 .then(testClaimFirstWorker) 153 .then(register_2) 154 .then(testClaimSecondWorker) 155 .then(function() { return unregister(registration_1); }) 156 .then(function() { return unregister(registration_2); }) 157 .catch(function(e) { 158 ok(false, "Some test failed with error " + e); 159 }).then(SimpleTest.finish); 160 } 161 162 SimpleTest.waitForExplicitFinish(); 163 SpecialPowers.pushPrefEnv({"set": [ 164 ["dom.serviceWorkers.exemptFromPerDomainMax", true], 165 ["dom.serviceWorkers.enabled", true], 166 ["dom.serviceWorkers.testing.enabled", true] 167 ]}, runTest); 168 </script> 169 </pre> 170 </body> 171 </html>