test_ext_settings_overrides_defaults.js (8268B)
1 /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ 2 /* vim: set sts=2 sw=2 et tw=80: */ 3 4 "use strict"; 5 6 const { AddonTestUtils } = ChromeUtils.importESModule( 7 "resource://testing-common/AddonTestUtils.sys.mjs" 8 ); 9 10 const { SearchTestUtils } = ChromeUtils.importESModule( 11 "resource://testing-common/SearchTestUtils.sys.mjs" 12 ); 13 14 const { SearchUtils } = ChromeUtils.importESModule( 15 "moz-src:///toolkit/components/search/SearchUtils.sys.mjs" 16 ); 17 18 const { RemoteSettings } = ChromeUtils.importESModule( 19 "resource://services-settings/remote-settings.sys.mjs" 20 ); 21 22 const { sinon } = ChromeUtils.importESModule( 23 "resource://testing-common/Sinon.sys.mjs" 24 ); 25 26 const CONFIG = [ 27 { 28 identifier: "MozParamsTest", 29 base: { 30 name: "MozParamsTest", 31 urls: { 32 search: { 33 base: "https://example.com/", 34 params: [ 35 { 36 name: "test-0", 37 searchAccessPoint: { 38 contextmenu: "0", 39 }, 40 }, 41 { 42 name: "test-1", 43 searchAccessPoint: { 44 searchbar: "1", 45 }, 46 }, 47 { 48 name: "test-2", 49 searchAccessPoint: { 50 homepage: "2", 51 }, 52 }, 53 { 54 name: "test-3", 55 searchAccessPoint: { 56 addressbar: "3", 57 }, 58 }, 59 { 60 name: "test-4", 61 searchAccessPoint: { 62 newtab: "4", 63 }, 64 }, 65 { 66 name: "simple", 67 value: "5", 68 }, 69 { 70 name: "term", 71 value: "{searchTerms}", 72 }, 73 { 74 name: "lang", 75 value: "{language}", 76 }, 77 { 78 name: "prefval", 79 experimentConfig: "code", 80 }, 81 { 82 name: "experimenter-1", 83 experimentConfig: "nimbus-key-1", 84 }, 85 { 86 name: "experimenter-2", 87 experimentConfig: "nimbus-key-2", 88 }, 89 ], 90 searchTermParamName: "q", 91 }, 92 }, 93 }, 94 }, 95 { 96 identifier: "MozParamsTest2", 97 base: { 98 name: "MozParamsTest2", 99 urls: { 100 search: { 101 base: "https://example.com/2/", 102 params: [ 103 { 104 name: "simple2", 105 value: "5", 106 }, 107 ], 108 searchTermParamName: "q", 109 }, 110 }, 111 }, 112 }, 113 ]; 114 115 const URLTYPE_SUGGEST_JSON = "application/x-suggestions+json"; 116 117 AddonTestUtils.init(this); 118 AddonTestUtils.createAppInfo( 119 "xpcshell@tests.mozilla.org", 120 "XPCShell", 121 "42", 122 "42" 123 ); 124 125 const kSearchEngineURL = "https://example.com/?q={searchTerms}&foo=myparams"; 126 const kSuggestURL = "https://example.com/fake/suggest/"; 127 const kSuggestURLParams = "q={searchTerms}&type=list2"; 128 129 Services.prefs.setBoolPref("browser.search.log", true); 130 131 add_task(async function setup() { 132 AddonTestUtils.usePrivilegedSignatures = false; 133 AddonTestUtils.overrideCertDB(); 134 await AddonTestUtils.promiseStartupManager(); 135 await SearchTestUtils.setRemoteSettingsConfig(CONFIG); 136 await Services.search.init(); 137 registerCleanupFunction(async () => { 138 await AddonTestUtils.promiseShutdownManager(); 139 }); 140 }); 141 142 function assertEngineParameters({ 143 name, 144 searchURL, 145 suggestionURL, 146 messageSnippet, 147 }) { 148 let engine = Services.search.getEngineByName(name); 149 Assert.ok(engine, `Should have found ${name}`); 150 151 Assert.equal( 152 engine.getSubmission("{searchTerms}").uri.spec, 153 encodeURI(searchURL), 154 `Should have ${messageSnippet} the suggestion url.` 155 ); 156 Assert.equal( 157 engine.getSubmission("{searchTerms}", URLTYPE_SUGGEST_JSON)?.uri.spec, 158 suggestionURL ? encodeURI(suggestionURL) : suggestionURL, 159 `Should ${messageSnippet} the submission URL.` 160 ); 161 } 162 163 add_task(async function test_extension_changing_to_app_provided_default() { 164 let ext1 = ExtensionTestUtils.loadExtension({ 165 manifest: { 166 icons: { 167 16: "foo.ico", 168 }, 169 chrome_settings_overrides: { 170 search_provider: { 171 is_default: true, 172 name: "MozParamsTest2", 173 keyword: "MozSearch", 174 search_url: kSearchEngineURL, 175 suggest_url: kSuggestURL, 176 suggest_url_get_params: kSuggestURLParams, 177 }, 178 }, 179 }, 180 useAddonManager: "temporary", 181 }); 182 183 await ext1.startup(); 184 await AddonTestUtils.waitForSearchProviderStartup(ext1); 185 186 Assert.equal( 187 Services.search.defaultEngine.name, 188 "MozParamsTest2", 189 "Should have switched the default engine." 190 ); 191 192 assertEngineParameters({ 193 name: "MozParamsTest2", 194 searchURL: "https://example.com/2/?simple2=5&q={searchTerms}", 195 messageSnippet: "left unchanged", 196 }); 197 198 let promiseDefaultBrowserChange = SearchTestUtils.promiseSearchNotification( 199 "engine-default", 200 "browser-search-engine-modified" 201 ); 202 await ext1.unload(); 203 await promiseDefaultBrowserChange; 204 205 Assert.equal( 206 Services.search.defaultEngine.name, 207 "MozParamsTest", 208 "Should have reverted to the original default engine." 209 ); 210 }); 211 212 add_task(async function test_extension_overriding_app_provided_default() { 213 const settings = await RemoteSettings(SearchUtils.SETTINGS_ALLOWLIST_KEY); 214 sinon.stub(settings, "get").returns([ 215 { 216 thirdPartyId: "test@thirdparty.example.com", 217 overridesAppIdv2: "MozParamsTest2", 218 urls: [ 219 { 220 search_url: "https://example.com/?q={searchTerms}&foo=myparams", 221 }, 222 ], 223 }, 224 ]); 225 226 let ext1 = ExtensionTestUtils.loadExtension({ 227 manifest: { 228 browser_specific_settings: { 229 gecko: { 230 id: "test@thirdparty.example.com", 231 }, 232 }, 233 icons: { 234 16: "foo.ico", 235 }, 236 chrome_settings_overrides: { 237 search_provider: { 238 is_default: true, 239 name: "MozParamsTest2", 240 keyword: "MozSearch", 241 search_url: kSearchEngineURL, 242 suggest_url: kSuggestURL, 243 suggest_url_get_params: kSuggestURLParams, 244 }, 245 }, 246 }, 247 useAddonManager: "permanent", 248 }); 249 250 info("startup"); 251 252 await ext1.startup(); 253 await AddonTestUtils.waitForSearchProviderStartup(ext1); 254 255 Assert.equal( 256 Services.search.defaultEngine.name, 257 "MozParamsTest2", 258 "Should have switched the default engine." 259 ); 260 assertEngineParameters({ 261 name: "MozParamsTest2", 262 searchURL: kSearchEngineURL, 263 suggestionURL: `${kSuggestURL}?${kSuggestURLParams}`, 264 messageSnippet: "changed", 265 }); 266 267 info("disable"); 268 269 let promiseDefaultBrowserChange = SearchTestUtils.promiseSearchNotification( 270 "engine-default", 271 "browser-search-engine-modified" 272 ); 273 await ext1.addon.disable(); 274 await promiseDefaultBrowserChange; 275 276 Assert.equal( 277 Services.search.defaultEngine.name, 278 "MozParamsTest", 279 "Should have reverted to the original default engine." 280 ); 281 assertEngineParameters({ 282 name: "MozParamsTest2", 283 searchURL: "https://example.com/2/?simple2=5&q={searchTerms}", 284 messageSnippet: "reverted", 285 }); 286 287 info("enable"); 288 289 promiseDefaultBrowserChange = SearchTestUtils.promiseSearchNotification( 290 "engine-default", 291 "browser-search-engine-modified" 292 ); 293 await ext1.addon.enable(); 294 await promiseDefaultBrowserChange; 295 296 Assert.equal( 297 Services.search.defaultEngine.name, 298 "MozParamsTest2", 299 "Should have switched the default engine." 300 ); 301 302 assertEngineParameters({ 303 name: "MozParamsTest2", 304 searchURL: kSearchEngineURL, 305 suggestionURL: `${kSuggestURL}?${kSuggestURLParams}`, 306 messageSnippet: "changed", 307 }); 308 309 info("unload"); 310 311 promiseDefaultBrowserChange = SearchTestUtils.promiseSearchNotification( 312 "engine-default", 313 "browser-search-engine-modified" 314 ); 315 await ext1.unload(); 316 await promiseDefaultBrowserChange; 317 318 Assert.equal( 319 Services.search.defaultEngine.name, 320 "MozParamsTest", 321 "Should have reverted to the original default engine." 322 ); 323 324 assertEngineParameters({ 325 name: "MozParamsTest2", 326 searchURL: "https://example.com/2/?simple2=5&q={searchTerms}", 327 messageSnippet: "reverted", 328 }); 329 sinon.restore(); 330 });