Merge pull request #17363 from Snuffleupagus/issue-17353

[Firefox] Restore opening of PDF attachments (issue 17353, bug 1867764)
This commit is contained in:
Jonas Jenwald 2023-12-01 18:12:52 +01:00 committed by GitHub
commit a1d84f5ecf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 35 additions and 24 deletions

View File

@ -112,9 +112,11 @@ class DownloadManager {
this.#openBlobUrls.set(data, blobUrl); this.#openBlobUrls.set(data, blobUrl);
} }
// Let Firefox's content handler catch the URL and display the PDF. // Let Firefox's content handler catch the URL and display the PDF.
let viewerUrl = blobUrl + "?filename=" + encodeURIComponent(filename); // NOTE: This cannot use a query string for the filename, see
// https://bugzilla.mozilla.org/show_bug.cgi?id=1632644#c5
let viewerUrl = blobUrl + "#filename=" + encodeURIComponent(filename);
if (dest) { if (dest) {
viewerUrl += `#${escape(dest)}`; viewerUrl += `&filedest=${escape(dest)}`;
} }
try { try {

View File

@ -431,32 +431,41 @@ class PDFLinkService {
if (params.has("nameddest")) { if (params.has("nameddest")) {
this.goToDestination(params.get("nameddest")); this.goToDestination(params.get("nameddest"));
} }
} else {
// Named (or explicit) destination.
dest = unescape(hash);
try {
dest = JSON.parse(dest);
if (!Array.isArray(dest)) { if (typeof PDFJSDev === "undefined" || !PDFJSDev.test("MOZCENTRAL")) {
// Avoid incorrectly rejecting a valid named destination, such as
// e.g. "4.3" or "true", because `JSON.parse` converted its type.
dest = dest.toString();
}
} catch {}
if (
typeof dest === "string" ||
PDFLinkService.#isValidExplicitDestination(dest)
) {
this.goToDestination(dest);
return; return;
} }
console.error( // Support opening of PDF attachments in the Firefox PDF Viewer,
`PDFLinkService.setHash: "${unescape( // which uses a couple of non-standard hash parameters; refer to
hash // `DownloadManager.openOrDownloadData` in the firefoxcom.js file.
)}" is not a valid destination.` if (!params.has("filename") || !params.has("filedest")) {
); return;
}
hash = params.get("filedest");
} }
// Named (or explicit) destination.
dest = unescape(hash);
try {
dest = JSON.parse(dest);
if (!Array.isArray(dest)) {
// Avoid incorrectly rejecting a valid named destination, such as
// e.g. "4.3" or "true", because `JSON.parse` converted its type.
dest = dest.toString();
}
} catch {}
if (
typeof dest === "string" ||
PDFLinkService.#isValidExplicitDestination(dest)
) {
this.goToDestination(dest);
return;
}
console.error(
`PDFLinkService.setHash: "${unescape(hash)}" is not a valid destination.`
);
} }
/** /**