test_ext_homepage_overrides_private.js (3734B)
1 /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ 2 /* vim: set sts=2 sw=2 et tw=80: */ 3 "use strict"; 4 5 const { AddonTestUtils } = ChromeUtils.importESModule( 6 "resource://testing-common/AddonTestUtils.sys.mjs" 7 ); 8 const { HomePage } = ChromeUtils.importESModule( 9 "resource:///modules/HomePage.sys.mjs" 10 ); 11 const { ExtensionPermissions } = ChromeUtils.importESModule( 12 "resource://gre/modules/ExtensionPermissions.sys.mjs" 13 ); 14 15 const { createAppInfo, promiseShutdownManager, promiseStartupManager } = 16 AddonTestUtils; 17 18 const EXTENSION_ID = "test_overrides@tests.mozilla.org"; 19 const HOMEPAGE_EXTENSION_CONTROLLED = 20 "browser.startup.homepage_override.extensionControlled"; 21 const HOMEPAGE_PRIVATE_ALLOWED = 22 "browser.startup.homepage_override.privateAllowed"; 23 const HOMEPAGE_URL_PREF = "browser.startup.homepage"; 24 const HOMEPAGE_URI = "webext-homepage-1.html"; 25 26 Services.prefs.setBoolPref("browser.privatebrowsing.autostart", true); 27 28 AddonTestUtils.init(this); 29 AddonTestUtils.usePrivilegedSignatures = false; 30 AddonTestUtils.overrideCertDB(); 31 32 createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "42"); 33 34 function promisePrefChange(pref) { 35 return new Promise(resolve => { 36 Services.prefs.addObserver(pref, function observer() { 37 Services.prefs.removeObserver(pref, observer); 38 resolve(arguments); 39 }); 40 }); 41 } 42 43 let defaultHomepageURL; 44 45 function verifyPrefSettings(controlled, allowed) { 46 equal( 47 Services.prefs.getBoolPref(HOMEPAGE_EXTENSION_CONTROLLED, false), 48 controlled, 49 "homepage extension controlled" 50 ); 51 equal( 52 Services.prefs.getBoolPref(HOMEPAGE_PRIVATE_ALLOWED, false), 53 allowed, 54 "homepage private permission after permission change" 55 ); 56 57 if (controlled && allowed) { 58 ok( 59 HomePage.get().endsWith(HOMEPAGE_URI), 60 "Home page url is overridden by the extension" 61 ); 62 } else { 63 equal(HomePage.get(), defaultHomepageURL, "Home page url is default."); 64 } 65 } 66 67 async function promiseUpdatePrivatePermission(allowed, extension) { 68 info(`update private allowed permission`); 69 await Promise.all([ 70 promisePrefChange(HOMEPAGE_PRIVATE_ALLOWED), 71 ExtensionPermissions[allowed ? "add" : "remove"]( 72 extension.id, 73 { permissions: ["internal:privateBrowsingAllowed"], origins: [] }, 74 extension 75 ), 76 ]); 77 78 verifyPrefSettings(true, allowed); 79 } 80 81 add_task(async function test_overrides_private() { 82 await promiseStartupManager(); 83 84 let extensionInfo = { 85 useAddonManager: "permanent", 86 manifest: { 87 version: "1.0", 88 browser_specific_settings: { 89 gecko: { 90 id: EXTENSION_ID, 91 }, 92 }, 93 chrome_settings_overrides: { 94 homepage: HOMEPAGE_URI, 95 }, 96 }, 97 }; 98 let extension = ExtensionTestUtils.loadExtension(extensionInfo); 99 100 defaultHomepageURL = HomePage.get(); 101 102 await extension.startup(); 103 104 verifyPrefSettings(true, false); 105 106 equal(HomePage.get(), defaultHomepageURL, "Home page url is default."); 107 108 info("add permission to extension"); 109 await promiseUpdatePrivatePermission(true, extension.extension); 110 info("remove permission from extension"); 111 await promiseUpdatePrivatePermission(false, extension.extension); 112 // set back to true to test upgrade removing extension control 113 info("add permission back to prepare for upgrade test"); 114 await promiseUpdatePrivatePermission(true, extension.extension); 115 116 extensionInfo.manifest = { 117 version: "2.0", 118 browser_specific_settings: { 119 gecko: { 120 id: EXTENSION_ID, 121 }, 122 }, 123 }; 124 125 await Promise.all([ 126 promisePrefChange(HOMEPAGE_URL_PREF), 127 extension.upgrade(extensionInfo), 128 ]); 129 130 verifyPrefSettings(false, false); 131 132 await extension.unload(); 133 await promiseShutdownManager(); 134 });