pdfjs-dist 2.5.207 → 2.6.347

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 (133) hide show
  1. package/bower.json +1 -1
  2. package/build/pdf.js +867 -216
  3. package/build/pdf.js.map +1 -1
  4. package/build/pdf.min.js +1 -1
  5. package/build/pdf.worker.js +10214 -8547
  6. package/build/pdf.worker.js.map +1 -1
  7. package/build/pdf.worker.min.js +1 -1
  8. package/es5/build/pdf.js +2023 -1046
  9. package/es5/build/pdf.js.map +1 -1
  10. package/es5/build/pdf.min.js +22 -0
  11. package/es5/build/pdf.worker.js +11136 -8144
  12. package/es5/build/pdf.worker.js.map +1 -1
  13. package/es5/build/pdf.worker.min.js +22 -0
  14. package/es5/image_decoders/pdf.image_decoders.js +12529 -0
  15. package/es5/image_decoders/pdf.image_decoders.js.map +1 -0
  16. package/es5/image_decoders/pdf.image_decoders.min.js +22 -0
  17. package/es5/web/images/shadow.png +0 -0
  18. package/es5/web/pdf_viewer.css +8 -5
  19. package/es5/web/pdf_viewer.js +195 -51
  20. package/es5/web/pdf_viewer.js.map +1 -1
  21. package/image_decoders/pdf.image_decoders.js +24 -16
  22. package/image_decoders/pdf.image_decoders.js.map +1 -1
  23. package/image_decoders/pdf.image_decoders.min.js +1 -1
  24. package/lib/core/annotation.js +479 -43
  25. package/lib/core/cff_parser.js +643 -615
  26. package/lib/core/chunked_stream.js +64 -50
  27. package/lib/core/colorspace.js +126 -104
  28. package/lib/core/crypto.js +37 -0
  29. package/lib/core/document.js +128 -75
  30. package/lib/core/evaluator.js +3015 -2754
  31. package/lib/core/fonts.js +47 -46
  32. package/lib/core/function.js +79 -6
  33. package/lib/core/image.js +364 -357
  34. package/lib/core/image_utils.js +109 -8
  35. package/lib/core/jpg.js +8 -3
  36. package/lib/core/obj.js +255 -34
  37. package/lib/core/operator_list.js +17 -15
  38. package/lib/core/parser.js +40 -3
  39. package/lib/core/pattern.js +24 -11
  40. package/lib/core/primitives.js +112 -53
  41. package/lib/core/type1_parser.js +2 -0
  42. package/lib/core/worker.js +102 -37
  43. package/lib/core/writer.js +242 -0
  44. package/lib/display/annotation_layer.js +51 -10
  45. package/lib/display/annotation_storage.js +89 -0
  46. package/lib/display/api.js +140 -54
  47. package/lib/display/canvas.js +215 -46
  48. package/lib/display/display_utils.js +55 -18
  49. package/lib/display/fetch_stream.js +6 -0
  50. package/lib/display/font_loader.js +26 -15
  51. package/lib/display/metadata.js +1 -7
  52. package/lib/display/network.js +0 -14
  53. package/lib/display/node_utils.js +87 -0
  54. package/lib/display/optional_content_config.js +184 -0
  55. package/lib/display/svg.js +1 -1
  56. package/lib/display/text_layer.js +4 -1
  57. package/lib/pdf.js +2 -2
  58. package/lib/pdf.worker.js +2 -2
  59. package/lib/shared/is_node.js +1 -1
  60. package/lib/shared/util.js +13 -10
  61. package/lib/test/unit/annotation_spec.js +520 -50
  62. package/lib/test/unit/annotation_storage_spec.js +83 -0
  63. package/lib/test/unit/api_spec.js +16 -6
  64. package/lib/test/unit/cmap_spec.js +4 -4
  65. package/lib/test/unit/colorspace_spec.js +216 -24
  66. package/lib/test/unit/crypto_spec.js +51 -4
  67. package/lib/test/unit/custom_spec.js +129 -1
  68. package/lib/test/unit/document_spec.js +112 -1
  69. package/lib/test/unit/evaluator_spec.js +29 -10
  70. package/lib/test/unit/jasmine-boot.js +1 -1
  71. package/lib/test/unit/metadata_spec.js +3 -3
  72. package/lib/test/unit/primitives_spec.js +242 -63
  73. package/lib/test/unit/test_utils.js +42 -89
  74. package/lib/test/unit/testreporter.js +17 -6
  75. package/lib/test/unit/util_spec.js +13 -12
  76. package/lib/test/unit/writer_spec.js +84 -0
  77. package/lib/web/annotation_layer_builder.js +13 -9
  78. package/lib/web/app.js +231 -26
  79. package/lib/web/app_options.js +1 -6
  80. package/lib/web/base_tree_viewer.js +100 -0
  81. package/lib/web/base_viewer.js +53 -4
  82. package/lib/web/download_manager.js +3 -10
  83. package/lib/web/firefox_print_service.js +32 -12
  84. package/lib/web/firefoxcom.js +20 -6
  85. package/lib/web/interfaces.js +1 -1
  86. package/lib/web/pdf_attachment_viewer.js +80 -38
  87. package/lib/web/pdf_find_controller.js +2 -1
  88. package/lib/web/pdf_layer_viewer.js +208 -0
  89. package/lib/web/pdf_outline_viewer.js +24 -57
  90. package/lib/web/pdf_page_view.js +29 -6
  91. package/lib/web/pdf_print_service.js +13 -11
  92. package/lib/web/pdf_sidebar.js +46 -25
  93. package/lib/web/pdf_thumbnail_view.js +16 -3
  94. package/lib/web/pdf_thumbnail_viewer.js +17 -1
  95. package/lib/web/pdf_viewer.component.js +2 -2
  96. package/lib/web/preferences.js +1 -1
  97. package/lib/web/toolbar.js +1 -1
  98. package/lib/web/ui_utils.js +7 -1
  99. package/package.json +3 -1
  100. package/types/display/annotation_layer.d.ts +61 -0
  101. package/types/display/annotation_storage.d.ts +36 -0
  102. package/types/display/api.d.ts +1107 -0
  103. package/types/display/api_compatibility.d.ts +1 -0
  104. package/types/display/canvas.d.ts +4 -0
  105. package/types/display/content_disposition.d.ts +7 -0
  106. package/types/display/display_utils.d.ts +243 -0
  107. package/types/display/fetch_stream.d.ts +67 -0
  108. package/types/display/font_loader.d.ts +19 -0
  109. package/types/display/metadata.d.ts +9 -0
  110. package/types/display/network.d.ts +80 -0
  111. package/types/display/network_utils.d.ts +14 -0
  112. package/types/display/node_stream.d.ts +72 -0
  113. package/types/display/node_utils.d.ts +6 -0
  114. package/types/display/optional_content_config.d.ts +12 -0
  115. package/types/display/pattern_helper.d.ts +5 -0
  116. package/types/display/svg.d.ts +2 -0
  117. package/types/display/text_layer.d.ts +83 -0
  118. package/types/display/transport_stream.d.ts +57 -0
  119. package/types/display/webgl.d.ts +20 -0
  120. package/types/display/worker_options.d.ts +27 -0
  121. package/types/display/xml_parser.d.ts +35 -0
  122. package/types/pdf.d.ts +33 -0
  123. package/types/shared/compatibility.d.ts +1 -0
  124. package/types/shared/is_node.d.ts +1 -0
  125. package/types/shared/message_handler.d.ts +62 -0
  126. package/types/shared/util.d.ts +421 -0
  127. package/web/images/shadow.png +0 -0
  128. package/web/pdf_viewer.css +8 -5
  129. package/web/pdf_viewer.js +109 -33
  130. package/web/pdf_viewer.js.map +1 -1
  131. package/webpack.js +1 -9
  132. package/es5/web/images/texture.png +0 -0
  133. package/web/images/texture.png +0 -0
