test_ext_settings_validate.js (6058B)
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 const { AddonManager } = ChromeUtils.importESModule( 10 "resource://gre/modules/AddonManager.sys.mjs" 11 ); 12 13 const { AboutNewTab } = ChromeUtils.importESModule( 14 "resource:///modules/AboutNewTab.sys.mjs" 15 ); 16 17 // Lazy load to avoid having Services.appinfo cached first. 18 ChromeUtils.defineESModuleGetters(this, { 19 ExtensionParent: "resource://gre/modules/ExtensionParent.sys.mjs", 20 }); 21 22 const { HomePage } = ChromeUtils.importESModule( 23 "resource:///modules/HomePage.sys.mjs" 24 ); 25 26 AddonTestUtils.init(this); 27 28 // Allow for unsigned addons. 29 AddonTestUtils.overrideCertDB(); 30 31 AddonTestUtils.createAppInfo( 32 "xpcshell@tests.mozilla.org", 33 "XPCShell", 34 "42", 35 "42" 36 ); 37 38 add_task(async function test_settings_modules_not_loaded() { 39 await ExtensionParent.apiManager.lazyInit(); 40 // Test that no settings modules are loaded. 41 let modules = Array.from(ExtensionParent.apiManager.settingsModules); 42 ok(modules.length, "we have settings modules"); 43 for (let name of modules) { 44 ok( 45 !ExtensionParent.apiManager.getModule(name).loaded, 46 `${name} is not loaded` 47 ); 48 } 49 }); 50 51 add_task(async function test_settings_validated() { 52 let defaultNewTab = AboutNewTab.newTabURL; 53 equal(defaultNewTab, "about:newtab", "Newtab url is default."); 54 let defaultHomepageURL = HomePage.get(); 55 equal(defaultHomepageURL, "about:home", "Home page url is default."); 56 57 let xpi = await AddonTestUtils.createTempWebExtensionFile({ 58 manifest: { 59 version: "1.0", 60 browser_specific_settings: { gecko: { id: "test@mochi" } }, 61 chrome_url_overrides: { 62 newtab: "/newtab", 63 }, 64 chrome_settings_overrides: { 65 homepage: "https://example.com/", 66 }, 67 }, 68 }); 69 let extension = ExtensionTestUtils.expectExtension("test@mochi"); 70 let file = await AddonTestUtils.manuallyInstall(xpi); 71 await AddonTestUtils.promiseStartupManager(); 72 await extension.awaitStartup(); 73 74 equal( 75 HomePage.get(), 76 "https://example.com/", 77 "Home page url is extension controlled." 78 ); 79 ok( 80 AboutNewTab.newTabURL.endsWith("/newtab"), 81 "newTabURL is extension controlled." 82 ); 83 84 await AddonTestUtils.promiseShutdownManager(); 85 // After shutdown, delete the xpi file. 86 Services.obs.notifyObservers(xpi, "flush-cache-entry"); 87 try { 88 file.remove(true); 89 } catch (e) { 90 ok(false, e); 91 } 92 await AddonTestUtils.cleanupTempXPIs(); 93 94 // Restart everything, the ExtensionAddonObserver should handle updating state. 95 let prefChanged = TestUtils.waitForPrefChange("browser.startup.homepage"); 96 await AddonTestUtils.promiseStartupManager(); 97 await prefChanged; 98 99 equal(HomePage.get(), defaultHomepageURL, "Home page url is default."); 100 equal(AboutNewTab.newTabURL, defaultNewTab, "newTabURL is reset to default."); 101 await AddonTestUtils.promiseShutdownManager(); 102 }); 103 104 add_task(async function test_settings_validated_safemode() { 105 let defaultNewTab = AboutNewTab.newTabURL; 106 equal(defaultNewTab, "about:newtab", "Newtab url is default."); 107 let defaultHomepageURL = HomePage.get(); 108 equal(defaultHomepageURL, "about:home", "Home page url is default."); 109 110 function isDefaultSettings(postfix) { 111 equal( 112 HomePage.get(), 113 defaultHomepageURL, 114 `Home page url is default ${postfix}.` 115 ); 116 equal( 117 AboutNewTab.newTabURL, 118 defaultNewTab, 119 `newTabURL is default ${postfix}.` 120 ); 121 } 122 123 function isExtensionSettings(postfix) { 124 equal( 125 HomePage.get(), 126 "https://example.com/", 127 `Home page url is extension controlled ${postfix}.` 128 ); 129 ok( 130 AboutNewTab.newTabURL.endsWith("/newtab"), 131 `newTabURL is extension controlled ${postfix}.` 132 ); 133 } 134 135 async function switchSafeMode(inSafeMode) { 136 await AddonTestUtils.promiseShutdownManager(); 137 AddonTestUtils.appInfo.inSafeMode = inSafeMode; 138 await AddonTestUtils.promiseStartupManager(); 139 return AddonManager.getAddonByID("test@mochi"); 140 } 141 142 let xpi = await AddonTestUtils.createTempWebExtensionFile({ 143 manifest: { 144 version: "1.0", 145 browser_specific_settings: { gecko: { id: "test@mochi" } }, 146 chrome_url_overrides: { 147 newtab: "/newtab", 148 }, 149 chrome_settings_overrides: { 150 homepage: "https://example.com/", 151 }, 152 }, 153 }); 154 let extension = ExtensionTestUtils.expectExtension("test@mochi"); 155 await AddonTestUtils.manuallyInstall(xpi); 156 await AddonTestUtils.promiseStartupManager(); 157 await extension.awaitStartup(); 158 159 isExtensionSettings("on extension startup"); 160 161 // Disable in safemode and verify settings are removed in normal mode. 162 let addon = await switchSafeMode(true); 163 await addon.disable(); 164 addon = await switchSafeMode(false); 165 isDefaultSettings("after disabling addon during safemode"); 166 167 // Enable in safemode and verify settings are back in normal mode. 168 addon = await switchSafeMode(true); 169 await addon.enable(); 170 addon = await switchSafeMode(false); 171 isExtensionSettings("after enabling addon during safemode"); 172 173 // Uninstall in safemode and verify settings are removed in normal mode. 174 addon = await switchSafeMode(true); 175 await addon.uninstall(); 176 addon = await switchSafeMode(false); 177 isDefaultSettings("after uninstalling addon during safemode"); 178 179 await AddonTestUtils.promiseShutdownManager(); 180 await AddonTestUtils.cleanupTempXPIs(); 181 }); 182 183 // There are more settings modules than used in this test file, they should have been 184 // loaded during the test extensions uninstall. Ensure that all settings modules have 185 // been loaded. 186 add_task(async function test_settings_modules_loaded() { 187 // Test that all settings modules are loaded. 188 let modules = Array.from(ExtensionParent.apiManager.settingsModules); 189 ok(modules.length, "we have settings modules"); 190 for (let name of modules) { 191 ok(ExtensionParent.apiManager.getModule(name).loaded, `${name} was loaded`); 192 } 193 });