<?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>