/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ ChromeUtils.defineESModuleGetters(this, { RemoteSettings: "resource://services-settings/remote-settings.sys.mjs", }); const { checkInputAndSerializationMatch, checkInputAndSerializationMatchChild, checkSerializationMissingSecondColon, checkSerializationMissingSecondColonChild, removeSecondColon, } = ChromeUtils.importESModule( "resource://testing-common/simple_unknown_uri_helpers.sys.mjs" ); add_setup(async () => { await SpecialPowers.pushPrefEnv({ set: [ ["network.url.useDefaultURI", true], ["network.url.simple_uri_unknown_schemes_enabled", true], ["network.url.simple_uri_unknown_schemes", "simpleprotocol,otherproto"], ], }); }); add_task(async function test_bypass_remote_settings_static_parent() { // sanity check checkInputAndSerializationMatch("https://example.com/"); // nsStandardURL removes second colon when nesting protocols checkSerializationMissingSecondColon("https://https://example.com/"); // no-bypass unknown protocol uses defaultURI checkSerializationMissingSecondColon( "nonsimpleprotocol://https://example.com" ); // simpleURI keeps the second colon // an unknown protocol in the bypass list will use simpleURI // despite network.url.useDefaultURI being enabled let same = "simpleprotocol://https://example.com"; checkInputAndSerializationMatch(same); // scheme bypass from static remote-settings checkInputAndSerializationMatch("ed2k://https://example.com"); // check the pref-specified scheme again (remote settings shouldn't overwrite) checkInputAndSerializationMatch(same); }); add_task(async function test_bypass_remote_settings_static_child() { const URL_EXAMPLE = "https://example.com"; const tab = BrowserTestUtils.addTab(gBrowser, URL_EXAMPLE); const browser = gBrowser.getBrowserForTab(tab); await BrowserTestUtils.browserLoaded(browser); await SpecialPowers.spawn( browser, [ removeSecondColon.toString(), checkSerializationMissingSecondColonChild.toString(), checkInputAndSerializationMatchChild.toString(), ], (rscSource, csmscSource, ciasmcSource) => { /* eslint-disable no-eval */ // eslint-disable-next-line no-unused-vars let removeSecondColon = eval(`(${rscSource})`); // used by check fns let checkSerializationMissingSecondColonChild = eval(`(${csmscSource})`); let checkInputAndSerializationMatchChild = eval(`(${ciasmcSource})`); /* eslint-enable no-eval */ checkInputAndSerializationMatchChild("https://example.com/"); // nsStandardURL removes second colon when nesting protocols checkSerializationMissingSecondColonChild("https://https://example.com"); // no-bypass protocol uses defaultURI checkSerializationMissingSecondColonChild( "nonsimpleprotocol://https://example.com" ); // simpleURI keeps the second colon // an unknown protocol in the bypass list will use simpleURI // despite network.url.useDefaultURI being enabled let same = "simpleprotocol://https://example.com"; checkInputAndSerializationMatchChild(same); // scheme bypass from static remote-settings checkInputAndSerializationMatchChild("ed2k://https://example.com"); // pref-specified scheme shouldn't be overwritten by remote settings schemes checkInputAndSerializationMatchChild(same); } ); // Cleanup BrowserTestUtils.removeTab(tab); Services.cookies.removeAll(); });