browser_test_referrer_loadInOtherProcess.js (5109B)
1 const TEST_PAGE = 2 "https://example.org/browser/browser/base/content/test/general/dummy_page.html"; 3 const TEST_REFERRER = "http://mochi.test:8888/"; 4 5 const ReferrerInfo = Components.Constructor( 6 "@mozilla.org/referrer-info;1", 7 "nsIReferrerInfo", 8 "init" 9 ); 10 11 let referrerInfo = new ReferrerInfo( 12 Ci.nsIReferrerInfo.ORIGIN, 13 true, 14 Services.io.newURI(TEST_REFERRER) 15 ); 16 let deReferrerInfo = E10SUtils.serializeReferrerInfo(referrerInfo); 17 18 var checkResult = async function (isRemote, browserKey, uri) { 19 is( 20 gBrowser.selectedBrowser.isRemoteBrowser, 21 isRemote, 22 "isRemoteBrowser should be correct" 23 ); 24 25 is( 26 gBrowser.selectedBrowser.permanentKey, 27 browserKey, 28 "browser.permanentKey should be correct" 29 ); 30 31 if (SpecialPowers.Services.appinfo.sessionHistoryInParent) { 32 let sessionHistory = 33 gBrowser.selectedBrowser.browsingContext.sessionHistory; 34 let entry = sessionHistory.getEntryAtIndex(sessionHistory.count - 1); 35 let args = { uri, referrerInfo: deReferrerInfo, isRemote }; 36 Assert.equal(entry.URI.spec, args.uri, "Uri should be correct"); 37 38 // Main process like about:mozilla does not trigger the real network request. 39 // So we don't store referrerInfo in sessionHistory in that case. 40 // Besides, the referrerInfo stored in sessionHistory was computed, we only 41 // check pre-computed things. 42 if (args.isRemote) { 43 let resultReferrerInfo = entry.referrerInfo; 44 let expectedReferrerInfo = E10SUtils.deserializeReferrerInfo( 45 args.referrerInfo 46 ); 47 48 Assert.equal( 49 resultReferrerInfo.originalReferrer.spec, 50 expectedReferrerInfo.originalReferrer.spec, 51 "originalReferrer should be correct" 52 ); 53 Assert.equal( 54 resultReferrerInfo.sendReferrer, 55 expectedReferrerInfo.sendReferrer, 56 "sendReferrer should be correct" 57 ); 58 Assert.equal( 59 resultReferrerInfo.referrerPolicy, 60 expectedReferrerInfo.referrerPolicy, 61 "referrerPolicy should be correct" 62 ); 63 } else { 64 Assert.equal(entry.referrerInfo, null, "ReferrerInfo should be correct"); 65 } 66 67 return; 68 } 69 70 await SpecialPowers.spawn( 71 gBrowser.selectedBrowser, 72 [{ uri, referrerInfo: deReferrerInfo, isRemote }], 73 async function (args) { 74 let webNav = content.docShell.QueryInterface(Ci.nsIWebNavigation); 75 let sessionHistory = webNav.sessionHistory; 76 let entry = sessionHistory.legacySHistory.getEntryAtIndex( 77 sessionHistory.count - 1 78 ); 79 80 var { E10SUtils } = SpecialPowers.ChromeUtils.importESModule( 81 "resource://gre/modules/E10SUtils.sys.mjs" 82 ); 83 84 Assert.equal(entry.URI.spec, args.uri, "Uri should be correct"); 85 86 // Main process like about:mozilla does not trigger the real network request. 87 // So we don't store referrerInfo in sessionHistory in that case. 88 // Besides, the referrerInfo stored in sessionHistory was computed, we only 89 // check pre-computed things. 90 if (args.isRemote) { 91 let resultReferrerInfo = entry.referrerInfo; 92 let expectedReferrerInfo = E10SUtils.deserializeReferrerInfo( 93 args.referrerInfo 94 ); 95 96 Assert.equal( 97 resultReferrerInfo.originalReferrer.spec, 98 expectedReferrerInfo.originalReferrer.spec, 99 "originalReferrer should be correct" 100 ); 101 Assert.equal( 102 resultReferrerInfo.sendReferrer, 103 expectedReferrerInfo.sendReferrer, 104 "sendReferrer should be correct" 105 ); 106 Assert.equal( 107 resultReferrerInfo.referrerPolicy, 108 expectedReferrerInfo.referrerPolicy, 109 "referrerPolicy should be correct" 110 ); 111 } else { 112 Assert.equal( 113 entry.referrerInfo, 114 null, 115 "ReferrerInfo should be correct" 116 ); 117 } 118 } 119 ); 120 }; 121 var waitForLoad = async function (uri) { 122 info("waitForLoad " + uri); 123 let loadURIOptions = { 124 triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(), 125 referrerInfo, 126 }; 127 gBrowser.selectedBrowser.webNavigation.loadURI( 128 Services.io.newURI(uri), 129 loadURIOptions 130 ); 131 132 await BrowserTestUtils.browserStopped(gBrowser, uri); 133 }; 134 135 // Tests referrerInfo when navigating from a page in the remote process to main 136 // process and vice versa. 137 add_task(async function test_navigation() { 138 // Navigate from non remote to remote 139 gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, "about:blank"); 140 let testURI = TEST_PAGE; 141 let { permanentKey } = gBrowser.selectedBrowser; 142 await waitForLoad(testURI); 143 await checkResult(true, permanentKey, testURI); 144 gBrowser.removeCurrentTab(); 145 146 // Navigate from remote to non-remote 147 gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, TEST_PAGE); 148 // Wait for the non-blank page to finish loading 149 await BrowserTestUtils.browserStopped(gBrowser, TEST_PAGE); 150 testURI = "about:mozilla"; 151 permanentKey = gBrowser.selectedBrowser.permanentKey; 152 await waitForLoad(testURI); 153 await checkResult(false, permanentKey, testURI); 154 155 gBrowser.removeCurrentTab(); 156 });