browser_messagemanager_unload.js (3244B)
1 function frameScript() { 2 function eventHandler(e) { 3 if (!docShell) { 4 sendAsyncMessage("Test:Fail", "docShell is null"); 5 } 6 7 sendAsyncMessage("Test:Event", [ 8 e.type, 9 e.target === content.document, 10 e.eventPhase, 11 ]); 12 } 13 14 let outerID = content.docShell.outerWindowID; 15 function onOuterWindowDestroyed(subject, topic, data) { 16 if (docShell) { 17 sendAsyncMessage("Test:Fail", "docShell is non-null"); 18 } 19 20 let id = subject.QueryInterface(Ci.nsISupportsPRUint64).data; 21 sendAsyncMessage("Test:Event", ["outer-window-destroyed", id == outerID]); 22 if (id == outerID) { 23 Services.obs.removeObserver( 24 onOuterWindowDestroyed, 25 "outer-window-destroyed" 26 ); 27 } 28 } 29 30 let url = 31 "https://example.com/browser/dom/base/test/file_messagemanager_unload.html"; 32 33 content.location = url; 34 addEventListener( 35 "load", 36 e => { 37 if (e.target.location != url) { 38 return; 39 } 40 41 addEventListener("unload", eventHandler, false); 42 addEventListener("unload", eventHandler, true); 43 addEventListener("pagehide", eventHandler, false); 44 addEventListener("pagehide", eventHandler, true); 45 Services.obs.addObserver( 46 onOuterWindowDestroyed, 47 "outer-window-destroyed" 48 ); 49 50 sendAsyncMessage("Test:Ready"); 51 }, 52 true 53 ); 54 } 55 56 const EXPECTED = [ 57 // Unload events on the BrowserChildGlobal. These come first so that the 58 // docshell is available. 59 ["unload", false, 2], 60 ["unload", false, 2], 61 62 // pagehide and unload events for the top-level page. 63 ["pagehide", true, 1], 64 ["pagehide", true, 3], 65 ["unload", true, 1], 66 67 // pagehide and unload events for the iframe. 68 ["pagehide", false, 1], 69 ["pagehide", false, 3], 70 ["unload", false, 1], 71 72 // outer-window-destroyed for both pages. 73 ["outer-window-destroyed", false], 74 ["outer-window-destroyed", true], 75 ]; 76 77 function test() { 78 waitForExplicitFinish(); 79 80 var newTab = BrowserTestUtils.addTab(gBrowser, "about:blank"); 81 gBrowser.selectedTab = newTab; 82 83 let browser = newTab.linkedBrowser; 84 let frameLoader = browser.frameLoader; 85 Assert.notStrictEqual(frameLoader, null, "frameLoader looks okay"); 86 87 browser.messageManager.loadFrameScript( 88 "data:,(" + frameScript.toString() + ")()", 89 false 90 ); 91 92 browser.messageManager.addMessageListener( 93 "Test:Fail", 94 msg => { 95 ok(false, msg.data); 96 }, 97 true 98 ); 99 100 let index = 0; 101 browser.messageManager.addMessageListener( 102 "Test:Event", 103 msg => { 104 Assert.strictEqual(msg.target, browser, "<browser> is correct"); 105 Assert.strictEqual( 106 msg.targetFrameLoader, 107 frameLoader, 108 "frameLoader is correct" 109 ); 110 Assert.strictEqual( 111 browser.frameLoader, 112 null, 113 "browser frameloader null during teardown" 114 ); 115 116 info(JSON.stringify(msg.data)); 117 118 is( 119 JSON.stringify(msg.data), 120 JSON.stringify(EXPECTED[index]), 121 "results match" 122 ); 123 index++; 124 125 if (index == EXPECTED.length) { 126 finish(); 127 } 128 }, 129 true 130 ); 131 132 browser.messageManager.addMessageListener("Test:Ready", () => { 133 info("Got ready message"); 134 gBrowser.removeCurrentTab(); 135 }); 136 }