1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/components/search/tests/xpcshell/test_prefSync.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,130 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + * http://creativecommons.org/publicdomain/zero/1.0/ */ 1.6 + 1.7 +/* 1.8 + * Test that currentEngine and defaultEngine properties are updated when the 1.9 + * prefs are set independently. 1.10 + */ 1.11 + 1.12 +"use strict"; 1.13 + 1.14 +const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; 1.15 + 1.16 +Cu.import("resource://testing-common/httpd.js"); 1.17 + 1.18 +let waitForEngines = { 1.19 + "Test search engine": 1, 1.20 + "A second test engine": 1 1.21 +}; 1.22 + 1.23 +const PREF_BRANCH = "browser.search."; 1.24 + 1.25 +/** 1.26 + * Wrapper for nsIPrefBranch::setComplexValue. 1.27 + * @param aPrefName 1.28 + * The name of the pref to set. 1.29 + */ 1.30 +function setLocalizedPref(aPrefName, aValue) { 1.31 + let nsIPLS = Ci.nsIPrefLocalizedString; 1.32 + let branch = Services.prefs.getBranch(PREF_BRANCH); 1.33 + try { 1.34 + var pls = Cc["@mozilla.org/pref-localizedstring;1"]. 1.35 + createInstance(Ci.nsIPrefLocalizedString); 1.36 + pls.data = aValue; 1.37 + branch.setComplexValue(aPrefName, nsIPLS, pls); 1.38 + } catch (ex) {} 1.39 +} 1.40 + 1.41 +function search_observer(aSubject, aTopic, aData) { 1.42 + let engine = aSubject.QueryInterface(Ci.nsISearchEngine); 1.43 + do_print("Observer: " + aData + " for " + engine.name); 1.44 + 1.45 + if (aData != "engine-added") { 1.46 + return; 1.47 + } 1.48 + 1.49 + // If the engine is defined in `waitForEngines`, remove it from the list 1.50 + if (waitForEngines[engine.name]) { 1.51 + delete waitForEngines[engine.name]; 1.52 + } else { 1.53 + // This engine is not one we're waiting for, so bail out early. 1.54 + return; 1.55 + } 1.56 + 1.57 + // Only continue when both engines have been loaded. 1.58 + if (Object.keys(waitForEngines).length) { 1.59 + return; 1.60 + } 1.61 + 1.62 + let search = Services.search; 1.63 + 1.64 + let engine1Name = "Test search engine"; 1.65 + let engine2Name = "A second test engine"; 1.66 + let engine1 = search.getEngineByName(engine1Name); 1.67 + let engine2 = search.getEngineByName(engine2Name); 1.68 + 1.69 + // Initial sanity check: 1.70 + search.defaultEngine = engine1; 1.71 + do_check_eq(search.defaultEngine, engine1); 1.72 + search.currentEngine = engine1; 1.73 + do_check_eq(search.currentEngine, engine1); 1.74 + 1.75 + setLocalizedPref("defaultenginename", engine2Name); 1.76 + // Default engine should be synced with the pref 1.77 + do_check_eq(search.defaultEngine, engine2); 1.78 + // Current engine should've stayed the same 1.79 + do_check_eq(search.currentEngine, engine1); 1.80 + 1.81 + setLocalizedPref("selectedEngine", engine2Name); 1.82 + // Default engine should've stayed the same 1.83 + do_check_eq(search.defaultEngine, engine2); 1.84 + // Current engine should've been updated 1.85 + do_check_eq(search.currentEngine, engine2); 1.86 + 1.87 + // Test that setting the currentEngine to the original default engine clears 1.88 + // the selectedEngine pref, rather than setting it. To do this we need to 1.89 + // set the value of defaultenginename on the default branch. 1.90 + let defaultBranch = Services.prefs.getDefaultBranch(""); 1.91 + let prefName = PREF_BRANCH + "defaultenginename"; 1.92 + let prefVal = "data:text/plain," + prefName + "=" + engine1Name; 1.93 + defaultBranch.setCharPref(prefName, prefVal, true); 1.94 + search.currentEngine = engine1; 1.95 + // Current engine should've been updated 1.96 + do_check_eq(search.currentEngine, engine1); 1.97 + do_check_false(Services.prefs.prefHasUserValue("browser.search.selectedEngine")); 1.98 + 1.99 + // Test that setting the defaultEngine to the original default engine clears 1.100 + // the defaultenginename pref, rather than setting it. 1.101 + do_check_true(Services.prefs.prefHasUserValue("browser.search.defaultenginename")); 1.102 + search.defaultEngine = engine1; 1.103 + do_check_eq(search.defaultEngine, engine1); 1.104 + do_check_false(Services.prefs.prefHasUserValue("browser.search.defaultenginename")); 1.105 + 1.106 + do_test_finished(); 1.107 +} 1.108 + 1.109 +function run_test() { 1.110 + removeMetadata(); 1.111 + updateAppInfo(); 1.112 + 1.113 + let httpServer = new HttpServer(); 1.114 + httpServer.start(-1); 1.115 + httpServer.registerDirectory("/", do_get_cwd()); 1.116 + let baseUrl = "http://localhost:" + httpServer.identity.primaryPort; 1.117 + 1.118 + do_register_cleanup(function cleanup() { 1.119 + httpServer.stop(function() {}); 1.120 + Services.obs.removeObserver(search_observer, "browser-search-engine-modified"); 1.121 + }); 1.122 + 1.123 + do_test_pending(); 1.124 + 1.125 + Services.obs.addObserver(search_observer, "browser-search-engine-modified", false); 1.126 + 1.127 + Services.search.addEngine(baseUrl + "/data/engine.xml", 1.128 + Ci.nsISearchEngine.DATA_XML, 1.129 + null, false); 1.130 + Services.search.addEngine(baseUrl + "/data/engine2.xml", 1.131 + Ci.nsISearchEngine.DATA_XML, 1.132 + null, false); 1.133 +}