Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
"use strict";
do_get_profile();
const { FileUtils } = ChromeUtils.importESModule(
);
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(
);
const { ExtensionTestUtils } = ChromeUtils.importESModule(
);
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.`.
{
output: "example.com",
},
{
output: "example.com",
},
{
output: "example.com",
},
{
output: "example.com",
},
{
input: "http://example.com",
output: "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:
{
output: "example.co.uk",
},
{
input: "https://www.co.uk",
output: "www.co.uk",
},
// Other sudomains should be kept:
{
output: "webmail.example.co.uk",
},
{
output: "webmail.example.com",
},
// IP addresses should work:
{
output: "[::1]",
},
{
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:
{
output: "blah",
},
{
output: "blah",
},
{
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,
},
{
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(
);
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`
);
}
});