test_ext_chrome_settings_overrides_home.js (5882B)
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 9 ChromeUtils.defineESModuleGetters(this, { 10 HomePage: "resource:///modules/HomePage.sys.mjs", 11 RemoteSettings: "resource://services-settings/remote-settings.sys.mjs", 12 TelemetryTestUtils: "resource://testing-common/TelemetryTestUtils.sys.mjs", 13 sinon: "resource://testing-common/Sinon.sys.mjs", 14 }); 15 16 function promisePrefChanged(expectedValue) { 17 return TestUtils.waitForPrefChange("browser.startup.homepage", value => 18 value.endsWith(expectedValue) 19 ); 20 } 21 22 const HOMEPAGE_EXTENSION_CONTROLLED = 23 "browser.startup.homepage_override.extensionControlled"; 24 25 AddonTestUtils.init(this); 26 AddonTestUtils.overrideCertDB(); 27 28 AddonTestUtils.createAppInfo( 29 "xpcshell@tests.mozilla.org", 30 "XPCShell", 31 "1", 32 "42" 33 ); 34 35 async function setupRemoteSettings() { 36 const settings = await RemoteSettings("hijack-blocklists"); 37 sinon.stub(settings, "get").returns([ 38 { 39 id: "homepage-urls", 40 matches: ["ignore=me"], 41 _status: "synced", 42 }, 43 ]); 44 } 45 46 add_task(async function setup() { 47 await AddonTestUtils.promiseStartupManager(); 48 await setupRemoteSettings(); 49 }); 50 51 add_task(async function test_overriding_with_ignored_url() { 52 // Manually poke into the ignore list a value to be ignored. 53 HomePage._ignoreList.push("ignore=me"); 54 Services.prefs.setBoolPref(HOMEPAGE_EXTENSION_CONTROLLED, false); 55 56 let extension = ExtensionTestUtils.loadExtension({ 57 manifest: { 58 browser_specific_settings: { 59 gecko: { 60 id: "ignore_homepage@example.com", 61 }, 62 }, 63 chrome_settings_overrides: { homepage: "https://example.com/?ignore=me" }, 64 name: "extension", 65 }, 66 useAddonManager: "temporary", 67 }); 68 69 await extension.startup(); 70 71 Assert.ok(HomePage.isDefault, "Should still have the default homepage"); 72 Assert.equal( 73 Services.prefs.getBoolPref( 74 "browser.startup.homepage_override.extensionControlled" 75 ), 76 false, 77 "Should not be extension controlled." 78 ); 79 TelemetryTestUtils.assertEvents( 80 [ 81 { 82 object: "ignore", 83 value: "set_blocked_extension", 84 extra: { webExtensionId: "ignore_homepage@example.com" }, 85 }, 86 ], 87 { 88 category: "homepage", 89 method: "preference", 90 } 91 ); 92 93 await extension.unload(); 94 HomePage._ignoreList.pop(); 95 }); 96 97 add_task(async function test_overriding_cancelled_after_ignore_update() { 98 const oldHomePageIgnoreList = HomePage._ignoreList; 99 let extension = ExtensionTestUtils.loadExtension({ 100 manifest: { 101 browser_specific_settings: { 102 gecko: { 103 id: "ignore_homepage1@example.com", 104 }, 105 }, 106 chrome_settings_overrides: { 107 homepage: "https://example.com/?ignore1=me", 108 }, 109 name: "extension", 110 }, 111 useAddonManager: "temporary", 112 }); 113 114 await extension.startup(); 115 116 Assert.ok(!HomePage.isDefault, "Should have overriden the new homepage"); 117 Assert.equal( 118 Services.prefs.getBoolPref( 119 "browser.startup.homepage_override.extensionControlled" 120 ), 121 true, 122 "Should be extension controlled." 123 ); 124 125 let prefChanged = TestUtils.waitForPrefChange( 126 "browser.startup.homepage_override.extensionControlled" 127 ); 128 129 await HomePage._handleIgnoreListUpdated({ 130 data: { 131 current: [{ id: "homepage-urls", matches: ["ignore1=me"] }], 132 }, 133 }); 134 135 await prefChanged; 136 137 await TestUtils.waitForCondition( 138 () => 139 !Services.prefs.getBoolPref( 140 "browser.startup.homepage_override.extensionControlled", 141 false 142 ), 143 "Should not longer be extension controlled" 144 ); 145 146 Assert.ok(HomePage.isDefault, "Should have reset the homepage"); 147 148 TelemetryTestUtils.assertEvents( 149 [ 150 { 151 object: "ignore", 152 value: "saved_reset", 153 }, 154 ], 155 { 156 category: "homepage", 157 method: "preference", 158 } 159 ); 160 161 await extension.unload(); 162 HomePage._ignoreList = oldHomePageIgnoreList; 163 }); 164 165 add_task(async function test_overriding_homepage_locale() { 166 Services.locale.availableLocales = ["en-US", "es-ES"]; 167 168 let extension = ExtensionTestUtils.loadExtension({ 169 manifest: { 170 browser_specific_settings: { 171 gecko: { 172 id: "homepage@example.com", 173 }, 174 }, 175 chrome_settings_overrides: { 176 homepage: "/__MSG_homepage__", 177 }, 178 name: "extension", 179 default_locale: "en", 180 }, 181 useAddonManager: "permanent", 182 183 files: { 184 "_locales/en/messages.json": { 185 homepage: { 186 message: "homepage.html", 187 description: "homepage", 188 }, 189 }, 190 191 "_locales/es_ES/messages.json": { 192 homepage: { 193 message: "default.html", 194 description: "homepage", 195 }, 196 }, 197 }, 198 }); 199 200 let prefPromise = promisePrefChanged("homepage.html"); 201 await extension.startup(); 202 await prefPromise; 203 204 Assert.equal( 205 HomePage.get(), 206 `moz-extension://${extension.uuid}/homepage.html`, 207 "Should have overridden the new homepage" 208 ); 209 210 // Set the new locale now, and disable the L10nRegistry reset 211 // when shutting down the addon mananger. This allows us to 212 // restart under a new locale without a lot of fuss. 213 let reqLoc = Services.locale.requestedLocales; 214 Services.locale.requestedLocales = ["es-ES"]; 215 216 prefPromise = promisePrefChanged("default.html"); 217 await AddonTestUtils.promiseShutdownManager({ clearL10nRegistry: false }); 218 await AddonTestUtils.promiseStartupManager(); 219 await extension.awaitStartup(); 220 await prefPromise; 221 222 Assert.equal( 223 HomePage.get(), 224 `moz-extension://${extension.uuid}/default.html`, 225 "Should have overridden the new homepage" 226 ); 227 228 await extension.unload(); 229 230 Services.locale.requestedLocales = reqLoc; 231 });