browser_vendored.js (6045B)
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_vendored_commands() { 11 // Navigate to a page to make sure that the windowglobal modules run in a 12 // different process than the root module. 13 const tab = BrowserTestUtils.addTab( 14 gBrowser, 15 "https://example.com/document-builder.sjs?html=tab" 16 ); 17 await BrowserTestUtils.browserLoaded(tab.linkedBrowser); 18 const browsingContextId = tab.linkedBrowser.browsingContext.id; 19 20 const rootMessageHandler = createRootMessageHandler( 21 "session-id-vendored-commands" 22 ); 23 24 const valueFromRoot = await rootMessageHandler.handleCommand({ 25 moduleName: "vendor:vendored", 26 commandName: "testRoot", 27 destination: { 28 type: RootMessageHandler.type, 29 }, 30 }); 31 is(valueFromRoot, "valueFromRoot"); 32 33 const valueFromWindowGlobal = await rootMessageHandler.handleCommand({ 34 moduleName: "vendor:vendored", 35 commandName: "testWindowGlobal", 36 destination: { 37 type: WindowGlobalMessageHandler.type, 38 id: browsingContextId, 39 }, 40 }); 41 is(valueFromWindowGlobal, "valueFromWindowGlobal"); 42 43 const valueFromWindowGlobalInRoot = await rootMessageHandler.handleCommand({ 44 moduleName: "vendor:vendored", 45 commandName: "testWindowGlobalInRoot", 46 destination: { 47 type: WindowGlobalMessageHandler.type, 48 id: browsingContextId, 49 }, 50 }); 51 is(valueFromWindowGlobalInRoot, "valueFromWindowGlobalInRoot"); 52 53 rootMessageHandler.destroy(); 54 gBrowser.removeTab(tab); 55 }); 56 57 add_task(async function test_vendored_events_dispatcher() { 58 // Navigate to a page to make sure that the windowglobal modules run in a 59 // different process than the root module. 60 const tab = BrowserTestUtils.addTab( 61 gBrowser, 62 "https://example.com/document-builder.sjs?html=tab" 63 ); 64 await BrowserTestUtils.browserLoaded(tab.linkedBrowser); 65 const browsingContext = tab.linkedBrowser.browsingContext; 66 const browsingContextId = browsingContext.id; 67 68 const rootMessageHandler = createRootMessageHandler( 69 "session-id-vendored-events-dispatcher" 70 ); 71 const events = []; 72 const onEvent = (event, data) => events.push(data); 73 await rootMessageHandler.eventsDispatcher.on( 74 "vendor:vendored.vendoredWindowGlobalEvent", 75 { 76 type: ContextDescriptorType.TopBrowsingContext, 77 id: browsingContext.browserId, 78 }, 79 onEvent 80 ); 81 82 await rootMessageHandler.handleCommand({ 83 moduleName: "vendor:vendored", 84 commandName: "emitVendoredWindowGlobalEvent", 85 destination: { 86 type: WindowGlobalMessageHandler.type, 87 id: browsingContextId, 88 }, 89 }); 90 91 await BrowserTestUtils.waitForCondition(() => events.length === 1); 92 is(events[0], "vendoredWindowGlobalEventValue"); 93 94 await rootMessageHandler.eventsDispatcher.on( 95 "vendor:vendored.vendoredRootEvent", 96 { 97 type: ContextDescriptorType.All, 98 }, 99 onEvent 100 ); 101 102 await rootMessageHandler.handleCommand({ 103 moduleName: "vendor:vendored", 104 commandName: "emitVendoredRootEvent", 105 destination: { 106 type: RootMessageHandler.type, 107 }, 108 }); 109 110 await BrowserTestUtils.waitForCondition(() => events.length === 2); 111 is(events[1], "vendoredRootEventValue"); 112 113 rootMessageHandler.destroy(); 114 gBrowser.removeTab(tab); 115 }); 116 117 add_task(async function test_vendored_session_data() { 118 // Navigate to a page to make sure that the windowglobal modules run in a 119 // different process than the root module. 120 const tab = BrowserTestUtils.addTab( 121 gBrowser, 122 "https://example.com/document-builder.sjs?html=tab" 123 ); 124 await BrowserTestUtils.browserLoaded(tab.linkedBrowser); 125 const browsingContextId = tab.linkedBrowser.browsingContext.id; 126 127 const rootMessageHandler = createRootMessageHandler( 128 "session-id-vendored-session-data" 129 ); 130 131 await rootMessageHandler.updateSessionData([ 132 { 133 method: "add", 134 moduleName: "vendor:vendored", 135 category: "vendored-session-data", 136 contextDescriptor: contextDescriptorAll, 137 values: ["vendored-session-data-value"], 138 }, 139 ]); 140 141 const valueFromSessionData = await rootMessageHandler.handleCommand({ 142 moduleName: "vendor:vendored", 143 commandName: "getSessionDataValue", 144 destination: { 145 type: WindowGlobalMessageHandler.type, 146 id: browsingContextId, 147 }, 148 }); 149 is(valueFromSessionData[0].value, "vendored-session-data-value"); 150 151 rootMessageHandler.destroy(); 152 gBrowser.removeTab(tab); 153 }); 154 155 add_task(async function test_vendored_unknown_modules() { 156 // Navigate to a page to make sure that the windowglobal modules run in a 157 // different process than the root module. 158 const tab = BrowserTestUtils.addTab( 159 gBrowser, 160 "https://example.com/document-builder.sjs?html=tab" 161 ); 162 await BrowserTestUtils.browserLoaded(tab.linkedBrowser); 163 164 const rootMessageHandler = createRootMessageHandler( 165 "session-id-vendored-commands" 166 ); 167 168 info("Attempt to call a vendored module with an unknown vendor prefix"); 169 Assert.throws( 170 () => 171 rootMessageHandler.handleCommand({ 172 moduleName: "rodnev:vendored", 173 commandName: "testRoot", 174 destination: { 175 type: RootMessageHandler.type, 176 }, 177 }), 178 err => 179 err.name == "UnsupportedCommandError" && 180 err.message == 181 `rodnev:vendored.testRoot not supported for destination ROOT` 182 ); 183 184 info("Attempt to call an unknown vendored module with a valid vendor prefix"); 185 Assert.throws( 186 () => 187 rootMessageHandler.handleCommand({ 188 moduleName: "vendor:derodnev", 189 commandName: "testRoot", 190 destination: { 191 type: RootMessageHandler.type, 192 }, 193 }), 194 err => 195 err.name == "UnsupportedCommandError" && 196 err.message == 197 `vendor:derodnev.testRoot not supported for destination ROOT` 198 ); 199 200 rootMessageHandler.destroy(); 201 gBrowser.removeTab(tab); 202 });