diff --git a/browser/components/extensions/parent/ext-tabs.js b/browser/components/extensions/parent/ext-tabs.js index 30617d4231a20..b4107ecae67b4 100644 --- a/browser/components/extensions/parent/ext-tabs.js +++ b/browser/components/extensions/parent/ext-tabs.js @@ -933,18 +933,6 @@ this.tabs = class extends ExtensionAPI { }); } } - - queryInfo = Object.assign({}, queryInfo); - - if (queryInfo.url !== null) { - queryInfo.url = new MatchPatternSet([].concat(queryInfo.url), { - restrictSchemes: false, - }); - } - if (queryInfo.title !== null) { - queryInfo.title = new MatchGlob(queryInfo.title); - } - return Array.from(tabManager.query(queryInfo, context), tab => tab.convert() ); diff --git a/browser/components/extensions/test/browser/browser_ext_tabs_query.js b/browser/components/extensions/test/browser/browser_ext_tabs_query.js index ea724b33723b1..45ef8197d3164 100644 --- a/browser/components/extensions/test/browser/browser_ext_tabs_query.js +++ b/browser/components/extensions/test/browser/browser_ext_tabs_query.js @@ -384,6 +384,35 @@ add_task(async function testQueryWithoutURLOrTitlePermissions() { await extension.unload(); }); +add_task(async function testInvalidUrl() { + let extension = ExtensionTestUtils.loadExtension({ + manifest: { + permissions: ["tabs"], + }, + async background() { + await browser.test.assertRejects( + browser.tabs.query({ url: "http://test1.net" }), + "Invalid url pattern: http://test1.net", + "Expected url to match pattern" + ); + await browser.test.assertRejects( + browser.tabs.query({ url: ["test2"] }), + "Invalid url pattern: test2", + "Expected an array with an invalid match pattern" + ); + await browser.test.assertRejects( + browser.tabs.query({ url: ["http://www.bbc.com/", "test3"] }), + "Invalid url pattern: test3", + "Expected an array with an invalid match pattern" + ); + browser.test.notifyPass("testInvalidUrl"); + }, + }); + await extension.startup(); + await extension.awaitFinish("testInvalidUrl"); + await extension.unload(); +}); + add_task(async function test_query_index() { let extension = ExtensionTestUtils.loadExtension({ manifest: { diff --git a/mobile/android/components/extensions/ext-tabs.js b/mobile/android/components/extensions/ext-tabs.js index 3ba69da4e600f..96acb5b8970b1 100644 --- a/mobile/android/components/extensions/ext-tabs.js +++ b/mobile/android/components/extensions/ext-tabs.js @@ -463,18 +463,6 @@ this.tabs = class extends ExtensionAPI { }); } } - - queryInfo = Object.assign({}, queryInfo); - - if (queryInfo.url !== null) { - queryInfo.url = new MatchPatternSet([].concat(queryInfo.url), { - restrictSchemes: false, - }); - } - if (queryInfo.title !== null) { - queryInfo.title = new MatchGlob(queryInfo.title); - } - return Array.from(tabManager.query(queryInfo, context), tab => tab.convert() ); diff --git a/toolkit/components/extensions/ExtensionUtils.jsm b/toolkit/components/extensions/ExtensionUtils.jsm index edea0c09696cd..fcbbebb061cac 100644 --- a/toolkit/components/extensions/ExtensionUtils.jsm +++ b/toolkit/components/extensions/ExtensionUtils.jsm @@ -287,6 +287,22 @@ function getMessageManager(target) { function flushJarCache(jarPath) { Services.obs.notifyObservers(null, "flush-cache-entry", jarPath); } +function parseMatchPatterns(patterns, options) { + try { + return new MatchPatternSet(patterns, options); + } catch (e) { + let pattern; + for (pattern of patterns) { + try { + new MatchPattern(pattern, options); + } catch (e) { + throw new ExtensionError(`Invalid url pattern: ${pattern}`); + } + } + // Unexpectedly MatchPatternSet threw, but MatchPattern did not. + throw e; + } +} var ExtensionUtils = { flushJarCache, @@ -295,6 +311,7 @@ var ExtensionUtils = { getUniqueId, filterStack, getWinUtils, + parseMatchPatterns, promiseDocumentIdle, promiseDocumentLoaded, promiseDocumentReady, diff --git a/toolkit/components/extensions/parent/ext-tabs-base.js b/toolkit/components/extensions/parent/ext-tabs-base.js index cb01fd9af99ca..f0953e949cbdd 100644 --- a/toolkit/components/extensions/parent/ext-tabs-base.js +++ b/toolkit/components/extensions/parent/ext-tabs-base.js @@ -28,6 +28,7 @@ var { DefaultWeakMap, ExtensionError, getWinUtils, + parseMatchPatterns, } = ExtensionUtils; var { defineLazyGetter } = ExtensionCommon; @@ -1962,6 +1963,21 @@ class TabManagerBase { * @returns {Iterator} */ *query(queryInfo = null, context = null) { + if (queryInfo) { + if (queryInfo.url !== null) { + queryInfo.url = parseMatchPatterns([].concat(queryInfo.url), { + restrictSchemes: false, + }); + } + + if (queryInfo.title !== null) { + try { + queryInfo.title = new MatchGlob(queryInfo.title); + } catch (e) { + throw new ExtensionError(`Invalid title: ${queryInfo.title}`); + } + } + } function* candidates(windowWrapper) { if (queryInfo) { let { active, highlighted, index } = queryInfo;