Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
// Tests that when a PDF is opened through PDF.js, the /favicon.ico request
// uses a content principal matching the PDF's https:// origin rather than the
// resource:// principal of the PDF viewer (bug 2015285). This ensures HTTP auth
// credentials cached for the PDF's origin are forwarded correctly.
const PDF_URL =
const FAVICON_URL = "https://example.com/favicon.ico";
add_task(async function test_pdf_favicon_uses_page_principal() {
let faviconLoadingPrincipal;
const { promise: observerDone, resolve: observerResolve } =
Promise.withResolvers();
const observer = {
observe(subject, topic) {
if (topic !== "http-on-modify-request") {
return;
}
const channel = subject.QueryInterface(Ci.nsIChannel);
if (channel.URI.spec !== FAVICON_URL) {
return;
}
faviconLoadingPrincipal = channel.loadInfo?.loadingPrincipal;
observerResolve();
},
};
Services.obs.addObserver(observer, "http-on-modify-request");
const tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, PDF_URL);
// The favicon request fires during page load.
await observerDone;
Services.obs.removeObserver(observer, "http-on-modify-request");
await SpecialPowers.spawn(tab.linkedBrowser, [], async () => {
const viewer = content.wrappedJSObject.PDFViewerApplication;
await viewer.testingClose();
});
BrowserTestUtils.removeTab(tab);
Assert.ok(
faviconLoadingPrincipal,
"Should have seen a /favicon.ico request for the PDF's domain"
);
is(
faviconLoadingPrincipal.URI?.scheme,
"https",
"Favicon channel loadingPrincipal should use https://, not resource://"
);
});