Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
"use strict";
const TEST_PATH = getRootDirectory(gTestPath).replace(
);
/**
* Check that web content cannot break into screenshots.
*/
add_task(async function test_inject_srcdoc() {
// If Screenshots was disabled, enable it just for this test.
const addon = await AddonManager.getAddonByID("screenshots@mozilla.org");
const isEnabled = addon.enabled;
if (!isEnabled) {
await addon.enable({ allowSystemAddons: true });
registerCleanupFunction(async () => {
await addon.disable({ allowSystemAddons: true });
});
}
await BrowserTestUtils.withNewTab(
TEST_PATH + "injection-page.html",
async browser => {
// Set up the content hijacking. Do this so we can see it without
// awaiting - the promise should never resolve.
let response = null;
let responsePromise = SpecialPowers.spawn(browser, [], () => {
return new Promise(resolve => {
// We can't pass `resolve` directly because of sandboxing.
// `responseHandler` gets invoked from the content page.
content.wrappedJSObject.responseHandler = Cu.exportFunction(function (
arg
) {
resolve(arg);
},
content);
});
}).then(
r => {
ok(false, "Should not have gotten HTML but got: " + r);
response = r;
},
() => {
// Do nothing - we expect this to error when the test finishes
// and the actor is destroyed, while the promise still hasn't
// been resolved. We need to catch it in order not to throw
// uncaught rejection errors and inadvertently fail the test.
}
);
let error;
let errorPromise = new Promise(resolve => {
SpecialPowers.registerConsoleListener(msg => {
if (
msg.message?.match(/iframe URL does not match expected blank.html/)
) {
error = msg;
resolve();
}
});
});
// Now try to start the screenshot flow:
CustomizableUI.addWidgetToArea(
"screenshot-button",
CustomizableUI.AREA_NAVBAR
);
let screenshotBtn = document.getElementById("screenshot-button");
screenshotBtn.click();
await Promise.race([errorPromise, responsePromise]);
ok(error, "Should get the relevant error: " + error?.message);
ok(!response, "Should not get a response from the webpage.");
SpecialPowers.postConsoleSentinel();
}
);
});