pdfjs-dist 2.6.347 → 2.7.570

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.

Potentially problematic release.


This version of pdfjs-dist might be problematic. Click here for more details.

Files changed (158) hide show
  1. package/README.md +3 -3
  2. package/bower.json +1 -1
  3. package/build/pdf.js +2050 -1087
  4. package/build/pdf.js.map +1 -1
  5. package/build/pdf.min.js +1 -1
  6. package/build/pdf.worker.js +18219 -10436
  7. package/build/pdf.worker.js.map +1 -1
  8. package/build/pdf.worker.min.js +1 -1
  9. package/es5/build/pdf.d.ts +1 -0
  10. package/es5/build/pdf.js +6623 -6654
  11. package/es5/build/pdf.js.map +1 -1
  12. package/es5/build/pdf.min.js +1 -1
  13. package/es5/build/pdf.worker.js +20815 -13888
  14. package/es5/build/pdf.worker.js.map +1 -1
  15. package/es5/build/pdf.worker.min.js +1 -1
  16. package/es5/image_decoders/pdf.image_decoders.js +3817 -4946
  17. package/es5/image_decoders/pdf.image_decoders.js.map +1 -1
  18. package/es5/image_decoders/pdf.image_decoders.min.js +1 -1
  19. package/es5/web/pdf_viewer.css +18 -15
  20. package/es5/web/pdf_viewer.js +1094 -514
  21. package/es5/web/pdf_viewer.js.map +1 -1
  22. package/image_decoders/pdf.image_decoders.js +774 -168
  23. package/image_decoders/pdf.image_decoders.js.map +1 -1
  24. package/image_decoders/pdf.image_decoders.min.js +1 -1
  25. package/lib/core/annotation.js +556 -108
  26. package/lib/core/cff_parser.js +7 -1
  27. package/lib/core/charsets.js +1 -1
  28. package/lib/core/cmap.js +20 -1
  29. package/lib/core/core_utils.js +162 -3
  30. package/lib/core/crypto.js +1 -1
  31. package/lib/core/default_appearance.js +132 -0
  32. package/lib/core/document.js +115 -9
  33. package/lib/core/encodings.js +1 -1
  34. package/lib/core/evaluator.js +168 -74
  35. package/lib/core/fonts.js +97 -11
  36. package/lib/core/function.js +5 -10
  37. package/lib/core/glyphlist.js +11 -4529
  38. package/lib/core/image_utils.js +30 -1
  39. package/lib/core/jpg.js +1 -1
  40. package/lib/core/jpx.js +5 -5
  41. package/lib/core/murmurhash3.js +1 -1
  42. package/lib/core/obj.js +123 -39
  43. package/lib/core/pattern.js +4 -4
  44. package/lib/core/primitives.js +24 -5
  45. package/lib/core/standard_fonts.js +1 -1
  46. package/lib/core/stream.js +5 -1
  47. package/lib/core/unicode.js +15 -1387
  48. package/lib/core/worker.js +58 -17
  49. package/lib/core/writer.js +68 -4
  50. package/lib/display/annotation_layer.js +712 -119
  51. package/lib/display/annotation_storage.js +21 -4
  52. package/lib/display/api.js +88 -18
  53. package/lib/display/canvas.js +414 -375
  54. package/lib/display/display_utils.js +11 -4
  55. package/lib/display/fetch_stream.js +3 -3
  56. package/lib/display/font_loader.js +2 -3
  57. package/lib/display/metadata.js +54 -20
  58. package/lib/display/node_stream.js +1 -1
  59. package/lib/display/optional_content_config.js +1 -1
  60. package/lib/display/pattern_helper.js +109 -113
  61. package/lib/display/svg.js +5 -5
  62. package/lib/display/text_layer.js +54 -54
  63. package/lib/display/transport_stream.js +4 -4
  64. package/lib/display/webgl.js +65 -68
  65. package/lib/examples/node/domstubs.js +9 -4
  66. package/lib/pdf.js +2 -2
  67. package/lib/pdf.sandbox.js +311 -0
  68. package/lib/pdf.worker.js +2 -2
  69. package/lib/shared/scripting_utils.js +84 -0
  70. package/lib/shared/util.js +129 -14
  71. package/lib/{display → shared}/xml_parser.js +112 -4
  72. package/lib/test/unit/annotation_spec.js +831 -109
  73. package/lib/test/unit/annotation_storage_spec.js +28 -10
  74. package/lib/test/unit/api_spec.js +190 -160
  75. package/lib/test/unit/bidi_spec.js +6 -6
  76. package/lib/test/unit/cff_parser_spec.js +73 -73
  77. package/lib/test/unit/clitests_helper.js +2 -0
  78. package/lib/test/unit/cmap_spec.js +48 -74
  79. package/lib/test/unit/core_utils_spec.js +34 -0
  80. package/lib/test/unit/crypto_spec.js +162 -199
  81. package/lib/test/unit/custom_spec.js +7 -18
  82. package/lib/test/unit/default_appearance_spec.js +54 -0
  83. package/lib/test/unit/display_svg_spec.js +24 -19
  84. package/lib/test/unit/display_utils_spec.js +1 -1
  85. package/lib/test/unit/document_spec.js +187 -20
  86. package/lib/test/unit/evaluator_spec.js +30 -30
  87. package/lib/test/unit/function_spec.js +165 -165
  88. package/lib/test/unit/jasmine-boot.js +52 -53
  89. package/lib/test/unit/metadata_spec.js +2 -2
  90. package/lib/test/unit/murmurhash3_spec.js +29 -16
  91. package/lib/test/unit/network_spec.js +21 -21
  92. package/lib/test/unit/pdf_find_controller_spec.js +131 -69
  93. package/lib/test/unit/pdf_find_utils_spec.js +10 -10
  94. package/lib/test/unit/scripting_spec.js +1104 -0
  95. package/lib/test/unit/stream_spec.js +8 -8
  96. package/lib/test/unit/test_utils.js +16 -19
  97. package/lib/test/unit/testreporter.js +11 -4
  98. package/lib/test/unit/type1_parser_spec.js +23 -23
  99. package/lib/test/unit/ui_utils_spec.js +78 -35
  100. package/lib/test/unit/unicode_spec.js +7 -7
  101. package/lib/test/unit/util_spec.js +26 -3
  102. package/lib/test/unit/writer_spec.js +16 -1
  103. package/lib/test/unit/xml_spec.js +117 -0
  104. package/lib/web/annotation_layer_builder.js +18 -6
  105. package/lib/web/app.js +579 -161
  106. package/lib/web/app_options.js +14 -0
  107. package/lib/web/base_tree_viewer.js +50 -0
  108. package/lib/web/base_viewer.js +350 -14
  109. package/lib/web/chromecom.js +9 -1
  110. package/lib/web/debugger.js +1 -2
  111. package/lib/web/download_manager.js +0 -15
  112. package/lib/web/firefox_print_service.js +6 -4
  113. package/lib/web/firefoxcom.js +84 -69
  114. package/lib/web/generic_scripting.js +55 -0
  115. package/lib/web/genericcom.js +9 -1
  116. package/lib/web/grab_to_pan.js +1 -1
  117. package/lib/web/interfaces.js +9 -3
  118. package/lib/web/pdf_attachment_viewer.js +1 -3
  119. package/lib/web/pdf_cursor_tools.js +20 -13
  120. package/lib/web/pdf_document_properties.js +48 -61
  121. package/lib/web/pdf_find_bar.js +1 -3
  122. package/lib/web/pdf_find_controller.js +58 -12
  123. package/lib/web/pdf_history.js +43 -21
  124. package/lib/web/pdf_layer_viewer.js +1 -9
  125. package/lib/web/pdf_link_service.js +108 -78
  126. package/lib/web/pdf_outline_viewer.js +166 -10
  127. package/lib/web/pdf_page_view.js +14 -14
  128. package/lib/web/pdf_presentation_mode.js +21 -31
  129. package/lib/web/pdf_rendering_queue.js +8 -1
  130. package/lib/web/pdf_sidebar.js +62 -107
  131. package/lib/web/pdf_sidebar_resizer.js +11 -21
  132. package/lib/web/pdf_single_page_viewer.js +8 -0
  133. package/lib/web/pdf_thumbnail_view.js +26 -26
  134. package/lib/web/pdf_thumbnail_viewer.js +13 -2
  135. package/lib/web/pdf_viewer.component.js +2 -2
  136. package/lib/web/pdf_viewer.js +3 -1
  137. package/lib/web/preferences.js +33 -44
  138. package/lib/web/text_layer_builder.js +2 -9
  139. package/lib/web/ui_utils.js +78 -46
  140. package/lib/web/viewer_compatibility.js +1 -2
  141. package/package.json +4 -1
  142. package/types/display/annotation_layer.d.ts +18 -3
  143. package/types/display/api.d.ts +110 -54
  144. package/types/display/canvas.d.ts +1 -1
  145. package/types/display/display_utils.d.ts +96 -95
  146. package/types/display/fetch_stream.d.ts +2 -2
  147. package/types/display/metadata.d.ts +4 -0
  148. package/types/display/pattern_helper.d.ts +1 -1
  149. package/types/display/text_layer.d.ts +7 -7
  150. package/types/display/transport_stream.d.ts +1 -1
  151. package/types/shared/scripting_utils.d.ts +12 -0
  152. package/types/shared/util.d.ts +281 -250
  153. package/types/shared/xml_parser.d.ts +64 -0
  154. package/web/pdf_viewer.css +18 -15
  155. package/web/pdf_viewer.js +809 -408
  156. package/web/pdf_viewer.js.map +1 -1
  157. package/webpack.js +1 -1
  158. package/types/display/xml_parser.d.ts +0 -35
