summaryrefslogtreecommitdiffstats
path: root/browser/components/extensions/test/browser/browser_ext_search_query.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/extensions/test/browser/browser_ext_search_query.js')
-rw-r--r--browser/components/extensions/test/browser/browser_ext_search_query.js174
1 files changed, 174 insertions, 0 deletions
diff --git a/browser/components/extensions/test/browser/browser_ext_search_query.js b/browser/components/extensions/test/browser/browser_ext_search_query.js
new file mode 100644
index 0000000000..5258b12605
--- /dev/null
+++ b/browser/components/extensions/test/browser/browser_ext_search_query.js
@@ -0,0 +1,174 @@
+"use strict";
+
+add_task(async function test_query() {
+ async function background() {
+ let resolvers = {};
+
+ function tabListener(tabId, changeInfo, tab) {
+ if (tab.url == "about:blank") {
+ // Ignore events related to the initial tab open.
+ return;
+ }
+
+ if (changeInfo.status === "complete") {
+ let query = new URL(tab.url).searchParams.get("q");
+ let resolver = resolvers[query];
+ browser.test.assertTrue(resolver, `Found resolver for ${tab.url}`);
+ browser.test.assertTrue(
+ resolver.resolve,
+ `${query} was not resolved yet`
+ );
+ resolver.resolve({
+ tabId,
+ windowId: tab.windowId,
+ });
+ resolver.resolve = null; // resolve can be used only once.
+ }
+ }
+ browser.tabs.onUpdated.addListener(tabListener);
+
+ async function awaitSearchResult(args) {
+ resolvers[args.text] = {};
+ resolvers[args.text].promise = new Promise(
+ _resolve => (resolvers[args.text].resolve = _resolve)
+ );
+ await browser.search.query(args);
+ let searchResult = await resolvers[args.text].promise;
+ return searchResult;
+ }
+
+ const firstTab = await browser.tabs.create({
+ active: true,
+ url: "about:blank",
+ });
+
+ browser.test.log("Search in current tab (testing default disposition)");
+ let result = await awaitSearchResult({
+ text: "DefaultDisposition",
+ });
+ browser.test.assertDeepEq(
+ {
+ tabId: firstTab.id,
+ windowId: firstTab.windowId,
+ },
+ result,
+ "Defaults to current tab in current window"
+ );
+
+ browser.test.log(
+ "Search in current tab (testing explicit disposition CURRENT_TAB)"
+ );
+ result = await awaitSearchResult({
+ text: "CurrentTab",
+ disposition: "CURRENT_TAB",
+ });
+ browser.test.assertDeepEq(
+ {
+ tabId: firstTab.id,
+ windowId: firstTab.windowId,
+ },
+ result,
+ "Query ran in current tab in current window"
+ );
+
+ browser.test.log("Search in new tab (testing disposition NEW_TAB)");
+ result = await awaitSearchResult({
+ text: "NewTab",
+ disposition: "NEW_TAB",
+ });
+ browser.test.assertFalse(
+ result.tabId === firstTab.id,
+ "Query ran in new tab"
+ );
+ browser.test.assertEq(
+ result.windowId,
+ firstTab.windowId,
+ "Query ran in current window"
+ );
+ await browser.tabs.remove(result.tabId); // Cleanup
+
+ browser.test.log("Search in a specific tab (testing property tabId)");
+ let newTab = await browser.tabs.create({
+ active: false,
+ url: "about:blank",
+ });
+ result = await awaitSearchResult({
+ text: "SpecificTab",
+ tabId: newTab.id,
+ });
+ browser.test.assertDeepEq(
+ {
+ tabId: newTab.id,
+ windowId: firstTab.windowId,
+ },
+ result,
+ "Query ran in specific tab in current window"
+ );
+ await browser.tabs.remove(newTab.id); // Cleanup
+
+ browser.test.log("Search in a new window (testing disposition NEW_WINDOW)");
+ result = await awaitSearchResult({
+ text: "NewWindow",
+ disposition: "NEW_WINDOW",
+ });
+ browser.test.assertFalse(
+ result.windowId === firstTab.windowId,
+ "Query ran in new window"
+ );
+ await browser.windows.remove(result.windowId); // Cleanup
+ await browser.tabs.remove(firstTab.id); // Cleanup
+
+ browser.test.log("Make sure tabId and disposition can't be used together");
+ await browser.test.assertRejects(
+ browser.search.query({
+ text: " ",
+ tabId: 1,
+ disposition: "NEW_WINDOW",
+ }),
+ "Cannot set both 'disposition' and 'tabId'",
+ "Should not be able to set both tabId and disposition"
+ );
+
+ browser.test.log("Make sure we reject if an invalid tabId is used");
+ await browser.test.assertRejects(
+ browser.search.query({
+ text: " ",
+ tabId: Number.MAX_SAFE_INTEGER,
+ }),
+ /Invalid tab ID/,
+ "Should not be able to set an invalid tabId"
+ );
+
+ browser.test.notifyPass("disposition");
+ }
+ const SEARCH_NAME = "Search Test";
+ let searchExtension = ExtensionTestUtils.loadExtension({
+ manifest: {
+ chrome_settings_overrides: {
+ search_provider: {
+ name: SEARCH_NAME,
+ search_url: "https://example.org/?q={searchTerms}",
+ },
+ },
+ },
+ useAddonManager: "temporary",
+ });
+ let extension = ExtensionTestUtils.loadExtension({
+ manifest: {
+ permissions: ["search", "tabs"],
+ },
+ background,
+ });
+ // We need to use a fake search engine because
+ // these tests aren't allowed to load actual
+ // webpages, like google.com for example.
+ await searchExtension.startup();
+ await Services.search.setDefault(
+ Services.search.getEngineByName(SEARCH_NAME),
+ Ci.nsISearchService.CHANGE_REASON_ADDON_INSTALL
+ );
+ await extension.startup();
+ await extension.awaitFinish("disposition");
+ await extension.unload();
+ await searchExtension.unload();
+});