toolkit/components/search/tests/xpcshell/test_prefSync.js

changeset 0
6474c204b198
     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 +}

mercurial