@@ -64,6 +64,10 @@ const defaultOptions = {
64
64
  value: false,
65
65
  kind: OptionKind.VIEWER + OptionKind.PREFERENCE
66
66
  },
67
+ enableScripting: {
68
+ value: false,
69
+ kind: OptionKind.VIEWER + OptionKind.PREFERENCE
70
+ },
67
71
  enableWebGL: {
68
72
  value: false,
69
73
  kind: OptionKind.VIEWER + OptionKind.PREFERENCE
@@ -129,6 +133,10 @@ const defaultOptions = {
129
133
  value: false,
130
134
  kind: OptionKind.VIEWER + OptionKind.PREFERENCE
131
135
  },
136
+ viewerCssTheme: {
137
+ value: 0,
138
+ kind: OptionKind.VIEWER + OptionKind.PREFERENCE
139
+ },
132
140
  viewOnLoad: {
133
141
  value: 0,
134
142
  kind: OptionKind.VIEWER + OptionKind.PREFERENCE
@@ -249,6 +257,12 @@ class AppOptions {
249
257
  userOptions[name] = value;
250
258
  }
251
259
 
260
+ static setAll(options) {
261
+ for (const name in options) {
262
+ userOptions[name] = options[name];
263
+ }
264
+ }
265
+
252
266
  static remove(name) {
253
267
  delete userOptions[name];
254
268
  }
@@ -28,6 +28,9 @@ exports.BaseTreeViewer = void 0;
28
28
 
29
29
  var _pdf = require("../pdf");
30
30
 
31
+ const TREEITEM_OFFSET_TOP = -100;
32
+ const TREEITEM_SELECTED_CLASS = "selected";
33
+
31
34
  class BaseTreeViewer {
32
35
  constructor(options) {
33
36
  if (this.constructor === BaseTreeViewer) {
@@ -40,7 +43,9 @@ class BaseTreeViewer {
40
43
  }
41
44
 
42
45
  reset() {
46
+ this._pdfDocument = null;
43
47
  this._lastToggleIsShow = true;
48
+ this._currentTreeItem = null;
44
49
  this.container.textContent = "";
45
50
  this.container.classList.remove("treeWithDeepNesting");
46
51
  }
@@ -91,10 +96,55 @@ class BaseTreeViewer {
91
96
  this._toggleTreeItem(this.container, !this._lastToggleIsShow);
92
97
  }
93
98
 
99
+ _finishRendering(fragment, count, hasAnyNesting = false) {
100
+ if (hasAnyNesting) {
101
+ this.container.classList.add("treeWithDeepNesting");
102
+ this._lastToggleIsShow = !fragment.querySelector(".treeItemsHidden");
103
+ }
104
+
105
+ this.container.appendChild(fragment);
106
+
107
+ this._dispatchEvent(count);
108
+ }
109
+
94
110
  render(params) {
95
111
  throw new Error("Not implemented: render");
96
112
  }
97
113
 
114
+ _updateCurrentTreeItem(treeItem = null) {
115
+ if (this._currentTreeItem) {
116
+ this._currentTreeItem.classList.remove(TREEITEM_SELECTED_CLASS);
117
+
118
+ this._currentTreeItem = null;
119
+ }
120
+
121
+ if (treeItem) {
122
+ treeItem.classList.add(TREEITEM_SELECTED_CLASS);
123
+ this._currentTreeItem = treeItem;
124
+ }
125
+ }
126
+
127
+ _scrollToCurrentTreeItem(treeItem) {
128
+ if (!treeItem) {
129
+ return;
130
+ }
131
+
132
+ let currentNode = treeItem.parentNode;
133
+
134
+ while (currentNode && currentNode !== this.container) {
135
+ if (currentNode.classList.contains("treeItem")) {
136
+ const toggler = currentNode.firstElementChild;
137
+ toggler?.classList.remove("treeItemsHidden");
138
+ }
139
+
140
+ currentNode = currentNode.parentNode;
141
+ }
142
+
143
+ this._updateCurrentTreeItem(treeItem);
144
+
145
+ this.container.scrollTo(treeItem.offsetLeft, treeItem.offsetTop + TREEITEM_OFFSET_TOP);
146
+ }
147
+
98
148
  }
99
149
 
100
150
  exports.BaseTreeViewer = BaseTreeViewer;
@@ -26,14 +26,14 @@ Object.defineProperty(exports, "__esModule", {
26
26
  });
27
27
  exports.BaseViewer = void 0;
28
28
 
29
+ var _pdf = require("../pdf");
30
+
29
31
  var _ui_utils = require("./ui_utils.js");
30
32
 
31
33
  var _pdf_rendering_queue = require("./pdf_rendering_queue.js");
32
34
 
33
35
  var _annotation_layer_builder = require("./annotation_layer_builder.js");
34
36
 
35
- var _pdf = require("../pdf");
36
-
37
37
  var _pdf_page_view = require("./pdf_page_view.js");
38
38
 
39
39
  var _pdf_link_service = require("./pdf_link_service.js");
@@ -78,6 +78,10 @@ function PDFPageViewBuffer(size) {
78
78
  data.shift().destroy();
79
79
  }
80
80
  };
81
+
82
+ this.has = function (view) {
83
+ return data.includes(view);
84
+ };
81
85
  }
82
86
 
83
87
  function isSameScale(oldScale, newScale) {
@@ -98,14 +102,24 @@ class BaseViewer {
98
102
  throw new Error("Cannot initialize BaseViewer.");
99
103
  }
100
104
 
105
+ const viewerVersion = '2.7.570';
106
+
107
+ if (_pdf.version !== viewerVersion) {
108
+ throw new Error(`The API version "${_pdf.version}" does not match the Viewer version "${viewerVersion}".`);
109
+ }
110
+
101
111
  this._name = this.constructor.name;
102
112
  this.container = options.container;
103
113
  this.viewer = options.viewer || options.container.firstElementChild;
104
114
 
105
- if (!(this.container instanceof HTMLDivElement && this.viewer instanceof HTMLDivElement)) {
115
+ if (!(this.container?.tagName.toUpperCase() === "DIV" && this.viewer?.tagName.toUpperCase() === "DIV")) {
106
116
  throw new Error("Invalid `container` and/or `viewer` option.");
107
117
  }
108
118
 
119
+ if (getComputedStyle(this.container).position !== "absolute") {
120
+ throw new Error("The `container` must be absolutely positioned.");
121
+ }
122
+
109
123
  this.eventBus = options.eventBus;
110
124
  this.linkService = options.linkService || new _pdf_link_service.SimpleLinkService();
111
125
  this.downloadManager = options.downloadManager || null;
@@ -120,6 +134,8 @@ class BaseViewer {
120
134
  this.useOnlyCssZoom = options.useOnlyCssZoom || false;
121
135
  this.maxCanvasPixels = options.maxCanvasPixels;
122
136
  this.l10n = options.l10n || _ui_utils.NullL10n;
137
+ this.enableScripting = options.enableScripting || false;
138
+ this._mouseState = options.mouseState || null;
123
139
  this.defaultRenderingQueue = !options.renderingQueue;
124
140
 
125
141
  if (this.defaultRenderingQueue) {
@@ -195,11 +211,13 @@ class BaseViewer {
195
211
  return false;
196
212
  }
197
213
 
214
+ const previous = this._currentPageNumber;
198
215
  this._currentPageNumber = val;
199
216
  this.eventBus.dispatch("pagechanging", {
200
217
  source: this,
201
218
  pageNumber: val,
202
- pageLabel: this._pageLabels && this._pageLabels[val - 1]
219
+ pageLabel: this._pageLabels && this._pageLabels[val - 1],
220
+ previous
203
221
  });
204
222
 
205
223
  if (resetCurrentPageView) {
@@ -327,6 +345,10 @@ class BaseViewer {
327
345
 
328
346
  setDocument(pdfDocument) {
329
347
  if (this.pdfDocument) {
348
+ this.eventBus.dispatch("pagesdestroy", {
349
+ source: this
350
+ });
351
+
330
352
  this._cancelRendering();
331
353
 
332
354
  this._resetView();
@@ -344,7 +366,6 @@ class BaseViewer {
344
366
 
345
367
  const pagesCount = pdfDocument.numPages;
346
368
  const firstPagePromise = pdfDocument.getPage(1);
347
- const annotationStorage = pdfDocument.annotationStorage;
348
369
  const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig();
349
370
 
350
371
  this._pagesCapability.promise.then(() => {
@@ -397,7 +418,6 @@ class BaseViewer {
397
418
  id: pageNum,
398
419
  scale,
399
420
  defaultViewport: viewport.clone(),
400
- annotationStorage,
401
421
  optionalContentConfigPromise,
402
422
  renderingQueue: this.renderingQueue,
403
423
  textLayerFactory,
@@ -409,7 +429,8 @@ class BaseViewer {
409
429
  enableWebGL: this.enableWebGL,
410
430
  useOnlyCssZoom: this.useOnlyCssZoom,
411
431
  maxCanvasPixels: this.maxCanvasPixels,
412
- l10n: this.l10n
432
+ l10n: this.l10n,
433
+ enableScripting: this.enableScripting
413
434
  });
414
435
 
415
436
  this._pages.push(pageView);
@@ -530,6 +551,8 @@ class BaseViewer {
530
551
  this._onAfterDraw = null;
531
552
  }
532
553
 
554
+ this._resetScriptingEvents();
555
+
533
556
  this.viewer.textContent = "";
534
557
 
535
558
  this._updateScrollMode();
@@ -601,6 +624,14 @@ class BaseViewer {
601
624
  }
602
625
  }
603
626
 
627
+ get _pageWidthScaleFactor() {
628
+ if (this.spreadMode !== _ui_utils.SpreadMode.NONE && this.scrollMode !== _ui_utils.ScrollMode.HORIZONTAL && !this.isInPresentationMode) {
629
+ return 2;
630
+ }
631
+
632
+ return 1;
633
+ }
634
+
604
635
  _setScale(value, noScroll = false) {
605
636
  let scale = parseFloat(value);
606
637
 
@@ -621,7 +652,7 @@ class BaseViewer {
621
652
  [hPadding, vPadding] = [vPadding, hPadding];
622
653
  }
623
654
 
624
- const pageWidthScale = (this.container.clientWidth - hPadding) / currentPage.width * currentPage.scale;
655
+ const pageWidthScale = (this.container.clientWidth - hPadding) / currentPage.width * currentPage.scale / this._pageWidthScaleFactor;
625
656
  const pageHeightScale = (this.container.clientHeight - vPadding) / currentPage.height * currentPage.scale;
626
657
 
627
658
  switch (value) {
@@ -667,6 +698,20 @@ class BaseViewer {
667
698
  });
668
699
  }
669
700
 
701
+ pageLabelToPageNumber(label) {
702
+ if (!this._pageLabels) {
703
+ return null;
704
+ }
705
+
706
+ const i = this._pageLabels.indexOf(label);
707
+
708
+ if (i < 0) {
709
+ return null;
710
+ }
711
+
712
+ return i + 1;
713
+ }
714
+
670
715
  scrollPageIntoView({
671
716
  pageNumber,
672
717
  destArray = null,
@@ -723,6 +768,8 @@ class BaseViewer {
723
768
  if (y === null && this._location) {
724
769
  x = this._location.left;
725
770
  y = this._location.top;
771
+ } else if (typeof y !== "number") {
772
+ y = pageHeight;
726
773
  }
727
774
 
728
775
  break;
@@ -853,6 +900,10 @@ class BaseViewer {
853
900
  return this.isInPresentationMode ? false : this._scrollMode === _ui_utils.ScrollMode.HORIZONTAL;
854
901
  }
855
902
 
903
+ get _isContainerRtl() {
904
+ return getComputedStyle(this.container).direction === "rtl";
905
+ }
906
+
856
907
  get isInPresentationMode() {
857
908
  return this.presentationModeState === _ui_utils.PresentationModeState.FULLSCREEN;
858
909
  }
@@ -892,7 +943,13 @@ class BaseViewer {
892
943
  }
893
944
 
894
945
  _getVisiblePages() {
895
- return (0, _ui_utils.getVisibleElements)(this.container, this._pages, true, this._isScrollModeHorizontal);
946
+ return (0, _ui_utils.getVisibleElements)({
947
+ scrollEl: this.container,
948
+ views: this._pages,
949
+ sortByVisibility: true,
950
+ horizontal: this._isScrollModeHorizontal,
951
+ rtl: this._isScrollModeHorizontal && this._isContainerRtl
952
+ });
896
953
  }
897
954
 
898
955
  isPageVisible(pageNumber) {
@@ -900,8 +957,8 @@ class BaseViewer {
900
957
  return false;
901
958
  }
902
959
 
903
- if (pageNumber < 1 || pageNumber > this.pagesCount) {
904
- console.error(`${this._name}.isPageVisible: "${pageNumber}" is out of bounds.`);
960
+ if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.pagesCount)) {
961
+ console.error(`${this._name}.isPageVisible: "${pageNumber}" is not a valid page.`);
905
962
  return false;
906
963
  }
907
964
 
@@ -910,6 +967,25 @@ class BaseViewer {
910
967
  });
911
968
  }
912
969
 
970
+ isPageCached(pageNumber) {
971
+ if (!this.pdfDocument || !this._buffer) {
972
+ return false;
973
+ }
974
+
975
+ if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.pagesCount)) {
976
+ console.error(`${this._name}.isPageCached: "${pageNumber}" is not a valid page.`);
977
+ return false;
978
+ }
979
+
980
+ const pageView = this._pages[pageNumber - 1];
981
+
982
+ if (!pageView) {
983
+ return false;
984
+ }
985
+
986
+ return this._buffer.has(pageView);
987
+ }
988
+
913
989
  cleanup() {
914
990
  for (let i = 0, ii = this._pages.length; i < ii; i++) {
915
991
  if (this._pages[i] && this._pages[i].renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {
@@ -982,16 +1058,19 @@ class BaseViewer {
982
1058
  });
983
1059
  }
984
1060
 
985
- createAnnotationLayerBuilder(pageDiv, pdfPage, annotationStorage = null, imageResourcesPath = "", renderInteractiveForms = false, l10n = _ui_utils.NullL10n) {
1061
+ createAnnotationLayerBuilder(pageDiv, pdfPage, annotationStorage = null, imageResourcesPath = "", renderInteractiveForms = false, l10n = _ui_utils.NullL10n, enableScripting = false, hasJSActionsPromise = null, mouseState = null) {
986
1062
  return new _annotation_layer_builder.AnnotationLayerBuilder({
987
1063
  pageDiv,
988
1064
  pdfPage,
989
- annotationStorage,
1065
+ annotationStorage: annotationStorage || this.pdfDocument?.annotationStorage,
990
1066
  imageResourcesPath,
991
1067
  renderInteractiveForms,
992
1068
  linkService: this.linkService,
993
1069
  downloadManager: this.downloadManager,
994
- l10n
1070
+ l10n,
1071
+ enableScripting,
1072
+ hasJSActionsPromise: hasJSActionsPromise || this.pdfDocument?.hasJSActions(),
1073
+ mouseState: mouseState || this._mouseState
995
1074
  });
996
1075
  }
997
1076
 
@@ -1174,11 +1253,268 @@ class BaseViewer {
1174
1253
  return;
1175
1254
  }
1176
1255
 
1256
+ if (this._currentScaleValue && isNaN(this._currentScaleValue)) {
1257
+ this._setScale(this._currentScaleValue, true);
1258
+ }
1259
+
1177
1260
  this._setCurrentPageNumber(pageNumber, true);
1178
1261
 
1179
1262
  this.update();
1180
1263
  }
1181
1264
 
1265
+ _getPageAdvance(currentPageNumber, previous = false) {
1266
+ if (this.isInPresentationMode) {
1267
+ return 1;
1268
+ }
1269
+
1270
+ switch (this._scrollMode) {
1271
+ case _ui_utils.ScrollMode.WRAPPED:
1272
+ {
1273
+ const {
1274
+ views
1275
+ } = this._getVisiblePages(),
1276
+ pageLayout = new Map();
1277
+
1278
+ for (const {
1279
+ id,
1280
+ y,
1281
+ percent,
1282
+ widthPercent
1283
+ } of views) {
1284
+ if (percent === 0 || widthPercent < 100) {
1285
+ continue;
1286
+ }
1287
+
1288
+ let yArray = pageLayout.get(y);
1289
+
1290
+ if (!yArray) {
1291
+ pageLayout.set(y, yArray || (yArray = []));
1292
+ }
1293
+
1294
+ yArray.push(id);
1295
+ }
1296
+
1297
+ for (const yArray of pageLayout.values()) {
1298
+ const currentIndex = yArray.indexOf(currentPageNumber);
1299
+
1300
+ if (currentIndex === -1) {
1301
+ continue;
1302
+ }
1303
+
1304
+ const numPages = yArray.length;
1305
+
1306
+ if (numPages === 1) {
1307
+ break;
1308
+ }
1309
+
1310
+ if (previous) {
1311
+ for (let i = currentIndex - 1, ii = 0; i >= ii; i--) {
1312
+ const currentId = yArray[i],
1313
+ expectedId = yArray[i + 1] - 1;
1314
+
1315
+ if (currentId < expectedId) {
1316
+ return currentPageNumber - expectedId;
1317
+ }
1318
+ }
1319
+ } else {
1320
+ for (let i = currentIndex + 1, ii = numPages; i < ii; i++) {
1321
+ const currentId = yArray[i],
1322
+ expectedId = yArray[i - 1] + 1;
1323
+
1324
+ if (currentId > expectedId) {
1325
+ return expectedId - currentPageNumber;
1326
+ }
1327
+ }
1328
+ }
1329
+
1330
+ if (previous) {
1331
+ const firstId = yArray[0];
1332
+
1333
+ if (firstId < currentPageNumber) {
1334
+ return currentPageNumber - firstId + 1;
1335
+ }
1336
+ } else {
1337
+ const lastId = yArray[numPages - 1];
1338
+
1339
+ if (lastId > currentPageNumber) {
1340
+ return lastId - currentPageNumber + 1;
1341
+ }
1342
+ }
1343
+
1344
+ break;
1345
+ }
1346
+
1347
+ break;
1348
+ }
1349
+
1350
+ case _ui_utils.ScrollMode.HORIZONTAL:
1351
+ {
1352
+ break;
1353
+ }
1354
+
1355
+ case _ui_utils.ScrollMode.VERTICAL:
1356
+ {
1357
+ if (this._spreadMode === _ui_utils.SpreadMode.NONE) {
1358
+ break;
1359
+ }
1360
+
1361
+ const parity = this._spreadMode - 1;
1362
+
1363
+ if (previous && currentPageNumber % 2 !== parity) {
1364
+ break;
1365
+ } else if (!previous && currentPageNumber % 2 === parity) {
1366
+ break;
1367
+ }
1368
+
1369
+ const {
1370
+ views
1371
+ } = this._getVisiblePages(),
1372
+ expectedId = previous ? currentPageNumber - 1 : currentPageNumber + 1;
1373
+
1374
+ for (const {
1375
+ id,
1376
+ percent,
1377
+ widthPercent
1378
+ } of views) {
1379
+ if (id !== expectedId) {
1380
+ continue;
1381
+ }
1382
+
1383
+ if (percent > 0 && widthPercent === 100) {
1384
+ return 2;
1385
+ }
1386
+
1387
+ break;
1388
+ }
1389
+
1390
+ break;
1391
+ }
1392
+ }
1393
+
1394
+ return 1;
1395
+ }
1396
+
1397
+ nextPage() {
1398
+ const currentPageNumber = this._currentPageNumber,
1399
+ pagesCount = this.pagesCount;
1400
+
1401
+ if (currentPageNumber >= pagesCount) {
1402
+ return false;
1403
+ }
1404
+
1405
+ const advance = this._getPageAdvance(currentPageNumber, false) || 1;
1406
+ this.currentPageNumber = Math.min(currentPageNumber + advance, pagesCount);
1407
+ return true;
1408
+ }
1409
+
1410
+ previousPage() {
1411
+ const currentPageNumber = this._currentPageNumber;
1412
+
1413
+ if (currentPageNumber <= 1) {
1414
+ return false;
1415
+ }
1416
+
1417
+ const advance = this._getPageAdvance(currentPageNumber, true) || 1;
1418
+ this.currentPageNumber = Math.max(currentPageNumber - advance, 1);
1419
+ return true;
1420
+ }
1421
+
1422
+ initializeScriptingEvents() {
1423
+ if (!this.enableScripting || this._pageOpenPendingSet) {
1424
+ return;
1425
+ }
1426
+
1427
+ const eventBus = this.eventBus,
1428
+ pageOpenPendingSet = this._pageOpenPendingSet = new Set(),
1429
+ scriptingEvents = this._scriptingEvents || (this._scriptingEvents = Object.create(null));
1430
+
1431
+ const dispatchPageClose = pageNumber => {
1432
+ if (pageOpenPendingSet.has(pageNumber)) {
1433
+ return;
1434
+ }
1435
+
1436
+ eventBus.dispatch("pageclose", {
1437
+ source: this,
1438
+ pageNumber
1439
+ });
1440
+ };
1441
+
1442
+ const dispatchPageOpen = pageNumber => {
1443
+ const pageView = this._pages[pageNumber - 1];
1444
+
1445
+ if (pageView?.renderingState === _pdf_rendering_queue.RenderingStates.FINISHED) {
1446
+ pageOpenPendingSet.delete(pageNumber);
1447
+ eventBus.dispatch("pageopen", {
1448
+ source: this,
1449
+ pageNumber,
1450
+ actionsPromise: pageView.pdfPage?.getJSActions()
1451
+ });
1452
+ } else {
1453
+ pageOpenPendingSet.add(pageNumber);
1454
+ }
1455
+ };
1456
+
1457
+ scriptingEvents.onPageChanging = ({
1458
+ pageNumber,
1459
+ previous
1460
+ }) => {
1461
+ if (pageNumber === previous) {
1462
+ return;
1463
+ }
1464
+
1465
+ dispatchPageClose(previous);
1466
+ dispatchPageOpen(pageNumber);
1467
+ };
1468
+
1469
+ eventBus._on("pagechanging", scriptingEvents.onPageChanging);
1470
+
1471
+ scriptingEvents.onPageRendered = ({
1472
+ pageNumber
1473
+ }) => {
1474
+ if (!pageOpenPendingSet.has(pageNumber)) {
1475
+ return;
1476
+ }
1477
+
1478
+ if (pageNumber !== this._currentPageNumber) {
1479
+ return;
1480
+ }
1481
+
1482
+ dispatchPageOpen(pageNumber);
1483
+ };
1484
+
1485
+ eventBus._on("pagerendered", scriptingEvents.onPageRendered);
1486
+
1487
+ scriptingEvents.onPagesDestroy = () => {
1488
+ dispatchPageClose(this._currentPageNumber);
1489
+ };
1490
+
1491
+ eventBus._on("pagesdestroy", scriptingEvents.onPagesDestroy);
1492
+
1493
+ dispatchPageOpen(this._currentPageNumber);
1494
+ }
1495
+
1496
+ _resetScriptingEvents() {
1497
+ if (!this.enableScripting || !this._pageOpenPendingSet) {
1498
+ return;
1499
+ }
1500
+
1501
+ const eventBus = this.eventBus,
1502
+ scriptingEvents = this._scriptingEvents;
1503
+
1504
+ eventBus._off("pagechanging", scriptingEvents.onPageChanging);
1505
+
1506
+ scriptingEvents.onPageChanging = null;
1507
+
1508
+ eventBus._off("pagerendered", scriptingEvents.onPageRendered);
1509
+
1510
+ scriptingEvents.onPageRendered = null;
1511
+
1512
+ eventBus._off("pagesdestroy", scriptingEvents.onPagesDestroy);
1513
+
1514
+ scriptingEvents.onPagesDestroy = null;
1515
+ this._pageOpenPendingSet = null;
1516
+ }
1517
+
1182
1518
  }
1183
1519
 
1184
1520
  exports.BaseViewer = BaseViewer;
@@ -36,6 +36,8 @@ var _download_manager = require("./download_manager.js");
36
36
 
37
37
  var _genericl10n = require("./genericl10n.js");
38
38
 
39
+ var _generic_scripting = require("./generic_scripting.js");
40
+
39
41
  {
40
42
  throw new Error('Module "pdfjs-web/chromecom" shall not be used outside CHROME build.');
41
43
  }
@@ -376,7 +378,7 @@ class ChromeExternalServices extends _app.DefaultExternalServices {
376
378
  }
377
379
 
378
380
  static createDownloadManager(options) {
379
- return new _download_manager.DownloadManager(options);
381
+ return new _download_manager.DownloadManager();
380
382
  }
381
383
 
382
384
  static createPreferences() {
@@ -387,6 +389,12 @@ class ChromeExternalServices extends _app.DefaultExternalServices {
387
389
  return new _genericl10n.GenericL10n(navigator.language);
388
390
  }
389
391
 
392
+ static createScripting({
393
+ sandboxBundleSrc
394
+ }) {
395
+ return new _generic_scripting.GenericScripting(sandboxBundleSrc);
396
+ }
397
+
390
398
  }
391
399
 
392
400
  _app.PDFViewerApplication.externalServices = ChromeExternalServices;
@@ -132,7 +132,7 @@ var FontInspector = function FontInspectorClosure() {
132
132
  var download = document.createElement("a");
133
133
 
134
134
  if (url) {
135
- url = /url\(['"]?([^\)"']+)/.exec(url);
135
+ url = /url\(['"]?([^)"']+)/.exec(url);
136
136
  download.href = url[1];
137
137
  } else if (fontObj.data) {
138
138
  download.href = URL.createObjectURL(new Blob([fontObj.data], {
@@ -415,7 +415,6 @@ var Stepper = function StepperClosure() {
415
415
  }
416
416
 
417
417
  if (operatorsToDisplay < operatorList.fnArray.length) {
418
- line = c("tr");
419
418
  var lastCell = c("td", "...");
420
419
  lastCell.colspan = 4;
421
420
  chunk.appendChild(lastCell);
@@ -61,26 +61,11 @@ class DownloadManager {
61
61
  }
62
62
 
63
63
  downloadData(data, filename, contentType) {
64
- if (navigator.msSaveBlob) {
65
- navigator.msSaveBlob(new Blob([data], {
66
- type: contentType
67
- }), filename);
68
- return;
69
- }
70
-
71
64
  const blobUrl = (0, _pdf.createObjectURL)(data, contentType, _viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL);
72
65
  download(blobUrl, filename);
73
66
  }
74
67
 
75
68
  download(blob, url, filename, sourceEventType = "download") {
76
- if (navigator.msSaveBlob) {
77
- if (!navigator.msSaveBlob(blob, filename)) {
78
- this.downloadUrl(url, filename);
79
- }
80
-
81
- return;
82
- }
83
-
84
69
  if (_viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL) {
85
70
  this.downloadUrl(url, filename);
86
71
  return;