Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
const { PermissionTestUtils } = ChromeUtils.importESModule(
);
const TEST_URI = "https://example.com";
const TEST_PATH = getRootDirectory(gTestPath).replace(
TEST_URI
);
const AUTOMATIC_DOWNLOAD_TOPIC = "blocked-automatic-download";
var MockFilePicker = SpecialPowers.MockFilePicker;
MockFilePicker.init(window.browsingContext);
registerCleanupFunction(() => MockFilePicker.cleanup());
let gTempDownloadDir;
add_setup(async function () {
// Create temp directory
let time = new Date().getTime();
let tempDir = Services.dirsvc.get("TmpD", Ci.nsIFile);
tempDir.append(time);
gTempDownloadDir = tempDir;
Services.prefs.setIntPref("browser.download.folderList", 2);
Services.prefs.setComplexValue("browser.download.dir", Ci.nsIFile, tempDir);
PermissionTestUtils.add(
TEST_URI,
"automatic-download",
Services.perms.UNKNOWN_ACTION
);
await SpecialPowers.pushPrefEnv({
set: [
// We disable browser.download.always_ask_before_handling_new_types here
// since the test expects the download to be saved directly to disk and
// not prompted by the UnknownContentType window.
["browser.download.always_ask_before_handling_new_types", false],
["browser.download.enable_spam_prevention", true],
],
});
registerCleanupFunction(async () => {
Services.prefs.clearUserPref("browser.download.folderList");
Services.prefs.clearUserPref("browser.download.dir");
await IOUtils.remove(tempDir.path, { recursive: true });
});
});
add_task(async function check_download_spam_permissions() {
const INITIAL_TABS_COUNT = gBrowser.tabs.length;
let publicList = await Downloads.getList(Downloads.PUBLIC);
let downloadFinishedPromise = promiseDownloadFinished(
publicList,
true /* stop the download from openning */
);
let blockedDownloadsCount = 0;
let blockedDownloadsURI = "";
let automaticDownloadObserver = {
observe: function automatic_download_observe(aSubject, aTopic, aData) {
if (aTopic === AUTOMATIC_DOWNLOAD_TOPIC) {
blockedDownloadsCount++;
blockedDownloadsURI = aData;
}
},
};
Services.obs.addObserver(automaticDownloadObserver, AUTOMATIC_DOWNLOAD_TOPIC);
let newTab = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
TEST_PATH + "test_spammy_page.html"
);
registerCleanupFunction(async () => {
DownloadIntegration.downloadSpamProtection.removeDownloadSpamForWindow(
TEST_URI,
window
);
DownloadsPanel.hidePanel();
await publicList.removeFinished();
BrowserTestUtils.removeTab(newTab);
Services.obs.removeObserver(
automaticDownloadObserver,
AUTOMATIC_DOWNLOAD_TOPIC
);
});
let download = await downloadFinishedPromise;
await TestUtils.waitForCondition(
() => gBrowser.tabs.length == INITIAL_TABS_COUNT + 1
);
is(
PermissionTestUtils.testPermission(TEST_URI, "automatic-download"),
Services.perms.PROMPT_ACTION,
"The permission to prompt the user should be stored."
);
ok(
await IOUtils.exists(download.target.path),
"One file should be downloaded"
);
let aCopyFilePath = download.target.path.replace(".pdf", "(1).pdf");
is(
await IOUtils.exists(aCopyFilePath),
false,
"An other file should be blocked"
);
info("Will wait for blockedDownloadsCount to be >= 99");
await TestUtils.waitForCondition(() => blockedDownloadsCount >= 99);
is(blockedDownloadsCount, 99, "Browser should block 99 downloads");
is(
blockedDownloadsURI,
TEST_URI,
"The test URI should have blocked automatic downloads"
);
await savelink();
});
// Check to ensure that a link saved manually is not blocked.
async function savelink() {
let publicList = await Downloads.getList(Downloads.PUBLIC);
let menu = document.getElementById("contentAreaContextMenu");
let popupShown = BrowserTestUtils.waitForEvent(menu, "popupshown");
BrowserTestUtils.synthesizeMouse(
"#image",
5,
5,
{ type: "contextmenu", button: 2 },
gBrowser.selectedBrowser
);
await popupShown;
await new Promise(resolve => {
MockFilePicker.showCallback = function () {
resolve();
let file = gTempDownloadDir.clone();
file.append("file_with__funny_name.png");
MockFilePicker.setFiles([file]);
return Ci.nsIFilePicker.returnOK;
};
let menuitem = menu.querySelector("#context-savelink");
menu.activateItem(menuitem);
});
await promiseDownloadFinished(
publicList,
true // stop the download from openning
);
}