summaryrefslogtreecommitdiffstats
path: root/browser/components/newtab/tools
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/newtab/tools')
-rw-r--r--browser/components/newtab/tools/resourceUriPlugin.js65
1 files changed, 65 insertions, 0 deletions
diff --git a/browser/components/newtab/tools/resourceUriPlugin.js b/browser/components/newtab/tools/resourceUriPlugin.js
new file mode 100644
index 0000000000..938822f410
--- /dev/null
+++ b/browser/components/newtab/tools/resourceUriPlugin.js
@@ -0,0 +1,65 @@
+/* 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/. */
+
+// This plugin supports finding files with particular resource:// URIs
+// and translating the uri into a relative filesytem path where the file may be
+// found when running within the Karma / Mocha test framework.
+
+module.exports = {
+ ResourceUriPlugin: class ResourceUriPlugin {
+ /**
+ * @typedef {RegEx} ResourceReplacement0
+ * A regular expression matching a resource:// URI substring to be
+ * replaced.
+ * @typedef {string} ResourceReplacement1
+ * A string to replace the matched substring with.
+ * @typedef {[ResourceReplacement0, ResourceReplacement1]} ResourceReplacement
+ */
+
+ /**
+ * Maps regular expressions representing resource URIs to strings that
+ * should replace matches for those regular expressions.
+ *
+ * @type {ResourceReplacement[]}
+ */
+ #resourcePathRegExes;
+
+ /**
+ * @param {object} options
+ * @param {ResourceReplacement[]} options.resourcePathRegExes
+ * An array of regex/string tuples to perform replacements on for
+ * imports involving resource:// URIs.
+ */
+ constructor({ resourcePathRegExes }) {
+ this.#resourcePathRegExes = resourcePathRegExes;
+ }
+
+ apply(compiler) {
+ compiler.hooks.compilation.tap(
+ "ResourceUriPlugin",
+ (compilation, { normalModuleFactory }) => {
+ normalModuleFactory.hooks.resolveForScheme
+ .for("resource")
+ .tap("ResourceUriPlugin", resourceData => {
+ const url = new URL(resourceData.resource);
+
+ for (let [regex, replacement] of this.#resourcePathRegExes) {
+ if (!url.href.match(regex)) {
+ continue;
+ }
+ const pathname = url.href.replace(regex, replacement);
+ resourceData.path = pathname;
+ resourceData.query = url.search;
+ resourceData.fragment = url.hash;
+ resourceData.resource = pathname + url.search + url.hash;
+ return true;
+ }
+
+ return true;
+ });
+ }
+ );
+ }
+ },
+};