michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: /* michael@0: * Test that currentEngine and defaultEngine properties are updated when the michael@0: * prefs are set independently. michael@0: */ michael@0: michael@0: "use strict"; michael@0: michael@0: const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; michael@0: michael@0: Cu.import("resource://testing-common/httpd.js"); michael@0: michael@0: let waitForEngines = { michael@0: "Test search engine": 1, michael@0: "A second test engine": 1 michael@0: }; michael@0: michael@0: const PREF_BRANCH = "browser.search."; michael@0: michael@0: /** michael@0: * Wrapper for nsIPrefBranch::setComplexValue. michael@0: * @param aPrefName michael@0: * The name of the pref to set. michael@0: */ michael@0: function setLocalizedPref(aPrefName, aValue) { michael@0: let nsIPLS = Ci.nsIPrefLocalizedString; michael@0: let branch = Services.prefs.getBranch(PREF_BRANCH); michael@0: try { michael@0: var pls = Cc["@mozilla.org/pref-localizedstring;1"]. michael@0: createInstance(Ci.nsIPrefLocalizedString); michael@0: pls.data = aValue; michael@0: branch.setComplexValue(aPrefName, nsIPLS, pls); michael@0: } catch (ex) {} michael@0: } michael@0: michael@0: function search_observer(aSubject, aTopic, aData) { michael@0: let engine = aSubject.QueryInterface(Ci.nsISearchEngine); michael@0: do_print("Observer: " + aData + " for " + engine.name); michael@0: michael@0: if (aData != "engine-added") { michael@0: return; michael@0: } michael@0: michael@0: // If the engine is defined in `waitForEngines`, remove it from the list michael@0: if (waitForEngines[engine.name]) { michael@0: delete waitForEngines[engine.name]; michael@0: } else { michael@0: // This engine is not one we're waiting for, so bail out early. michael@0: return; michael@0: } michael@0: michael@0: // Only continue when both engines have been loaded. michael@0: if (Object.keys(waitForEngines).length) { michael@0: return; michael@0: } michael@0: michael@0: let search = Services.search; michael@0: michael@0: let engine1Name = "Test search engine"; michael@0: let engine2Name = "A second test engine"; michael@0: let engine1 = search.getEngineByName(engine1Name); michael@0: let engine2 = search.getEngineByName(engine2Name); michael@0: michael@0: // Initial sanity check: michael@0: search.defaultEngine = engine1; michael@0: do_check_eq(search.defaultEngine, engine1); michael@0: search.currentEngine = engine1; michael@0: do_check_eq(search.currentEngine, engine1); michael@0: michael@0: setLocalizedPref("defaultenginename", engine2Name); michael@0: // Default engine should be synced with the pref michael@0: do_check_eq(search.defaultEngine, engine2); michael@0: // Current engine should've stayed the same michael@0: do_check_eq(search.currentEngine, engine1); michael@0: michael@0: setLocalizedPref("selectedEngine", engine2Name); michael@0: // Default engine should've stayed the same michael@0: do_check_eq(search.defaultEngine, engine2); michael@0: // Current engine should've been updated michael@0: do_check_eq(search.currentEngine, engine2); michael@0: michael@0: // Test that setting the currentEngine to the original default engine clears michael@0: // the selectedEngine pref, rather than setting it. To do this we need to michael@0: // set the value of defaultenginename on the default branch. michael@0: let defaultBranch = Services.prefs.getDefaultBranch(""); michael@0: let prefName = PREF_BRANCH + "defaultenginename"; michael@0: let prefVal = "data:text/plain," + prefName + "=" + engine1Name; michael@0: defaultBranch.setCharPref(prefName, prefVal, true); michael@0: search.currentEngine = engine1; michael@0: // Current engine should've been updated michael@0: do_check_eq(search.currentEngine, engine1); michael@0: do_check_false(Services.prefs.prefHasUserValue("browser.search.selectedEngine")); michael@0: michael@0: // Test that setting the defaultEngine to the original default engine clears michael@0: // the defaultenginename pref, rather than setting it. michael@0: do_check_true(Services.prefs.prefHasUserValue("browser.search.defaultenginename")); michael@0: search.defaultEngine = engine1; michael@0: do_check_eq(search.defaultEngine, engine1); michael@0: do_check_false(Services.prefs.prefHasUserValue("browser.search.defaultenginename")); michael@0: michael@0: do_test_finished(); michael@0: } michael@0: michael@0: function run_test() { michael@0: removeMetadata(); michael@0: updateAppInfo(); michael@0: michael@0: let httpServer = new HttpServer(); michael@0: httpServer.start(-1); michael@0: httpServer.registerDirectory("/", do_get_cwd()); michael@0: let baseUrl = "http://localhost:" + httpServer.identity.primaryPort; michael@0: michael@0: do_register_cleanup(function cleanup() { michael@0: httpServer.stop(function() {}); michael@0: Services.obs.removeObserver(search_observer, "browser-search-engine-modified"); michael@0: }); michael@0: michael@0: do_test_pending(); michael@0: michael@0: Services.obs.addObserver(search_observer, "browser-search-engine-modified", false); michael@0: michael@0: Services.search.addEngine(baseUrl + "/data/engine.xml", michael@0: Ci.nsISearchEngine.DATA_XML, michael@0: null, false); michael@0: Services.search.addEngine(baseUrl + "/data/engine2.xml", michael@0: Ci.nsISearchEngine.DATA_XML, michael@0: null, false); michael@0: }