pdfjs-dist 2.0.943 → 2.1.266
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.
- package/bower.json +1 -1
- package/build/pdf.js +15329 -11095
- package/build/pdf.js.map +1 -1
- package/build/pdf.min.js +1 -1
- package/build/pdf.worker.js +12497 -4184
- package/build/pdf.worker.js.map +1 -1
- package/build/pdf.worker.min.js +1 -1
- package/image_decoders/pdf.image_decoders.js +3438 -1209
- package/image_decoders/pdf.image_decoders.js.map +1 -1
- package/image_decoders/pdf.image_decoders.min.js +1 -1
- package/lib/core/annotation.js +335 -109
- package/lib/core/arithmetic_decoder.js +274 -244
- package/lib/core/bidi.js +64 -5
- package/lib/core/ccitt.js +172 -17
- package/lib/core/ccitt_stream.js +14 -5
- package/lib/core/cff_parser.js +304 -28
- package/lib/core/charsets.js +4 -3
- package/lib/core/chunked_stream.js +379 -149
- package/lib/core/cmap.js +210 -40
- package/lib/core/colorspace.js +332 -187
- package/lib/core/crypto.js +289 -44
- package/lib/core/document.js +508 -249
- package/lib/core/encodings.js +18 -9
- package/lib/core/evaluator.js +657 -119
- package/lib/core/font_renderer.js +217 -34
- package/lib/core/fonts.js +632 -41
- package/lib/core/function.js +252 -26
- package/lib/core/glyphlist.js +2 -1
- package/lib/core/image.js +124 -27
- package/lib/core/jbig2.js +425 -65
- package/lib/core/jbig2_stream.js +18 -7
- package/lib/core/jpeg_stream.js +24 -8
- package/lib/core/jpg.js +208 -16
- package/lib/core/jpx.js +395 -5
- package/lib/core/jpx_stream.js +17 -5
- package/lib/core/metrics.js +3 -3
- package/lib/core/murmurhash3.js +23 -5
- package/lib/core/obj.js +625 -132
- package/lib/core/operator_list.js +104 -3
- package/lib/core/parser.js +262 -25
- package/lib/core/pattern.js +144 -12
- package/lib/core/pdf_manager.js +104 -70
- package/lib/core/primitives.js +74 -21
- package/lib/core/ps_parser.js +133 -44
- package/lib/core/standard_fonts.js +9 -9
- package/lib/core/stream.js +283 -31
- package/lib/core/type1_parser.js +138 -6
- package/lib/core/unicode.js +28 -1
- package/lib/core/worker.js +192 -57
- package/lib/display/annotation_layer.js +303 -123
- package/lib/display/api.js +1073 -574
- package/lib/display/api_compatibility.js +4 -1
- package/lib/display/canvas.js +314 -18
- package/lib/display/content_disposition.js +70 -23
- package/lib/display/dom_utils.js +112 -59
- package/lib/display/fetch_stream.js +95 -50
- package/lib/display/font_loader.js +250 -132
- package/lib/display/metadata.js +37 -15
- package/lib/display/network.js +123 -34
- package/lib/display/network_utils.js +23 -10
- package/lib/display/node_stream.js +162 -65
- package/lib/display/pattern_helper.js +57 -6
- package/lib/display/svg.js +194 -18
- package/lib/display/text_layer.js +128 -14
- package/lib/display/transport_stream.js +83 -27
- package/lib/display/webgl.js +63 -17
- package/lib/display/worker_options.js +4 -3
- package/lib/display/xml_parser.js +162 -52
- package/lib/examples/node/domstubs.js +56 -3
- package/lib/pdf.js +15 -2
- package/lib/pdf.worker.js +4 -2
- package/lib/shared/compatibility.js +129 -26
- package/lib/shared/global_scope.js +1 -1
- package/lib/shared/is_node.js +3 -3
- package/lib/shared/message_handler.js +103 -45
- package/lib/shared/streams_polyfill.js +20 -16
- package/lib/shared/url_polyfill.js +8 -2
- package/lib/shared/util.js +246 -84
- package/lib/test/unit/annotation_spec.js +99 -73
- package/lib/test/unit/api_spec.js +347 -113
- package/lib/test/unit/bidi_spec.js +6 -6
- package/lib/test/unit/cff_parser_spec.js +17 -5
- package/lib/test/unit/clitests_helper.js +7 -8
- package/lib/test/unit/cmap_spec.js +79 -25
- package/lib/test/unit/colorspace_spec.js +65 -18
- package/lib/test/unit/crypto_spec.js +16 -4
- package/lib/test/unit/custom_spec.js +40 -52
- package/lib/test/unit/display_svg_spec.js +32 -16
- package/lib/test/unit/document_spec.js +2 -2
- package/lib/test/unit/dom_utils_spec.js +8 -8
- package/lib/test/unit/encodings_spec.js +24 -44
- package/lib/test/unit/evaluator_spec.js +15 -8
- package/lib/test/unit/function_spec.js +16 -4
- package/lib/test/unit/jasmine-boot.js +29 -16
- package/lib/test/unit/message_handler_spec.js +19 -6
- package/lib/test/unit/metadata_spec.js +64 -11
- package/lib/test/unit/murmurhash3_spec.js +2 -2
- package/lib/test/unit/network_spec.js +19 -4
- package/lib/test/unit/network_utils_spec.js +6 -4
- package/lib/test/unit/node_stream_spec.js +50 -26
- package/lib/test/unit/parser_spec.js +13 -29
- package/lib/test/unit/pdf_find_controller_spec.js +144 -32
- package/lib/test/unit/pdf_find_utils_spec.js +10 -9
- package/lib/test/unit/pdf_history_spec.js +20 -8
- package/lib/test/unit/primitives_spec.js +23 -3
- package/lib/test/unit/stream_spec.js +8 -3
- package/lib/test/unit/test_utils.js +89 -26
- package/lib/test/unit/testreporter.js +19 -1
- package/lib/test/unit/type1_parser_spec.js +7 -5
- package/lib/test/unit/ui_utils_spec.js +162 -38
- package/lib/test/unit/unicode_spec.js +13 -10
- package/lib/test/unit/util_spec.js +89 -9
- package/lib/web/annotation_layer_builder.js +38 -21
- package/lib/web/app.js +610 -245
- package/lib/web/app_options.js +54 -34
- package/lib/web/base_viewer.js +359 -162
- package/lib/web/chromecom.js +159 -80
- package/lib/web/debugger.js +161 -17
- package/lib/web/download_manager.js +29 -11
- package/lib/web/firefox_print_service.js +16 -8
- package/lib/web/firefoxcom.js +127 -91
- package/lib/web/genericcom.js +50 -31
- package/lib/web/genericl10n.js +46 -34
- package/lib/web/grab_to_pan.js +25 -3
- package/lib/web/interfaces.js +108 -61
- package/lib/web/overlay_manager.js +67 -45
- package/lib/web/password_prompt.js +20 -12
- package/lib/web/pdf_attachment_viewer.js +37 -17
- package/lib/web/pdf_cursor_tools.js +38 -15
- package/lib/web/pdf_document_properties.js +65 -24
- package/lib/web/pdf_find_bar.js +48 -20
- package/lib/web/pdf_find_controller.js +290 -89
- package/lib/web/pdf_find_utils.js +19 -3
- package/lib/web/pdf_history.js +186 -49
- package/lib/web/pdf_link_service.js +127 -52
- package/lib/web/pdf_outline_viewer.js +71 -21
- package/lib/web/pdf_page_view.js +188 -63
- package/lib/web/pdf_presentation_mode.js +98 -33
- package/lib/web/pdf_print_service.js +54 -10
- package/lib/web/pdf_rendering_queue.js +26 -4
- package/lib/web/pdf_sidebar.js +116 -62
- package/lib/web/pdf_sidebar_resizer.js +41 -15
- package/lib/web/pdf_single_page_viewer.js +65 -68
- package/lib/web/pdf_thumbnail_view.js +102 -31
- package/lib/web/pdf_thumbnail_viewer.js +62 -22
- package/lib/web/pdf_viewer.component.js +111 -31
- package/lib/web/pdf_viewer.js +80 -60
- package/lib/web/preferences.js +61 -39
- package/lib/web/secondary_toolbar.js +101 -82
- package/lib/web/text_layer_builder.js +124 -69
- package/lib/web/toolbar.js +67 -27
- package/lib/web/ui_utils.js +284 -128
- package/lib/web/view_history.js +75 -51
- package/lib/web/viewer_compatibility.js +2 -1
- package/package.json +1 -1
- package/web/pdf_viewer.css +1 -1
- package/web/pdf_viewer.js +2200 -973
- package/web/pdf_viewer.js.map +1 -1
- package/lib/web/dom_events.js +0 -140
@@ -30,9 +30,11 @@ function initializePDFJS(callback) {
|
|
30
30
|
var PDFNetworkStream = modules[2].PDFNetworkStream;
|
31
31
|
var PDFFetchStream = modules[3].PDFFetchStream;
|
32
32
|
var isNodeJS = modules[4];
|
33
|
+
|
33
34
|
if (isNodeJS()) {
|
34
35
|
throw new Error('The `gulp unittest` command cannot be used in ' + 'Node.js environments.');
|
35
36
|
}
|
37
|
+
|
36
38
|
if (typeof Response !== 'undefined' && 'body' in Response.prototype && typeof ReadableStream !== 'undefined') {
|
37
39
|
displayApi.setPDFNetworkStreamFactory(function (params) {
|
38
40
|
return new PDFFetchStream(params);
|
@@ -42,10 +44,12 @@ function initializePDFJS(callback) {
|
|
42
44
|
return new PDFNetworkStream(params);
|
43
45
|
});
|
44
46
|
}
|
47
|
+
|
45
48
|
GlobalWorkerOptions.workerSrc = '../../build/generic/build/pdf.worker.js';
|
46
49
|
callback();
|
47
50
|
});
|
48
51
|
}
|
52
|
+
|
49
53
|
(function () {
|
50
54
|
window.jasmine = jasmineRequire.core(jasmineRequire);
|
51
55
|
jasmineRequire.html(jasmine);
|
@@ -57,26 +61,27 @@ function initializePDFJS(callback) {
|
|
57
61
|
return window.location;
|
58
62
|
}
|
59
63
|
});
|
60
|
-
var
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
+
var config = {
|
65
|
+
failFast: queryString.getParam('failFast'),
|
66
|
+
oneFailurePerSpec: queryString.getParam('oneFailurePerSpec'),
|
67
|
+
hideDisabled: queryString.getParam('hideDisabled')
|
68
|
+
};
|
64
69
|
var random = queryString.getParam('random');
|
65
|
-
|
70
|
+
|
71
|
+
if (random !== undefined && random !== '') {
|
72
|
+
config.random = random;
|
73
|
+
}
|
74
|
+
|
66
75
|
var seed = queryString.getParam('seed');
|
76
|
+
|
67
77
|
if (seed) {
|
68
|
-
|
78
|
+
config.seed = seed;
|
69
79
|
}
|
80
|
+
|
70
81
|
var htmlReporter = new jasmine.HtmlReporter({
|
71
82
|
env: env,
|
72
|
-
|
73
|
-
queryString.navigateWithNewParam(
|
74
|
-
},
|
75
|
-
onThrowExpectationsClick: function onThrowExpectationsClick() {
|
76
|
-
queryString.navigateWithNewParam('throwFailures', !env.throwingExpectationFailures());
|
77
|
-
},
|
78
|
-
onRandomClick: function onRandomClick() {
|
79
|
-
queryString.navigateWithNewParam('random', !env.randomTests());
|
83
|
+
navigateWithNewParam: function navigateWithNewParam(key, value) {
|
84
|
+
return queryString.navigateWithNewParam(key, value);
|
80
85
|
},
|
81
86
|
addToExistingQueryString: function addToExistingQueryString(key, value) {
|
82
87
|
return queryString.fullStringWithNewParam(key, value);
|
@@ -90,37 +95,45 @@ function initializePDFJS(callback) {
|
|
90
95
|
createTextNode: function createTextNode() {
|
91
96
|
return document.createTextNode.apply(document, arguments);
|
92
97
|
},
|
93
|
-
|
94
98
|
timer: new jasmine.Timer()
|
95
99
|
});
|
96
100
|
env.addReporter(htmlReporter);
|
101
|
+
|
97
102
|
if (queryString.getParam('browser')) {
|
98
103
|
var testReporter = new TestReporter(queryString.getParam('browser'), queryString.getParam('path'));
|
99
104
|
env.addReporter(testReporter);
|
100
105
|
}
|
106
|
+
|
101
107
|
var specFilter = new jasmine.HtmlSpecFilter({
|
102
108
|
filterString: function filterString() {
|
103
109
|
return queryString.getParam('spec');
|
104
110
|
}
|
105
111
|
});
|
106
|
-
|
112
|
+
|
113
|
+
config.specFilter = function (spec) {
|
107
114
|
return specFilter.matches(spec.getFullName());
|
108
115
|
};
|
116
|
+
|
117
|
+
env.configure(config);
|
109
118
|
jasmine.DEFAULT_TIMEOUT_INTERVAL = 30000;
|
110
119
|
var currentWindowOnload = window.onload;
|
120
|
+
|
111
121
|
window.onload = function () {
|
112
122
|
if (currentWindowOnload) {
|
113
123
|
currentWindowOnload();
|
114
124
|
}
|
125
|
+
|
115
126
|
initializePDFJS(function () {
|
116
127
|
htmlReporter.initialize();
|
117
128
|
env.execute();
|
118
129
|
});
|
119
130
|
};
|
131
|
+
|
120
132
|
function extend(destination, source) {
|
121
133
|
for (var property in source) {
|
122
134
|
destination[property] = source[property];
|
123
135
|
}
|
136
|
+
|
124
137
|
return destination;
|
125
138
|
}
|
126
139
|
})();
|
@@ -19,15 +19,15 @@
|
|
19
19
|
* @licend The above is the entire license notice for the
|
20
20
|
* Javascript code in this page
|
21
21
|
*/
|
22
|
-
|
22
|
+
"use strict";
|
23
23
|
|
24
|
-
var
|
24
|
+
var _util = require("../../shared/util");
|
25
25
|
|
26
|
-
var
|
26
|
+
var _api = require("../../display/api");
|
27
27
|
|
28
|
-
var
|
28
|
+
var _message_handler = require("../../shared/message_handler");
|
29
29
|
|
30
|
-
|
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); }
|
31
31
|
|
32
32
|
describe('message_handler', function () {
|
33
33
|
function sleep(ticks) {
|
@@ -35,12 +35,13 @@ describe('message_handler', function () {
|
|
35
35
|
return ticks && sleep(ticks - 1);
|
36
36
|
});
|
37
37
|
}
|
38
|
+
|
38
39
|
describe('sendWithStream', function () {
|
39
40
|
it('should return a ReadableStream', function () {
|
40
41
|
var port = new _api.LoopbackPort();
|
41
42
|
var messageHandler1 = new _message_handler.MessageHandler('main', 'worker', port);
|
42
43
|
var readable = messageHandler1.sendWithStream('fakeHandler');
|
43
|
-
expect(
|
44
|
+
expect(_typeof(readable)).toEqual('object');
|
44
45
|
expect(_typeof(readable.getReader)).toEqual('function');
|
45
46
|
});
|
46
47
|
it('should read using a reader', function (done) {
|
@@ -52,9 +53,11 @@ describe('message_handler', function () {
|
|
52
53
|
sink.onPull = function () {
|
53
54
|
log += 'p';
|
54
55
|
};
|
56
|
+
|
55
57
|
sink.onCancel = function (reason) {
|
56
58
|
log += 'c';
|
57
59
|
};
|
60
|
+
|
58
61
|
sink.ready.then(function () {
|
59
62
|
sink.enqueue('hi');
|
60
63
|
return sink.ready;
|
@@ -94,9 +97,11 @@ describe('message_handler', function () {
|
|
94
97
|
sink.onPull = function () {
|
95
98
|
log += 'p';
|
96
99
|
};
|
100
|
+
|
97
101
|
sink.onCancel = function (reason) {
|
98
102
|
log += 'c';
|
99
103
|
};
|
104
|
+
|
100
105
|
log += '0';
|
101
106
|
sink.ready.then(function () {
|
102
107
|
log += '1';
|
@@ -144,9 +149,11 @@ describe('message_handler', function () {
|
|
144
149
|
sink.onPull = function () {
|
145
150
|
log += 'p';
|
146
151
|
};
|
152
|
+
|
147
153
|
sink.onCancel = function (reason) {
|
148
154
|
log += 'c';
|
149
155
|
};
|
156
|
+
|
150
157
|
sink.ready.then(function () {
|
151
158
|
sink.enqueue([1, 2, 3, 4], 4);
|
152
159
|
return sink.ready;
|
@@ -183,9 +190,11 @@ describe('message_handler', function () {
|
|
183
190
|
sink.onPull = function () {
|
184
191
|
log += 'p';
|
185
192
|
};
|
193
|
+
|
186
194
|
sink.onCancel = function (reason) {
|
187
195
|
log += 'c';
|
188
196
|
};
|
197
|
+
|
189
198
|
log += '0';
|
190
199
|
sink.ready.then(function () {
|
191
200
|
log += '1';
|
@@ -238,9 +247,11 @@ describe('message_handler', function () {
|
|
238
247
|
sink.onPull = function () {
|
239
248
|
log += 'p';
|
240
249
|
};
|
250
|
+
|
241
251
|
sink.onCancel = function (reason) {
|
242
252
|
log += 'c';
|
243
253
|
};
|
254
|
+
|
244
255
|
log += '0';
|
245
256
|
sink.ready.then(function () {
|
246
257
|
log += '1';
|
@@ -295,9 +306,11 @@ describe('message_handler', function () {
|
|
295
306
|
sink.onPull = function () {
|
296
307
|
log += 'p';
|
297
308
|
};
|
309
|
+
|
298
310
|
sink.onCancel = function (reason) {
|
299
311
|
log += 'c';
|
300
312
|
};
|
313
|
+
|
301
314
|
log += '0';
|
302
315
|
sink.ready.then(function () {
|
303
316
|
log += '1';
|
@@ -19,34 +19,38 @@
|
|
19
19
|
* @licend The above is the entire license notice for the
|
20
20
|
* Javascript code in this page
|
21
21
|
*/
|
22
|
-
|
22
|
+
"use strict";
|
23
23
|
|
24
|
-
var _util = require(
|
24
|
+
var _util = require("../../shared/util");
|
25
25
|
|
26
|
-
var _metadata = require(
|
26
|
+
var _metadata = require("../../display/metadata");
|
27
27
|
|
28
28
|
describe('metadata', function () {
|
29
29
|
it('should handle valid metadata', function () {
|
30
|
-
var
|
31
|
-
var metadata = new _metadata.Metadata(
|
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);
|
32
32
|
expect(metadata.has('dc:title')).toBeTruthy();
|
33
33
|
expect(metadata.has('dc:qux')).toBeFalsy();
|
34
34
|
expect(metadata.get('dc:title')).toEqual('Foo bar baz');
|
35
35
|
expect(metadata.get('dc:qux')).toEqual(null);
|
36
|
-
expect(metadata.getAll()).toEqual({
|
36
|
+
expect(metadata.getAll()).toEqual({
|
37
|
+
'dc:title': 'Foo bar baz'
|
38
|
+
});
|
37
39
|
});
|
38
40
|
it('should repair and handle invalid metadata', function () {
|
39
|
-
var
|
40
|
-
var metadata = new _metadata.Metadata(
|
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);
|
41
43
|
expect(metadata.has('dc:title')).toBeTruthy();
|
42
44
|
expect(metadata.has('dc:qux')).toBeFalsy();
|
43
45
|
expect(metadata.get('dc:title')).toEqual('PDF&');
|
44
46
|
expect(metadata.get('dc:qux')).toEqual(null);
|
45
|
-
expect(metadata.getAll()).toEqual({
|
47
|
+
expect(metadata.getAll()).toEqual({
|
48
|
+
'dc:title': 'PDF&'
|
49
|
+
});
|
46
50
|
});
|
47
51
|
it('should repair and handle invalid metadata (bug 1424938)', function () {
|
48
|
-
var
|
49
|
-
var metadata = new _metadata.Metadata(
|
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'\\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);
|
50
54
|
expect(metadata.has('dc:title')).toBeTruthy();
|
51
55
|
expect(metadata.has('dc:qux')).toBeFalsy();
|
52
56
|
expect(metadata.get('dc:title')).toEqual('L\'Odissee thématique logo Odisséé - décembre 2008.pub');
|
@@ -62,4 +66,53 @@ describe('metadata', function () {
|
|
62
66
|
var metadata = new _metadata.Metadata(data);
|
63
67
|
expect((0, _util.isEmptyObj)(metadata.getAll())).toEqual(true);
|
64
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">'Foo bar baz'</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
|
+
});
|
65
118
|
});
|
@@ -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
|
-
|
22
|
+
"use strict";
|
23
23
|
|
24
|
-
var _murmurhash = require(
|
24
|
+
var _murmurhash = require("../../core/murmurhash3");
|
25
25
|
|
26
26
|
describe('MurmurHash3_64', function () {
|
27
27
|
it('instantiates without seed', function () {
|
@@ -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
|
-
|
22
|
+
"use strict";
|
23
23
|
|
24
|
-
var _network = require(
|
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;
|
@@ -43,16 +43,19 @@ describe('network', function () {
|
|
43
43
|
});
|
44
44
|
var len = 0,
|
45
45
|
count = 0;
|
46
|
+
|
46
47
|
var read = function read() {
|
47
48
|
return fullReader.read().then(function (result) {
|
48
49
|
if (result.done) {
|
49
50
|
return;
|
50
51
|
}
|
52
|
+
|
51
53
|
count++;
|
52
54
|
len += result.value.byteLength;
|
53
55
|
return read();
|
54
56
|
});
|
55
57
|
};
|
58
|
+
|
56
59
|
var readPromise = Promise.all([read(), promise]);
|
57
60
|
readPromise.then(function (page) {
|
58
61
|
expect(len).toEqual(pdf1Length);
|
@@ -67,11 +70,13 @@ describe('network', function () {
|
|
67
70
|
it('read with streaming', function (done) {
|
68
71
|
var userAgent = window.navigator.userAgent;
|
69
72
|
var m = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(userAgent);
|
73
|
+
|
70
74
|
if (!m || m[1] < 9) {
|
71
75
|
expect(true).toEqual(true);
|
72
76
|
done();
|
73
77
|
return;
|
74
78
|
}
|
79
|
+
|
75
80
|
var stream = new _network.PDFNetworkStream({
|
76
81
|
url: pdf2,
|
77
82
|
rangeChunkSize: 65536,
|
@@ -86,16 +91,19 @@ describe('network', function () {
|
|
86
91
|
});
|
87
92
|
var len = 0,
|
88
93
|
count = 0;
|
94
|
+
|
89
95
|
var read = function read() {
|
90
96
|
return fullReader.read().then(function (result) {
|
91
97
|
if (result.done) {
|
92
98
|
return;
|
93
99
|
}
|
100
|
+
|
94
101
|
count++;
|
95
102
|
len += result.value.byteLength;
|
96
103
|
return read();
|
97
104
|
});
|
98
105
|
};
|
106
|
+
|
99
107
|
var readPromise = Promise.all([read(), promise]);
|
100
108
|
readPromise.then(function () {
|
101
109
|
expect(len).toEqual(pdf2Length);
|
@@ -127,17 +135,24 @@ describe('network', function () {
|
|
127
135
|
var tailSize = pdf1Length % rangeSize || rangeSize;
|
128
136
|
var range1Reader = stream.getRangeReader(pdf1Length - tailSize - rangeSize, pdf1Length - tailSize);
|
129
137
|
var range2Reader = stream.getRangeReader(pdf1Length - tailSize, pdf1Length);
|
130
|
-
var result1 = {
|
131
|
-
|
138
|
+
var result1 = {
|
139
|
+
value: 0
|
140
|
+
},
|
141
|
+
result2 = {
|
142
|
+
value: 0
|
143
|
+
};
|
144
|
+
|
132
145
|
var read = function read(reader, lenResult) {
|
133
146
|
return reader.read().then(function (result) {
|
134
147
|
if (result.done) {
|
135
148
|
return;
|
136
149
|
}
|
150
|
+
|
137
151
|
lenResult.value += result.value.byteLength;
|
138
152
|
return read(reader, lenResult);
|
139
153
|
});
|
140
154
|
};
|
155
|
+
|
141
156
|
var readPromises = Promise.all([read(range1Reader, result1), read(range2Reader, result2), promise]);
|
142
157
|
readPromises.then(function () {
|
143
158
|
expect(result1.value).toEqual(rangeSize);
|
@@ -19,17 +19,19 @@
|
|
19
19
|
* @licend The above is the entire license notice for the
|
20
20
|
* Javascript code in this page
|
21
21
|
*/
|
22
|
-
|
22
|
+
"use strict";
|
23
23
|
|
24
|
-
var _network_utils = require(
|
24
|
+
var _network_utils = require("../../display/network_utils");
|
25
25
|
|
26
|
-
var _util = require(
|
26
|
+
var _util = require("../../shared/util");
|
27
27
|
|
28
28
|
describe('network_utils', function () {
|
29
29
|
describe('validateRangeRequestCapabilities', function () {
|
30
30
|
it('rejects range chunk sizes that are not larger than zero', function () {
|
31
31
|
expect(function () {
|
32
|
-
(0, _network_utils.validateRangeRequestCapabilities)({
|
32
|
+
(0, _network_utils.validateRangeRequestCapabilities)({
|
33
|
+
rangeChunkSize: 0
|
34
|
+
});
|
33
35
|
}).toThrow(new Error('Range chunk size must be larger than zero'));
|
34
36
|
});
|
35
37
|
it('rejects disabled or non-HTTP range requests', function () {
|
@@ -19,25 +19,34 @@
|
|
19
19
|
* @licend The above is the entire license notice for the
|
20
20
|
* Javascript code in this page
|
21
21
|
*/
|
22
|
-
|
22
|
+
"use strict";
|
23
23
|
|
24
|
-
var
|
24
|
+
var _util = require("../../shared/util");
|
25
25
|
|
26
|
-
var
|
26
|
+
var _is_node = _interopRequireDefault(require("../../shared/is_node"));
|
27
27
|
|
28
|
-
var
|
28
|
+
var _node_stream = require("../../display/node_stream");
|
29
29
|
|
30
|
-
|
30
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
31
31
|
|
32
|
-
|
32
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
|
33
33
|
|
34
|
-
function
|
34
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
|
35
|
+
|
36
|
+
function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
37
|
+
|
38
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
39
|
+
|
40
|
+
(0, _util.assert)((0, _is_node.default)());
|
35
41
|
|
36
|
-
(0, _util.assert)((0, _is_node2.default)());
|
37
42
|
var path = require('path');
|
43
|
+
|
38
44
|
var url = require('url');
|
45
|
+
|
39
46
|
var http = require('http');
|
47
|
+
|
40
48
|
var fs = require('fs');
|
49
|
+
|
41
50
|
describe('node_stream', function () {
|
42
51
|
var server = null;
|
43
52
|
var port = null;
|
@@ -49,9 +58,10 @@ describe('node_stream', function () {
|
|
49
58
|
fs.lstat(filePath, function (error, stat) {
|
50
59
|
if (error) {
|
51
60
|
response.writeHead(404);
|
52
|
-
response.end(
|
61
|
+
response.end("File ".concat(request.url, " not found!"));
|
53
62
|
return;
|
54
63
|
}
|
64
|
+
|
55
65
|
if (!request.headers['range']) {
|
56
66
|
var contentLength = stat.size;
|
57
67
|
var stream = fs.createReadStream(filePath);
|
@@ -73,7 +83,11 @@ describe('node_stream', function () {
|
|
73
83
|
start: start,
|
74
84
|
end: end
|
75
85
|
});
|
76
|
-
|
86
|
+
|
87
|
+
response.writeHead(206, {
|
88
|
+
'Content-Type': 'application/pdf'
|
89
|
+
});
|
90
|
+
|
77
91
|
_stream.pipe(response);
|
78
92
|
}
|
79
93
|
});
|
@@ -87,7 +101,7 @@ describe('node_stream', function () {
|
|
87
101
|
});
|
88
102
|
it('read both http(s) and filesystem pdf files', function (done) {
|
89
103
|
var stream1 = new _node_stream.PDFNodeStream({
|
90
|
-
url:
|
104
|
+
url: "http://127.0.0.1:".concat(port, "/tracemonkey.pdf"),
|
91
105
|
rangeChunkSize: 65536,
|
92
106
|
disableStream: true,
|
93
107
|
disableRange: true
|
@@ -100,38 +114,41 @@ describe('node_stream', function () {
|
|
100
114
|
});
|
101
115
|
var fullReader1 = stream1.getFullReader();
|
102
116
|
var fullReader2 = stream2.getFullReader();
|
103
|
-
var isStreamingSupported1
|
104
|
-
isRangeSupported1 = void 0;
|
117
|
+
var isStreamingSupported1, isRangeSupported1;
|
105
118
|
var promise1 = fullReader1.headersReady.then(function () {
|
106
119
|
isStreamingSupported1 = fullReader1.isStreamingSupported;
|
107
120
|
isRangeSupported1 = fullReader1.isRangeSupported;
|
108
121
|
});
|
109
|
-
var isStreamingSupported2
|
110
|
-
isRangeSupported2 = void 0;
|
122
|
+
var isStreamingSupported2, isRangeSupported2;
|
111
123
|
var promise2 = fullReader2.headersReady.then(function () {
|
112
124
|
isStreamingSupported2 = fullReader2.isStreamingSupported;
|
113
125
|
isRangeSupported2 = fullReader2.isRangeSupported;
|
114
126
|
});
|
115
127
|
var len1 = 0,
|
116
128
|
len2 = 0;
|
129
|
+
|
117
130
|
var read1 = function read1() {
|
118
131
|
return fullReader1.read().then(function (result) {
|
119
132
|
if (result.done) {
|
120
133
|
return;
|
121
134
|
}
|
135
|
+
|
122
136
|
len1 += result.value.byteLength;
|
123
137
|
return read1();
|
124
138
|
});
|
125
139
|
};
|
140
|
+
|
126
141
|
var read2 = function read2() {
|
127
142
|
return fullReader2.read().then(function (result) {
|
128
143
|
if (result.done) {
|
129
144
|
return;
|
130
145
|
}
|
146
|
+
|
131
147
|
len2 += result.value.byteLength;
|
132
148
|
return read2();
|
133
149
|
});
|
134
150
|
};
|
151
|
+
|
135
152
|
var readPromise = Promise.all([read1(), read2(), promise1, promise2]);
|
136
153
|
readPromise.then(function (result) {
|
137
154
|
expect(isStreamingSupported1).toEqual(false);
|
@@ -148,7 +165,7 @@ describe('node_stream', function () {
|
|
148
165
|
it('read custom ranges for both http(s) and filesystem urls', function (done) {
|
149
166
|
var rangeSize = 32768;
|
150
167
|
var stream1 = new _node_stream.PDFNodeStream({
|
151
|
-
url:
|
168
|
+
url: "http://127.0.0.1:".concat(port, "/tracemonkey.pdf"),
|
152
169
|
length: pdfLength,
|
153
170
|
rangeChunkSize: rangeSize,
|
154
171
|
disableStream: true,
|
@@ -163,12 +180,8 @@ describe('node_stream', function () {
|
|
163
180
|
});
|
164
181
|
var fullReader1 = stream1.getFullReader();
|
165
182
|
var fullReader2 = stream2.getFullReader();
|
166
|
-
var isStreamingSupported1
|
167
|
-
|
168
|
-
fullReaderCancelled1 = void 0;
|
169
|
-
var isStreamingSupported2 = void 0,
|
170
|
-
isRangeSupported2 = void 0,
|
171
|
-
fullReaderCancelled2 = void 0;
|
183
|
+
var isStreamingSupported1, isRangeSupported1, fullReaderCancelled1;
|
184
|
+
var isStreamingSupported2, isRangeSupported2, fullReaderCancelled2;
|
172
185
|
var promise1 = fullReader1.headersReady.then(function () {
|
173
186
|
isStreamingSupported1 = fullReader1.isStreamingSupported;
|
174
187
|
isRangeSupported1 = fullReader1.isRangeSupported;
|
@@ -186,19 +199,30 @@ describe('node_stream', function () {
|
|
186
199
|
var range12Reader = stream1.getRangeReader(pdfLength - tailSize, pdfLength);
|
187
200
|
var range21Reader = stream2.getRangeReader(pdfLength - tailSize - rangeSize, pdfLength - tailSize);
|
188
201
|
var range22Reader = stream2.getRangeReader(pdfLength - tailSize, pdfLength);
|
189
|
-
var result11 = {
|
190
|
-
|
191
|
-
|
192
|
-
|
202
|
+
var result11 = {
|
203
|
+
value: 0
|
204
|
+
},
|
205
|
+
result12 = {
|
206
|
+
value: 0
|
207
|
+
};
|
208
|
+
var result21 = {
|
209
|
+
value: 0
|
210
|
+
},
|
211
|
+
result22 = {
|
212
|
+
value: 0
|
213
|
+
};
|
214
|
+
|
193
215
|
var read = function read(reader, lenResult) {
|
194
216
|
return reader.read().then(function (result) {
|
195
217
|
if (result.done) {
|
196
218
|
return;
|
197
219
|
}
|
220
|
+
|
198
221
|
lenResult.value += result.value.byteLength;
|
199
222
|
return read(reader, lenResult);
|
200
223
|
});
|
201
224
|
};
|
225
|
+
|
202
226
|
var readPromises = Promise.all([read(range11Reader, result11), read(range12Reader, result12), read(range21Reader, result21), read(range22Reader, result22), promise1, promise2]);
|
203
227
|
readPromises.then(function () {
|
204
228
|
expect(result11.value).toEqual(rangeSize);
|