forked from mirrors/gecko-dev
Depends on D200551 Differential Revision: https://phabricator.services.mozilla.com/D200552
158 lines
4.7 KiB
JavaScript
158 lines
4.7 KiB
JavaScript
/* 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(
|
|
"resource://testing-common/PermissionTestUtils.sys.mjs"
|
|
);
|
|
|
|
const TEST_URI = "https://example.com";
|
|
|
|
const TEST_PATH = getRootDirectory(gTestPath).replace(
|
|
"chrome://mochitests/content",
|
|
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 (fp) {
|
|
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
|
|
);
|
|
}
|