@@ -0,0 +1,242 @@
1
+ /**
2
+ * @licstart The following is the entire license notice for the
3
+ * Javascript code in this page
4
+ *
5
+ * Copyright 2020 Mozilla Foundation
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ *
19
+ * @licend The above is the entire license notice for the
20
+ * Javascript code in this page
21
+ */
22
+ "use strict";
23
+
24
+ Object.defineProperty(exports, "__esModule", {
25
+ value: true
26
+ });
27
+ exports.writeDict = writeDict;
28
+ exports.incrementalUpdate = incrementalUpdate;
29
+
30
+ var _util = require("../shared/util.js");
31
+
32
+ var _primitives = require("./primitives.js");
33
+
34
+ var _crypto = require("./crypto.js");
35
+
36
+ function writeDict(dict, buffer, transform) {
37
+ buffer.push("<<");
38
+
39
+ for (const key of dict.getKeys()) {
40
+ buffer.push(` /${key} `);
41
+ writeValue(dict.getRaw(key), buffer, transform);
42
+ }
43
+
44
+ buffer.push(">>");
45
+ }
46
+
47
+ function writeStream(stream, buffer, transform) {
48
+ writeDict(stream.dict, buffer, transform);
49
+ buffer.push(" stream\n");
50
+ let string = (0, _util.bytesToString)(stream.getBytes());
51
+
52
+ if (transform !== null) {
53
+ string = transform.encryptString(string);
54
+ }
55
+
56
+ buffer.push(string);
57
+ buffer.push("\nendstream\n");
58
+ }
59
+
60
+ function writeArray(array, buffer, transform) {
61
+ buffer.push("[");
62
+ let first = true;
63
+
64
+ for (const val of array) {
65
+ if (!first) {
66
+ buffer.push(" ");
67
+ } else {
68
+ first = false;
69
+ }
70
+
71
+ writeValue(val, buffer, transform);
72
+ }
73
+
74
+ buffer.push("]");
75
+ }
76
+
77
+ function numberToString(value) {
78
+ if (Number.isInteger(value)) {
79
+ return value.toString();
80
+ }
81
+
82
+ const roundedValue = Math.round(value * 100);
83
+
84
+ if (roundedValue % 100 === 0) {
85
+ return (roundedValue / 100).toString();
86
+ }
87
+
88
+ if (roundedValue % 10 === 0) {
89
+ return value.toFixed(1);
90
+ }
91
+
92
+ return value.toFixed(2);
93
+ }
94
+
95
+ function writeValue(value, buffer, transform) {
96
+ if ((0, _primitives.isName)(value)) {
97
+ buffer.push(`/${value.name}`);
98
+ } else if ((0, _primitives.isRef)(value)) {
99
+ buffer.push(`${value.num} ${value.gen} R`);
100
+ } else if (Array.isArray(value)) {
101
+ writeArray(value, buffer, transform);
102
+ } else if (typeof value === "string") {
103
+ if (transform !== null) {
104
+ value = transform.encryptString(value);
105
+ }
106
+
107
+ buffer.push(`(${(0, _util.escapeString)(value)})`);
108
+ } else if (typeof value === "number") {
109
+ buffer.push(numberToString(value));
110
+ } else if ((0, _primitives.isDict)(value)) {
111
+ writeDict(value, buffer, transform);
112
+ } else if ((0, _primitives.isStream)(value)) {
113
+ writeStream(value, buffer, transform);
114
+ }
115
+ }
116
+
117
+ function writeInt(number, size, offset, buffer) {
118
+ for (let i = size + offset - 1; i > offset - 1; i--) {
119
+ buffer[i] = number & 0xff;
120
+ number >>= 8;
121
+ }
122
+
123
+ return offset + size;
124
+ }
125
+
126
+ function writeString(string, offset, buffer) {
127
+ for (let i = 0, len = string.length; i < len; i++) {
128
+ buffer[offset + i] = string.charCodeAt(i) & 0xff;
129
+ }
130
+ }
131
+
132
+ function computeMD5(filesize, xrefInfo) {
133
+ const time = Math.floor(Date.now() / 1000);
134
+ const filename = xrefInfo.filename || "";
135
+ const md5Buffer = [time.toString(), filename, filesize.toString()];
136
+ let md5BufferLen = md5Buffer.reduce((a, str) => a + str.length, 0);
137
+
138
+ for (const value of Object.values(xrefInfo.info)) {
139
+ md5Buffer.push(value);
140
+ md5BufferLen += value.length;
141
+ }
142
+
143
+ const array = new Uint8Array(md5BufferLen);
144
+ let offset = 0;
145
+
146
+ for (const str of md5Buffer) {
147
+ writeString(str, offset, array);
148
+ offset += str.length;
149
+ }
150
+
151
+ return (0, _util.bytesToString)((0, _crypto.calculateMD5)(array));
152
+ }
153
+
154
+ function incrementalUpdate(originalData, xrefInfo, newRefs) {
155
+ const newXref = new _primitives.Dict(null);
156
+ const refForXrefTable = xrefInfo.newRef;
157
+ let buffer, baseOffset;
158
+ const lastByte = originalData[originalData.length - 1];
159
+
160
+ if (lastByte === 0x0a || lastByte === 0x0d) {
161
+ buffer = [];
162
+ baseOffset = originalData.length;
163
+ } else {
164
+ buffer = ["\n"];
165
+ baseOffset = originalData.length + 1;
166
+ }
167
+
168
+ newXref.set("Size", refForXrefTable.num + 1);
169
+ newXref.set("Prev", xrefInfo.startXRef);
170
+ newXref.set("Type", _primitives.Name.get("XRef"));
171
+
172
+ if (xrefInfo.rootRef !== null) {
173
+ newXref.set("Root", xrefInfo.rootRef);
174
+ }
175
+
176
+ if (xrefInfo.infoRef !== null) {
177
+ newXref.set("Info", xrefInfo.infoRef);
178
+ }
179
+
180
+ if (xrefInfo.encrypt !== null) {
181
+ newXref.set("Encrypt", xrefInfo.encrypt);
182
+ }
183
+
184
+ newRefs.push({
185
+ ref: refForXrefTable,
186
+ data: ""
187
+ });
188
+ newRefs = newRefs.sort((a, b) => {
189
+ return a.ref.num - b.ref.num;
190
+ });
191
+ const xrefTableData = [[0, 1, 0xffff]];
192
+ const indexes = [0, 1];
193
+ let maxOffset = 0;
194
+
195
+ for (const {
196
+ ref,
197
+ data
198
+ } of newRefs) {
199
+ maxOffset = Math.max(maxOffset, baseOffset);
200
+ xrefTableData.push([1, baseOffset, Math.min(ref.gen, 0xffff)]);
201
+ baseOffset += data.length;
202
+ indexes.push(ref.num);
203
+ indexes.push(1);
204
+ buffer.push(data);
205
+ }
206
+
207
+ newXref.set("Index", indexes);
208
+
209
+ if (xrefInfo.fileIds.length !== 0) {
210
+ const md5 = computeMD5(baseOffset, xrefInfo);
211
+ newXref.set("ID", [xrefInfo.fileIds[0], md5]);
212
+ }
213
+
214
+ const offsetSize = Math.ceil(Math.log2(maxOffset) / 8);
215
+ const sizes = [1, offsetSize, 2];
216
+ const structSize = sizes[0] + sizes[1] + sizes[2];
217
+ const tableLength = structSize * xrefTableData.length;
218
+ newXref.set("W", sizes);
219
+ newXref.set("Length", tableLength);
220
+ buffer.push(`${refForXrefTable.num} ${refForXrefTable.gen} obj\n`);
221
+ writeDict(newXref, buffer, null);
222
+ buffer.push(" stream\n");
223
+ const bufferLen = buffer.reduce((a, str) => a + str.length, 0);
224
+ const footer = `\nendstream\nendobj\nstartxref\n${baseOffset}\n%%EOF\n`;
225
+ const array = new Uint8Array(originalData.length + bufferLen + tableLength + footer.length);
226
+ array.set(originalData);
227
+ let offset = originalData.length;
228
+
229
+ for (const str of buffer) {
230
+ writeString(str, offset, array);
231
+ offset += str.length;
232
+ }
233
+
234
+ for (const [type, objOffset, gen] of xrefTableData) {
235
+ offset = writeInt(type, sizes[0], offset, array);
236
+ offset = writeInt(objOffset, sizes[1], offset, array);
237
+ offset = writeInt(gen, sizes[2], offset, array);
238
+ }
239
+
240
+ writeString(footer, offset, array);
241
+ return array;
242
+ }
@@ -30,6 +30,8 @@ var _display_utils = require("./display_utils.js");
30
30
 
