browser_realms.js (4663B)
1 /* Any copyright is dedicated to the Public Domain. 2 * http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 const { RootMessageHandler } = ChromeUtils.importESModule( 7 "chrome://remote/content/shared/messagehandler/RootMessageHandler.sys.mjs" 8 ); 9 10 add_task(async function test_tab_is_removed() { 11 const tab = await addTab("https://example.com/document-builder.sjs?html=tab"); 12 const sessionId = "realms"; 13 const browsingContext = tab.linkedBrowser.browsingContext; 14 const contextDescriptor = { 15 type: ContextDescriptorType.TopBrowsingContext, 16 id: browsingContext.browserId, 17 }; 18 19 const rootMessageHandler = createRootMessageHandler(sessionId); 20 21 const onRealmCreated = rootMessageHandler.once("realm-created"); 22 23 // Add a new session data item to get window global handlers created 24 await rootMessageHandler.addSessionDataItem({ 25 moduleName: "command", 26 category: "browser_realms", 27 contextDescriptor, 28 values: [true], 29 }); 30 31 const realmCreatedEvent = await onRealmCreated; 32 const createdRealmId = realmCreatedEvent.realmInfo.realm; 33 34 is(rootMessageHandler.realms.size, 1, "Realm is added in the internal map"); 35 36 const onRealmDestroyed = rootMessageHandler.once("realm-destroyed"); 37 38 gBrowser.removeTab(tab); 39 40 const realmDestroyedEvent = await onRealmDestroyed; 41 42 is( 43 realmDestroyedEvent.realm, 44 createdRealmId, 45 "Received a correct realm id in realm-destroyed event" 46 ); 47 is(rootMessageHandler.realms.size, 0, "The realm map is cleaned up"); 48 49 rootMessageHandler.destroy(); 50 }); 51 52 add_task(async function test_same_origin_navigation() { 53 const tab = await addTab("https://example.com/document-builder.sjs?html=tab"); 54 const sessionId = "realms"; 55 const browsingContext = tab.linkedBrowser.browsingContext; 56 const contextDescriptor = { 57 type: ContextDescriptorType.TopBrowsingContext, 58 id: browsingContext.browserId, 59 }; 60 61 const rootMessageHandler = createRootMessageHandler(sessionId); 62 63 const onRealmCreated = rootMessageHandler.once("realm-created"); 64 65 // Add a new session data item to get window global handlers created 66 await rootMessageHandler.addSessionDataItem({ 67 moduleName: "command", 68 category: "browser_realms", 69 contextDescriptor, 70 values: [true], 71 }); 72 73 const realmCreatedEvent = await onRealmCreated; 74 const createdRealmId = realmCreatedEvent.realmInfo.realm; 75 76 is(rootMessageHandler.realms.size, 1, "Realm is added in the internal map"); 77 78 const onRealmDestroyed = rootMessageHandler.once("realm-destroyed"); 79 const onNewRealmCreated = rootMessageHandler.once("realm-created"); 80 81 // Navigate to another page with the same origin 82 await loadURL( 83 tab.linkedBrowser, 84 "https://example.com/document-builder.sjs?html=othertab" 85 ); 86 87 const realmDestroyedEvent = await onRealmDestroyed; 88 89 is( 90 realmDestroyedEvent.realm, 91 createdRealmId, 92 "Received a correct realm id in realm-destroyed event" 93 ); 94 95 await onNewRealmCreated; 96 97 is(rootMessageHandler.realms.size, 1, "Realm is added in the internal map"); 98 99 gBrowser.removeTab(tab); 100 rootMessageHandler.destroy(); 101 }); 102 103 add_task(async function test_cross_origin_navigation() { 104 const tab = await addTab("https://example.com/document-builder.sjs?html=tab"); 105 const sessionId = "realms"; 106 const browsingContext = tab.linkedBrowser.browsingContext; 107 const contextDescriptor = { 108 type: ContextDescriptorType.TopBrowsingContext, 109 id: browsingContext.browserId, 110 }; 111 112 const rootMessageHandler = createRootMessageHandler(sessionId); 113 114 const onRealmCreated = rootMessageHandler.once("realm-created"); 115 116 // Add a new session data item to get window global handlers created 117 await rootMessageHandler.addSessionDataItem({ 118 moduleName: "command", 119 category: "browser_realms", 120 contextDescriptor, 121 values: [true], 122 }); 123 124 const realmCreatedEvent = await onRealmCreated; 125 const createdRealmId = realmCreatedEvent.realmInfo.realm; 126 127 is(rootMessageHandler.realms.size, 1, "Realm is added in the internal map"); 128 129 const onRealmDestroyed = rootMessageHandler.once("realm-destroyed"); 130 const onNewRealmCreated = rootMessageHandler.once("realm-created"); 131 132 // Navigate to another page with the different origin 133 await loadURL( 134 tab.linkedBrowser, 135 "https://example.com/document-builder.sjs?html=otherorigin" 136 ); 137 138 const realmDestroyedEvent = await onRealmDestroyed; 139 140 is( 141 realmDestroyedEvent.realm, 142 createdRealmId, 143 "Received a correct realm id in realm-destroyed event" 144 ); 145 146 await onNewRealmCreated; 147 148 is(rootMessageHandler.realms.size, 1, "Realm is added in the internal map"); 149 150 gBrowser.removeTab(tab); 151 rootMessageHandler.destroy(); 152 });