summaryrefslogtreecommitdiffstats
path: root/toolkit/modules/tests/xpcshell/test_BrowserUtils_urlFormatting.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/modules/tests/xpcshell/test_BrowserUtils_urlFormatting.js')
-rw-r--r--toolkit/modules/tests/xpcshell/test_BrowserUtils_urlFormatting.js309
1 files changed, 309 insertions, 0 deletions
diff --git a/toolkit/modules/tests/xpcshell/test_BrowserUtils_urlFormatting.js b/toolkit/modules/tests/xpcshell/test_BrowserUtils_urlFormatting.js
new file mode 100644
index 0000000000..c7945cdb9c
--- /dev/null
+++ b/toolkit/modules/tests/xpcshell/test_BrowserUtils_urlFormatting.js
@@ -0,0 +1,309 @@
+/* Any copyright is dedicated to the Public Domain.
+http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+do_get_profile();
+
+const { FileUtils } = ChromeUtils.importESModule(
+ "resource://gre/modules/FileUtils.sys.mjs"
+);
+
+let tempFile = new FileUtils.File(PathUtils.tempDir);
+const TEST_LOCAL_FILE_NAME = "hello.txt";
+tempFile.append(TEST_LOCAL_FILE_NAME);
+
+const gL10n = new Localization(["toolkit/global/browser-utils.ftl"], true);
+const DATA_URL_EXPECTED_STRING = gL10n.formatValueSync(
+ "browser-utils-url-data"
+);
+const EXTENSION_NAME = "My Test Extension";
+const EXTENSION_URL_EXPECTED_STRING = gL10n.formatValueSync(
+ "browser-utils-url-extension",
+ { extension: EXTENSION_NAME }
+);
+
+const { AddonTestUtils } = ChromeUtils.importESModule(
+ "resource://testing-common/AddonTestUtils.sys.mjs"
+);
+
+const { ExtensionTestUtils } = ChromeUtils.importESModule(
+ "resource://testing-common/ExtensionXPCShellUtils.sys.mjs"
+);
+
+AddonTestUtils.init(this);
+ExtensionTestUtils.init(this);
+
+// Allow for unsigned addons.
+AddonTestUtils.overrideCertDB();
+
+AddonTestUtils.createAppInfo(
+ "xpcshell@tests.mozilla.org",
+ "XPCShell",
+ "42",
+ "42"
+);
+
+// Filled in in setup, shared state with the various test tasks so declared here.
+let addonBaseURI;
+
+// http/https tests first. These are split out from TESTS for the benefit of reuse by the
+// blob: tests further down.
+const HTTP_TESTS = [
+ // Simple http/https examples with/without `www.`.
+ {
+ input: "https://example.com",
+ output: "example.com",
+ },
+ {
+ input: "https://example.com/path/?query#hash",
+ output: "example.com",
+ },
+ {
+ input: "https://www.example.com",
+ output: "example.com",
+ },
+ {
+ input: "https://www.example.com/path/?query#hash",
+ output: "example.com",
+ },
+ {
+ input: "http://example.com",
+ output: "example.com",
+ },
+ {
+ input: "http://www.example.com",
+ output: "example.com",
+ },
+
+ // We shouldn't drop `www.` if that's the domain:
+ {
+ input: "https://www.com",
+ output: "www.com",
+ },
+
+ // Multilevel TLDs should work:
+ {
+ input: "https://www.example.co.uk",
+ output: "example.co.uk",
+ },
+ {
+ input: "https://www.co.uk",
+ output: "www.co.uk",
+ },
+
+ // Other sudomains should be kept:
+ {
+ input: "https://webmail.example.co.uk",
+ output: "webmail.example.co.uk",
+ },
+ {
+ input: "https://webmail.example.com",
+ output: "webmail.example.com",
+ },
+
+ // IP addresses should work:
+ {
+ input: "http://[::1]/foo/bar?baz=bax#quux",
+ output: "[::1]",
+ },
+ {
+ input: "http://127.0.0.1/foo/bar?baz=bax#quux",
+ output: "127.0.0.1",
+ },
+];
+
+const TESTS = [
+ ...HTTP_TESTS,
+
+ // about URIs:
+ {
+ input: "about:config",
+ output: "about:config",
+ },
+ {
+ input: "about:config?foo#bar",
+ output: "about:config",
+ },
+
+ // file URI directory:
+ {
+ input: Services.io.newFileURI(new FileUtils.File(PathUtils.tempDir)).spec,
+ output: PathUtils.filename(PathUtils.tempDir),
+ },
+ // file URI directory that ends in slash:
+ {
+ input:
+ Services.io.newFileURI(new FileUtils.File(PathUtils.tempDir)).spec + "/",
+ output: PathUtils.filename(PathUtils.tempDir),
+ },
+ // file URI individual file:
+ {
+ input: Services.io.newFileURI(tempFile).spec,
+ output: tempFile.leafName,
+ },
+
+ // As above but for chrome URIs:
+ {
+ input: "chrome://global/content/blah",
+ output: "blah",
+ },
+ {
+ input: "chrome://global/content/blah//",
+ output: "blah",
+ },
+ {
+ input: "chrome://global/content/foo.txt",
+ output: "foo.txt",
+ },
+
+ // Also check data URIs:
+ {
+ input: "data:text/html,42",
+ output: DATA_URL_EXPECTED_STRING,
+ },
+];
+
+add_setup(async () => {
+ const testExtensionData = {
+ useAddonManager: "temporary",
+ manifest: {
+ browser_specific_settings: { gecko: { id: "myextension@example.com" } },
+ name: EXTENSION_NAME,
+ },
+ };
+
+ const testNoNameExtensionData = {
+ useAddonManager: "temporary",
+ manifest: {
+ browser_specific_settings: { gecko: { id: "noname@example.com" } },
+ name: "",
+ },
+ };
+
+ await AddonTestUtils.promiseStartupManager();
+ const extension = ExtensionTestUtils.loadExtension(testExtensionData);
+ const noNameExtension = ExtensionTestUtils.loadExtension(
+ testNoNameExtensionData
+ );
+ await extension.startup();
+ await noNameExtension.startup();
+
+ addonBaseURI = extension.extension.baseURI;
+ let noNameAddonBaseURI = noNameExtension.extension.baseURI;
+
+ TESTS.push(
+ {
+ input: addonBaseURI.spec,
+ output: EXTENSION_URL_EXPECTED_STRING,
+ },
+ {
+ input: "moz-extension://blah/",
+ output: gL10n.formatValueSync("browser-utils-url-extension", {
+ extension: "moz-extension://blah/",
+ }),
+ },
+ {
+ input: noNameAddonBaseURI.spec,
+ output: gL10n.formatValueSync("browser-utils-url-extension", {
+ extension: noNameAddonBaseURI.spec,
+ }),
+ }
+ );
+
+ registerCleanupFunction(async () => {
+ await extension.unload();
+ await noNameExtension.unload();
+ });
+});
+
+const { BrowserUtils } = ChromeUtils.importESModule(
+ "resource://gre/modules/BrowserUtils.sys.mjs"
+);
+
+add_task(async function test_checkStringFormatting() {
+ for (let { input, output } of TESTS) {
+ Assert.equal(
+ BrowserUtils.formatURIStringForDisplay(input),
+ output,
+ `String ${input} formatted for output should match`
+ );
+ }
+});
+
+add_task(async function test_checkURIFormatting() {
+ for (let { input, output } of TESTS) {
+ let uri = Services.io.newURI(input);
+ Assert.equal(
+ BrowserUtils.formatURIForDisplay(uri),
+ output,
+ `URI ${input} formatted for output should match`
+ );
+ }
+});
+
+add_task(async function test_checkViewSourceFormatting() {
+ for (let { input, output } of HTTP_TESTS) {
+ Assert.equal(
+ BrowserUtils.formatURIStringForDisplay("view-source:" + input),
+ output,
+ `String view-source:${input} formatted for output should match`
+ );
+ let uri = Services.io.newURI("view-source:" + input);
+ Assert.equal(
+ BrowserUtils.formatURIForDisplay(uri),
+ output,
+ `URI view-source:${input} formatted for output should match`
+ );
+ }
+});
+
+function createBlobURLWithSandbox(origin) {
+ let sb = new Cu.Sandbox(origin, { wantGlobalProperties: ["Blob", "URL"] });
+ // Need to pass 'false' for the validate filename param or this throws
+ // exceptions. I'm not sure why...
+ return Cu.evalInSandbox(
+ 'URL.createObjectURL(new Blob(["text"], { type: "text/plain" }))',
+ sb,
+ "",
+ null,
+ 0,
+ false
+ );
+}
+
+add_task(async function test_checkBlobURIs() {
+ // These don't just live in the TESTS array because creating a valid
+ // blob URI is a bit more involved...
+ let blob = new Blob(["test"], { type: "text/plain" });
+ let url = URL.createObjectURL(blob);
+ Assert.equal(
+ BrowserUtils.formatURIStringForDisplay(url),
+ DATA_URL_EXPECTED_STRING,
+ `Blob url string without origin should be represented as (data)`
+ );
+
+ // Now with a null principal:
+ url = createBlobURLWithSandbox(null);
+ Assert.equal(
+ BrowserUtils.formatURIStringForDisplay(url),
+ DATA_URL_EXPECTED_STRING,
+ `Blob url string with null principal origin should be represented as (data)`
+ );
+
+ // And some valid url principals:
+ let BLOB_TESTS = [
+ {
+ input: addonBaseURI.spec,
+ output: EXTENSION_URL_EXPECTED_STRING,
+ },
+ ].concat(HTTP_TESTS);
+ for (let { input, output } of BLOB_TESTS) {
+ url = createBlobURLWithSandbox(input);
+ Assert.equal(
+ BrowserUtils.formatURIStringForDisplay(url),
+ output,
+ `Blob url string with principal from ${input} should show principal URI`
+ );
+ }
+});