pdfjs-dist 2.0.489 → 2.2.228

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 (169) hide show
  1. package/CODE_OF_CONDUCT.md +15 -0
  2. package/bower.json +1 -1
  3. package/build/pdf.js +18515 -11402
  4. package/build/pdf.js.map +1 -1
  5. package/build/pdf.min.js +1 -1
  6. package/build/pdf.worker.js +48266 -37137
  7. package/build/pdf.worker.js.map +1 -1
  8. package/build/pdf.worker.min.js +1 -1
  9. package/external/url/url-lib.js +627 -0
  10. package/image_decoders/pdf.image_decoders.js +11350 -0
  11. package/image_decoders/pdf.image_decoders.js.map +1 -0
  12. package/image_decoders/pdf.image_decoders.min.js +1 -0
  13. package/lib/core/annotation.js +587 -242
  14. package/lib/core/arithmetic_decoder.js +275 -245
  15. package/lib/core/bidi.js +65 -6
  16. package/lib/core/ccitt.js +173 -18
  17. package/lib/core/ccitt_stream.js +15 -6
  18. package/lib/core/cff_parser.js +433 -61
  19. package/lib/core/charsets.js +5 -4
  20. package/lib/core/chunked_stream.js +400 -152
  21. package/lib/core/cmap.js +326 -87
  22. package/lib/core/colorspace.js +874 -594
  23. package/lib/core/core_utils.js +147 -0
  24. package/lib/core/crypto.js +290 -45
  25. package/lib/core/document.js +560 -268
  26. package/lib/core/encodings.js +19 -10
  27. package/lib/core/evaluator.js +1005 -360
  28. package/lib/core/font_renderer.js +331 -97
  29. package/lib/core/fonts.js +812 -195
  30. package/lib/core/function.js +284 -71
  31. package/lib/core/glyphlist.js +4 -3
  32. package/lib/core/image.js +169 -62
  33. package/lib/core/image_utils.js +111 -0
  34. package/lib/core/jbig2.js +479 -66
  35. package/lib/core/jbig2_stream.js +19 -8
  36. package/lib/core/jpeg_stream.js +38 -13
  37. package/lib/core/jpg.js +253 -29
  38. package/lib/core/jpx.js +396 -6
  39. package/lib/core/jpx_stream.js +18 -6
  40. package/lib/core/metrics.js +15 -15
  41. package/lib/core/murmurhash3.js +56 -34
  42. package/lib/core/obj.js +1354 -488
  43. package/lib/core/operator_list.js +144 -31
  44. package/lib/core/parser.js +539 -191
  45. package/lib/core/pattern.js +148 -14
  46. package/lib/core/pdf_manager.js +323 -133
  47. package/lib/core/primitives.js +111 -24
  48. package/lib/core/ps_parser.js +134 -45
  49. package/lib/core/standard_fonts.js +17 -17
  50. package/lib/core/stream.js +313 -34
  51. package/lib/core/type1_parser.js +143 -13
  52. package/lib/core/unicode.js +32 -5
  53. package/lib/core/worker.js +217 -190
  54. package/lib/core/worker_stream.js +277 -0
  55. package/lib/display/annotation_layer.js +450 -133
  56. package/lib/display/api.js +1597 -784
  57. package/lib/display/api_compatibility.js +11 -13
  58. package/lib/display/canvas.js +360 -44
  59. package/lib/display/content_disposition.js +83 -32
  60. package/lib/display/display_utils.js +747 -0
  61. package/lib/display/fetch_stream.js +221 -90
  62. package/lib/display/font_loader.js +468 -236
  63. package/lib/display/metadata.js +38 -16
  64. package/lib/display/network.js +635 -428
  65. package/lib/display/network_utils.js +32 -19
  66. package/lib/display/node_stream.js +367 -175
  67. package/lib/display/pattern_helper.js +81 -31
  68. package/lib/display/svg.js +1235 -519
  69. package/lib/display/text_layer.js +153 -29
  70. package/lib/display/transport_stream.js +345 -94
  71. package/lib/display/webgl.js +64 -18
  72. package/lib/display/worker_options.js +5 -4
  73. package/lib/display/xml_parser.js +166 -53
  74. package/lib/examples/node/domstubs.js +60 -4
  75. package/lib/pdf.js +36 -14
  76. package/lib/pdf.worker.js +5 -3
  77. package/lib/shared/compatibility.js +158 -564
  78. package/lib/shared/global_scope.js +2 -2
  79. package/lib/shared/is_node.js +4 -4
  80. package/lib/shared/message_handler.js +521 -0
  81. package/lib/shared/streams_polyfill.js +21 -17
  82. package/lib/shared/url_polyfill.js +56 -0
  83. package/lib/shared/util.js +243 -710
  84. package/lib/test/unit/annotation_spec.js +870 -401
  85. package/lib/test/unit/api_spec.js +657 -345
  86. package/lib/test/unit/bidi_spec.js +7 -7
  87. package/lib/test/unit/cff_parser_spec.js +54 -11
  88. package/lib/test/unit/clitests_helper.js +10 -8
  89. package/lib/test/unit/cmap_spec.js +95 -41
  90. package/lib/test/unit/colorspace_spec.js +115 -63
  91. package/lib/test/unit/core_utils_spec.js +191 -0
  92. package/lib/test/unit/crypto_spec.js +17 -5
  93. package/lib/test/unit/custom_spec.js +43 -55
  94. package/lib/test/unit/display_svg_spec.js +34 -18
  95. package/lib/test/unit/display_utils_spec.js +273 -0
  96. package/lib/test/unit/document_spec.js +8 -13
  97. package/lib/test/unit/encodings_spec.js +25 -45
  98. package/lib/test/unit/evaluator_spec.js +38 -15
  99. package/lib/test/unit/fetch_stream_spec.js +109 -0
  100. package/lib/test/unit/function_spec.js +17 -5
  101. package/lib/test/unit/jasmine-boot.js +33 -20
  102. package/lib/test/unit/{util_stream_spec.js → message_handler_spec.js} +41 -69
  103. package/lib/test/unit/metadata_spec.js +71 -11
  104. package/lib/test/unit/murmurhash3_spec.js +3 -3
  105. package/lib/test/unit/network_spec.js +19 -54
  106. package/lib/test/unit/network_utils_spec.js +91 -14
  107. package/lib/test/unit/node_stream_spec.js +56 -32
  108. package/lib/test/unit/parser_spec.js +162 -71
  109. package/lib/test/unit/pdf_find_controller_spec.js +230 -0
  110. package/lib/test/unit/pdf_find_utils_spec.js +63 -0
  111. package/lib/test/unit/pdf_history_spec.js +21 -9
  112. package/lib/test/unit/primitives_spec.js +53 -20
  113. package/lib/test/unit/stream_spec.js +12 -4
  114. package/lib/test/unit/test_utils.js +273 -56
  115. package/lib/test/unit/testreporter.js +21 -3
  116. package/lib/test/unit/type1_parser_spec.js +8 -6
  117. package/lib/test/unit/ui_utils_spec.js +454 -16
  118. package/lib/test/unit/unicode_spec.js +18 -15
  119. package/lib/test/unit/util_spec.js +87 -128
  120. package/lib/web/annotation_layer_builder.js +39 -22
  121. package/lib/web/app.js +1290 -588
  122. package/lib/web/app_options.js +100 -62
  123. package/lib/web/base_viewer.js +511 -182
  124. package/lib/web/chromecom.js +261 -117
  125. package/lib/web/debugger.js +166 -22
  126. package/lib/web/download_manager.js +32 -13
  127. package/lib/web/firefox_print_service.js +20 -10
  128. package/lib/web/firefoxcom.js +315 -80
  129. package/lib/web/genericcom.js +89 -30
  130. package/lib/web/genericl10n.js +142 -30
  131. package/lib/web/grab_to_pan.js +28 -4
  132. package/lib/web/interfaces.js +170 -47
  133. package/lib/web/overlay_manager.js +235 -85
  134. package/lib/web/password_prompt.js +22 -14
  135. package/lib/web/pdf_attachment_viewer.js +38 -18
  136. package/lib/web/pdf_cursor_tools.js +39 -16
  137. package/lib/web/pdf_document_properties.js +255 -136
  138. package/lib/web/pdf_find_bar.js +84 -40
  139. package/lib/web/pdf_find_controller.js +495 -184
  140. package/lib/web/pdf_find_utils.js +111 -0
  141. package/lib/web/pdf_history.js +190 -53
  142. package/lib/web/pdf_link_service.js +138 -77
  143. package/lib/web/pdf_outline_viewer.js +122 -46
  144. package/lib/web/pdf_page_view.js +191 -67
  145. package/lib/web/pdf_presentation_mode.js +99 -34
  146. package/lib/web/pdf_print_service.js +61 -13
  147. package/lib/web/pdf_rendering_queue.js +28 -9
  148. package/lib/web/pdf_sidebar.js +141 -81
  149. package/lib/web/pdf_sidebar_resizer.js +42 -16
  150. package/lib/web/pdf_single_page_viewer.js +74 -66
  151. package/lib/web/pdf_thumbnail_view.js +104 -33
  152. package/lib/web/pdf_thumbnail_viewer.js +66 -26
  153. package/lib/web/pdf_viewer.component.js +112 -32
  154. package/lib/web/pdf_viewer.js +91 -52
  155. package/lib/web/preferences.js +284 -89
  156. package/lib/web/secondary_toolbar.js +165 -40
  157. package/lib/web/text_layer_builder.js +134 -59
  158. package/lib/web/toolbar.js +78 -43
  159. package/lib/web/ui_utils.js +462 -136
  160. package/lib/web/view_history.js +215 -67
  161. package/lib/web/viewer_compatibility.js +4 -13
  162. package/package.json +5 -4
  163. package/web/pdf_viewer.css +79 -11
  164. package/web/pdf_viewer.js +6107 -3748
  165. package/web/pdf_viewer.js.map +1 -1
  166. package/lib/display/dom_utils.js +0 -309
  167. package/lib/test/unit/dom_utils_spec.js +0 -89
  168. package/lib/test/unit/fonts_spec.js +0 -81
  169. package/lib/web/dom_events.js +0 -137
