browser_child_resource.js (6927B)
1 /* 2 Any copyright is dedicated to the Public Domain. 3 http://creativecommons.org/publicdomain/zero/1.0/ 4 */ 5 "use strict"; 6 7 // This must be loaded in the remote process for this test to be useful 8 const TEST_URL = "https://example.com/browser/netwerk/test/browser/dummy.html"; 9 10 const expectedRemote = gMultiProcessBrowser ? "true" : ""; 11 12 const resProtocol = Cc[ 13 "@mozilla.org/network/protocol;1?name=resource" 14 ].getService(Ci.nsIResProtocolHandler); 15 16 function waitForEvent(obj, name, capturing, chromeEvent) { 17 info("Waiting for " + name); 18 return new Promise(resolve => { 19 function listener(event) { 20 info("Saw " + name); 21 obj.removeEventListener(name, listener, capturing, chromeEvent); 22 resolve(event); 23 } 24 25 obj.addEventListener(name, listener, capturing, chromeEvent); 26 }); 27 } 28 29 function resolveURI(uri) { 30 uri = Services.io.newURI(uri); 31 try { 32 return resProtocol.resolveURI(uri); 33 } catch (e) { 34 return null; 35 } 36 } 37 38 function remoteResolveURI(uri) { 39 return SpecialPowers.spawn(gBrowser.selectedBrowser, [uri], uriToResolve => { 40 let resProtocol = Cc[ 41 "@mozilla.org/network/protocol;1?name=resource" 42 ].getService(Ci.nsIResProtocolHandler); 43 44 uriToResolve = Services.io.newURI(uriToResolve); 45 try { 46 return resProtocol.resolveURI(uriToResolve); 47 } catch (e) {} 48 return null; 49 }); 50 } 51 52 // Restarts the child process by crashing it then reloading the tab 53 var restart = async function () { 54 let browser = gBrowser.selectedBrowser; 55 // If the tab isn't remote this would crash the main process so skip it 56 if (browser.getAttribute("remote") != "true") { 57 return browser; 58 } 59 60 await BrowserTestUtils.crashFrame(browser); 61 62 browser.reload(); 63 64 await BrowserTestUtils.browserLoaded(browser); 65 is( 66 browser.getAttribute("remote"), 67 expectedRemote, 68 "Browser should be in the right process" 69 ); 70 return browser; 71 }; 72 73 // Sanity check that this test is going to be useful 74 add_task(async function () { 75 await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL); 76 77 // This must be loaded in the remote process for this test to be useful 78 is( 79 gBrowser.selectedBrowser.getAttribute("remote"), 80 expectedRemote, 81 "Browser should be in the right process" 82 ); 83 84 let local = resolveURI("resource://gre/modules/AppConstants.jsm"); 85 let remote = await remoteResolveURI( 86 "resource://gre/modules/AppConstants.jsm" 87 ); 88 is(local, remote, "AppConstants.jsm should resolve in both processes"); 89 90 gBrowser.removeCurrentTab(); 91 }); 92 93 // Add a mapping, update it then remove it 94 add_task(async function () { 95 await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL); 96 97 info("Set"); 98 resProtocol.setSubstitution( 99 "testing", 100 Services.io.newURI("chrome://global/content") 101 ); 102 let local = resolveURI("resource://testing/test.js"); 103 let remote = await remoteResolveURI("resource://testing/test.js"); 104 is( 105 local, 106 "chrome://global/content/test.js", 107 "Should resolve in main process" 108 ); 109 is( 110 remote, 111 "chrome://global/content/test.js", 112 "Should resolve in child process" 113 ); 114 115 info("Change"); 116 resProtocol.setSubstitution( 117 "testing", 118 Services.io.newURI("chrome://global/skin") 119 ); 120 local = resolveURI("resource://testing/test.js"); 121 remote = await remoteResolveURI("resource://testing/test.js"); 122 is(local, "chrome://global/skin/test.js", "Should resolve in main process"); 123 is(remote, "chrome://global/skin/test.js", "Should resolve in child process"); 124 125 info("Clear"); 126 resProtocol.setSubstitution("testing", null); 127 local = resolveURI("resource://testing/test.js"); 128 remote = await remoteResolveURI("resource://testing/test.js"); 129 is(local, null, "Shouldn't resolve in main process"); 130 is(remote, null, "Shouldn't resolve in child process"); 131 132 gBrowser.removeCurrentTab(); 133 }); 134 135 // Add a mapping, restart the child process then check it is still there 136 add_task(async function () { 137 await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL); 138 139 info("Set"); 140 resProtocol.setSubstitution( 141 "testing", 142 Services.io.newURI("chrome://global/content") 143 ); 144 let local = resolveURI("resource://testing/test.js"); 145 let remote = await remoteResolveURI("resource://testing/test.js"); 146 is( 147 local, 148 "chrome://global/content/test.js", 149 "Should resolve in main process" 150 ); 151 is( 152 remote, 153 "chrome://global/content/test.js", 154 "Should resolve in child process" 155 ); 156 157 await restart(); 158 159 local = resolveURI("resource://testing/test.js"); 160 remote = await remoteResolveURI("resource://testing/test.js"); 161 is( 162 local, 163 "chrome://global/content/test.js", 164 "Should resolve in main process" 165 ); 166 is( 167 remote, 168 "chrome://global/content/test.js", 169 "Should resolve in child process" 170 ); 171 172 info("Change"); 173 resProtocol.setSubstitution( 174 "testing", 175 Services.io.newURI("chrome://global/skin") 176 ); 177 178 await restart(); 179 180 local = resolveURI("resource://testing/test.js"); 181 remote = await remoteResolveURI("resource://testing/test.js"); 182 is(local, "chrome://global/skin/test.js", "Should resolve in main process"); 183 is(remote, "chrome://global/skin/test.js", "Should resolve in child process"); 184 185 info("Clear"); 186 resProtocol.setSubstitution("testing", null); 187 188 await restart(); 189 190 local = resolveURI("resource://testing/test.js"); 191 remote = await remoteResolveURI("resource://testing/test.js"); 192 is(local, null, "Shouldn't resolve in main process"); 193 is(remote, null, "Shouldn't resolve in child process"); 194 195 gBrowser.removeCurrentTab(); 196 }); 197 198 // Adding a mapping to a resource URI should work 199 add_task(async function () { 200 await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL); 201 202 info("Set"); 203 resProtocol.setSubstitution( 204 "testing", 205 Services.io.newURI("chrome://global/content") 206 ); 207 resProtocol.setSubstitution( 208 "testing2", 209 Services.io.newURI("resource://testing") 210 ); 211 let local = resolveURI("resource://testing2/test.js"); 212 let remote = await remoteResolveURI("resource://testing2/test.js"); 213 is( 214 local, 215 "chrome://global/content/test.js", 216 "Should resolve in main process" 217 ); 218 is( 219 remote, 220 "chrome://global/content/test.js", 221 "Should resolve in child process" 222 ); 223 224 info("Clear"); 225 resProtocol.setSubstitution("testing", null); 226 local = resolveURI("resource://testing2/test.js"); 227 remote = await remoteResolveURI("resource://testing2/test.js"); 228 is( 229 local, 230 "chrome://global/content/test.js", 231 "Should resolve in main process" 232 ); 233 is( 234 remote, 235 "chrome://global/content/test.js", 236 "Should resolve in child process" 237 ); 238 239 resProtocol.setSubstitution("testing2", null); 240 local = resolveURI("resource://testing2/test.js"); 241 remote = await remoteResolveURI("resource://testing2/test.js"); 242 is(local, null, "Shouldn't resolve in main process"); 243 is(remote, null, "Shouldn't resolve in child process"); 244 245 gBrowser.removeCurrentTab(); 246 });