blob: 14e75543bcbf919eb4d27ff9a6a62391d78c5c34 [file] [log] [blame]
/**
* @licstart The following is the entire license notice for the
* Javascript code in this page
*
* Copyright 2020 Mozilla Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* @licend The above is the entire license notice for the
* Javascript code in this page
*/
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.PDFAttachmentViewer = void 0;
var _pdf = require("../pdf");
var _base_tree_viewer = require("./base_tree_viewer.js");
var _viewer_compatibility = require("./viewer_compatibility.js");
const PdfFileRegExp = /\.pdf$/i;
class PDFAttachmentViewer extends _base_tree_viewer.BaseTreeViewer {
constructor(options) {
super(options);
this.downloadManager = options.downloadManager;
this.eventBus._on("fileattachmentannotation", this._appendAttachment.bind(this));
}
reset(keepRenderedCapability = false) {
super.reset();
this._attachments = null;
if (!keepRenderedCapability) {
this._renderedCapability = (0, _pdf.createPromiseCapability)();
}
if (this._pendingDispatchEvent) {
clearTimeout(this._pendingDispatchEvent);
}
this._pendingDispatchEvent = null;
}
_dispatchEvent(attachmentsCount) {
this._renderedCapability.resolve();
if (this._pendingDispatchEvent) {
clearTimeout(this._pendingDispatchEvent);
this._pendingDispatchEvent = null;
}
if (attachmentsCount === 0) {
this._pendingDispatchEvent = setTimeout(() => {
this.eventBus.dispatch("attachmentsloaded", {
source: this,
attachmentsCount: 0
});
this._pendingDispatchEvent = null;
});
return;
}
this.eventBus.dispatch("attachmentsloaded", {
source: this,
attachmentsCount
});
}
_bindPdfLink(element, {
content,
filename
}) {
let blobUrl;
element.onclick = () => {
if (!blobUrl) {
blobUrl = URL.createObjectURL(new Blob([content], {
type: "application/pdf"
}));
}
let viewerUrl;
viewerUrl = "?file=" + encodeURIComponent(blobUrl + "#" + filename);
try {
window.open(viewerUrl);
} catch (ex) {
console.error(`_bindPdfLink: ${ex}`);
URL.revokeObjectURL(blobUrl);
blobUrl = null;
this.downloadManager.downloadData(content, filename, "application/pdf");
}
return false;
};
}
_bindLink(element, {
content,
filename
}) {
element.onclick = () => {
const contentType = PdfFileRegExp.test(filename) ? "application/pdf" : "";
this.downloadManager.downloadData(content, filename, contentType);
return false;
};
}
render({
attachments,
keepRenderedCapability = false
}) {
if (this._attachments) {
this.reset(keepRenderedCapability);
}
this._attachments = attachments || null;
if (!attachments) {
this._dispatchEvent(0);
return;
}
const names = Object.keys(attachments).sort(function (a, b) {
return a.toLowerCase().localeCompare(b.toLowerCase());
});
const fragment = document.createDocumentFragment();
let attachmentsCount = 0;
for (const name of names) {
const item = attachments[name];
const filename = (0, _pdf.getFilenameFromUrl)(item.filename);
const div = document.createElement("div");
div.className = "treeItem";
const element = document.createElement("a");
if (PdfFileRegExp.test(filename) && !_viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL) {
this._bindPdfLink(element, {
content: item.content,
filename
});
} else {
this._bindLink(element, {
content: item.content,
filename
});
}
element.textContent = this._normalizeTextContent(filename);
div.appendChild(element);
fragment.appendChild(div);
attachmentsCount++;
}
this.container.appendChild(fragment);
this._dispatchEvent(attachmentsCount);
}
_appendAttachment({
id,
filename,
content
}) {
const renderedPromise = this._renderedCapability.promise;
renderedPromise.then(() => {
if (renderedPromise !== this._renderedCapability.promise) {
return;
}
let attachments = this._attachments;
if (!attachments) {
attachments = Object.create(null);
} else {
for (const name in attachments) {
if (id === name) {
return;
}
}
}
attachments[id] = {
filename,
content
};
this.render({
attachments,
keepRenderedCapability: true
});
});
}
}
exports.PDFAttachmentViewer = PDFAttachmentViewer;