browser/components/search/test/browser_426329.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/browser/components/search/test/browser_426329.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,305 @@
     1.4 +// Instead of loading ChromeUtils.js into the test scope in browser-test.js for all tests,
     1.5 +// we only need ChromeUtils.js for a few files which is why we are using loadSubScript.
     1.6 +var ChromeUtils = {};
     1.7 +this._scriptLoader = Cc["@mozilla.org/moz/jssubscript-loader;1"].
     1.8 +                     getService(Ci.mozIJSSubScriptLoader);
     1.9 +this._scriptLoader.loadSubScript("chrome://mochikit/content/tests/SimpleTest/ChromeUtils.js", ChromeUtils);
    1.10 +
    1.11 +XPCOMUtils.defineLazyModuleGetter(this, "FormHistory",
    1.12 +  "resource://gre/modules/FormHistory.jsm");
    1.13 +XPCOMUtils.defineLazyModuleGetter(this, "Promise",
    1.14 +  "resource://gre/modules/Promise.jsm");
    1.15 +
    1.16 +function expectedURL(aSearchTerms) {
    1.17 +  const ENGINE_HTML_BASE = "http://mochi.test:8888/browser/browser/components/search/test/test.html";
    1.18 +  var textToSubURI = Cc["@mozilla.org/intl/texttosuburi;1"].
    1.19 +                     getService(Ci.nsITextToSubURI);
    1.20 +  var searchArg = textToSubURI.ConvertAndEscape("utf-8", aSearchTerms);
    1.21 +  return ENGINE_HTML_BASE + "?test=" + searchArg;
    1.22 +}
    1.23 +
    1.24 +function simulateClick(aEvent, aTarget) {
    1.25 +  var event = document.createEvent("MouseEvent");
    1.26 +  var ctrlKeyArg  = aEvent.ctrlKey  || false;
    1.27 +  var altKeyArg   = aEvent.altKey   || false;
    1.28 +  var shiftKeyArg = aEvent.shiftKey || false;
    1.29 +  var metaKeyArg  = aEvent.metaKey  || false;
    1.30 +  var buttonArg   = aEvent.button   || 0;
    1.31 +  event.initMouseEvent("click", true, true, window,
    1.32 +                        0, 0, 0, 0, 0,
    1.33 +                        ctrlKeyArg, altKeyArg, shiftKeyArg, metaKeyArg,
    1.34 +                        buttonArg, null);
    1.35 +  aTarget.dispatchEvent(event);
    1.36 +}
    1.37 +
    1.38 +// modified from toolkit/components/satchel/test/test_form_autocomplete.html
    1.39 +function checkMenuEntries(expectedValues) {
    1.40 +  var actualValues = getMenuEntries();
    1.41 +  is(actualValues.length, expectedValues.length, "Checking length of expected menu");
    1.42 +  for (var i = 0; i < expectedValues.length; i++)
    1.43 +    is(actualValues[i], expectedValues[i], "Checking menu entry #" + i);
    1.44 +}
    1.45 +
    1.46 +function getMenuEntries() {
    1.47 +  var entries = [];
    1.48 +  var autocompleteMenu = searchBar.textbox.popup;
    1.49 +  // Could perhaps pull values directly from the controller, but it seems
    1.50 +  // more reliable to test the values that are actually in the tree?
    1.51 +  var column = autocompleteMenu.tree.columns[0];
    1.52 +  var numRows = autocompleteMenu.tree.view.rowCount;
    1.53 +  for (var i = 0; i < numRows; i++) {
    1.54 +    entries.push(autocompleteMenu.tree.view.getValueAt(i, column));
    1.55 +  }
    1.56 +  return entries;
    1.57 +}
    1.58 +
    1.59 +function* countEntries(name, value) {
    1.60 +  let deferred = Promise.defer();
    1.61 +  let count = 0;
    1.62 +  let obj = name && value ? {fieldname: name, value: value} : {};
    1.63 +  FormHistory.count(obj,
    1.64 +                    { handleResult: function(result) { count = result; },
    1.65 +                      handleError: function(error) { throw error; },
    1.66 +                      handleCompletion: function(reason) {
    1.67 +                        if (!reason) {
    1.68 +                          deferred.resolve(count);
    1.69 +                        }
    1.70 +                      }
    1.71 +                    });
    1.72 +  return deferred.promise;
    1.73 +}
    1.74 +
    1.75 +var searchBar;
    1.76 +var searchButton;
    1.77 +var searchEntries = ["test", "More Text", "Some Text"];
    1.78 +function* promiseSetEngine() {
    1.79 +  let deferred = Promise.defer();
    1.80 +  var ss = Services.search;
    1.81 +
    1.82 +  function observer(aSub, aTopic, aData) {
    1.83 +    switch (aData) {
    1.84 +      case "engine-added":
    1.85 +        var engine = ss.getEngineByName("Bug 426329");
    1.86 +        ok(engine, "Engine was added.");
    1.87 +        ss.currentEngine = engine;
    1.88 +        break;
    1.89 +      case "engine-current":
    1.90 +        ok(ss.currentEngine.name == "Bug 426329", "currentEngine set");
    1.91 +        searchBar = BrowserSearch.searchBar;
    1.92 +        searchButton = document.getAnonymousElementByAttribute(searchBar,
    1.93 +                           "anonid", "search-go-button");
    1.94 +        ok(searchButton, "got search-go-button");
    1.95 +        searchBar.value = "test";
    1.96 +
    1.97 +        Services.obs.removeObserver(observer, "browser-search-engine-modified");
    1.98 +        deferred.resolve();
    1.99 +        break;
   1.100 +    }
   1.101 +  };
   1.102 +
   1.103 +  Services.obs.addObserver(observer, "browser-search-engine-modified", false);
   1.104 +  ss.addEngine("http://mochi.test:8888/browser/browser/components/search/test/426329.xml",
   1.105 +               Ci.nsISearchEngine.DATA_XML, "data:image/x-icon,%00",
   1.106 +               false);
   1.107 +
   1.108 +  return deferred.promise;
   1.109 +}
   1.110 +
   1.111 +function* promiseRemoveEngine() {
   1.112 +  let deferred = Promise.defer();
   1.113 +  var ss = Services.search;
   1.114 +
   1.115 +  function observer(aSub, aTopic, aData) {
   1.116 +    if (aData == "engine-removed") {
   1.117 +      Services.obs.removeObserver(observer, "browser-search-engine-modified");
   1.118 +      deferred.resolve();
   1.119 +    }
   1.120 +  };
   1.121 +
   1.122 +  Services.obs.addObserver(observer, "browser-search-engine-modified", false);
   1.123 +  var engine = ss.getEngineByName("Bug 426329");
   1.124 +  ss.removeEngine(engine);
   1.125 +
   1.126 +  return deferred.promise;
   1.127 +}
   1.128 +
   1.129 +
   1.130 +var preSelectedBrowser;
   1.131 +var preTabNo;
   1.132 +function* prepareTest() {
   1.133 +  preSelectedBrowser = gBrowser.selectedBrowser;
   1.134 +  preTabNo = gBrowser.tabs.length;
   1.135 +  searchBar = BrowserSearch.searchBar;
   1.136 +
   1.137 +  let windowFocused = Promise.defer();
   1.138 +  SimpleTest.waitForFocus(windowFocused.resolve, window);
   1.139 +  yield windowFocused.promise;
   1.140 +
   1.141 +  let deferred = Promise.defer();
   1.142 +  if (document.activeElement != searchBar) {
   1.143 +    searchBar.addEventListener("focus", function onFocus() {
   1.144 +      searchBar.removeEventListener("focus", onFocus);
   1.145 +      deferred.resolve();
   1.146 +    });
   1.147 +    searchBar.focus();
   1.148 +  } else {
   1.149 +    deferred.resolve();
   1.150 +  }
   1.151 +  return deferred.promise;
   1.152 +}
   1.153 +
   1.154 +add_task(function testSetupEngine() {
   1.155 +  yield promiseSetEngine();
   1.156 +});
   1.157 +
   1.158 +add_task(function testReturn() {
   1.159 +  yield prepareTest();
   1.160 +  EventUtils.synthesizeKey("VK_RETURN", {});
   1.161 +  let event = yield promiseOnLoad();
   1.162 +
   1.163 +  is(gBrowser.tabs.length, preTabNo, "Return key did not open new tab");
   1.164 +  is(event.originalTarget, preSelectedBrowser.contentDocument,
   1.165 +     "Return key loaded results in current tab");
   1.166 +  is(event.originalTarget.URL, expectedURL(searchBar.value), "testReturn opened correct search page");
   1.167 +});
   1.168 +
   1.169 +add_task(function testAltReturn() {
   1.170 +  yield prepareTest();
   1.171 +  EventUtils.synthesizeKey("VK_RETURN", { altKey: true });
   1.172 +  let event = yield promiseOnLoad();
   1.173 +
   1.174 +  is(gBrowser.tabs.length, preTabNo + 1, "Alt+Return key added new tab");
   1.175 +  isnot(event.originalTarget, preSelectedBrowser.contentDocument,
   1.176 +        "Alt+Return key loaded results in new tab");
   1.177 +  is(event.originalTarget, gBrowser.contentDocument,
   1.178 +     "Alt+Return key loaded results in foreground tab");
   1.179 +  is(event.originalTarget.URL, expectedURL(searchBar.value), "testAltReturn opened correct search page");
   1.180 +});
   1.181 +
   1.182 +//Shift key has no effect for now, so skip it
   1.183 +add_task(function testShiftAltReturn() {
   1.184 +  return;
   1.185 +
   1.186 +  yield prepareTest();
   1.187 +  EventUtils.synthesizeKey("VK_RETURN", { shiftKey: true, altKey: true });
   1.188 +  let event = yield promiseOnLoad();
   1.189 +
   1.190 +  is(gBrowser.tabs.length, preTabNo + 1, "Shift+Alt+Return key added new tab");
   1.191 +  isnot(event.originalTarget, preSelectedBrowser.contentDocument,
   1.192 +        "Shift+Alt+Return key loaded results in new tab");
   1.193 +  isnot(event.originalTarget, gBrowser.contentDocument,
   1.194 +        "Shift+Alt+Return key loaded results in background tab");
   1.195 +  is(event.originalTarget.URL, expectedURL(searchBar.value), "testShiftAltReturn opened correct search page");
   1.196 +});
   1.197 +
   1.198 +add_task(function testLeftClick() {
   1.199 +  yield prepareTest();
   1.200 +  simulateClick({ button: 0 }, searchButton);
   1.201 +  let event = yield promiseOnLoad();
   1.202 +  is(gBrowser.tabs.length, preTabNo, "LeftClick did not open new tab");
   1.203 +  is(event.originalTarget, preSelectedBrowser.contentDocument,
   1.204 +     "LeftClick loaded results in current tab");
   1.205 +  is(event.originalTarget.URL, expectedURL(searchBar.value), "testLeftClick opened correct search page");
   1.206 +});
   1.207 +
   1.208 +add_task(function testMiddleClick() {
   1.209 +  yield prepareTest();
   1.210 +  simulateClick({ button: 1 }, searchButton);
   1.211 +  let event = yield promiseOnLoad();
   1.212 +  is(gBrowser.tabs.length, preTabNo + 1, "MiddleClick added new tab");
   1.213 +  isnot(event.originalTarget, preSelectedBrowser.contentDocument,
   1.214 +        "MiddleClick loaded results in new tab");
   1.215 +  is(event.originalTarget, gBrowser.contentDocument,
   1.216 +     "MiddleClick loaded results in foreground tab");
   1.217 +  is(event.originalTarget.URL, expectedURL(searchBar.value), "testMiddleClick opened correct search page");
   1.218 +});
   1.219 +
   1.220 +add_task(function testShiftMiddleClick() {
   1.221 +  yield prepareTest();
   1.222 +  simulateClick({ button: 1, shiftKey: true }, searchButton);
   1.223 +  let event = yield promiseOnLoad();
   1.224 +  is(gBrowser.tabs.length, preTabNo + 1, "Shift+MiddleClick added new tab");
   1.225 +  isnot(event.originalTarget, preSelectedBrowser.contentDocument,
   1.226 +        "Shift+MiddleClick loaded results in new tab");
   1.227 +  isnot(event.originalTarget, gBrowser.contentDocument,
   1.228 +        "Shift+MiddleClick loaded results in background tab");
   1.229 +  is(event.originalTarget.URL, expectedURL(searchBar.value), "testShiftMiddleClick opened correct search page");
   1.230 +});
   1.231 +
   1.232 +add_task(function testDropText() {
   1.233 +  yield prepareTest();
   1.234 +  let promisePreventPopup = promiseEvent(searchBar, "popupshowing", true);
   1.235 +  // drop on the search button so that we don't need to worry about the
   1.236 +  // default handlers for textboxes.
   1.237 +  ChromeUtils.synthesizeDrop(searchBar.searchButton, searchBar.searchButton, [[ {type: "text/plain", data: "Some Text" } ]], "copy", window);
   1.238 +  yield promisePreventPopup;
   1.239 +  let event = yield promiseOnLoad();
   1.240 +  is(event.originalTarget.URL, expectedURL(searchBar.value), "testDropText opened correct search page");
   1.241 +  is(searchBar.value, "Some Text", "drop text/plain on searchbar");
   1.242 +});
   1.243 +
   1.244 +add_task(function testDropInternalText() {
   1.245 +  yield prepareTest();
   1.246 +  let promisePreventPopup = promiseEvent(searchBar, "popupshowing", true);
   1.247 +  ChromeUtils.synthesizeDrop(searchBar.searchButton, searchBar.searchButton, [[ {type: "text/x-moz-text-internal", data: "More Text" } ]], "copy", window);
   1.248 +  yield promisePreventPopup;
   1.249 +  let event = yield promiseOnLoad();
   1.250 +  is(event.originalTarget.URL, expectedURL(searchBar.value), "testDropInternalText opened correct search page");
   1.251 +  is(searchBar.value, "More Text", "drop text/x-moz-text-internal on searchbar");
   1.252 +
   1.253 +  // testDropLink implicitly depended on testDropInternalText, so these two tests
   1.254 +  // were merged so that if testDropInternalText failed it wouldn't cause testDropLink
   1.255 +  // to fail unexplainably.
   1.256 +  yield prepareTest();
   1.257 +  let promisePreventPopup = promiseEvent(searchBar, "popupshowing", true);
   1.258 +  ChromeUtils.synthesizeDrop(searchBar.searchButton, searchBar.searchButton, [[ {type: "text/uri-list", data: "http://www.mozilla.org" } ]], "copy", window);
   1.259 +  yield promisePreventPopup;
   1.260 +  is(searchBar.value, "More Text", "drop text/uri-list on searchbar shouldn't change anything");
   1.261 +});
   1.262 +
   1.263 +add_task(function testRightClick() {
   1.264 +  preTabNo = gBrowser.tabs.length;
   1.265 +  content.location.href = "about:blank";
   1.266 +  simulateClick({ button: 2 }, searchButton);
   1.267 +  let deferred = Promise.defer();
   1.268 +  setTimeout(function() {
   1.269 +    is(gBrowser.tabs.length, preTabNo, "RightClick did not open new tab");
   1.270 +    is(gBrowser.currentURI.spec, "about:blank", "RightClick did nothing");
   1.271 +    deferred.resolve();
   1.272 +  }, 5000);
   1.273 +  yield deferred.promise;
   1.274 +});
   1.275 +
   1.276 +add_task(function testSearchHistory() {
   1.277 +  var textbox = searchBar._textbox;
   1.278 +  for (var i = 0; i < searchEntries.length; i++) {
   1.279 +    let count = yield countEntries(textbox.getAttribute("autocompletesearchparam"), searchEntries[i]);
   1.280 +    ok(count > 0, "form history entry '" + searchEntries[i] + "' should exist");
   1.281 +  }
   1.282 +});
   1.283 +
   1.284 +add_task(function testAutocomplete() {
   1.285 +  var popup = searchBar.textbox.popup;
   1.286 +  let popupShownPromise = promiseEvent(popup, "popupshown");
   1.287 +  searchBar.textbox.showHistoryPopup();
   1.288 +  yield popupShownPromise;
   1.289 +  checkMenuEntries(searchEntries);
   1.290 +});
   1.291 +
   1.292 +add_task(function testClearHistory() {
   1.293 +  let controller = searchBar.textbox.controllers.getControllerForCommand("cmd_clearhistory")
   1.294 +  ok(controller.isCommandEnabled("cmd_clearhistory"), "Clear history command enabled");
   1.295 +  controller.doCommand("cmd_clearhistory");
   1.296 +  let count = yield countEntries();
   1.297 +  ok(count == 0, "History cleared");
   1.298 +});
   1.299 +
   1.300 +add_task(function asyncCleanup() {
   1.301 +  searchBar.value = "";
   1.302 +  while (gBrowser.tabs.length != 1) {
   1.303 +    gBrowser.removeTab(gBrowser.tabs[0], {animate: false});
   1.304 +  }
   1.305 +  content.location.href = "about:blank";
   1.306 +  yield promiseRemoveEngine();
   1.307 +});
   1.308 +

mercurial