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 +