summaryrefslogtreecommitdiffstats
path: root/browser/components/search/test/browser_oneOffHeader.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/search/test/browser_oneOffHeader.js')
-rw-r--r--browser/components/search/test/browser_oneOffHeader.js142
1 files changed, 142 insertions, 0 deletions
diff --git a/browser/components/search/test/browser_oneOffHeader.js b/browser/components/search/test/browser_oneOffHeader.js
new file mode 100644
index 000000000..3a209bf56
--- /dev/null
+++ b/browser/components/search/test/browser_oneOffHeader.js
@@ -0,0 +1,142 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+// Tests that keyboard navigation in the search panel works as designed.
+
+const isMac = ("nsILocalFileMac" in Ci);
+
+const searchbar = document.getElementById("searchbar");
+const textbox = searchbar._textbox;
+const searchPopup = document.getElementById("PopupSearchAutoComplete");
+const searchIcon = document.getAnonymousElementByAttribute(searchbar, "anonid",
+ "searchbar-search-button");
+
+const oneOffsContainer =
+ document.getAnonymousElementByAttribute(searchPopup, "anonid",
+ "search-one-off-buttons");
+const searchSettings =
+ document.getAnonymousElementByAttribute(oneOffsContainer, "anonid",
+ "search-settings");
+var header =
+ document.getAnonymousElementByAttribute(oneOffsContainer, "anonid",
+ "search-panel-one-offs-header");
+function getHeaderText() {
+ let headerChild = header.selectedPanel;
+ while (headerChild.hasChildNodes()) {
+ headerChild = headerChild.firstChild;
+ }
+ let headerStrings = [];
+ for (let label = headerChild; label; label = label.nextSibling) {
+ headerStrings.push(label.value);
+ }
+ return headerStrings.join("");
+}
+
+const msg = isMac ? 5 : 1;
+const utils = window.QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIDOMWindowUtils);
+const scale = utils.screenPixelsPerCSSPixel;
+function* synthesizeNativeMouseMove(aElement) {
+ let rect = aElement.getBoundingClientRect();
+ let win = aElement.ownerGlobal;
+ let x = win.mozInnerScreenX + (rect.left + rect.right) / 2;
+ let y = win.mozInnerScreenY + (rect.top + rect.bottom) / 2;
+
+ // Wait for the mouseup event to occur before continuing.
+ return new Promise((resolve, reject) => {
+ function eventOccurred(e)
+ {
+ aElement.removeEventListener("mouseover", eventOccurred, true);
+ resolve();
+ }
+
+ aElement.addEventListener("mouseover", eventOccurred, true);
+
+ utils.sendNativeMouseEvent(x * scale, y * scale, msg, 0, null);
+ });
+}
+
+
+add_task(function* init() {
+ yield promiseNewEngine("testEngine.xml");
+});
+
+add_task(function* test_notext() {
+ let promise = promiseEvent(searchPopup, "popupshown");
+ info("Opening search panel");
+ EventUtils.synthesizeMouseAtCenter(searchIcon, {});
+ yield promise;
+
+ is(header.getAttribute("selectedIndex"), 0,
+ "Header has the correct index selected with no search terms.");
+
+ is(getHeaderText(), "Search with:",
+ "Search header string is correct when no search terms have been entered");
+
+ yield synthesizeNativeMouseMove(searchSettings);
+ is(header.getAttribute("selectedIndex"), 0,
+ "Header has the correct index when no search terms have been entered and the Change Search Settings button is selected.");
+ is(getHeaderText(), "Search with:",
+ "Header has the correct text when no search terms have been entered and the Change Search Settings button is selected.");
+
+ let buttons = getOneOffs();
+ yield synthesizeNativeMouseMove(buttons[0]);
+ is(header.getAttribute("selectedIndex"), 2,
+ "Header has the correct index selected when a search engine has been selected");
+ is(getHeaderText(), "Search " + buttons[0].engine.name,
+ "Is the header text correct when a search engine is selected and no terms have been entered.");
+
+ promise = promiseEvent(searchPopup, "popuphidden");
+ info("Closing search panel");
+ EventUtils.synthesizeKey("VK_ESCAPE", {});
+ yield promise;
+});
+
+add_task(function* test_text() {
+ textbox.value = "foo";
+ registerCleanupFunction(() => {
+ textbox.value = "";
+ });
+
+ let promise = promiseEvent(searchPopup, "popupshown");
+ info("Opening search panel");
+ SimpleTest.executeSoon(() => {
+ EventUtils.synthesizeMouseAtCenter(searchIcon, {});
+ });
+ yield promise;
+
+ is(header.getAttribute("selectedIndex"), 1,
+ "Header has the correct index selected with a search term.");
+ is(getHeaderText(), "Search for foo with:",
+ "Search header string is correct when a search term has been entered");
+
+ let buttons = getOneOffs();
+ yield synthesizeNativeMouseMove(buttons[0]);
+ is(header.getAttribute("selectedIndex"), 2,
+ "Header has the correct index selected when a search engine has been selected");
+ is(getHeaderText(), "Search " + buttons[0].engine.name,
+ "Is the header text correct when search terms are entered after a search engine has been selected.");
+
+ yield synthesizeNativeMouseMove(searchSettings);
+ is(header.getAttribute("selectedIndex"), 1,
+ "Header has the correct index selected when search terms have been entered and the Change Search Settings button is selected.");
+ is(getHeaderText(), "Search for foo with:",
+ "Header has the correct text when search terms have been entered and the Change Search Settings button is selected.");
+
+ // Click the "Foo Search" header at the top of the popup and make sure it
+ // loads the search results.
+ let searchbarEngine =
+ document.getAnonymousElementByAttribute(searchPopup, "anonid",
+ "searchbar-engine");
+
+ yield synthesizeNativeMouseMove(searchbarEngine);
+ SimpleTest.executeSoon(() => {
+ EventUtils.synthesizeMouseAtCenter(searchbarEngine, {});
+ });
+
+ let url = Services.search.currentEngine.getSubmission(textbox.value).uri.spec;
+ yield promiseTabLoadEvent(gBrowser.selectedTab, url);
+
+ // Move the cursor out of the panel area to avoid messing with other tests.
+ yield synthesizeNativeMouseMove(searchbar);
+});