31
31
  var _util = require("../shared/util.js");
32
32
 
33
+ var _annotation_storage = require("./annotation_storage.js");
34
+
33
35
  class AnnotationElementFactory {
34
36
  static create(parameters) {
35
37
  const subtype = parameters.data.annotationType;
@@ -127,6 +129,7 @@ class AnnotationElement {
127
129
  this.imageResourcesPath = parameters.imageResourcesPath;
128
130
  this.renderInteractiveForms = parameters.renderInteractiveForms;
129
131
  this.svgFactory = parameters.svgFactory;
132
+ this.annotationStorage = parameters.annotationStorage;
130
133
 
131
134
  if (isRenderable) {
132
135
  this.container = this._createContainer(ignoreBorder);
@@ -333,19 +336,26 @@ class TextWidgetAnnotationElement extends WidgetAnnotationElement {
333
336
 
334
337
  render() {
335
338
  const TEXT_ALIGNMENT = ["left", "center", "right"];
339
+ const storage = this.annotationStorage;
340
+ const id = this.data.id;
336
341
  this.container.className = "textWidgetAnnotation";
337
342
  let element = null;
338
343
 
339
344
  if (this.renderInteractiveForms) {
345
+ const textContent = storage.getOrCreateValue(id, this.data.fieldValue);
346
+
340
347
  if (this.data.multiLine) {
341
348
  element = document.createElement("textarea");
342
- element.textContent = this.data.fieldValue;
349
+ element.textContent = textContent;
343
350
  } else {
344
351
  element = document.createElement("input");
345
352
  element.type = "text";
346
- element.setAttribute("value", this.data.fieldValue);
353
+ element.setAttribute("value", textContent);
347
354
  }
348
355
 
356
+ element.addEventListener("input", function (event) {
357
+ storage.setValue(id, event.target.value);
358
+ });
349
359
  element.disabled = this.data.readOnly;
350
360
  element.name = this.data.fieldName;
351
361
 
@@ -413,16 +423,23 @@ class CheckboxWidgetAnnotationElement extends WidgetAnnotationElement {
413
423
  }
414
424
 
415
425
  render() {
426
+ const storage = this.annotationStorage;
427
+ const data = this.data;
428
+ const id = data.id;
429
+ const value = storage.getOrCreateValue(id, data.fieldValue && data.fieldValue !== "Off");
416
430
  this.container.className = "buttonWidgetAnnotation checkBox";
417
431
  const element = document.createElement("input");
418
- element.disabled = this.data.readOnly;
432
+ element.disabled = data.readOnly;
419
433
  element.type = "checkbox";
420
434
  element.name = this.data.fieldName;
421
435
 
422
- if (this.data.fieldValue && this.data.fieldValue !== "Off") {
436
+ if (value) {
423
437
  element.setAttribute("checked", true);
424
438
  }
425
439
 
440
+ element.addEventListener("change", function (event) {
441
+ storage.setValue(id, event.target.checked);
442
+ });
426
443
  this.container.appendChild(element);
427
444
  return this.container;
428
445
  }
@@ -436,15 +453,30 @@ class RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement {
436
453
 
437
454
  render() {
438
455
  this.container.className = "buttonWidgetAnnotation radioButton";
456
+ const storage = this.annotationStorage;
457
+ const data = this.data;
458
+ const id = data.id;
459
+ const value = storage.getOrCreateValue(id, data.fieldValue === data.buttonValue);
439
460
  const element = document.createElement("input");
440
- element.disabled = this.data.readOnly;
461
+ element.disabled = data.readOnly;
441
462
  element.type = "radio";
442
- element.name = this.data.fieldName;
463
+ element.name = data.fieldName;
443
464
 
444
- if (this.data.fieldValue === this.data.buttonValue) {
465
+ if (value) {
445
466
  element.setAttribute("checked", true);
446
467
  }
447
468
 
469
+ element.addEventListener("change", function (event) {
470
+ const name = event.target.name;
471
+
472
+ for (const radio of document.getElementsByName(name)) {
473
+ if (radio !== event.target) {
474
+ storage.setValue(radio.parentNode.getAttribute("data-annotation-id"), false);
475
+ }
476
+ }
477
+
478
+ storage.setValue(id, event.target.checked);
479
+ });
448
480
  this.container.appendChild(element);
449
481
  return this.container;
450
482
  }
@@ -467,6 +499,9 @@ class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement {
467
499
 
468
500
  render() {
469
501
  this.container.className = "choiceWidgetAnnotation";
502
+ const storage = this.annotationStorage;
503
+ const id = this.data.id;
504
+ storage.getOrCreateValue(id, this.data.fieldValue.length > 0 ? this.data.fieldValue[0] : null);
470
505
  const selectElement = document.createElement("select");
471
506
  selectElement.disabled = this.data.readOnly;
472
507
  selectElement.name = this.data.fieldName;
@@ -484,13 +519,18 @@ class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement {
484
519
  optionElement.textContent = option.displayValue;
485
520
  optionElement.value = option.exportValue;
486
521
 
487
- if (this.data.fieldValue.includes(option.displayValue)) {
522
+ if (this.data.fieldValue.includes(option.exportValue)) {
488
523
  optionElement.setAttribute("selected", true);
489
524
  }
490
525
 
491
526
  selectElement.appendChild(optionElement);
492
527
  }
493
528
 
529
+ selectElement.addEventListener("input", function (event) {
530
+ const options = event.target.options;
531
+ const value = options[options.selectedIndex].value;
532
+ storage.setValue(id, value);
533
+ });
494
534
  this.container.appendChild(selectElement);
495
535
  return this.container;
496
536
  }
@@ -1024,8 +1064,9 @@ class AnnotationLayer {
1024
1064
  linkService: parameters.linkService,
1025
1065
  downloadManager: parameters.downloadManager,
1026
1066
  imageResourcesPath: parameters.imageResourcesPath || "",
1027
- renderInteractiveForms: parameters.renderInteractiveForms || false,
1028
- svgFactory: new _display_utils.DOMSVGFactory()
1067
+ renderInteractiveForms: typeof parameters.renderInteractiveForms === "boolean" ? parameters.renderInteractiveForms : true,
1068
+ svgFactory: new _display_utils.DOMSVGFactory(),
1069
+ annotationStorage: parameters.annotationStorage || new _annotation_storage.AnnotationStorage()
1029
1070
  });
1030
1071
 
1031
1072
  if (element.isRenderable) {
@@ -0,0 +1,89 @@
1
+ /**
2
+ * @licstart The following is the entire license notice for the
3
+ * Javascript code in this page
4
+ *
5
+ * Copyright 2020 Mozilla Foundation
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ *
19
+ * @licend The above is the entire license notice for the
20
+ * Javascript code in this page
21
+ */
22
+ "use strict";
23
+
24
+ Object.defineProperty(exports, "__esModule", {
25
+ value: true
26
+ });
27
+ exports.AnnotationStorage = void 0;
28
+
29
+ class AnnotationStorage {
30
+ constructor() {
31
+ this._storage = new Map();
32
+ this._modified = false;
33
+ this.onSetModified = null;
34
+ this.onResetModified = null;
35
+ }
36
+
37
+ getOrCreateValue(key, defaultValue) {
38
+ if (this._storage.has(key)) {
39
+ return this._storage.get(key);
40
+ }
41
+
42
+ this._storage.set(key, defaultValue);
43
+
44
+ return defaultValue;
45
+ }
46
+
47
+ setValue(key, value) {
48
+ if (this._storage.get(key) !== value) {
49
+ this._setModified();
50
+ }
51
+
52
+ this._storage.set(key, value);
53
+ }
54
+
55
+ getAll() {
56
+ if (this._storage.size === 0) {
57
+ return null;
58
+ }
59
+
60
+ return Object.fromEntries(this._storage);
61
+ }
62
+
63
+ get size() {
64
+ return this._storage.size;
65
+ }
66
+
67
+ _setModified() {
68
+ if (!this._modified) {
69
+ this._modified = true;
70
+
71
+ if (typeof this.onSetModified === "function") {
72
+ this.onSetModified();
73
+ }
74
+ }
75
+ }
76
+
77
+ resetModified() {
78
+ if (this._modified) {
79
+ this._modified = false;
80
+
81
+ if (typeof this.onResetModified === "function") {
82
+ this.onResetModified();
83
+ }
84
+ }
85
+ }
86
+
87
+ }
88
+
89
+ exports.AnnotationStorage = AnnotationStorage;