@@ -2,7 +2,7 @@
2
2
  * @licstart The following is the entire license notice for the
3
3
  * Javascript code in this page
4
4
  *
5
- * Copyright 2017 Mozilla Foundation
5
+ * Copyright 2019 Mozilla Foundation
6
6
  *
7
7
  * Licensed under the Apache License, Version 2.0 (the "License");
8
8
  * you may not use this file except in compliance with the License.
@@ -19,83 +19,45 @@
19
19
  * @licend The above is the entire license notice for the
20
20
  * Javascript code in this page
21
21
  */
22
- 'use strict';
22
+ "use strict";
23
23
 
24
- var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
24
+ var _util = require("../../shared/util");
25
25
 
26
- var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
26
+ var _api = require("../../display/api");
27
27
 
28
- var _util = require('../../shared/util');
28
+ var _message_handler = require("../../shared/message_handler");
29
29
 
30
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
31
-
32
- describe('util_stream', function () {
33
- var FakePort = function () {
34
- function FakePort() {
35
- _classCallCheck(this, FakePort);
36
-
37
- this._listeners = [];
38
- this._deferred = Promise.resolve(undefined);
39
- }
40
-
41
- _createClass(FakePort, [{
42
- key: 'postMessage',
43
- value: function postMessage(obj) {
44
- var _this = this;
45
-
46
- var event = { data: obj };
47
- this._deferred.then(function () {
48
- _this._listeners.forEach(function (listener) {
49
- listener.call(this, event);
50
- }, _this);
51
- });
52
- }
53
- }, {
54
- key: 'addEventListener',
55
- value: function addEventListener(name, listener) {
56
- this._listeners.push(listener);
57
- }
58
- }, {
59
- key: 'removeEventListener',
60
- value: function removeEventListener(name, listener) {
61
- var i = this._listeners.indexOf(listener);
62
- this._listeners.splice(i, 1);
63
- }
64
- }, {
65
- key: 'terminate',
66
- value: function terminate() {
67
- this._listeners = [];
68
- }
69
- }]);
70
-
71
- return FakePort;
72
- }();
30
+ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
73
31
 
32
+ describe('message_handler', function () {
74
33
  function sleep(ticks) {
75
34
  return Promise.resolve().then(function () {
76
35
  return ticks && sleep(ticks - 1);
77
36
  });
78
37
  }
38
+
79
39
  describe('sendWithStream', function () {
80
40
  it('should return a ReadableStream', function () {
81
- var port = new FakePort();
82
- var messageHandler1 = new _util.MessageHandler('main', 'worker', port);
41
+ var port = new _api.LoopbackPort();
42
+ var messageHandler1 = new _message_handler.MessageHandler('main', 'worker', port);
83
43
  var readable = messageHandler1.sendWithStream('fakeHandler');
84
- expect(typeof readable === 'undefined' ? 'undefined' : _typeof(readable)).toEqual('object');
44
+ expect(_typeof(readable)).toEqual('object');
85
45
  expect(_typeof(readable.getReader)).toEqual('function');
86
46
  });
87
47
  it('should read using a reader', function (done) {
88
48
  var log = '';
89
- var port = new FakePort();
90
- var messageHandler1 = new _util.MessageHandler('main', 'worker', port);
91
- var messageHandler2 = new _util.MessageHandler('worker', 'main', port);
49
+ var port = new _api.LoopbackPort();
50
+ var messageHandler1 = new _message_handler.MessageHandler('main', 'worker', port);
51
+ var messageHandler2 = new _message_handler.MessageHandler('worker', 'main', port);
92
52
  messageHandler2.on('fakeHandler', function (data, sink) {
93
53
  sink.onPull = function () {
94
54
  log += 'p';
95
55
  };
56
+
96
57
  sink.onCancel = function (reason) {
97
58
  log += 'c';
98
59
  };
60
+
99
61
  sink.ready.then(function () {
100
62
  sink.enqueue('hi');
101
63
  return sink.ready;
@@ -129,15 +91,17 @@ describe('util_stream', function () {
129
91
  });
130
92
  it('should not read any data when cancelled', function (done) {
131
93
  var log = '';
132
- var port = new FakePort();
133
- var messageHandler2 = new _util.MessageHandler('worker', 'main', port);
94
+ var port = new _api.LoopbackPort();
95
+ var messageHandler2 = new _message_handler.MessageHandler('worker', 'main', port);
134
96
  messageHandler2.on('fakeHandler', function (data, sink) {
135
97
  sink.onPull = function () {
136
98
  log += 'p';
137
99
  };
100
+
138
101
  sink.onCancel = function (reason) {
139
102
  log += 'c';
140
103
  };
104
+
141
105
  log += '0';
142
106
  sink.ready.then(function () {
143
107
  log += '1';
@@ -154,7 +118,7 @@ describe('util_stream', function () {
154
118
  log += '4';
155
119
  });
156
120
  });
157
- var messageHandler1 = new _util.MessageHandler('main', 'worker', port);
121
+ var messageHandler1 = new _message_handler.MessageHandler('main', 'worker', port);
158
122
  var readable = messageHandler1.sendWithStream('fakeHandler', {}, {
159
123
  highWaterMark: 4,
160
124
  size: function size(arr) {
@@ -179,15 +143,17 @@ describe('util_stream', function () {
179
143
  });
180
144
  it('should not read when errored', function (done) {
181
145
  var log = '';
182
- var port = new FakePort();
183
- var messageHandler2 = new _util.MessageHandler('worker', 'main', port);
146
+ var port = new _api.LoopbackPort();
147
+ var messageHandler2 = new _message_handler.MessageHandler('worker', 'main', port);
184
148
  messageHandler2.on('fakeHandler', function (data, sink) {
185
149
  sink.onPull = function () {
186
150
  log += 'p';
187
151
  };
152
+
188
153
  sink.onCancel = function (reason) {
189
154
  log += 'c';
190
155
  };
156
+
191
157
  sink.ready.then(function () {
192
158
  sink.enqueue([1, 2, 3, 4], 4);
193
159
  return sink.ready;
@@ -196,7 +162,7 @@ describe('util_stream', function () {
196
162
  sink.error('error');
197
163
  });
198
164
  });
199
- var messageHandler1 = new _util.MessageHandler('main', 'worker', port);
165
+ var messageHandler1 = new _message_handler.MessageHandler('main', 'worker', port);
200
166
  var readable = messageHandler1.sendWithStream('fakeHandler', {}, {
201
167
  highWaterMark: 4,
202
168
  size: function size(arr) {
@@ -218,15 +184,17 @@ describe('util_stream', function () {
218
184
  });
219
185
  it('should read data with blocking promise', function (done) {
220
186
  var log = '';
221
- var port = new FakePort();
222
- var messageHandler2 = new _util.MessageHandler('worker', 'main', port);
187
+ var port = new _api.LoopbackPort();
188
+ var messageHandler2 = new _message_handler.MessageHandler('worker', 'main', port);
223
189
  messageHandler2.on('fakeHandler', function (data, sink) {
224
190
  sink.onPull = function () {
225
191
  log += 'p';
226
192
  };
193
+
227
194
  sink.onCancel = function (reason) {
228
195
  log += 'c';
229
196
  };
197
+
230
198
  log += '0';
231
199
  sink.ready.then(function () {
232
200
  log += '1';
@@ -240,7 +208,7 @@ describe('util_stream', function () {
240
208
  sink.close();
241
209
  });
242
210
  });
243
- var messageHandler1 = new _util.MessageHandler('main', 'worker', port);
211
+ var messageHandler1 = new _message_handler.MessageHandler('main', 'worker', port);
244
212
  var readable = messageHandler1.sendWithStream('fakeHandler', {}, {
245
213
  highWaterMark: 4,
246
214
  size: function size(arr) {
@@ -273,15 +241,17 @@ describe('util_stream', function () {
273
241
  });
274
242
  it('should read data with blocking promise and buffer whole data' + ' into stream', function (done) {
275
243
  var log = '';
276
- var port = new FakePort();
277
- var messageHandler2 = new _util.MessageHandler('worker', 'main', port);
244
+ var port = new _api.LoopbackPort();
245
+ var messageHandler2 = new _message_handler.MessageHandler('worker', 'main', port);
278
246
  messageHandler2.on('fakeHandler', function (data, sink) {
279
247
  sink.onPull = function () {
280
248
  log += 'p';
281
249
  };
250
+
282
251
  sink.onCancel = function (reason) {
283
252
  log += 'c';
284
253
  };
254
+
285
255
  log += '0';
286
256
  sink.ready.then(function () {
287
257
  log += '1';
@@ -296,7 +266,7 @@ describe('util_stream', function () {
296
266
  });
297
267
  return sleep(10);
298
268
  });
299
- var messageHandler1 = new _util.MessageHandler('main', 'worker', port);
269
+ var messageHandler1 = new _message_handler.MessageHandler('main', 'worker', port);
300
270
  var readable = messageHandler1.sendWithStream('fakeHandler', {}, {
301
271
  highWaterMark: 8,
302
272
  size: function size(arr) {
@@ -329,16 +299,18 @@ describe('util_stream', function () {
329
299
  });
330
300
  it('should ignore any pull after close is called', function (done) {
331
301
  var log = '';
332
- var port = new FakePort();
302
+ var port = new _api.LoopbackPort();
333
303
  var capability = (0, _util.createPromiseCapability)();
334
- var messageHandler2 = new _util.MessageHandler('worker', 'main', port);
304
+ var messageHandler2 = new _message_handler.MessageHandler('worker', 'main', port);
335
305
  messageHandler2.on('fakeHandler', function (data, sink) {
336
306
  sink.onPull = function () {
337
307
  log += 'p';
338
308
  };
309
+
339
310
  sink.onCancel = function (reason) {
340
311
  log += 'c';
341
312
  };
313
+
342
314
  log += '0';
343
315
  sink.ready.then(function () {
344
316
  log += '1';
@@ -348,7 +320,7 @@ describe('util_stream', function () {
348
320
  sink.close();
349
321
  });
350
322
  });
351
- var messageHandler1 = new _util.MessageHandler('main', 'worker', port);
323
+ var messageHandler1 = new _message_handler.MessageHandler('main', 'worker', port);
352
324
  var readable = messageHandler1.sendWithStream('fakeHandler', {}, {
353
325
  highWaterMark: 10,
354
326
  size: function size(arr) {
@@ -2,7 +2,7 @@
2
2
  * @licstart The following is the entire license notice for the
3
3
  * Javascript code in this page
4
4
  *
5
- * Copyright 2017 Mozilla Foundation
5
+ * Copyright 2019 Mozilla Foundation
6
6
  *
7
7
  * Licensed under the Apache License, Version 2.0 (the "License");
8
8
  * you may not use this file except in compliance with the License.
@@ -19,32 +19,38 @@
19
19
  * @licend The above is the entire license notice for the
20
20
  * Javascript code in this page
21
21
  */
22
- 'use strict';
22
+ "use strict";
23
23
 
24
- var _metadata = require('../../display/metadata');
24
+ var _util = require("../../shared/util");
25
+
26
+ var _metadata = require("../../display/metadata");
25
27
 
26
28
  describe('metadata', function () {
27
29
  it('should handle valid metadata', function () {
28
- var validData = '<x:xmpmeta xmlns:x=\'adobe:ns:meta/\'>' + '<rdf:RDF xmlns:rdf=\'http://www.w3.org/1999/02/22-rdf-syntax-ns#\'>' + '<rdf:Description xmlns:dc=\'http://purl.org/dc/elements/1.1/\'>' + '<dc:title><rdf:Alt><rdf:li xml:lang="x-default">Foo bar baz</rdf:li>' + '</rdf:Alt></dc:title></rdf:Description></rdf:RDF></x:xmpmeta>';
29
- var metadata = new _metadata.Metadata(validData);
30
+ var data = '<x:xmpmeta xmlns:x=\'adobe:ns:meta/\'>' + '<rdf:RDF xmlns:rdf=\'http://www.w3.org/1999/02/22-rdf-syntax-ns#\'>' + '<rdf:Description xmlns:dc=\'http://purl.org/dc/elements/1.1/\'>' + '<dc:title><rdf:Alt><rdf:li xml:lang="x-default">Foo bar baz</rdf:li>' + '</rdf:Alt></dc:title></rdf:Description></rdf:RDF></x:xmpmeta>';
31
+ var metadata = new _metadata.Metadata(data);
30
32
  expect(metadata.has('dc:title')).toBeTruthy();
31
33
  expect(metadata.has('dc:qux')).toBeFalsy();
32
34
  expect(metadata.get('dc:title')).toEqual('Foo bar baz');
33
35
  expect(metadata.get('dc:qux')).toEqual(null);
34
- expect(metadata.getAll()).toEqual({ 'dc:title': 'Foo bar baz' });
36
+ expect(metadata.getAll()).toEqual({
37
+ 'dc:title': 'Foo bar baz'
38
+ });
35
39
  });
36
40
  it('should repair and handle invalid metadata', function () {
37
- var invalidData = '<x:xmpmeta xmlns:x=\'adobe:ns:meta/\'>' + '<rdf:RDF xmlns:rdf=\'http://www.w3.org/1999/02/22-rdf-syntax-ns#\'>' + '<rdf:Description xmlns:dc=\'http://purl.org/dc/elements/1.1/\'>' + '<dc:title>\\376\\377\\000P\\000D\\000F\\000&</dc:title>' + '</rdf:Description></rdf:RDF></x:xmpmeta>';
38
- var metadata = new _metadata.Metadata(invalidData);
41
+ var data = '<x:xmpmeta xmlns:x=\'adobe:ns:meta/\'>' + '<rdf:RDF xmlns:rdf=\'http://www.w3.org/1999/02/22-rdf-syntax-ns#\'>' + '<rdf:Description xmlns:dc=\'http://purl.org/dc/elements/1.1/\'>' + '<dc:title>\\376\\377\\000P\\000D\\000F\\000&</dc:title>' + '</rdf:Description></rdf:RDF></x:xmpmeta>';
42
+ var metadata = new _metadata.Metadata(data);
39
43
  expect(metadata.has('dc:title')).toBeTruthy();
40
44
  expect(metadata.has('dc:qux')).toBeFalsy();
41
45
  expect(metadata.get('dc:title')).toEqual('PDF&');
42
46
  expect(metadata.get('dc:qux')).toEqual(null);
43
- expect(metadata.getAll()).toEqual({ 'dc:title': 'PDF&' });
47
+ expect(metadata.getAll()).toEqual({
48
+ 'dc:title': 'PDF&'
49
+ });
44
50
  });
45
51
  it('should repair and handle invalid metadata (bug 1424938)', function () {
46
- var invalidData = '<x:xmpmeta xmlns:x=\'adobe:ns:meta/\' ' + 'x:xmptk=\'XMP toolkit 2.9.1-13, framework 1.6\'>' + '<rdf:RDF xmlns:rdf=\'http://www.w3.org/1999/02/22-rdf-syntax-ns#\' ' + 'xmlns:iX=\'http://ns.adobe.com/iX/1.0/\'>' + '<rdf:Description rdf:about=\'61652fa7-fc1f-11dd-0000-ce81d41f9ecf\' ' + 'xmlns:pdf=\'http://ns.adobe.com/pdf/1.3/\' ' + 'pdf:Producer=\'GPL Ghostscript 8.63\'/>' + '<rdf:Description rdf:about=\'61652fa7-fc1f-11dd-0000-ce81d41f9ecf\' ' + 'xmlns:xap=\'http://ns.adobe.com/xap/1.0/\' ' + 'xap:ModifyDate=\'2009-02-13T12:42:54+01:00\' ' + 'xap:CreateDate=\'2009-02-13T12:42:54+01:00\'>' + '<xap:CreatorTool>\\376\\377\\000P\\000D\\000F\\000C\\000r\\000e\\000a' + '\\000t\\000o\\000r\\000 \\000V\\000e\\000r\\000s\\000i\\000o\\000n' + '\\000 \\0000\\000.\\0009\\000.\\0006</xap:CreatorTool>' + '</rdf:Description><rdf:Description ' + 'rdf:about=\'61652fa7-fc1f-11dd-0000-ce81d41f9ecf\' ' + 'xmlns:xapMM=\'http://ns.adobe.com/xap/1.0/mm/\' ' + 'xapMM:DocumentID=\'61652fa7-fc1f-11dd-0000-ce81d41f9ecf\'/>' + '<rdf:Description rdf:about=\'61652fa7-fc1f-11dd-0000-ce81d41f9ecf\' ' + 'xmlns:dc=\'http://purl.org/dc/elements/1.1/\' ' + 'dc:format=\'application/pdf\'><dc:title><rdf:Alt>' + '<rdf:li xml:lang=\'x-default\'>\\376\\377\\000L\\000&apos;\\000O\\000d' + '\\000i\\000s\\000s\\000e\\000e\\000 \\000t\\000h\\000\\351\\000m\\000a' + '\\000t\\000i\\000q\\000u\\000e\\000 \\000l\\000o\\000g\\000o\\000 ' + '\\000O\\000d\\000i\\000s\\000s\\000\\351\\000\\351\\000 \\000-\\000 ' + '\\000d\\000\\351\\000c\\000e\\000m\\000b\\000r\\000e\\000 \\0002\\0000' + '\\0000\\0008\\000.\\000p\\000u\\000b</rdf:li></rdf:Alt></dc:title>' + '<dc:creator><rdf:Seq><rdf:li>\\376\\377\\000O\\000D\\000I\\000S' + '</rdf:li></rdf:Seq></dc:creator></rdf:Description></rdf:RDF>' + '</x:xmpmeta>';
47
- var metadata = new _metadata.Metadata(invalidData);
52
+ var data = '<x:xmpmeta xmlns:x=\'adobe:ns:meta/\' ' + 'x:xmptk=\'XMP toolkit 2.9.1-13, framework 1.6\'>' + '<rdf:RDF xmlns:rdf=\'http://www.w3.org/1999/02/22-rdf-syntax-ns#\' ' + 'xmlns:iX=\'http://ns.adobe.com/iX/1.0/\'>' + '<rdf:Description rdf:about=\'61652fa7-fc1f-11dd-0000-ce81d41f9ecf\' ' + 'xmlns:pdf=\'http://ns.adobe.com/pdf/1.3/\' ' + 'pdf:Producer=\'GPL Ghostscript 8.63\'/>' + '<rdf:Description rdf:about=\'61652fa7-fc1f-11dd-0000-ce81d41f9ecf\' ' + 'xmlns:xap=\'http://ns.adobe.com/xap/1.0/\' ' + 'xap:ModifyDate=\'2009-02-13T12:42:54+01:00\' ' + 'xap:CreateDate=\'2009-02-13T12:42:54+01:00\'>' + '<xap:CreatorTool>\\376\\377\\000P\\000D\\000F\\000C\\000r\\000e\\000a' + '\\000t\\000o\\000r\\000 \\000V\\000e\\000r\\000s\\000i\\000o\\000n' + '\\000 \\0000\\000.\\0009\\000.\\0006</xap:CreatorTool>' + '</rdf:Description><rdf:Description ' + 'rdf:about=\'61652fa7-fc1f-11dd-0000-ce81d41f9ecf\' ' + 'xmlns:xapMM=\'http://ns.adobe.com/xap/1.0/mm/\' ' + 'xapMM:DocumentID=\'61652fa7-fc1f-11dd-0000-ce81d41f9ecf\'/>' + '<rdf:Description rdf:about=\'61652fa7-fc1f-11dd-0000-ce81d41f9ecf\' ' + 'xmlns:dc=\'http://purl.org/dc/elements/1.1/\' ' + 'dc:format=\'application/pdf\'><dc:title><rdf:Alt>' + '<rdf:li xml:lang=\'x-default\'>\\376\\377\\000L\\000&apos;\\000O\\000d' + '\\000i\\000s\\000s\\000e\\000e\\000 \\000t\\000h\\000\\351\\000m\\000a' + '\\000t\\000i\\000q\\000u\\000e\\000 \\000l\\000o\\000g\\000o\\000 ' + '\\000O\\000d\\000i\\000s\\000s\\000\\351\\000\\351\\000 \\000-\\000 ' + '\\000d\\000\\351\\000c\\000e\\000m\\000b\\000r\\000e\\000 \\0002\\0000' + '\\0000\\0008\\000.\\000p\\000u\\000b</rdf:li></rdf:Alt></dc:title>' + '<dc:creator><rdf:Seq><rdf:li>\\376\\377\\000O\\000D\\000I\\000S' + '</rdf:li></rdf:Seq></dc:creator></rdf:Description></rdf:RDF>' + '</x:xmpmeta>';
53
+ var metadata = new _metadata.Metadata(data);
48
54
  expect(metadata.has('dc:title')).toBeTruthy();
49
55
  expect(metadata.has('dc:qux')).toBeFalsy();
50
56
  expect(metadata.get('dc:title')).toEqual('L\'Odissee thématique logo Odisséé - décembre 2008.pub');
@@ -55,4 +61,58 @@ describe('metadata', function () {
55
61
  'xap:creatortool': 'PDFCreator Version 0.9.6'
56
62
  });
57
63
  });
64
+ it('should gracefully handle incomplete tags (issue 8884)', function () {
65
+ var data = '<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d' + '<x:xmpmeta xmlns:x="adobe:ns:meta/">' + '<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">' + '<rdf:Description rdf:about=""' + 'xmlns:pdfx="http://ns.adobe.com/pdfx/1.3/">' + '</rdf:Description>' + '<rdf:Description rdf:about=""' + 'xmlns:xap="http://ns.adobe.com/xap/1.0/">' + '<xap:ModifyDate>2010-03-25T11:20:09-04:00</xap:ModifyDate>' + '<xap:CreateDate>2010-03-25T11:20:09-04:00</xap:CreateDate>' + '<xap:MetadataDate>2010-03-25T11:20:09-04:00</xap:MetadataDate>' + '</rdf:Description>' + '<rdf:Description rdf:about=""' + 'xmlns:dc="http://purl.org/dc/elements/1.1/">' + '<dc:format>application/pdf</dc:format>' + '</rdf:Description>' + '<rdf:Description rdf:about=""' + 'xmlns:pdfaid="http://www.aiim.org/pdfa/ns/id/">' + '<pdfaid:part>1</pdfaid:part>' + '<pdfaid:conformance>A</pdfaid:conformance>' + '</rdf:Description>' + '</rdf:RDF>' + '</x:xmpmeta>' + '<?xpacket end="w"?>';
66
+ var metadata = new _metadata.Metadata(data);
67
+ expect((0, _util.isEmptyObj)(metadata.getAll())).toEqual(true);
68
+ });
69
+ it('should gracefully handle "junk" before the actual metadata (issue 10395)', function () {
70
+ var data = '<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>' + '<x:xmpmeta x:xmptk="TallComponents PDFObjects 1.0" ' + 'xmlns:x="adobe:ns:meta/">' + '<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">' + '<rdf:Description rdf:about="" ' + 'xmlns:pdf="http://ns.adobe.com/pdf/1.3/">' + '<pdf:Producer>PDFKit.NET 4.0.102.0</pdf:Producer>' + '<pdf:Keywords></pdf:Keywords>' + '<pdf:PDFVersion>1.7</pdf:PDFVersion></rdf:Description>' + '<rdf:Description rdf:about="" ' + 'xmlns:xap="http://ns.adobe.com/xap/1.0/">' + '<xap:CreateDate>2018-12-27T13:50:36-08:00</xap:CreateDate>' + '<xap:ModifyDate>2018-12-27T13:50:38-08:00</xap:ModifyDate>' + '<xap:CreatorTool></xap:CreatorTool>' + '<xap:MetadataDate>2018-12-27T13:50:38-08:00</xap:MetadataDate>' + '</rdf:Description><rdf:Description rdf:about="" ' + 'xmlns:dc="http://purl.org/dc/elements/1.1/">' + '<dc:creator><rdf:Seq><rdf:li></rdf:li></rdf:Seq></dc:creator>' + '<dc:subject><rdf:Bag /></dc:subject>' + '<dc:description><rdf:Alt><rdf:li xml:lang="x-default">' + '</rdf:li></rdf:Alt></dc:description>' + '<dc:title><rdf:Alt><rdf:li xml:lang="x-default"></rdf:li>' + '</rdf:Alt></dc:title><dc:format>application/pdf</dc:format>' + '</rdf:Description></rdf:RDF></x:xmpmeta><?xpacket end="w"?>';
71
+ var metadata = new _metadata.Metadata(data);
72
+ expect(metadata.has('dc:title')).toBeTruthy();
73
+ expect(metadata.has('dc:qux')).toBeFalsy();
74
+ expect(metadata.get('dc:title')).toEqual('');
75
+ expect(metadata.get('dc:qux')).toEqual(null);
76
+ expect(metadata.getAll()).toEqual({
77
+ 'dc:creator': '',
78
+ 'dc:description': '',
79
+ 'dc:format': 'application/pdf',
80
+ 'dc:subject': '',
81
+ 'dc:title': '',
82
+ 'pdf:keywords': '',
83
+ 'pdf:pdfversion': '1.7',
84
+ 'pdf:producer': 'PDFKit.NET 4.0.102.0',
85
+ 'xap:createdate': '2018-12-27T13:50:36-08:00',
86
+ 'xap:creatortool': '',
87
+ 'xap:metadatadate': '2018-12-27T13:50:38-08:00',
88
+ 'xap:modifydate': '2018-12-27T13:50:38-08:00'
89
+ });
90
+ });
91
+ it('should correctly handle metadata containing "&apos" (issue 10407)', function () {
92
+ var data = '<x:xmpmeta xmlns:x=\'adobe:ns:meta/\'>' + '<rdf:RDF xmlns:rdf=\'http://www.w3.org/1999/02/22-rdf-syntax-ns#\'>' + '<rdf:Description xmlns:dc=\'http://purl.org/dc/elements/1.1/\'>' + '<dc:title><rdf:Alt>' + '<rdf:li xml:lang="x-default">&apos;Foo bar baz&apos;</rdf:li>' + '</rdf:Alt></dc:title></rdf:Description></rdf:RDF></x:xmpmeta>';
93
+ var metadata = new _metadata.Metadata(data);
94
+ expect(metadata.has('dc:title')).toBeTruthy();
95
+ expect(metadata.has('dc:qux')).toBeFalsy();
96
+ expect(metadata.get('dc:title')).toEqual('\'Foo bar baz\'');
97
+ expect(metadata.get('dc:qux')).toEqual(null);
98
+ expect(metadata.getAll()).toEqual({
99
+ 'dc:title': '\'Foo bar baz\''
100
+ });
101
+ });
102
+ it('should gracefully handle unbalanced end tags (issue 10410)', function () {
103
+ var data = '<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>' + '<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">' + '<rdf:Description rdf:about="" ' + 'xmlns:pdf="http://ns.adobe.com/pdf/1.3/">' + '<pdf:Producer>Soda PDF 5</pdf:Producer></rdf:Description>' + '<rdf:Description rdf:about="" ' + 'xmlns:xap="http://ns.adobe.com/xap/1.0/">' + '<xap:CreateDate>2018-10-02T08:14:49-05:00</xap:CreateDate>' + '<xap:CreatorTool>Soda PDF 5</xap:CreatorTool>' + '<xap:MetadataDate>2018-10-02T08:14:49-05:00</xap:MetadataDate> ' + '<xap:ModifyDate>2018-10-02T08:14:49-05:00</xap:ModifyDate>' + '</rdf:Description><rdf:Description rdf:about="" ' + 'xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/">' + '<xmpMM:DocumentID>uuid:00000000-1c84-3cf9-89ba-bef0e729c831' + '</xmpMM:DocumentID></rdf:Description>' + '</rdf:RDF></x:xmpmeta><?xpacket end="w"?>';
104
+ var metadata = new _metadata.Metadata(data);
105
+ expect((0, _util.isEmptyObj)(metadata.getAll())).toEqual(true);
106
+ });
107
+ it('should not be vulnerable to the billion laughs attack', function () {
108
+ var data = '<?xml version="1.0"?>' + '<!DOCTYPE lolz [' + ' <!ENTITY lol "lol">' + ' <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">' + ' <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">' + ' <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">' + ' <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">' + ' <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">' + ' <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">' + ' <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">' + ' <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">' + ' <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">' + ']>' + '<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">' + ' <rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1/">' + ' <dc:title>' + ' <rdf:Alt>' + ' <rdf:li xml:lang="x-default">a&lol9;b</rdf:li>' + ' </rdf:Alt>' + ' </dc:title>' + ' </rdf:Description>' + '</rdf:RDF>';
109
+ var metadata = new _metadata.Metadata(data);
110
+ expect(metadata.has('dc:title')).toBeTruthy();
111
+ expect(metadata.has('dc:qux')).toBeFalsy();
112
+ expect(metadata.get('dc:title')).toEqual('a&lol9;b');
113
+ expect(metadata.get('dc:qux')).toEqual(null);
114
+ expect(metadata.getAll()).toEqual({
115
+ 'dc:title': 'a&lol9;b'
116
+ });
117
+ });
58
118
  });
@@ -2,7 +2,7 @@
2
2
  * @licstart The following is the entire license notice for the
3
3
  * Javascript code in this page
4
4
  *
5
- * Copyright 2017 Mozilla Foundation
5
+ * Copyright 2019 Mozilla Foundation
6
6
  *
7
7
  * Licensed under the Apache License, Version 2.0 (the "License");
8
8
  * you may not use this file except in compliance with the License.
@@ -19,9 +19,9 @@
19
19
  * @licend The above is the entire license notice for the
20
20
  * Javascript code in this page
21
21
  */
22
- 'use strict';
22
+ "use strict";
23
23
 
24
- var _murmurhash = require('../../core/murmurhash3');
24
+ var _murmurhash = require("../../core/murmurhash3");
25
25
 
26
26
  describe('MurmurHash3_64', function () {
27
27
  it('instantiates without seed', function () {
@@ -2,7 +2,7 @@
2
2
  * @licstart The following is the entire license notice for the
3
3
  * Javascript code in this page
4
4
  *
5
- * Copyright 2017 Mozilla Foundation
5
+ * Copyright 2019 Mozilla Foundation
6
6
  *
7
7
  * Licensed under the Apache License, Version 2.0 (the "License");
8
8
  * you may not use this file except in compliance with the License.
@@ -19,15 +19,13 @@
19
19
  * @licend The above is the entire license notice for the
20
20
  * Javascript code in this page
21
21
  */
22
- 'use strict';
22
+ "use strict";
23
23
 
24
- var _network = require('../../display/network');
24
+ var _network = require("../../display/network");
25
25
 
26
26
  describe('network', function () {
27
27
  var pdf1 = new URL('../pdfs/tracemonkey.pdf', window.location).href;
28
28
  var pdf1Length = 1016315;
29
- var pdf2 = new URL('../pdfs/pdf.pdf', window.location).href;
30
- var pdf2Length = 32472771;
31
29
  it('read without stream and range', function (done) {
32
30
  var stream = new _network.PDFNetworkStream({
33
31
  url: pdf1,
@@ -43,16 +41,19 @@ describe('network', function () {
43
41
  });
44
42
  var len = 0,
45
43
  count = 0;
44
+
46
45
  var read = function read() {
47
46
  return fullReader.read().then(function (result) {
48
47
  if (result.done) {
49
- return;
48
+ return undefined;
50
49
  }
50
+
51
51
  count++;
52
52
  len += result.value.byteLength;
53
53
  return read();
54
54
  });
55
55
  };
56
+
56
57
  var readPromise = Promise.all([read(), promise]);
57
58
  readPromise.then(function (page) {
58
59
  expect(len).toEqual(pdf1Length);
@@ -60,50 +61,7 @@ describe('network', function () {
60
61
  expect(isStreamingSupported).toEqual(false);
61
62
  expect(isRangeSupported).toEqual(false);
62
63
  done();
63
- }).catch(function (reason) {
64
- done.fail(reason);
65
- });
66
- });
67
- it('read with streaming', function (done) {
68
- var userAgent = window.navigator.userAgent;
69
- var m = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(userAgent);
70
- if (!m || m[1] < 9) {
71
- expect(true).toEqual(true);
72
- done();
73
- return;
74
- }
75
- var stream = new _network.PDFNetworkStream({
76
- url: pdf2,
77
- rangeChunkSize: 65536,
78
- disableStream: false,
79
- disableRange: false
80
- });
81
- var fullReader = stream.getFullReader();
82
- var isStreamingSupported, isRangeSupported;
83
- var promise = fullReader.headersReady.then(function () {
84
- isStreamingSupported = fullReader.isStreamingSupported;
85
- isRangeSupported = fullReader.isRangeSupported;
86
- });
87
- var len = 0,
88
- count = 0;
89
- var read = function read() {
90
- return fullReader.read().then(function (result) {
91
- if (result.done) {
92
- return;
93
- }
94
- count++;
95
- len += result.value.byteLength;
96
- return read();
97
- });
98
- };
99
- var readPromise = Promise.all([read(), promise]);
100
- readPromise.then(function () {
101
- expect(len).toEqual(pdf2Length);
102
- expect(count).toBeGreaterThan(1);
103
- expect(isStreamingSupported).toEqual(true);
104
- expect(isRangeSupported).toEqual(true);
105
- done();
106
- }).catch(function (reason) {
64
+ })["catch"](function (reason) {
107
65
  done.fail(reason);
108
66
  });
109
67
  });
@@ -127,17 +85,24 @@ describe('network', function () {
127
85
  var tailSize = pdf1Length % rangeSize || rangeSize;
128
86
  var range1Reader = stream.getRangeReader(pdf1Length - tailSize - rangeSize, pdf1Length - tailSize);
129
87
  var range2Reader = stream.getRangeReader(pdf1Length - tailSize, pdf1Length);
130
- var result1 = { value: 0 },
131
- result2 = { value: 0 };
88
+ var result1 = {
89
+ value: 0
90
+ },
91
+ result2 = {
92
+ value: 0
93
+ };
94
+
132
95
  var read = function read(reader, lenResult) {
133
96
  return reader.read().then(function (result) {
134
97
  if (result.done) {
135
- return;
98
+ return undefined;
136
99
  }
100
+
137
101
  lenResult.value += result.value.byteLength;
138
102
  return read(reader, lenResult);
139
103
  });
140
104
  };
105
+
141
106
  var readPromises = Promise.all([read(range1Reader, result1), read(range2Reader, result2), promise]);
142
107
  readPromises.then(function () {
143
108
  expect(result1.value).toEqual(rangeSize);
@@ -146,7 +111,7 @@ describe('network', function () {
146
111
  expect(isRangeSupported).toEqual(true);
147
112
  expect(fullReaderCancelled).toEqual(true);
148
113
  done();
149
- }).catch(function (reason) {
114
+ })["catch"](function (reason) {
150
115
  done.fail(reason);
151
116
  });
152
117
  });