@vaadin-component-factory/vcf-pdf-viewer 4.0.2 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +8 -2
- package/pdfjs/dist/event_utils.js +207 -0
- package/pdfjs/dist/genericl10n.js +2420 -0
- package/pdfjs/dist/message_handler.js +327 -192
- package/pdfjs/dist/node_stream.js +2 -494
- package/pdfjs/dist/node_stream2.js +1759 -0
- package/pdfjs/dist/pdf.js +17910 -9761
- package/pdfjs/dist/pdf.worker.js +24 -0
- package/pdfjs/dist/pdf_link_service.js +223 -378
- package/pdfjs/dist/pdf_rendering_queue.js +62 -62
- package/pdfjs/dist/pdf_thumbnail_viewer.js +216 -399
- package/pdfjs/dist/pdf_viewer.js +3450 -2305
- package/pdfjs/dist/ui_utils.js +209 -480
- package/pdfjs/dist/util.js +384 -595
- package/pdfjs/dist/worker.js +44555 -45401
- package/src/vcf-pdf-viewer.js +153 -16
- package/pdfjs/dist/display_utils.js +0 -848
- package/pdfjs/dist/fetch_stream.js +0 -306
- package/pdfjs/dist/l10n_utils.js +0 -140
- package/pdfjs/dist/network.js +0 -565
- package/pdfjs/dist/network_utils.js +0 -340
|
@@ -14,6 +14,17 @@ import { parseQueryString } from './ui_utils.js';
|
|
|
14
14
|
* See the License for the specific language governing permissions and
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
|
+
|
|
18
|
+
const DEFAULT_LINK_REL = "noopener noreferrer nofollow";
|
|
19
|
+
const LinkTarget = {
|
|
20
|
+
NONE: 0,
|
|
21
|
+
// Default value.
|
|
22
|
+
SELF: 1,
|
|
23
|
+
BLANK: 2,
|
|
24
|
+
PARENT: 3,
|
|
25
|
+
TOP: 4
|
|
26
|
+
};
|
|
27
|
+
|
|
17
28
|
/**
|
|
18
29
|
* @typedef {Object} PDFLinkServiceOptions
|
|
19
30
|
* @property {EventBus} eventBus - The application event bus.
|
|
@@ -32,8 +43,9 @@ import { parseQueryString } from './ui_utils.js';
|
|
|
32
43
|
* or destination.
|
|
33
44
|
* @implements {IPDFLinkService}
|
|
34
45
|
*/
|
|
35
|
-
|
|
36
46
|
class PDFLinkService {
|
|
47
|
+
externalLinkEnabled = true;
|
|
48
|
+
|
|
37
49
|
/**
|
|
38
50
|
* @param {PDFLinkServiceOptions} options
|
|
39
51
|
*/
|
|
@@ -46,105 +58,111 @@ class PDFLinkService {
|
|
|
46
58
|
this.eventBus = eventBus;
|
|
47
59
|
this.externalLinkTarget = externalLinkTarget;
|
|
48
60
|
this.externalLinkRel = externalLinkRel;
|
|
49
|
-
this.externalLinkEnabled = true;
|
|
50
61
|
this._ignoreDestinationZoom = ignoreDestinationZoom;
|
|
51
62
|
this.baseUrl = null;
|
|
52
63
|
this.pdfDocument = null;
|
|
53
64
|
this.pdfViewer = null;
|
|
54
65
|
this.pdfHistory = null;
|
|
55
|
-
this._pagesRefCache = null;
|
|
56
66
|
}
|
|
57
|
-
|
|
58
67
|
setDocument(pdfDocument, baseUrl = null) {
|
|
59
68
|
this.baseUrl = baseUrl;
|
|
60
69
|
this.pdfDocument = pdfDocument;
|
|
61
|
-
this._pagesRefCache = Object.create(null);
|
|
62
70
|
}
|
|
63
|
-
|
|
64
71
|
setViewer(pdfViewer) {
|
|
65
72
|
this.pdfViewer = pdfViewer;
|
|
66
73
|
}
|
|
67
|
-
|
|
68
74
|
setHistory(pdfHistory) {
|
|
69
75
|
this.pdfHistory = pdfHistory;
|
|
70
76
|
}
|
|
77
|
+
|
|
71
78
|
/**
|
|
72
79
|
* @type {number}
|
|
73
80
|
*/
|
|
74
|
-
|
|
75
|
-
|
|
76
81
|
get pagesCount() {
|
|
77
82
|
return this.pdfDocument ? this.pdfDocument.numPages : 0;
|
|
78
83
|
}
|
|
84
|
+
|
|
79
85
|
/**
|
|
80
86
|
* @type {number}
|
|
81
87
|
*/
|
|
82
|
-
|
|
83
|
-
|
|
84
88
|
get page() {
|
|
85
|
-
return this.pdfViewer.currentPageNumber;
|
|
89
|
+
return this.pdfDocument ? this.pdfViewer.currentPageNumber : 1;
|
|
86
90
|
}
|
|
91
|
+
|
|
87
92
|
/**
|
|
88
93
|
* @param {number} value
|
|
89
94
|
*/
|
|
90
|
-
|
|
91
|
-
|
|
92
95
|
set page(value) {
|
|
93
|
-
this.
|
|
96
|
+
if (this.pdfDocument) {
|
|
97
|
+
this.pdfViewer.currentPageNumber = value;
|
|
98
|
+
}
|
|
94
99
|
}
|
|
100
|
+
|
|
95
101
|
/**
|
|
96
102
|
* @type {number}
|
|
97
103
|
*/
|
|
98
|
-
|
|
99
|
-
|
|
100
104
|
get rotation() {
|
|
101
|
-
return this.pdfViewer.pagesRotation;
|
|
105
|
+
return this.pdfDocument ? this.pdfViewer.pagesRotation : 0;
|
|
102
106
|
}
|
|
107
|
+
|
|
103
108
|
/**
|
|
104
109
|
* @param {number} value
|
|
105
110
|
*/
|
|
106
|
-
|
|
107
|
-
|
|
108
111
|
set rotation(value) {
|
|
109
|
-
this.
|
|
112
|
+
if (this.pdfDocument) {
|
|
113
|
+
this.pdfViewer.pagesRotation = value;
|
|
114
|
+
}
|
|
110
115
|
}
|
|
116
|
+
|
|
111
117
|
/**
|
|
112
|
-
* @
|
|
118
|
+
* @type {boolean}
|
|
113
119
|
*/
|
|
120
|
+
get isInPresentationMode() {
|
|
121
|
+
return this.pdfDocument ? this.pdfViewer.isInPresentationMode : false;
|
|
122
|
+
}
|
|
114
123
|
|
|
115
|
-
|
|
116
|
-
|
|
124
|
+
/**
|
|
125
|
+
* This method will, when available, also update the browser history.
|
|
126
|
+
*
|
|
127
|
+
* @param {string|Array} dest - The named, or explicit, PDF destination.
|
|
128
|
+
*/
|
|
129
|
+
async goToDestination(dest) {
|
|
130
|
+
if (!this.pdfDocument) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
let namedDest, explicitDest, pageNumber;
|
|
134
|
+
if (typeof dest === "string") {
|
|
135
|
+
namedDest = dest;
|
|
136
|
+
explicitDest = await this.pdfDocument.getDestination(dest);
|
|
137
|
+
} else {
|
|
138
|
+
namedDest = null;
|
|
139
|
+
explicitDest = await dest;
|
|
140
|
+
}
|
|
141
|
+
if (!Array.isArray(explicitDest)) {
|
|
142
|
+
console.error(`goToDestination: "${explicitDest}" is not a valid destination array, for dest="${dest}".`);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
117
145
|
// Dest array looks like that: <page-ref> </XYZ|/FitXXX> <args..>
|
|
118
|
-
const destRef = explicitDest
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
pageNumber = this._cachedPageNumber(destRef);
|
|
123
|
-
|
|
124
|
-
if (pageNumber === null) {
|
|
146
|
+
const [destRef] = explicitDest;
|
|
147
|
+
if (destRef && typeof destRef === "object") {
|
|
148
|
+
pageNumber = this.pdfDocument.cachedPageNumber(destRef);
|
|
149
|
+
if (!pageNumber) {
|
|
125
150
|
// Fetch the page reference if it's not yet available. This could
|
|
126
151
|
// only occur during loading, before all pages have been resolved.
|
|
127
|
-
|
|
128
|
-
this.
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
});
|
|
134
|
-
return;
|
|
152
|
+
try {
|
|
153
|
+
pageNumber = (await this.pdfDocument.getPageIndex(destRef)) + 1;
|
|
154
|
+
} catch {
|
|
155
|
+
console.error(`goToDestination: "${destRef}" is not a valid page reference, for dest="${dest}".`);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
135
158
|
}
|
|
136
159
|
} else if (Number.isInteger(destRef)) {
|
|
137
160
|
pageNumber = destRef + 1;
|
|
138
|
-
} else {
|
|
139
|
-
console.error(`PDFLinkService._goToDestinationHelper: "${destRef}" is not ` + `a valid destination reference, for dest="${rawDest}".`);
|
|
140
|
-
return;
|
|
141
161
|
}
|
|
142
|
-
|
|
143
162
|
if (!pageNumber || pageNumber < 1 || pageNumber > this.pagesCount) {
|
|
144
|
-
console.error(`
|
|
163
|
+
console.error(`goToDestination: "${pageNumber}" is not a valid page number, for dest="${dest}".`);
|
|
145
164
|
return;
|
|
146
165
|
}
|
|
147
|
-
|
|
148
166
|
if (this.pdfHistory) {
|
|
149
167
|
// Update the browser history before scrolling the new destination into
|
|
150
168
|
// view, to be able to accurately capture the current document position.
|
|
@@ -155,78 +173,82 @@ class PDFLinkService {
|
|
|
155
173
|
pageNumber
|
|
156
174
|
});
|
|
157
175
|
}
|
|
158
|
-
|
|
159
176
|
this.pdfViewer.scrollPageIntoView({
|
|
160
177
|
pageNumber,
|
|
161
178
|
destArray: explicitDest,
|
|
162
179
|
ignoreDestinationZoom: this._ignoreDestinationZoom
|
|
163
180
|
});
|
|
164
181
|
}
|
|
165
|
-
/**
|
|
166
|
-
* This method will, when available, also update the browser history.
|
|
167
|
-
*
|
|
168
|
-
* @param {string|Array} dest - The named, or explicit, PDF destination.
|
|
169
|
-
*/
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
async goToDestination(dest) {
|
|
173
|
-
if (!this.pdfDocument) {
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
let namedDest, explicitDest;
|
|
178
|
-
|
|
179
|
-
if (typeof dest === "string") {
|
|
180
|
-
namedDest = dest;
|
|
181
|
-
explicitDest = await this.pdfDocument.getDestination(dest);
|
|
182
|
-
} else {
|
|
183
|
-
namedDest = null;
|
|
184
|
-
explicitDest = await dest;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
if (!Array.isArray(explicitDest)) {
|
|
188
|
-
console.error(`PDFLinkService.goToDestination: "${explicitDest}" is not ` + `a valid destination array, for dest="${dest}".`);
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
182
|
|
|
192
|
-
this._goToDestinationHelper(dest, namedDest, explicitDest);
|
|
193
|
-
}
|
|
194
183
|
/**
|
|
195
184
|
* This method will, when available, also update the browser history.
|
|
196
185
|
*
|
|
197
186
|
* @param {number|string} val - The page number, or page label.
|
|
198
187
|
*/
|
|
199
|
-
|
|
200
|
-
|
|
201
188
|
goToPage(val) {
|
|
202
189
|
if (!this.pdfDocument) {
|
|
203
190
|
return;
|
|
204
191
|
}
|
|
205
|
-
|
|
206
192
|
const pageNumber = typeof val === "string" && this.pdfViewer.pageLabelToPageNumber(val) || val | 0;
|
|
207
|
-
|
|
208
193
|
if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.pagesCount)) {
|
|
209
194
|
console.error(`PDFLinkService.goToPage: "${val}" is not a valid page.`);
|
|
210
195
|
return;
|
|
211
196
|
}
|
|
212
|
-
|
|
213
197
|
if (this.pdfHistory) {
|
|
214
198
|
// Update the browser history before scrolling the new page into view,
|
|
215
199
|
// to be able to accurately capture the current document position.
|
|
216
200
|
this.pdfHistory.pushCurrentPosition();
|
|
217
201
|
this.pdfHistory.pushPage(pageNumber);
|
|
218
202
|
}
|
|
219
|
-
|
|
220
203
|
this.pdfViewer.scrollPageIntoView({
|
|
221
204
|
pageNumber
|
|
222
205
|
});
|
|
223
206
|
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Adds various attributes (href, title, target, rel) to hyperlinks.
|
|
210
|
+
* @param {HTMLAnchorElement} link
|
|
211
|
+
* @param {string} url
|
|
212
|
+
* @param {boolean} [newWindow]
|
|
213
|
+
*/
|
|
214
|
+
addLinkAttributes(link, url, newWindow = false) {
|
|
215
|
+
if (!url || typeof url !== "string") {
|
|
216
|
+
throw new Error('A valid "url" parameter must provided.');
|
|
217
|
+
}
|
|
218
|
+
const target = newWindow ? LinkTarget.BLANK : this.externalLinkTarget,
|
|
219
|
+
rel = this.externalLinkRel;
|
|
220
|
+
if (this.externalLinkEnabled) {
|
|
221
|
+
link.href = link.title = url;
|
|
222
|
+
} else {
|
|
223
|
+
link.href = "";
|
|
224
|
+
link.title = `Disabled: ${url}`;
|
|
225
|
+
link.onclick = () => false;
|
|
226
|
+
}
|
|
227
|
+
let targetStr = ""; // LinkTarget.NONE
|
|
228
|
+
switch (target) {
|
|
229
|
+
case LinkTarget.NONE:
|
|
230
|
+
break;
|
|
231
|
+
case LinkTarget.SELF:
|
|
232
|
+
targetStr = "_self";
|
|
233
|
+
break;
|
|
234
|
+
case LinkTarget.BLANK:
|
|
235
|
+
targetStr = "_blank";
|
|
236
|
+
break;
|
|
237
|
+
case LinkTarget.PARENT:
|
|
238
|
+
targetStr = "_parent";
|
|
239
|
+
break;
|
|
240
|
+
case LinkTarget.TOP:
|
|
241
|
+
targetStr = "_top";
|
|
242
|
+
break;
|
|
243
|
+
}
|
|
244
|
+
link.target = targetStr;
|
|
245
|
+
link.rel = typeof rel === "string" ? rel : DEFAULT_LINK_REL;
|
|
246
|
+
}
|
|
247
|
+
|
|
224
248
|
/**
|
|
225
249
|
* @param {string|Array} dest - The PDF destination object.
|
|
226
250
|
* @returns {string} The hyperlink to the PDF object.
|
|
227
251
|
*/
|
|
228
|
-
|
|
229
|
-
|
|
230
252
|
getDestinationHash(dest) {
|
|
231
253
|
if (typeof dest === "string") {
|
|
232
254
|
if (dest.length > 0) {
|
|
@@ -234,89 +256,76 @@ class PDFLinkService {
|
|
|
234
256
|
}
|
|
235
257
|
} else if (Array.isArray(dest)) {
|
|
236
258
|
const str = JSON.stringify(dest);
|
|
237
|
-
|
|
238
259
|
if (str.length > 0) {
|
|
239
260
|
return this.getAnchorUrl("#" + escape(str));
|
|
240
261
|
}
|
|
241
262
|
}
|
|
242
|
-
|
|
243
263
|
return this.getAnchorUrl("");
|
|
244
264
|
}
|
|
265
|
+
|
|
245
266
|
/**
|
|
246
267
|
* Prefix the full url on anchor links to make sure that links are resolved
|
|
247
268
|
* relative to the current URL instead of the one defined in <base href>.
|
|
248
269
|
* @param {string} anchor - The anchor hash, including the #.
|
|
249
270
|
* @returns {string} The hyperlink to the PDF object.
|
|
250
271
|
*/
|
|
251
|
-
|
|
252
|
-
|
|
253
272
|
getAnchorUrl(anchor) {
|
|
254
|
-
return
|
|
273
|
+
return this.baseUrl ? this.baseUrl + anchor : anchor;
|
|
255
274
|
}
|
|
275
|
+
|
|
256
276
|
/**
|
|
257
277
|
* @param {string} hash
|
|
258
278
|
*/
|
|
259
|
-
|
|
260
|
-
|
|
261
279
|
setHash(hash) {
|
|
262
280
|
if (!this.pdfDocument) {
|
|
263
281
|
return;
|
|
264
282
|
}
|
|
265
|
-
|
|
266
283
|
let pageNumber, dest;
|
|
267
|
-
|
|
268
284
|
if (hash.includes("=")) {
|
|
269
285
|
const params = parseQueryString(hash);
|
|
270
|
-
|
|
271
|
-
|
|
286
|
+
if (params.has("search")) {
|
|
287
|
+
const query = params.get("search").replaceAll('"', ""),
|
|
288
|
+
phrase = params.get("phrase") === "true";
|
|
272
289
|
this.eventBus.dispatch("findfromurlhash", {
|
|
273
290
|
source: this,
|
|
274
|
-
query:
|
|
275
|
-
phraseSearch: params.phrase === "true"
|
|
291
|
+
query: phrase ? query : query.match(/\S+/g)
|
|
276
292
|
});
|
|
277
|
-
} // borrowing syntax from "Parameters for Opening PDF Files"
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
if ("page" in params) {
|
|
281
|
-
pageNumber = params.page | 0 || 1;
|
|
282
293
|
}
|
|
283
|
-
|
|
284
|
-
if ("
|
|
294
|
+
// borrowing syntax from "Parameters for Opening PDF Files"
|
|
295
|
+
if (params.has("page")) {
|
|
296
|
+
pageNumber = params.get("page") | 0 || 1;
|
|
297
|
+
}
|
|
298
|
+
if (params.has("zoom")) {
|
|
285
299
|
// Build the destination array.
|
|
286
|
-
const zoomArgs = params.zoom.split(","); // scale,left,top
|
|
287
|
-
|
|
300
|
+
const zoomArgs = params.get("zoom").split(","); // scale,left,top
|
|
288
301
|
const zoomArg = zoomArgs[0];
|
|
289
302
|
const zoomArgNumber = parseFloat(zoomArg);
|
|
290
|
-
|
|
291
303
|
if (!zoomArg.includes("Fit")) {
|
|
292
304
|
// If the zoomArg is a number, it has to get divided by 100. If it's
|
|
293
305
|
// a string, it should stay as it is.
|
|
294
306
|
dest = [null, {
|
|
295
307
|
name: "XYZ"
|
|
296
308
|
}, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null, zoomArgs.length > 2 ? zoomArgs[2] | 0 : null, zoomArgNumber ? zoomArgNumber / 100 : zoomArg];
|
|
297
|
-
} else {
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
309
|
+
} else if (zoomArg === "Fit" || zoomArg === "FitB") {
|
|
310
|
+
dest = [null, {
|
|
311
|
+
name: zoomArg
|
|
312
|
+
}];
|
|
313
|
+
} else if (zoomArg === "FitH" || zoomArg === "FitBH" || zoomArg === "FitV" || zoomArg === "FitBV") {
|
|
314
|
+
dest = [null, {
|
|
315
|
+
name: zoomArg
|
|
316
|
+
}, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null];
|
|
317
|
+
} else if (zoomArg === "FitR") {
|
|
318
|
+
if (zoomArgs.length !== 5) {
|
|
319
|
+
console.error('PDFLinkService.setHash: Not enough parameters for "FitR".');
|
|
320
|
+
} else {
|
|
303
321
|
dest = [null, {
|
|
304
322
|
name: zoomArg
|
|
305
|
-
}, zoomArgs
|
|
306
|
-
} else if (zoomArg === "FitR") {
|
|
307
|
-
if (zoomArgs.length !== 5) {
|
|
308
|
-
console.error('PDFLinkService.setHash: Not enough parameters for "FitR".');
|
|
309
|
-
} else {
|
|
310
|
-
dest = [null, {
|
|
311
|
-
name: zoomArg
|
|
312
|
-
}, zoomArgs[1] | 0, zoomArgs[2] | 0, zoomArgs[3] | 0, zoomArgs[4] | 0];
|
|
313
|
-
}
|
|
314
|
-
} else {
|
|
315
|
-
console.error(`PDFLinkService.setHash: "${zoomArg}" is not ` + "a valid zoom value.");
|
|
323
|
+
}, zoomArgs[1] | 0, zoomArgs[2] | 0, zoomArgs[3] | 0, zoomArgs[4] | 0];
|
|
316
324
|
}
|
|
325
|
+
} else {
|
|
326
|
+
console.error(`PDFLinkService.setHash: "${zoomArg}" is not a valid zoom value.`);
|
|
317
327
|
}
|
|
318
328
|
}
|
|
319
|
-
|
|
320
329
|
if (dest) {
|
|
321
330
|
this.pdfViewer.scrollPageIntoView({
|
|
322
331
|
pageNumber: pageNumber || this.page,
|
|
@@ -326,313 +335,149 @@ class PDFLinkService {
|
|
|
326
335
|
} else if (pageNumber) {
|
|
327
336
|
this.page = pageNumber; // simple page
|
|
328
337
|
}
|
|
329
|
-
|
|
330
|
-
if ("pagemode" in params) {
|
|
338
|
+
if (params.has("pagemode")) {
|
|
331
339
|
this.eventBus.dispatch("pagemode", {
|
|
332
340
|
source: this,
|
|
333
|
-
mode: params.pagemode
|
|
341
|
+
mode: params.get("pagemode")
|
|
334
342
|
});
|
|
335
|
-
}
|
|
343
|
+
}
|
|
344
|
+
// Ensure that this parameter is *always* handled last, in order to
|
|
336
345
|
// guarantee that it won't be overridden (e.g. by the "page" parameter).
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
if ("nameddest" in params) {
|
|
340
|
-
this.goToDestination(params.nameddest);
|
|
346
|
+
if (params.has("nameddest")) {
|
|
347
|
+
this.goToDestination(params.get("nameddest"));
|
|
341
348
|
}
|
|
342
|
-
|
|
343
|
-
// Named (or explicit) destination.
|
|
344
|
-
dest = unescape(hash);
|
|
345
|
-
|
|
346
|
-
try {
|
|
347
|
-
dest = JSON.parse(dest);
|
|
348
|
-
|
|
349
|
-
if (!Array.isArray(dest)) {
|
|
350
|
-
// Avoid incorrectly rejecting a valid named destination, such as
|
|
351
|
-
// e.g. "4.3" or "true", because `JSON.parse` converted its type.
|
|
352
|
-
dest = dest.toString();
|
|
353
|
-
}
|
|
354
|
-
} catch (ex) {}
|
|
355
|
-
|
|
356
|
-
if (typeof dest === "string" || isValidExplicitDestination(dest)) {
|
|
357
|
-
this.goToDestination(dest);
|
|
349
|
+
if (typeof PDFJSDev === "undefined" || !PDFJSDev.test("MOZCENTRAL")) {
|
|
358
350
|
return;
|
|
359
351
|
}
|
|
352
|
+
// Support opening of PDF attachments in the Firefox PDF Viewer,
|
|
353
|
+
// which uses a couple of non-standard hash parameters; refer to
|
|
354
|
+
// `DownloadManager.openOrDownloadData` in the firefoxcom.js file.
|
|
355
|
+
if (!params.has("filename") || !params.has("filedest")) {
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
hash = params.get("filedest");
|
|
359
|
+
}
|
|
360
360
|
|
|
361
|
-
|
|
361
|
+
// Named (or explicit) destination.
|
|
362
|
+
dest = unescape(hash);
|
|
363
|
+
try {
|
|
364
|
+
dest = JSON.parse(dest);
|
|
365
|
+
if (!Array.isArray(dest)) {
|
|
366
|
+
// Avoid incorrectly rejecting a valid named destination, such as
|
|
367
|
+
// e.g. "4.3" or "true", because `JSON.parse` converted its type.
|
|
368
|
+
dest = dest.toString();
|
|
369
|
+
}
|
|
370
|
+
} catch {}
|
|
371
|
+
if (typeof dest === "string" || PDFLinkService.#isValidExplicitDest(dest)) {
|
|
372
|
+
this.goToDestination(dest);
|
|
373
|
+
return;
|
|
362
374
|
}
|
|
375
|
+
console.error(`PDFLinkService.setHash: "${unescape(hash)}" is not a valid destination.`);
|
|
363
376
|
}
|
|
377
|
+
|
|
364
378
|
/**
|
|
365
379
|
* @param {string} action
|
|
366
380
|
*/
|
|
367
|
-
|
|
368
|
-
|
|
369
381
|
executeNamedAction(action) {
|
|
382
|
+
var _this$pdfHistory, _this$pdfHistory2;
|
|
383
|
+
if (!this.pdfDocument) {
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
370
386
|
// See PDF reference, table 8.45 - Named action
|
|
371
387
|
switch (action) {
|
|
372
388
|
case "GoBack":
|
|
373
|
-
|
|
374
|
-
this.pdfHistory.back();
|
|
375
|
-
}
|
|
376
|
-
|
|
389
|
+
(_this$pdfHistory = this.pdfHistory) === null || _this$pdfHistory === void 0 ? void 0 : _this$pdfHistory.back();
|
|
377
390
|
break;
|
|
378
|
-
|
|
379
391
|
case "GoForward":
|
|
380
|
-
|
|
381
|
-
this.pdfHistory.forward();
|
|
382
|
-
}
|
|
383
|
-
|
|
392
|
+
(_this$pdfHistory2 = this.pdfHistory) === null || _this$pdfHistory2 === void 0 ? void 0 : _this$pdfHistory2.forward();
|
|
384
393
|
break;
|
|
385
|
-
|
|
386
394
|
case "NextPage":
|
|
387
395
|
this.pdfViewer.nextPage();
|
|
388
396
|
break;
|
|
389
|
-
|
|
390
397
|
case "PrevPage":
|
|
391
398
|
this.pdfViewer.previousPage();
|
|
392
399
|
break;
|
|
393
|
-
|
|
394
400
|
case "LastPage":
|
|
395
401
|
this.page = this.pagesCount;
|
|
396
402
|
break;
|
|
397
|
-
|
|
398
403
|
case "FirstPage":
|
|
399
404
|
this.page = 1;
|
|
400
405
|
break;
|
|
401
406
|
// No action according to spec
|
|
402
407
|
}
|
|
403
|
-
|
|
404
408
|
this.eventBus.dispatch("namedaction", {
|
|
405
409
|
source: this,
|
|
406
410
|
action
|
|
407
411
|
});
|
|
408
412
|
}
|
|
413
|
+
|
|
409
414
|
/**
|
|
410
|
-
* @param {
|
|
411
|
-
* @param {Object} pageRef - reference to the page.
|
|
415
|
+
* @param {Object} action
|
|
412
416
|
*/
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
cachePageRef(pageNum, pageRef) {
|
|
416
|
-
if (!pageRef) {
|
|
417
|
+
async executeSetOCGState(action) {
|
|
418
|
+
if (!this.pdfDocument) {
|
|
417
419
|
return;
|
|
418
420
|
}
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
this.
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
_cachedPageNumber(pageRef) {
|
|
429
|
-
var _this$_pagesRefCache;
|
|
430
|
-
|
|
431
|
-
const refStr = pageRef.gen === 0 ? `${pageRef.num}R` : `${pageRef.num}R${pageRef.gen}`;
|
|
432
|
-
return ((_this$_pagesRefCache = this._pagesRefCache) === null || _this$_pagesRefCache === void 0 ? void 0 : _this$_pagesRefCache[refStr]) || null;
|
|
433
|
-
}
|
|
434
|
-
/**
|
|
435
|
-
* @param {number} pageNumber
|
|
436
|
-
*/
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
isPageVisible(pageNumber) {
|
|
440
|
-
return this.pdfViewer.isPageVisible(pageNumber);
|
|
441
|
-
}
|
|
442
|
-
/**
|
|
443
|
-
* @param {number} pageNumber
|
|
444
|
-
*/
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
isPageCached(pageNumber) {
|
|
448
|
-
return this.pdfViewer.isPageCached(pageNumber);
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
function isValidExplicitDestination(dest) {
|
|
454
|
-
if (!Array.isArray(dest)) {
|
|
455
|
-
return false;
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
const destLength = dest.length;
|
|
459
|
-
|
|
460
|
-
if (destLength < 2) {
|
|
461
|
-
return false;
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
const page = dest[0];
|
|
465
|
-
|
|
466
|
-
if (!(typeof page === "object" && Number.isInteger(page.num) && Number.isInteger(page.gen)) && !(Number.isInteger(page) && page >= 0)) {
|
|
467
|
-
return false;
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
const zoom = dest[1];
|
|
471
|
-
|
|
472
|
-
if (!(typeof zoom === "object" && typeof zoom.name === "string")) {
|
|
473
|
-
return false;
|
|
421
|
+
const pdfDocument = this.pdfDocument,
|
|
422
|
+
optionalContentConfig = await this.pdfViewer.optionalContentConfigPromise;
|
|
423
|
+
if (pdfDocument !== this.pdfDocument) {
|
|
424
|
+
return; // The document was closed while the optional content resolved.
|
|
425
|
+
}
|
|
426
|
+
optionalContentConfig.setOCGState(action);
|
|
427
|
+
this.pdfViewer.optionalContentConfigPromise = Promise.resolve(optionalContentConfig);
|
|
474
428
|
}
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
429
|
+
static #isValidExplicitDest(dest) {
|
|
430
|
+
if (!Array.isArray(dest) || dest.length < 2) {
|
|
431
|
+
return false;
|
|
432
|
+
}
|
|
433
|
+
const [page, zoom, ...args] = dest;
|
|
434
|
+
if (!(typeof page === "object" && Number.isInteger(page === null || page === void 0 ? void 0 : page.num) && Number.isInteger(page === null || page === void 0 ? void 0 : page.gen)) && !Number.isInteger(page)) {
|
|
435
|
+
return false;
|
|
436
|
+
}
|
|
437
|
+
if (!(typeof zoom === "object" && typeof (zoom === null || zoom === void 0 ? void 0 : zoom.name) === "string")) {
|
|
438
|
+
return false;
|
|
439
|
+
}
|
|
440
|
+
let allowNull = true;
|
|
441
|
+
switch (zoom.name) {
|
|
442
|
+
case "XYZ":
|
|
443
|
+
if (args.length !== 3) {
|
|
444
|
+
return false;
|
|
445
|
+
}
|
|
446
|
+
break;
|
|
447
|
+
case "Fit":
|
|
448
|
+
case "FitB":
|
|
449
|
+
return args.length === 0;
|
|
450
|
+
case "FitH":
|
|
451
|
+
case "FitBH":
|
|
452
|
+
case "FitV":
|
|
453
|
+
case "FitBV":
|
|
454
|
+
if (args.length !== 1) {
|
|
455
|
+
return false;
|
|
456
|
+
}
|
|
457
|
+
break;
|
|
458
|
+
case "FitR":
|
|
459
|
+
if (args.length !== 4) {
|
|
460
|
+
return false;
|
|
461
|
+
}
|
|
462
|
+
allowNull = false;
|
|
463
|
+
break;
|
|
464
|
+
default:
|
|
495
465
|
return false;
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
case "FitR":
|
|
501
|
-
if (destLength !== 6) {
|
|
466
|
+
}
|
|
467
|
+
for (const arg of args) {
|
|
468
|
+
if (!(typeof arg === "number" || allowNull && arg === null)) {
|
|
502
469
|
return false;
|
|
503
470
|
}
|
|
504
|
-
|
|
505
|
-
allowNull = false;
|
|
506
|
-
break;
|
|
507
|
-
|
|
508
|
-
default:
|
|
509
|
-
return false;
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
for (let i = 2; i < destLength; i++) {
|
|
513
|
-
const param = dest[i];
|
|
514
|
-
|
|
515
|
-
if (!(typeof param === "number" || allowNull && param === null)) {
|
|
516
|
-
return false;
|
|
517
471
|
}
|
|
472
|
+
return true;
|
|
518
473
|
}
|
|
519
|
-
|
|
520
|
-
return true;
|
|
521
474
|
}
|
|
475
|
+
|
|
522
476
|
/**
|
|
523
477
|
* @implements {IPDFLinkService}
|
|
524
478
|
*/
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
class SimpleLinkService {
|
|
528
|
-
constructor() {
|
|
529
|
-
this.externalLinkTarget = null;
|
|
530
|
-
this.externalLinkRel = null;
|
|
531
|
-
this.externalLinkEnabled = true;
|
|
532
|
-
this._ignoreDestinationZoom = false;
|
|
533
|
-
}
|
|
534
|
-
/**
|
|
535
|
-
* @type {number}
|
|
536
|
-
*/
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
get pagesCount() {
|
|
540
|
-
return 0;
|
|
541
|
-
}
|
|
542
|
-
/**
|
|
543
|
-
* @type {number}
|
|
544
|
-
*/
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
get page() {
|
|
548
|
-
return 0;
|
|
549
|
-
}
|
|
550
|
-
/**
|
|
551
|
-
* @param {number} value
|
|
552
|
-
*/
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
set page(value) {}
|
|
556
|
-
/**
|
|
557
|
-
* @type {number}
|
|
558
|
-
*/
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
get rotation() {
|
|
562
|
-
return 0;
|
|
563
|
-
}
|
|
564
|
-
/**
|
|
565
|
-
* @param {number} value
|
|
566
|
-
*/
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
set rotation(value) {}
|
|
570
|
-
/**
|
|
571
|
-
* @param {string|Array} dest - The named, or explicit, PDF destination.
|
|
572
|
-
*/
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
async goToDestination(dest) {}
|
|
576
|
-
/**
|
|
577
|
-
* @param {number|string} val - The page number, or page label.
|
|
578
|
-
*/
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
goToPage(val) {}
|
|
582
|
-
/**
|
|
583
|
-
* @param dest - The PDF destination object.
|
|
584
|
-
* @returns {string} The hyperlink to the PDF object.
|
|
585
|
-
*/
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
getDestinationHash(dest) {
|
|
589
|
-
return "#";
|
|
590
|
-
}
|
|
591
|
-
/**
|
|
592
|
-
* @param hash - The PDF parameters/hash.
|
|
593
|
-
* @returns {string} The hyperlink to the PDF object.
|
|
594
|
-
*/
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
getAnchorUrl(hash) {
|
|
598
|
-
return "#";
|
|
599
|
-
}
|
|
600
|
-
/**
|
|
601
|
-
* @param {string} hash
|
|
602
|
-
*/
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
setHash(hash) {}
|
|
606
|
-
/**
|
|
607
|
-
* @param {string} action
|
|
608
|
-
*/
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
executeNamedAction(action) {}
|
|
612
|
-
/**
|
|
613
|
-
* @param {number} pageNum - page number.
|
|
614
|
-
* @param {Object} pageRef - reference to the page.
|
|
615
|
-
*/
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
cachePageRef(pageNum, pageRef) {}
|
|
619
|
-
/**
|
|
620
|
-
* @param {number} pageNumber
|
|
621
|
-
*/
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
isPageVisible(pageNumber) {
|
|
625
|
-
return true;
|
|
626
|
-
}
|
|
627
|
-
/**
|
|
628
|
-
* @param {number} pageNumber
|
|
629
|
-
*/
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
isPageCached(pageNumber) {
|
|
633
|
-
return true;
|
|
634
|
-
}
|
|
635
|
-
|
|
479
|
+
class SimpleLinkService extends PDFLinkService {
|
|
480
|
+
setDocument(pdfDocument, baseUrl = null) {}
|
|
636
481
|
}
|
|
637
482
|
|
|
638
|
-
export { PDFLinkService, SimpleLinkService };
|
|
483
|
+
export { LinkTarget, PDFLinkService, SimpleLinkService };
|