Source code

Revision control

Copy as Markdown

Other Tools

/* Any copyright is dedicated to the Public Domain.
*/
"use strict";
const { AddonTestUtils } = ChromeUtils.importESModule(
);
const { ExtensionCommon } = ChromeUtils.importESModule(
"resource://gre/modules/ExtensionCommon.sys.mjs"
);
AddonTestUtils.initMochitest(this);
// Test that an install that requires cookies to be sent succeeds when cookies
// are set.
// This test file verifies that it succeeds with install on navigation when the
// cookie is set and fails with mozAddonManager (which is expected to not be
// sending the cookies) and with install on navigation when the cookie is not set.
async function testInstallWithCookie({
useMozAddonManager,
addCookie,
expectFailure,
}) {
await SpecialPowers.pushPrefEnv({
set: [
["extensions.webapi.testing", true],
[PREF_INSTALL_REQUIREBUILTINCERTS, false],
],
});
let promiseAddonStarted;
function confirm_install(panel) {
is(panel.getAttribute("name"), "XPI Test", "Should have seen the name");
promiseAddonStarted = AddonTestUtils.promiseWebExtensionStartup(
"amosigned-xpi@tests.mozilla.org"
);
return true;
}
function install_ended(install, addon) {
promiseAddonStarted.then(() => addon.uninstall());
}
function download_failed(install) {
is(
install.error,
AddonManager.ERROR_NETWORK_FAILURE,
"Install should fail"
);
}
const deferredInstallCompleted = Promise.withResolvers();
if (expectFailure) {
Harness.downloadFailedCallback = download_failed;
} else {
Harness.installConfirmCallback = confirm_install;
Harness.installEndedCallback = install_ended;
}
Harness.installsCompletedCallback = deferredInstallCompleted.resolve;
Harness.setup();
registerCleanupFunction(() => Harness.finish());
if (addCookie) {
const cv = Services.cookies.add(
"example.com",
"/browser/" + RELATIVE_DIR,
"xpinstall",
"true",
false,
false,
true,
Date.now() + 1000 * 60,
{},
Ci.nsICookie.SAMESITE_UNSET,
Ci.nsICookie.SCHEME_HTTPS
);
Assert.equal(cv.result, Ci.nsICookieValidation.eOK, "Valid cookie");
}
PermissionTestUtils.add(
"install",
Services.perms.ALLOW_ACTION
);
await BrowserTestUtils.withNewTab({ gBrowser }, async browser => {
const expectNavigationFailure = !useMozAddonManager && expectFailure;
const triggerUrl =
SECURE_TESTROOT +
"cookieRedirect.sjs?" +
SECURE_TESTROOT +
"amosigned.xpi";
if (useMozAddonManager) {
var triggers = encodeURIComponent(JSON.stringify({ url: triggerUrl }));
BrowserTestUtils.startLoadingURIString(
browser,
SECURE_TESTROOT + "mozaddonmanager.html?" + triggers
);
} else {
await ExtensionCommon.withHandlingUserInput(window, () =>
BrowserTestUtils.startLoadingURIString(browser, triggerUrl)
);
}
if (expectNavigationFailure) {
info("Wait for browserLoaded");
await BrowserTestUtils.browserLoaded(browser);
info("Verify expected navigation failure");
const navigationResultText = await SpecialPowers.spawn(
browser,
[],
() => {
return this.content.document.body.innerText;
}
);
is(
navigationResultText,
"Invalid request",
"Got the expected failure message from install on navigation without the expected cookie"
);
return;
}
const count = await deferredInstallCompleted.promise;
if (expectFailure) {
is(count, 0, "Add-on should have NOT been successfully installed");
} else {
is(count, 1, "1 Add-on should have been successfully installed");
}
});
if (addCookie) {
Services.cookies.remove(
"example.com",
"xpinstall",
"/browser/" + RELATIVE_DIR,
{}
);
}
PermissionTestUtils.remove("https://example.com", "install");
await SpecialPowers.popPrefEnv();
}
add_task(async function test_installOnNavigation_failure() {
await testInstallWithCookie({
useMozAddonManager: false,
expectFailure: true,
addCookie: false,
});
});
add_task(async function test_installOnNavigation_successfull() {
await testInstallWithCookie({
useMozAddonManager: false,
expectFailure: false,
addCookie: true,
});
});
add_task(
async function test_installOnNavigation_successfull_thirdPartyCookieDisabled() {
await SpecialPowers.pushPrefEnv({
set: [["network.cookie.cookieBehavior", 1]],
});
await testInstallWithCookie({
useMozAddonManager: false,
expectFailure: false,
addCookie: true,
});
await SpecialPowers.popPrefEnv();
}
);
add_task(async function test_mozAddonManager_install_failure() {
await testInstallWithCookie({
useMozAddonManager: true,
expectFailure: true,
addCookie: true,
});
});