@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.
@@ -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.pdfViewer.currentPageNumber = value;
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.pdfViewer.pagesRotation = value;
112
+ if (this.pdfDocument) {
113
+ this.pdfViewer.pagesRotation = value;
114
+ }
110
115
  }
116
+
111
117
  /**
112
- * @private
118
+ * @type {boolean}
113
119
  */
120
+ get isInPresentationMode() {
121
+ return this.pdfDocument ? this.pdfViewer.isInPresentationMode : false;
122
+ }
114
123
 
115
-
116
- _goToDestinationHelper(rawDest, namedDest = null, explicitDest) {
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[0];
119
- let pageNumber;
120
-
121
- if (typeof destRef === "object" && destRef !== null) {
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
- this.pdfDocument.getPageIndex(destRef).then(pageIndex => {
128
- this.cachePageRef(pageIndex + 1, destRef);
129
-
130
- this._goToDestinationHelper(rawDest, namedDest, explicitDest);
131
- }).catch(() => {
132
- console.error(`PDFLinkService._goToDestinationHelper: "${destRef}" is not ` + `a valid page reference, for dest="${rawDest}".`);
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(`PDFLinkService._goToDestinationHelper: "${pageNumber}" is not ` + `a valid page number, for dest="${rawDest}".`);
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 (this.baseUrl || "") + anchor;
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
- if ("search" in params) {
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: params.search.replace(/"/g, ""),
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 ("zoom" in params) {
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
- if (zoomArg === "Fit" || zoomArg === "FitB") {
299
- dest = [null, {
300
- name: zoomArg
301
- }];
302
- } else if (zoomArg === "FitH" || zoomArg === "FitBH" || zoomArg === "FitV" || zoomArg === "FitBV") {
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.length > 1 ? zoomArgs[1] | 0 : null];
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
- } // Ensure that this parameter is *always* handled last, in order to
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
- } else {
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
- console.error(`PDFLinkService.setHash: "${unescape(hash)}" is not ` + "a valid destination.");
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
- if (this.pdfHistory) {
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
- if (this.pdfHistory) {
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 {number} pageNum - page number.
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
- const refStr = pageRef.gen === 0 ? `${pageRef.num}R` : `${pageRef.num}R${pageRef.gen}`;
421
- this._pagesRefCache[refStr] = pageNum;
422
- }
423
- /**
424
- * @private
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
- let allowNull = true;
477
-
478
- switch (zoom.name) {
479
- case "XYZ":
480
- if (destLength !== 5) {
481
- return false;
482
- }
483
-
484
- break;
485
-
486
- case "Fit":
487
- case "FitB":
488
- return destLength === 2;
489
-
490
- case "FitH":
491
- case "FitBH":
492
- case "FitV":
493
- case "FitBV":
494
- if (destLength !== 3) {
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
- break;
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 };