diff options
Diffstat (limited to 'toolkit/content/tests/chrome/bug451540_window.xul')
-rw-r--r-- | toolkit/content/tests/chrome/bug451540_window.xul | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/toolkit/content/tests/chrome/bug451540_window.xul b/toolkit/content/tests/chrome/bug451540_window.xul new file mode 100644 index 000000000..3c08c95c9 --- /dev/null +++ b/toolkit/content/tests/chrome/bug451540_window.xul @@ -0,0 +1,248 @@ +<?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"?> + +<window id="451540test" + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" + width="600" + height="600" + title="451540 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); + const SEARCH_TEXT = "minefield"; + + let gFindBar = null; + let gPrefsvc = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch); + let gBrowser; + + let sendCtrl = true; + let sendMeta = false; + if (navigator.platform.indexOf("Mac") >= 0) { + sendCtrl = false; + sendMeta = true; + } + + let imports = [ "SimpleTest", "ok", "is", "info"]; + for (let name of imports) { + window[name] = window.opener.wrappedJSObject[name]; + } + + SimpleTest.requestLongerTimeout(2); + + function startTest() { + gFindBar = document.getElementById("FindToolbar"); + gBrowser = document.getElementById("content"); + gBrowser.addEventListener("pageshow", onPageShow, false); + let data = `data:text/html,<input id="inp" type="text" /> + <textarea id="tarea"/>`; + gBrowser.loadURI(data); + } + + function promiseHighlightFinished() { + return new Promise(resolve => { + let listener = { + onHighlightFinished() { + gFindBar.browser.finder.removeResultListener(listener); + resolve(); + } + }; + gFindBar.browser.finder.addResultListener(listener); + }); + } + + function* resetForNextTest(elementId, aText) { + if (!aText) + aText = SEARCH_TEXT; + + // Turn off highlighting + let highlightButton = gFindBar.getElement("highlight"); + if (highlightButton.checked) { + highlightButton.click(); + } + + // Initialise input + info(`setting element value to ${aText}`); + yield ContentTask.spawn(gBrowser, {elementId, aText}, function*(args) { + let {elementId, aText} = args; + let doc = content.document; + let element = doc.getElementById(elementId); + element.value = aText; + element.focus(); + }); + info(`just set element value to ${aText}`); + gFindBar._findField.value = SEARCH_TEXT; + + // Perform search and turn on highlighting + gFindBar._find(); + highlightButton.click(); + yield promiseHighlightFinished(); + + // Move caret to start of element + info(`focusing element`); + yield ContentTask.spawn(gBrowser, elementId, function*(elementId) { + let doc = content.document; + let element = doc.getElementById(elementId); + element.focus(); + }); + info(`focused element`); + if (navigator.platform.indexOf("Mac") >= 0) { + yield BrowserTestUtils.synthesizeKey("VK_LEFT", { metaKey: true }, gBrowser); + } else { + yield BrowserTestUtils.synthesizeKey("VK_HOME", {}, gBrowser); + } + } + + function* testSelection(elementId, expectedRangeCount, message) { + yield ContentTask.spawn(gBrowser, {elementId, expectedRangeCount, message}, function*(args) { + let {elementId, expectedRangeCount, message} = args; + let doc = content.document; + let element = doc.getElementById(elementId); + let controller = element.editor.selectionController; + let selection = controller.getSelection(controller.SELECTION_FIND); + Assert.equal(selection.rangeCount, expectedRangeCount, message); + }); + } + + function* testInput(elementId, testTypeText) { + let isEditableElement = yield ContentTask.spawn(gBrowser, elementId, function*(elementId) { + let doc = content.document; + let element = doc.getElementById(elementId); + return element instanceof Ci.nsIDOMNSEditableElement; + }); + if (!isEditableElement) { + return; + } + + // Initialize the findbar + let matchCase = gFindBar.getElement("find-case-sensitive"); + if (matchCase.checked) { + matchCase.doCommand(); + } + + // First check match has been correctly highlighted + yield resetForNextTest(elementId); + + yield testSelection(elementId, 1, testTypeText + " correctly highlighted match"); + + // Test 2: check highlight removed when text added within the highlight + yield BrowserTestUtils.synthesizeKey("VK_RIGHT", {}, gBrowser); + yield BrowserTestUtils.synthesizeKey("a", {}, gBrowser); + + yield testSelection(elementId, 0, testTypeText + " correctly removed highlight on text insertion"); + + // Test 3: check highlighting remains when text added before highlight + yield resetForNextTest(elementId); + yield BrowserTestUtils.synthesizeKey("a", {}, gBrowser); + yield testSelection(elementId, 1, testTypeText + " highlight correctly remained on text insertion at start"); + + // Test 4: check highlighting remains when text added after highlight + yield resetForNextTest(elementId); + for (let x = 0; x < SEARCH_TEXT.length; x++) { + yield BrowserTestUtils.synthesizeKey("VK_RIGHT", {}, gBrowser); + } + yield BrowserTestUtils.synthesizeKey("a", {}, gBrowser); + yield testSelection(elementId, 1, testTypeText + " highlight correctly remained on text insertion at end"); + + // Test 5: deleting text within the highlight + yield resetForNextTest(elementId); + yield BrowserTestUtils.synthesizeKey("VK_RIGHT", {}, gBrowser); + yield BrowserTestUtils.synthesizeKey("VK_BACK_SPACE", {}, gBrowser); + yield testSelection(elementId, 0, testTypeText + " correctly removed highlight on text deletion"); + + // Test 6: deleting text at end of highlight + yield resetForNextTest(elementId, SEARCH_TEXT + "A"); + for (let x = 0; x < (SEARCH_TEXT + "A").length; x++) { + yield BrowserTestUtils.synthesizeKey("VK_RIGHT", {}, gBrowser); + } + yield BrowserTestUtils.synthesizeKey("VK_BACK_SPACE", {}, gBrowser); + yield testSelection(elementId, 1, testTypeText + " highlight correctly remained on text deletion at end"); + + // Test 7: deleting text at start of highlight + yield resetForNextTest(elementId, "A" + SEARCH_TEXT); + yield BrowserTestUtils.synthesizeKey("VK_RIGHT", {}, gBrowser); + yield BrowserTestUtils.synthesizeKey("VK_BACK_SPACE", {}, gBrowser); + yield testSelection(elementId, 1, testTypeText + " highlight correctly remained on text deletion at start"); + + // Test 8: deleting selection + yield resetForNextTest(elementId); + yield BrowserTestUtils.synthesizeKey("VK_RIGHT", { shiftKey: true }, gBrowser); + yield BrowserTestUtils.synthesizeKey("VK_RIGHT", { shiftKey: true }, gBrowser); + yield BrowserTestUtils.synthesizeKey("x", { ctrlKey: sendCtrl, metaKey: sendMeta }, gBrowser); + yield testSelection(elementId, 0, testTypeText + " correctly removed highlight on selection deletion"); + + // Test 9: Multiple matches within one editor (part 1) + // Check second match remains highlighted after inserting text into + // first match, and that its highlighting gets removed when the + // second match is edited + yield resetForNextTest(elementId, SEARCH_TEXT + " " + SEARCH_TEXT); + yield testSelection(elementId, 2, testTypeText + " correctly highlighted both matches"); + yield BrowserTestUtils.synthesizeKey("VK_RIGHT", {}, gBrowser); + yield BrowserTestUtils.synthesizeKey("a", {}, gBrowser); + yield testSelection(elementId, 1, testTypeText + " correctly removed only the first highlight on text insertion"); + yield BrowserTestUtils.synthesizeKey("VK_RIGHT", { ctrlKey: sendCtrl, metaKey: sendMeta }, gBrowser); + yield BrowserTestUtils.synthesizeKey("VK_RIGHT", { ctrlKey: sendCtrl, metaKey: sendMeta }, gBrowser); + yield BrowserTestUtils.synthesizeKey("VK_LEFT", {}, gBrowser); + yield BrowserTestUtils.synthesizeKey("a", {}, gBrowser); + yield testSelection(elementId, 0, testTypeText + " correctly removed second highlight on text insertion"); + + // Test 10: Multiple matches within one editor (part 2) + // Check second match remains highlighted after deleting text in + // first match, and that its highlighting gets removed when the + // second match is edited + yield resetForNextTest(elementId, SEARCH_TEXT + " " + SEARCH_TEXT); + yield testSelection(elementId, 2, testTypeText + " correctly highlighted both matches"); + yield BrowserTestUtils.synthesizeKey("VK_RIGHT", {}, gBrowser); + yield BrowserTestUtils.synthesizeKey("VK_BACK_SPACE", {}, gBrowser); + yield testSelection(elementId, 1, testTypeText + " correctly removed only the first highlight on text deletion"); + yield BrowserTestUtils.synthesizeKey("VK_RIGHT", { ctrlKey: sendCtrl, metaKey: sendMeta }, gBrowser); + yield BrowserTestUtils.synthesizeKey("VK_RIGHT", { ctrlKey: sendCtrl, metaKey: sendMeta }, gBrowser); + yield BrowserTestUtils.synthesizeKey("VK_LEFT", {}, gBrowser); + yield BrowserTestUtils.synthesizeKey("VK_BACK_SPACE", {}, gBrowser); + yield testSelection(elementId, 0, testTypeText + " correctly removed second highlight on text deletion"); + + // Test 11: Multiple matches within one editor (part 3) + // Check second match remains highlighted after deleting selection + // in first match, and that second match highlighting gets correctly + // removed when it has a selection deleted from it + yield resetForNextTest(elementId, SEARCH_TEXT + " " + SEARCH_TEXT); + yield BrowserTestUtils.synthesizeKey("VK_RIGHT", { shiftKey: true }, gBrowser); + yield BrowserTestUtils.synthesizeKey("VK_RIGHT", { shiftKey: true }, gBrowser); + yield BrowserTestUtils.synthesizeKey("x", { ctrlKey: sendCtrl, metaKey: sendMeta }, gBrowser); + yield testSelection(elementId, 1, testTypeText + " correctly removed only first highlight on selection deletion"); + yield BrowserTestUtils.synthesizeKey("VK_RIGHT", { ctrlKey: sendCtrl, metaKey: sendMeta }, gBrowser); + yield BrowserTestUtils.synthesizeKey("VK_RIGHT", { ctrlKey: sendCtrl, metaKey: sendMeta }, gBrowser); + yield BrowserTestUtils.synthesizeKey("VK_LEFT", { shiftKey: true }, gBrowser); + yield BrowserTestUtils.synthesizeKey("VK_LEFT", { shiftKey: true }, gBrowser); + yield BrowserTestUtils.synthesizeKey("x", { ctrlKey: sendCtrl, metaKey: sendMeta }, gBrowser); + yield testSelection(elementId, 0, testTypeText + " correctly removed second highlight on selection deletion"); + } + + function onPageShow() { + gBrowser.removeEventListener("load", onPageShow, true); + Task.spawn(function*() { + gFindBar.open(); + yield testInput("inp", "Input:"); + yield testInput("tarea", "Textarea:"); + }).then(() => { + window.close(); + SimpleTest.finish(); + }); + } + + SimpleTest.waitForFocus(startTest, window); + ]]></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> |