test_notification_serviceworker_openWindow_nested.html (3548B)
1 <!DOCTYPE HTML> 2 <html> 3 <!-- 4 https://bugzilla.mozilla.org/show_bug.cgi?id=1172870 5 --> 6 <head> 7 <title>Bug 1172870 - Test clients.openWindow</title> 8 <script src="/tests/SimpleTest/SimpleTest.js"></script> 9 <script type="text/javascript" src="/tests/dom/notification/test/mochitest/MockAlertsService.js"></script> 10 <script type="text/javascript" src="/tests/dom/notification/test/mochitest/NotificationTest.js"></script> 11 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> 12 </head> 13 <body> 14 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1172870">Bug 1172870</a> 15 <p id="display"></p> 16 <div id="content" style="display: none"> 17 </div> 18 <pre id="test"> 19 </pre> 20 <script src="/tests/dom/serviceworkers/test/utils.js"></script> 21 <script type="text/javascript"> 22 SimpleTest.requestFlakyTimeout("Mock alert service dispatches show and click events."); 23 24 async function setup(ctx) { 25 await MockAlertsService.register(); 26 await MockAlertsService.enableAutoClick(); 27 28 const swr = await navigator.serviceWorker.register("openWindow.serviceworker.js", {scope: "./"}); 29 ok(swr, "Registration successful"); 30 ctx.registration = swr; 31 return await waitForState(swr.installing, 'activated', ctx); 32 } 33 34 function setupMessageHandler(ctx) { 35 return new Promise(res => { 36 navigator.serviceWorker.onmessage = function(event) { 37 navigator.serviceWorker.onmessage = null; 38 for (const data of event.data) { 39 ok(data.result, data.message); 40 } 41 res(ctx); 42 } 43 }); 44 } 45 46 function testPopupNotAllowed(ctx) { 47 var p = setupMessageHandler(ctx); 48 ok(ctx.registration.active, "Worker is active."); 49 ctx.registration.active.postMessage("testNoPopup"); 50 51 return p; 52 } 53 54 function testPopupAllowed(ctx) { 55 var p = setupMessageHandler(ctx); 56 ctx.registration.showNotification("testPopup"); 57 58 return p; 59 } 60 61 function checkNumberOfWindows(ctx) { 62 return new Promise(res => { 63 navigator.serviceWorker.onmessage = function(event) { 64 navigator.serviceWorker.onmessage = null; 65 for (const data of event.data) { 66 ok(data.result, data.message); 67 } 68 res(ctx); 69 } 70 ctx.registration.active.postMessage("CHECK_NUMBER_OF_WINDOWS"); 71 }); 72 } 73 74 async function clear(ctx) { 75 const result = await ctx.registration.unregister(); 76 ctx.registration = null; 77 ok(result, "Unregister was successful."); 78 } 79 80 async function runTest() { 81 try { 82 const ctx = await setup({}); 83 // Permission to allow popups persists for some time after a notification 84 // click event, so the order here is important. 85 await NotificationTest.allowNotifications(); 86 await testPopupNotAllowed(ctx); 87 await testPopupAllowed(ctx); 88 await checkNumberOfWindows(ctx); 89 await clear(ctx); 90 } catch (e) { 91 ok(false, "Some test failed with error " + e); 92 } finally { 93 SimpleTest.finish(); 94 } 95 } 96 97 SimpleTest.waitForExplicitFinish(); 98 SpecialPowers.pushPrefEnv({"set": [ 99 ["dom.serviceWorkers.exemptFromPerDomainMax", true], 100 ["dom.serviceWorkers.enabled", true], 101 ["dom.serviceWorkers.testing.enabled", true], 102 ["dom.webnotifications.disable_open_click_delay", 1000], 103 ["dom.serviceWorkers.idle_timeout", 299999], 104 ["dom.serviceWorkers.idle_extended_timeout", 299999], 105 ["dom.securecontext.allowlist", "mochi.test,example.com"], 106 ["network.cookie.cookieBehavior", 0], // XXX: Doesn't work with dFPI 107 ]}, runTest); 108 </script> 109 </body> 110 </html>