test_PreferencesBackupResource_searchEngines.js (8564B)
1 /* Any copyright is dedicated to the Public Domain. 2 https://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 const { PreferencesBackupResource } = ChromeUtils.importESModule( 7 "resource:///modules/backup/PreferencesBackupResource.sys.mjs" 8 ); 9 const { SearchTestUtils } = ChromeUtils.importESModule( 10 "resource://testing-common/SearchTestUtils.sys.mjs" 11 ); 12 const { SearchUtils } = ChromeUtils.importESModule( 13 "moz-src:///toolkit/components/search/SearchUtils.sys.mjs" 14 ); 15 const { updateAppInfo } = ChromeUtils.importESModule( 16 "resource://testing-common/AppInfo.sys.mjs" 17 ); 18 19 const SEARCH_PREFS_FILENAME = "search.json.mozlz4"; 20 21 SearchTestUtils.init(this); 22 23 updateAppInfo({ name: "XPCShell", version: "48", platformVersion: "48" }); 24 do_get_profile(); 25 26 const FAKE_SEARCH_EXTENSION_NAME = "Some WebExtension Search Engine"; 27 const FAKE_PRIVATE_SEARCH_EXTENSION_NAME = 28 "Some Private WebExtension Search Engine"; 29 30 add_setup(async function () { 31 Services.prefs.setBoolPref("browser.search.separatePrivateDefault", true); 32 Services.prefs.setBoolPref( 33 "browser.search.separatePrivateDefault.ui.enabled", 34 true 35 ); 36 37 await SearchTestUtils.setRemoteSettingsConfig([ 38 { identifier: "engine1" }, 39 { identifier: "engine2" }, 40 ]); 41 42 Services.prefs.setCharPref(SearchUtils.BROWSER_SEARCH_PREF + "region", "US"); 43 Services.locale.availableLocales = ["en-US"]; 44 Services.locale.requestedLocales = ["en-US"]; 45 46 await Services.search.init(); 47 48 await SearchTestUtils.installSearchExtension( 49 { 50 name: FAKE_SEARCH_EXTENSION_NAME, 51 search_url: "https://example.com/plain", 52 }, 53 { setAsDefault: true } 54 ); 55 56 await SearchTestUtils.installSearchExtension( 57 { 58 name: FAKE_PRIVATE_SEARCH_EXTENSION_NAME, 59 search_url: "https://example.com/", 60 search_url_get_params: "private={searchTerms}", 61 }, 62 { setAsDefaultPrivate: true } 63 ); 64 65 await SearchTestUtils.promiseSearchNotification( 66 "write-settings-to-disk-complete" 67 ); 68 }); 69 70 /** 71 * Tests that PreferencesBackupResource will correctly recompute search engine 72 * verification hashes after a recovery. This is more of an integration test 73 * than what already exists in test_PreferencesBackupResource.js. 74 */ 75 add_task(async function test_recover_searchEngines_verified() { 76 let preferencesBackupResource = new PreferencesBackupResource(); 77 let recoveryPath = await IOUtils.createUniqueDirectory( 78 PathUtils.tempDir, 79 "PreferencesBackupResource-recovery-test" 80 ); 81 let destProfilePath = await IOUtils.createUniqueDirectory( 82 PathUtils.tempDir, 83 "PreferencesBackupResource-test-profile" 84 ); 85 86 await IOUtils.copy( 87 PathUtils.join(PathUtils.profileDir, SEARCH_PREFS_FILENAME), 88 PathUtils.join(recoveryPath, SEARCH_PREFS_FILENAME) 89 ); 90 91 let postRecoveryEntry = await preferencesBackupResource.recover( 92 { profilePath: PathUtils.profileDir }, 93 recoveryPath, 94 destProfilePath 95 ); 96 97 Assert.equal( 98 postRecoveryEntry, 99 null, 100 "PreferencesBackupResource.recover should return null as its post recovery entry" 101 ); 102 103 let originalSearchEngineSettings = await IOUtils.readJSON( 104 PathUtils.join(PathUtils.profileDir, SEARCH_PREFS_FILENAME), 105 { decompress: true } 106 ); 107 108 let recoveredSearchEngineSettings = await IOUtils.readJSON( 109 PathUtils.join(destProfilePath, SEARCH_PREFS_FILENAME), 110 { decompress: true } 111 ); 112 113 Assert.notEqual( 114 originalSearchEngineSettings.metaData.defaultEngineIdHash, 115 recoveredSearchEngineSettings.metaData.defaultEngineIdHash, 116 "defaultEngineIdHash was updated." 117 ); 118 Assert.equal( 119 recoveredSearchEngineSettings.metaData.defaultEngineIdHash, 120 SearchUtils.getVerificationHash( 121 originalSearchEngineSettings.metaData.defaultEngineId, 122 destProfilePath 123 ), 124 "defaultEngineIdHash was updated correctly." 125 ); 126 127 Assert.notEqual( 128 originalSearchEngineSettings.metaData.privateDefaultEngineIdHash, 129 recoveredSearchEngineSettings.metaData.privateDefaultEngineIdHash, 130 "privateDefaultEngineIdHash was updated." 131 ); 132 Assert.equal( 133 recoveredSearchEngineSettings.metaData.privateDefaultEngineIdHash, 134 SearchUtils.getVerificationHash( 135 originalSearchEngineSettings.metaData.privateDefaultEngineId, 136 destProfilePath 137 ), 138 "privateDefaultEngineIdHash was updated correctly." 139 ); 140 141 Assert.equal( 142 originalSearchEngineSettings.engines.length, 143 recoveredSearchEngineSettings.engines.length, 144 "Got the same number of engines" 145 ); 146 147 for (let i = 0; i < originalSearchEngineSettings.engines.length; ++i) { 148 let originalEngine = originalSearchEngineSettings.engines[i]; 149 let recoveredEngine = recoveredSearchEngineSettings.engines[i]; 150 151 if (originalEngine._metaData.loadPathHash) { 152 Assert.ok( 153 recoveredEngine._metaData.loadPathHash, 154 "Recovered engine also has a loadPathHash" 155 ); 156 Assert.notEqual( 157 originalEngine._metaData.loadPathHash, 158 recoveredEngine._metaData.loadPathHash, 159 "loadPathHash was updated." 160 ); 161 Assert.equal( 162 recoveredEngine._metaData.loadPathHash, 163 SearchUtils.getVerificationHash( 164 originalEngine._loadPath, 165 destProfilePath 166 ), 167 "loadPathHash had the expected value." 168 ); 169 } else { 170 Assert.deepEqual( 171 originalEngine, 172 recoveredEngine, 173 "Engine was not changed." 174 ); 175 } 176 } 177 178 await maybeRemovePath(recoveryPath); 179 await maybeRemovePath(destProfilePath); 180 }); 181 182 /** 183 * Tests that PreferencesBackupResource will not update the verification hashes 184 * for any search engines that fail to verify for the original path. 185 */ 186 add_task(async function test_recover_searchEngines_unverified() { 187 let preferencesBackupResource = new PreferencesBackupResource(); 188 let recoveryPath = await IOUtils.createUniqueDirectory( 189 PathUtils.tempDir, 190 "PreferencesBackupResource-recovery-test" 191 ); 192 let destProfilePath = await IOUtils.createUniqueDirectory( 193 PathUtils.tempDir, 194 "PreferencesBackupResource-test-profile" 195 ); 196 197 // Now let's read in the original search preferences file and break some 198 // of the verification hashes... 199 let searchEngineSettings = await IOUtils.readJSON( 200 PathUtils.join(PathUtils.profileDir, SEARCH_PREFS_FILENAME), 201 { decompress: true } 202 ); 203 204 const BOGUS_HASH = "bogus hash!"; 205 206 searchEngineSettings.metaData.defaultEngineIdHash = BOGUS_HASH; 207 searchEngineSettings.metaData.privateDefaultEngineIdHash = BOGUS_HASH; 208 209 for (let engine of searchEngineSettings.engines) { 210 if (engine._metaData.loadPathHash) { 211 engine._metaData.loadPathHash = BOGUS_HASH; 212 } 213 } 214 215 // And now let us write this data out to the recovery path. 216 await IOUtils.writeJSON( 217 PathUtils.join(recoveryPath, SEARCH_PREFS_FILENAME), 218 searchEngineSettings, 219 { 220 compress: true, 221 } 222 ); 223 224 let postRecoveryEntry = await preferencesBackupResource.recover( 225 { profilePath: PathUtils.profileDir }, 226 recoveryPath, 227 destProfilePath 228 ); 229 230 Assert.equal( 231 postRecoveryEntry, 232 null, 233 "PreferencesBackupResource.recover should return null as its post recovery entry" 234 ); 235 236 // And now let us write this data out to the recovery path. 237 let recoveredSearchEngineSettings = await IOUtils.readJSON( 238 PathUtils.join(destProfilePath, SEARCH_PREFS_FILENAME), 239 { 240 decompress: true, 241 } 242 ); 243 244 Assert.equal( 245 recoveredSearchEngineSettings.metaData.defaultEngineIdHash, 246 BOGUS_HASH, 247 "Bogus defaultEngineIdHash was not changed." 248 ); 249 250 Assert.equal( 251 recoveredSearchEngineSettings.metaData.privateDefaultEngineIdHash, 252 BOGUS_HASH, 253 "Bogus privateDefaultEngineIdHash was not changed." 254 ); 255 256 Assert.equal( 257 searchEngineSettings.engines.length, 258 recoveredSearchEngineSettings.engines.length, 259 "Got the same number of engines" 260 ); 261 262 for (let i = 0; i < searchEngineSettings.engines.length; ++i) { 263 let originalEngine = searchEngineSettings.engines[i]; 264 let recoveredEngine = recoveredSearchEngineSettings.engines[i]; 265 266 if (originalEngine._metaData.loadPathHash) { 267 Assert.ok( 268 recoveredEngine._metaData.loadPathHash, 269 "Recovered engine also has a loadPathHash" 270 ); 271 Assert.equal( 272 recoveredEngine._metaData.loadPathHash, 273 BOGUS_HASH, 274 "Bogus loadPathHash was not changed." 275 ); 276 } else { 277 Assert.deepEqual( 278 originalEngine, 279 recoveredEngine, 280 "Engine was not changed." 281 ); 282 } 283 } 284 285 await maybeRemovePath(recoveryPath); 286 await maybeRemovePath(destProfilePath); 287 });