summaryrefslogtreecommitdiffstats
path: root/toolkit/content/tests/chrome/findbar_events_window.xul
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/content/tests/chrome/findbar_events_window.xul')
-rw-r--r--toolkit/content/tests/chrome/findbar_events_window.xul173
1 files changed, 173 insertions, 0 deletions
diff --git a/toolkit/content/tests/chrome/findbar_events_window.xul b/toolkit/content/tests/chrome/findbar_events_window.xul
new file mode 100644
index 000000000..2bfc52c14
--- /dev/null
+++ b/toolkit/content/tests/chrome/findbar_events_window.xul
@@ -0,0 +1,173 @@
+<?xml version="1.0"?>
+
+<!-- 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/. -->
+
+<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
+<?xml-stylesheet
+ href="chrome://mochikit/content/tests/SimpleTest/test.css"
+ type="text/css"?>
+
+<window id="FindbarTest"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ width="600"
+ height="600"
+ onload="SimpleTest.executeSoon(startTest);"
+ title="findbar events test">
+
+ <script type="application/javascript"><![CDATA[
+ const {interfaces: Ci, classes: Cc, results: Cr, utils: Cu} = Components;
+ Cu.import("resource://gre/modules/Task.jsm");
+ Cu.import("resource://testing-common/BrowserTestUtils.jsm");
+ Cu.import("resource://testing-common/ContentTask.jsm");
+ ContentTask.setTestScope(window.opener.wrappedJSObject);
+
+ var gFindBar = null;
+ var gBrowser;
+ const kTimeout = 5000; // 5 seconds.
+
+ var imports = ["SimpleTest", "ok", "is", "info"];
+ for (var name of imports) {
+ window[name] = window.opener.wrappedJSObject[name];
+ }
+ SimpleTest.requestLongerTimeout(2);
+
+ function startTest() {
+ Task.spawn(function* () {
+ gFindBar = document.getElementById("FindToolbar");
+ for (let browserId of ["content", "content-remote"]) {
+ yield startTestWithBrowser(browserId);
+ }
+ }).then(() => {
+ window.close();
+ SimpleTest.finish();
+ });
+ }
+
+ function* startTestWithBrowser(browserId) {
+ info("Starting test with browser '" + browserId + "'");
+ gBrowser = document.getElementById(browserId);
+ gFindBar.browser = gBrowser;
+ let promise = BrowserTestUtils.browserLoaded(gBrowser);
+ gBrowser.loadURI("data:text/html,hello there");
+ yield promise;
+ yield onDocumentLoaded();
+ }
+
+ function* onDocumentLoaded() {
+ gFindBar.open();
+ gFindBar.onFindCommand();
+
+ yield testFind();
+ yield testFindAgain();
+ yield testCaseSensitivity();
+ yield testHighlight();
+ }
+
+ function checkSelection() {
+ return new Promise(resolve => {
+ SimpleTest.executeSoon(() => {
+ ContentTask.spawn(gBrowser, null, function* () {
+ let selected = content.getSelection();
+ Assert.equal(String(selected), "", "No text is selected");
+
+ let controller = docShell.QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsISelectionDisplay)
+ .QueryInterface(Ci.nsISelectionController);
+ let selection = controller.getSelection(controller.SELECTION_FIND);
+ Assert.equal(selection.rangeCount, 0, "No text is highlighted");
+ }).then(resolve);
+ });
+ });
+ }
+
+ function once(node, eventName, preventDefault = true) {
+ return new Promise((resolve, reject) => {
+ let timeout = window.setTimeout(() => {
+ reject("Event wasn't fired within " + kTimeout + "ms for event '" +
+ eventName + "'.");
+ }, kTimeout);
+
+ node.addEventListener(eventName, function clb(e) {
+ window.clearTimeout(timeout);
+ node.removeEventListener(eventName, clb);
+ if (preventDefault)
+ e.preventDefault();
+ resolve(e);
+ });
+ });
+ }
+
+ function* testFind() {
+ info("Testing normal find.");
+ let query = "t";
+ let promise = once(gFindBar, "find");
+
+ // Put some text in the find box.
+ let event = document.createEvent("KeyboardEvent");
+ event.initKeyEvent("keypress", true, true, null, false, false,
+ false, false, 0, query.charCodeAt(0));
+ gFindBar._findField.inputField.dispatchEvent(event);
+
+ let e = yield promise;
+ ok(e.detail.query === query, "find event query should match '" + query + "'");
+ // Since we're preventing the default make sure nothing was selected.
+ yield checkSelection();
+ }
+
+ function testFindAgain() {
+ info("Testing repeating normal find.");
+ let promise = once(gFindBar, "findagain");
+
+ gFindBar.onFindAgainCommand();
+
+ yield promise;
+ // Since we're preventing the default make sure nothing was selected.
+ yield checkSelection();
+ }
+
+ function* testCaseSensitivity() {
+ info("Testing normal case sensitivity.");
+ let promise = once(gFindBar, "findcasesensitivitychange", false);
+
+ let matchCaseCheckbox = gFindBar.getElement("find-case-sensitive");
+ matchCaseCheckbox.click();
+
+ let e = yield promise;
+ ok(e.detail.caseSensitive, "find should be case sensitive");
+
+ // Toggle it back to the original setting.
+ matchCaseCheckbox.click();
+
+ // Changing case sensitivity does the search so clear the selected text
+ // before the next test.
+ yield ContentTask.spawn(gBrowser, null, () => content.getSelection().removeAllRanges());
+ }
+
+ function* testHighlight() {
+ info("Testing find with highlight all.");
+ // Update the find state so the highlight button is clickable.
+ gFindBar.updateControlState(Ci.nsITypeAheadFind.FIND_FOUND, false);
+
+ let promise = once(gFindBar, "findhighlightallchange");
+
+ let highlightButton = gFindBar.getElement("highlight");
+ if (!highlightButton.checked)
+ highlightButton.click();
+
+ let e = yield promise;
+ ok(e.detail.highlightAll, "find event should have highlight all set");
+ // Since we're preventing the default make sure nothing was highlighted.
+ yield checkSelection();
+
+ // Toggle it back to the original setting.
+ if (highlightButton.checked)
+ highlightButton.click();
+ }
+ ]]></script>
+
+ <browser type="content-primary" flex="1" id="content" src="about:blank"/>
+ <browser type="content-primary" flex="1" id="content-remote" remote="true" src="about:blank"/>
+ <findbar id="FindToolbar" browserid="content"/>
+</window>