diff --git a/browser/components/extensions/test/browser/browser-common.ini b/browser/components/extensions/test/browser/browser-common.ini --- a/browser/components/extensions/test/browser/browser-common.ini +++ b/browser/components/extensions/test/browser/browser-common.ini @@ -62,16 +62,17 @@ skip-if = os == 'win' && !debug # Bug 13 [browser_ext_contextMenus_urlPatterns.js] [browser_ext_currentWindow.js] [browser_ext_devtools_inspectedWindow.js] [browser_ext_devtools_inspectedWindow_eval_bindings.js] [browser_ext_devtools_inspectedWindow_reload.js] [browser_ext_devtools_network.js] [browser_ext_devtools_page.js] [browser_ext_devtools_panel.js] +[browser_ext_find.js] [browser_ext_geckoProfiler_symbolicate.js] [browser_ext_getViews.js] [browser_ext_identity_indication.js] [browser_ext_incognito_views.js] [browser_ext_incognito_popup.js] [browser_ext_lastError.js] [browser_ext_menus.js] [browser_ext_omnibox.js] diff --git a/browser/components/extensions/test/browser/browser_ext_find.js b/browser/components/extensions/test/browser/browser_ext_find.js new file mode 100644 --- /dev/null +++ b/browser/components/extensions/test/browser/browser_ext_find.js @@ -0,0 +1,139 @@ +"use strict"; + +function frameScript() { + function getSelectedText() { + var frame = this.content.frames[0].frames[1]; + var Ci = Components.interfaces; + var docShell = frame.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIWebNavigation) + .QueryInterface(Ci.nsIDocShell); + var controller = docShell.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsISelectionDisplay) + .QueryInterface(Ci.nsISelectionController); + var selection = controller.getSelection(controller.SELECTION_FIND); + var range = selection.getRangeAt(0); + var r1 = frame.parent.frameElement.getBoundingClientRect(); + var r2 = frame.frameElement.getBoundingClientRect(); + var r3 = range.getBoundingClientRect(); + var rect = { top: (r1.top + r2.top + r3.top), left: (r1.left + r2.left + r3.left) }; + this.sendAsyncMessage("test:find:selectionTest", { text: selection.toString(), rect }); + }; + getSelectedText(); +} + +function waitForMessage(browser, topic) { + let mm = browser.messageManager; + return new Promise(resolve => { + mm.addMessageListener(topic, function messageListener(message) { + mm.removeMessageListener(topic, messageListener); + resolve(message); + }); + }); +} + +add_task(async function testDuplicatePinnedTab() { + async function background() { + function awaitLoad(tabId) { + return new Promise(resolve => { + browser.tabs.onUpdated.addListener(function listener(tabId_, changed, tab) { + if (tabId == tabId_ && changed.status == "complete") { + browser.tabs.onUpdated.removeListener(listener); + resolve(); + } + }); + }); + } + + let url = "http://example.com/browser/browser/components/extensions/test/browser/file_find_frames.html"; + let tab = await browser.tabs.update({url}); + await awaitLoad(tab.id); + + let data = await browser.find.search("banana", { includeRangeData: true }); + let rangeData = data.rangeData + + browser.test.log("Test that `data.count` is the expected value."); + browser.test.assertEq(6, data.count, "The value returned from `data.count`"); + + browser.test.log("Test that `rangeData` has the proper number of values."); + browser.test.assertEq(6, rangeData.length, "The number of values held in `rangeData`"); + + browser.test.log("Test that the text found in the top window and nested frames corresponds to the proper position."); + let terms = ["Banana", "bAnana", "baNana", "banAna", "banaNa", "bananA"]; + for (let i = 0; i < terms.length; i++) { + browser.test.assertEq(terms[i], rangeData[i].text, `The text at range position ${i}:`); + } + + browser.test.log("Test that case sensitive match works properly."); + data = await browser.find.search("baNana", { caseSensitive: true, includeRangeData: true }); + browser.test.assertEq(1, data.count, "The number of matches found:"); + browser.test.assertEq("baNana", data.rangeData[0].text, "The text found:"); + + browser.test.log("Test that case insensitive match works properly."); + data = await browser.find.search("banana", { caseSensitive: false }); + browser.test.assertEq(6, data.count, "The number of matches found:"); + + browser.test.log("Test that entire word match works properly."); + data = await browser.find.search("banana", { entireWord: true }); + browser.test.assertEq(4, data.count, "The number of matches found, should skip 2 matches, \"banaNaland\" amd \"bananAland\":"); + + browser.test.log("Test that `rangeData` is not returned if `includeRangeData` is false."); + data = await browser.find.search("banana", { caseSensitive: false, includeRangeData: false }); + browser.test.assertEq(false, !!data.rangeData, "The boolean cast value of `rangeData`:"); + + browser.test.log("Test that `rectData` is not returned if `includeRectData` is false."); + data = await browser.find.search("banana", { caseSensitive: false, includeRectData: false }); + browser.test.assertEq(false, !!data.rectData, "The boolean cast value of `rectData`:"); + + browser.test.log("Test that text spanning multiple inline elements is found."); + data = await browser.find.search("fruitcake"); + browser.test.assertEq(1, data.count, "The number of matches found:"); + + browser.test.log("Test that text spanning multiple block elements is not found."); + data = await browser.find.search("angelfood"); + browser.test.assertEq(0, data.count, "The number of matches found:"); + + browser.test.log("Test that `highlightResults` returns proper status code."); + await browser.find.search("banana"); + + let result = await browser.find.highlightResults({ rangeIndex: 0 }); + browser.test.assertEq(1, result.status, "The status code is the proper value:"); + + result = await browser.find.highlightResults({ rangeIndex: 6 }); + browser.test.assertEq(2, result.status, "The status code is the proper value:"); + + data = await browser.find.search("xyz"); + result = await browser.find.highlightResults({ rangeIndex: 0 }); + browser.test.assertEq(3, result.status, "The status code is the proper value:"); + + data = await browser.find.search("banana", { includeRectData: true }); + result = await browser.find.highlightResults({ rangeIndex: 5 }); + + browser.test.sendMessage("test:find:WebExtensionFinished", data.rectData); + } + + let extension = ExtensionTestUtils.loadExtension({ + manifest: { + "permissions": ["find", "tabs"], + }, + background, + }); + + await extension.startup(); + let rectData = await extension.awaitMessage("test:find:WebExtensionFinished"); + let { top, left } = rectData[5].rectsAndTexts.rectList[0]; + await extension.unload(); + + let browser = gBrowser.selectedBrowser; + + let frameScriptUrl = `data:,(${frameScript})()`; + browser.messageManager.loadFrameScript(frameScriptUrl, false); + let message = await waitForMessage(browser, "test:find:selectionTest"); + + info("Test that text was highlighted properly."); + is (message.data.text, "bananA", `The text that was highlighted: - Expected: bananA, Actual: ${message.data.text}`); + + info("Test that rectangle data returned from the search matches the highlighted result."); + is (message.data.rect.top, top, `rect.top: - Expected: ${message.data.rect.top}, Actual: ${top}`); + is (message.data.rect.left, left, `rect.left: - Expected: ${message.data.rect.left}, Actual: ${left}`); +}); + diff --git a/browser/components/extensions/test/browser/file_find_frames.html b/browser/components/extensions/test/browser/file_find_frames.html new file mode 100644 --- /dev/null +++ b/browser/components/extensions/test/browser/file_find_frames.html @@ -0,0 +1,15 @@ + + + + +

Banana 0

+ +

bAnana 1

+

fruitcake

+

ang

elf
ood

+ + +