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 @@ -14,16 +14,17 @@ support-files = file_popup_api_injection_b.html file_iframe_document.html file_iframe_document.sjs file_bypass_cache.sjs file_language_fr_en.html file_language_ja.html file_language_tlh.html file_dummy.html + file_find_frames.html file_inspectedwindow_reload_target.sjs file_serviceWorker.html webNav_createdTarget.html webNav_createdTargetSource.html webNav_createdTargetSource_subframe.html serviceWorker.js searchSuggestionEngine.xml searchSuggestionEngine.sjs @@ -59,16 +60,17 @@ support-files = [browser_ext_contextMenus_uninstall.js] [browser_ext_contextMenus_urlPatterns.js] [browser_ext_currentWindow.js] [browser_ext_devtools_inspectedWindow.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_omnibox.js] skip-if = debug || asan # Bug 1354681 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,108 @@ +"use strict"; + +let 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 });' + + '};\n' + + 'getSelectedText();\n'; + +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({ queryphrase: "banana", includeRangeData: true }); + let rangeData = data.searchResults.rangeData + + browser.test.log("Test that the text found in the top window corresponds to the proper position."); + browser.test.assertEq(rangeData[1].text, "bAnana", "The text at range position 1:"); + + browser.test.log("Test that the text found in the first-level nested frame corresponds to the proper position."); + browser.test.assertEq(rangeData[3].text, "banAna", "The text at range position 3:"); + + browser.test.log("Test that the text found in the second-level nested frame corresponds to the proper position."); + browser.test.assertEq(rangeData[5].text, "bananA", "The text at range position 5:"); + + data = await browser.find.search({ queryphrase: "baNana", caseSensitive: true, includeRangeData: true }); + rangeData = data.searchResults.rangeData; + + browser.test.log("Test that case sensitive match works properly."); + browser.test.assertEq(rangeData.length, 1, "The number of matches found:"); + browser.test.assertEq(rangeData[0].text, "baNana", "The text found:"); + + data = await browser.find.search({ queryphrase: "banana", entireWord: true, includeRangeData: true }); + rangeData = data.searchResults.rangeData; + + browser.test.log("Test that entire word match works properly."); + browser.test.assertEq(rangeData.length, 4, "The number of matches found:"); + + data = await browser.find.search({ queryphrase: "banana", includeRectData: true }); + let result = await browser.find.highlightResults({ rangeIndex: 5 }); + + browser.test.sendMessage("test:find:WebExtensionFinished", data.searchResults.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 promise = waitForMessage(browser, "test:find:selectionTest"); + + let frameScriptUrl = 'data:,' + frameScript; + browser.messageManager.loadFrameScript(frameScriptUrl, false); + let message = await promise; + + 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,13 @@ + + + + +

Banana 0

+ +

bAnana 1

+ + +