fune/toolkit/components/remotebrowserutils/tests/browser/browser_httpToFileHistory.js
Nika Layzell 399a2f946d Bug 1538028 - Part 3: Validate loads by TriggeringRemoteType, r=smaug,ckerschb
The previous part introduced a new mechanism to track the triggering remote
type for a specific load in a reliable way. This adds some basic checks based
on the triggering remote type to the nsContentSecurityManager, while also
providing the potential infrastructure to expand these checks in the future.

As these checks are performed before some other content security checks (to
ensure that they are performed before InitialSecurityCheckDone() is checked),
they may reject a load which would otherwise have been rejected by a later
check. For this reason, the diagnostic assertions added in this part are only
fired if the check appears as though it would otherwise have succeeded. This
check is not fully accurate, however, so may miss some cases.

This is important, as we have some tests, such as service worker navigation
tests, which will try to load file:/// URIs in content processes, and only fail
in the later content security checks.

For now, no checks are performed for non-document loads, though that may change
in the future.

Differential Revision: https://phabricator.services.mozilla.com/D161199
2022-11-29 20:41:45 +00:00

119 lines
3.4 KiB
JavaScript

const { E10SUtils } = ChromeUtils.importESModule(
"resource://gre/modules/E10SUtils.sys.mjs"
);
const HISTORY = [
{ url: httpURL("dummy_page.html") },
{ url: fileURL("dummy_page.html") },
{ url: httpURL("dummy_page.html") },
];
function reversed(list) {
let copy = list.slice();
copy.reverse();
return copy;
}
function butLast(list) {
return list.slice(0, -1);
}
async function runTest() {
await BrowserTestUtils.withNewTab({ gBrowser }, async function(aBrowser) {
// Perform initial load of each URL in the history.
let count = 0;
let index = -1;
for (let { url } of HISTORY) {
BrowserTestUtils.loadURI(aBrowser, url);
await BrowserTestUtils.browserLoaded(aBrowser, false, loaded => {
return (
Services.io.newURI(loaded).scheme == Services.io.newURI(url).scheme
);
});
count++;
index++;
await SpecialPowers.spawn(
aBrowser,
[{ count, index, url }],
async function({ count, index, url }) {
docShell.QueryInterface(Ci.nsIWebNavigation);
is(
docShell.sessionHistory.count,
count,
"Initial Navigation Count Match"
);
is(
docShell.sessionHistory.index,
index,
"Initial Navigation Index Match"
);
let real = Services.io.newURI(content.location.href);
let expect = Services.io.newURI(url);
is(real.scheme, expect.scheme, "Initial Navigation URL Scheme");
}
);
}
// Go back to the first entry.
for (let { url } of reversed(HISTORY).slice(1)) {
SpecialPowers.spawn(aBrowser, [], () => {
content.history.back();
});
await BrowserTestUtils.browserLoaded(aBrowser, false, loaded => {
return (
Services.io.newURI(loaded).scheme == Services.io.newURI(url).scheme
);
});
index--;
await SpecialPowers.spawn(
aBrowser,
[{ count, index, url }],
async function({ count, index, url }) {
docShell.QueryInterface(Ci.nsIWebNavigation);
is(docShell.sessionHistory.count, count, "Go Back Count Match");
is(docShell.sessionHistory.index, index, "Go Back Index Match");
let real = Services.io.newURI(content.location.href);
let expect = Services.io.newURI(url);
is(real.scheme, expect.scheme, "Go Back URL Scheme");
}
);
}
// Go forward to the last entry.
for (let { url } of HISTORY.slice(1)) {
SpecialPowers.spawn(aBrowser, [], () => {
content.history.forward();
});
await BrowserTestUtils.browserLoaded(aBrowser, false, loaded => {
return (
Services.io.newURI(loaded).scheme == Services.io.newURI(url).scheme
);
});
index++;
await SpecialPowers.spawn(
aBrowser,
[{ count, index, url }],
async function({ count, index, url }) {
docShell.QueryInterface(Ci.nsIWebNavigation);
is(docShell.sessionHistory.count, count, "Go Forward Count Match");
is(docShell.sessionHistory.index, index, "Go Forward Index Match");
let real = Services.io.newURI(content.location.href);
let expect = Services.io.newURI(url);
is(real.scheme, expect.scheme, "Go Forward URL Scheme");
}
);
}
});
}
add_task(runTest);