зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1740135 - Treat download button like save action to avoid opening on completion. r=Gijs
Differential Revision: https://phabricator.services.mozilla.com/D131945
This commit is contained in:
Родитель
024b1ac41c
Коммит
2816a6e799
|
@ -356,8 +356,16 @@ class ChromeActions {
|
|||
var blobUri = NetUtil.newURI(blobUrl);
|
||||
|
||||
// If the download was triggered from the ctrl/cmd+s or "Save Page As"
|
||||
// launch the "Save As" dialog.
|
||||
if (data.sourceEventType == "save") {
|
||||
// or the download button, launch the "Save As" dialog.
|
||||
const saveOnDownload = getBoolPref(
|
||||
"browser.download.improvements_to_download_panel",
|
||||
false
|
||||
);
|
||||
|
||||
if (
|
||||
data.sourceEventType == "save" ||
|
||||
(saveOnDownload && data.sourceEventType == "download")
|
||||
) {
|
||||
let actor = getActor(this.domWindow);
|
||||
actor.sendAsyncMessage("PDFJS:Parent:saveURL", {
|
||||
blobUrl,
|
||||
|
|
|
@ -3,6 +3,7 @@ support-files =
|
|||
file_pdfjs_test.pdf
|
||||
head.js
|
||||
|
||||
[browser_pdfjs_download_button.js]
|
||||
[browser_pdfjs_fill_login.js]
|
||||
support-files =
|
||||
file_pdfjs_form.pdf
|
||||
|
|
|
@ -0,0 +1,117 @@
|
|||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
"use strict";
|
||||
|
||||
const RELATIVE_DIR = "toolkit/components/pdfjs/test/";
|
||||
const TESTROOT = "http://example.com/browser/" + RELATIVE_DIR;
|
||||
|
||||
var MockFilePicker = SpecialPowers.MockFilePicker;
|
||||
MockFilePicker.init(window);
|
||||
MockFilePicker.returnValue = MockFilePicker.returnOK;
|
||||
|
||||
var tempDir;
|
||||
|
||||
function createPromiseForFilePicker() {
|
||||
return new Promise(resolve => {
|
||||
MockFilePicker.showCallback = fp => {
|
||||
let destFile = tempDir.clone();
|
||||
destFile.append(fp.defaultString);
|
||||
if (destFile.exists()) {
|
||||
destFile.remove(false);
|
||||
}
|
||||
MockFilePicker.setFiles([destFile]);
|
||||
MockFilePicker.filterIndex = 0; // kSaveAsType_Complete
|
||||
resolve();
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
add_task(async function setup() {
|
||||
tempDir = createTemporarySaveDirectory();
|
||||
MockFilePicker.displayDirectory = tempDir;
|
||||
|
||||
registerCleanupFunction(async function() {
|
||||
MockFilePicker.cleanup();
|
||||
await cleanupDownloads();
|
||||
tempDir.remove(true);
|
||||
});
|
||||
});
|
||||
|
||||
async function closeDownloadsPanel() {
|
||||
if (DownloadsPanel.panel.state !== "closed") {
|
||||
let hiddenPromise = BrowserTestUtils.waitForEvent(
|
||||
DownloadsPanel.panel,
|
||||
"popuphidden"
|
||||
);
|
||||
DownloadsPanel.hidePanel();
|
||||
await hiddenPromise;
|
||||
}
|
||||
is(
|
||||
DownloadsPanel.panel.state,
|
||||
"closed",
|
||||
"Check that the download panel is closed"
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check clicking the download button saves the file and doesn't open a new viewer
|
||||
*/
|
||||
add_task(async function test_downloading_pdf_nonprivate_window() {
|
||||
const pdfUrl = TESTROOT + "file_pdfjs_test.pdf";
|
||||
|
||||
await SpecialPowers.pushPrefEnv({
|
||||
set: [["browser.download.improvements_to_download_panel", true]],
|
||||
});
|
||||
|
||||
await BrowserTestUtils.withNewTab(
|
||||
{ gBrowser, url: "about:blank" },
|
||||
async function(browser) {
|
||||
await waitForPdfJS(browser, pdfUrl);
|
||||
|
||||
const tabCount = gBrowser.tabs.length;
|
||||
info(`${tabCount} tabs are open at the start of the test`);
|
||||
|
||||
let downloadList = await Downloads.getList(Downloads.PUBLIC);
|
||||
const initialDownloadCount = (await downloadList.getAll()).length;
|
||||
|
||||
let filePickerShown = createPromiseForFilePicker();
|
||||
|
||||
let downloadsPanelPromise = BrowserTestUtils.waitForEvent(
|
||||
DownloadsPanel.panel,
|
||||
"popupshown"
|
||||
);
|
||||
|
||||
info("Clicking on the download button...");
|
||||
await SpecialPowers.spawn(browser, [], () => {
|
||||
content.document.querySelector("#download").click();
|
||||
});
|
||||
info("Waiting for a filename to be picked from the file picker");
|
||||
await filePickerShown;
|
||||
|
||||
// check that resulted in a download being added to the list
|
||||
// and the dl panel opened
|
||||
info("Waiting for download panel to open when the download is complete");
|
||||
await downloadsPanelPromise;
|
||||
is(
|
||||
DownloadsPanel.panel.state,
|
||||
"open",
|
||||
"Check the download panel state is 'open'"
|
||||
);
|
||||
downloadList = await Downloads.getList(Downloads.PUBLIC);
|
||||
let currentDownloadCount = (await downloadList.getAll()).length;
|
||||
is(
|
||||
currentDownloadCount,
|
||||
initialDownloadCount + 1,
|
||||
"A download was added when we clicked download"
|
||||
);
|
||||
|
||||
is(
|
||||
gBrowser.tabs.length,
|
||||
tabCount,
|
||||
"No new tab was opened to view the downloaded PDF"
|
||||
);
|
||||
await closeDownloadsPanel();
|
||||
}
|
||||
);
|
||||
});
|
|
@ -15,15 +15,6 @@ Services.scriptloader.loadSubScript(
|
|||
this
|
||||
);
|
||||
|
||||
function createTemporarySaveDirectory() {
|
||||
var saveDir = Services.dirsvc.get("TmpD", Ci.nsIFile);
|
||||
saveDir.append("testsavedir");
|
||||
if (!saveDir.exists()) {
|
||||
saveDir.create(Ci.nsIFile.DIRECTORY_TYPE, 0o755);
|
||||
}
|
||||
return saveDir;
|
||||
}
|
||||
|
||||
function createPromiseForTransferComplete(expectedFileName, destFile) {
|
||||
return new Promise(resolve => {
|
||||
MockFilePicker.showCallback = fp => {
|
||||
|
|
|
@ -74,3 +74,32 @@ function changeMimeHandler(preferredAction, alwaysAskBeforeHandling) {
|
|||
|
||||
return oldAction;
|
||||
}
|
||||
|
||||
function createTemporarySaveDirectory() {
|
||||
var saveDir = Services.dirsvc.get("TmpD", Ci.nsIFile);
|
||||
saveDir.append("testsavedir");
|
||||
if (!saveDir.exists()) {
|
||||
saveDir.create(Ci.nsIFile.DIRECTORY_TYPE, 0o755);
|
||||
}
|
||||
return saveDir;
|
||||
}
|
||||
|
||||
async function cleanupDownloads(listId = Downloads.PUBLIC) {
|
||||
info("cleaning up downloads");
|
||||
let downloadList = await Downloads.getList(listId);
|
||||
for (let download of await downloadList.getAll()) {
|
||||
await download.finalize(true);
|
||||
try {
|
||||
if (Services.appinfo.OS === "WINNT") {
|
||||
// We need to make the file writable to delete it on Windows.
|
||||
await IOUtils.setPermissions(download.target.path, 0o600);
|
||||
}
|
||||
await IOUtils.remove(download.target.path);
|
||||
} catch (error) {
|
||||
info("The file " + download.target.path + " is not removed, " + error);
|
||||
}
|
||||
|
||||
await downloadList.remove(download);
|
||||
await download.finalize();
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче