pdfjs-dist 2.0.943 → 2.4.456
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/CODE_OF_CONDUCT.md +15 -0
- package/README.md +4 -0
- package/bower.json +1 -1
- package/build/pdf.js +8286 -14230
- package/build/pdf.js.map +1 -1
- package/build/pdf.min.js +22 -1
- package/build/pdf.worker.entry.js +5 -3
- package/build/pdf.worker.js +25500 -26628
- package/build/pdf.worker.js.map +1 -1
- package/build/pdf.worker.min.js +22 -1
- package/es5/build/pdf.js +25473 -0
- package/es5/build/pdf.js.map +1 -0
- package/{lib/shared/global_scope.js → es5/build/pdf.worker.entry.js} +5 -10
- package/es5/build/pdf.worker.js +57878 -0
- package/es5/build/pdf.worker.js.map +1 -0
- package/es5/web/images/annotation-check.svg +11 -0
- package/es5/web/images/annotation-comment.svg +16 -0
- package/es5/web/images/annotation-help.svg +26 -0
- package/es5/web/images/annotation-insert.svg +10 -0
- package/es5/web/images/annotation-key.svg +11 -0
- package/es5/web/images/annotation-newparagraph.svg +11 -0
- package/es5/web/images/annotation-noicon.svg +7 -0
- package/es5/web/images/annotation-note.svg +42 -0
- package/es5/web/images/annotation-paragraph.svg +16 -0
- package/es5/web/images/loading-icon.gif +0 -0
- package/es5/web/images/shadow.png +0 -0
- package/es5/web/images/texture.png +0 -0
- package/es5/web/pdf_viewer.css +407 -0
- package/es5/web/pdf_viewer.js +7757 -0
- package/es5/web/pdf_viewer.js.map +1 -0
- package/image_decoders/pdf.image_decoders.js +2887 -4094
- package/image_decoders/pdf.image_decoders.js.map +1 -1
- package/image_decoders/pdf.image_decoders.min.js +22 -1
- package/lib/README.md +7 -0
- package/lib/core/annotation.js +855 -778
- package/lib/core/arithmetic_decoder.js +325 -311
- package/lib/core/bidi.js +117 -50
- package/lib/core/ccitt.js +251 -89
- package/lib/core/ccitt_stream.js +26 -16
- package/lib/core/cff_parser.js +525 -197
- package/lib/core/charsets.js +6 -5
- package/lib/core/chunked_stream.js +541 -406
- package/lib/core/cmap.js +368 -253
- package/lib/core/colorspace.js +781 -800
- package/lib/core/core_utils.js +152 -0
- package/lib/core/crypto.js +609 -422
- package/lib/core/document.js +649 -481
- package/lib/core/encodings.js +33 -24
- package/lib/core/evaluator.js +1471 -736
- package/lib/core/font_renderer.js +289 -149
- package/lib/core/fonts.js +1067 -413
- package/lib/core/function.js +517 -287
- package/lib/core/glyphlist.js +4529 -4527
- package/lib/core/image.js +232 -114
- package/lib/core/image_utils.js +94 -0
- package/lib/core/jbig2.js +711 -342
- package/lib/core/jbig2_stream.js +31 -19
- package/lib/core/jpeg_stream.js +151 -26
- package/lib/core/jpg.js +433 -181
- package/lib/core/jpx.js +551 -143
- package/lib/core/jpx_stream.js +40 -28
- package/lib/core/metrics.js +2931 -2931
- package/lib/core/murmurhash3.js +104 -97
- package/lib/core/obj.js +1561 -1053
- package/lib/core/operator_list.js +192 -64
- package/lib/core/parser.js +1162 -864
- package/lib/core/pattern.js +224 -75
- package/lib/core/pdf_manager.js +154 -285
- package/lib/core/primitives.js +145 -69
- package/lib/core/ps_parser.js +212 -162
- package/lib/core/standard_fonts.js +245 -244
- package/lib/core/stream.js +353 -81
- package/lib/core/type1_parser.js +218 -68
- package/lib/core/unicode.js +1682 -1655
- package/lib/core/worker.js +233 -302
- package/lib/core/worker_stream.js +168 -0
- package/lib/display/annotation_layer.js +808 -862
- package/lib/display/api.js +1778 -1462
- package/lib/display/api_compatibility.js +14 -9
- package/lib/display/canvas.js +463 -140
- package/lib/display/content_disposition.js +86 -58
- package/lib/display/display_utils.js +524 -0
- package/lib/display/fetch_stream.js +202 -274
- package/lib/display/font_loader.js +311 -333
- package/lib/display/metadata.js +98 -88
- package/lib/display/network.js +343 -347
- package/lib/display/network_utils.js +46 -26
- package/lib/display/node_stream.js +326 -404
- package/lib/display/pattern_helper.js +168 -69
- package/lib/display/svg.js +1296 -885
- package/lib/display/text_layer.js +229 -103
- package/lib/display/transport_stream.js +290 -250
- package/lib/display/webgl.js +116 -83
- package/lib/display/worker_options.js +6 -5
- package/lib/display/xml_parser.js +358 -337
- package/lib/examples/node/domstubs.js +95 -39
- package/lib/pdf.js +49 -31
- package/lib/pdf.worker.js +7 -5
- package/lib/shared/compatibility.js +3 -145
- package/lib/shared/is_node.js +8 -7
- package/lib/shared/message_handler.js +367 -314
- package/lib/shared/util.js +421 -415
- package/lib/test/unit/annotation_spec.js +1570 -690
- package/lib/test/unit/api_spec.js +855 -493
- package/lib/test/unit/bidi_spec.js +12 -12
- package/lib/test/unit/cff_parser_spec.js +88 -61
- package/lib/test/unit/clitests_helper.js +9 -12
- package/lib/test/unit/cmap_spec.js +140 -88
- package/lib/test/unit/colorspace_spec.js +204 -152
- package/lib/test/unit/core_utils_spec.js +211 -0
- package/lib/test/unit/crypto_spec.js +194 -182
- package/lib/test/unit/custom_spec.js +50 -64
- package/lib/test/unit/display_svg_spec.js +53 -38
- package/lib/test/unit/display_utils_spec.js +263 -0
- package/lib/test/unit/document_spec.js +17 -22
- package/lib/test/unit/encodings_spec.js +15 -57
- package/lib/test/unit/evaluator_spec.js +90 -83
- package/lib/test/unit/fetch_stream_spec.js +111 -0
- package/lib/test/unit/function_spec.js +219 -205
- package/lib/test/unit/jasmine-boot.js +68 -39
- package/lib/test/unit/message_handler_spec.js +187 -160
- package/lib/test/unit/metadata_spec.js +87 -34
- package/lib/test/unit/murmurhash3_spec.js +13 -13
- package/lib/test/unit/network_spec.js +26 -59
- package/lib/test/unit/network_utils_spec.js +187 -121
- package/lib/test/unit/node_stream_spec.js +98 -90
- package/lib/test/unit/parser_spec.js +173 -131
- package/lib/test/unit/pdf_find_controller_spec.js +148 -67
- package/lib/test/unit/pdf_find_utils_spec.js +35 -34
- package/lib/test/unit/pdf_history_spec.js +45 -33
- package/lib/test/unit/primitives_spec.js +161 -126
- package/lib/test/unit/stream_spec.js +22 -15
- package/lib/test/unit/test_utils.js +149 -98
- package/lib/test/unit/testreporter.js +36 -18
- package/lib/test/unit/type1_parser_spec.js +46 -44
- package/lib/test/unit/ui_utils_spec.js +388 -372
- package/lib/test/unit/unicode_spec.js +49 -46
- package/lib/test/unit/util_spec.js +144 -248
- package/lib/web/annotation_layer_builder.js +75 -95
- package/lib/web/app.js +1538 -1147
- package/lib/web/app_options.js +116 -104
- package/lib/web/base_viewer.js +950 -775
- package/lib/web/chromecom.js +217 -225
- package/lib/web/debugger.js +236 -148
- package/lib/web/download_manager.js +50 -50
- package/lib/web/firefox_print_service.js +51 -33
- package/lib/web/firefoxcom.js +225 -352
- package/lib/web/genericcom.js +30 -93
- package/lib/web/genericl10n.js +26 -143
- package/lib/web/grab_to_pan.js +57 -33
- package/lib/web/interfaces.js +105 -232
- package/lib/web/overlay_manager.js +73 -227
- package/lib/web/password_prompt.js +44 -62
- package/lib/web/pdf_attachment_viewer.js +118 -123
- package/lib/web/pdf_cursor_tools.js +89 -93
- package/lib/web/pdf_document_properties.js +242 -281
- package/lib/web/pdf_find_bar.js +157 -163
- package/lib/web/pdf_find_controller.js +598 -454
- package/lib/web/pdf_find_utils.js +32 -16
- package/lib/web/pdf_history.js +481 -355
- package/lib/web/pdf_link_service.js +355 -323
- package/lib/web/pdf_outline_viewer.js +167 -152
- package/lib/web/pdf_page_view.js +511 -457
- package/lib/web/pdf_presentation_mode.js +347 -335
- package/lib/web/pdf_print_service.js +133 -103
- package/lib/web/pdf_rendering_queue.js +98 -100
- package/lib/web/pdf_sidebar.js +323 -299
- package/lib/web/pdf_sidebar_resizer.js +107 -108
- package/lib/web/pdf_single_page_viewer.js +94 -146
- package/lib/web/pdf_thumbnail_view.js +319 -269
- package/lib/web/pdf_thumbnail_viewer.js +219 -199
- package/lib/web/pdf_viewer.component.js +111 -32
- package/lib/web/pdf_viewer.js +61 -101
- package/lib/web/preferences.js +87 -272
- package/lib/web/secondary_toolbar.js +207 -220
- package/lib/web/text_layer_builder.js +322 -322
- package/lib/web/toolbar.js +227 -180
- package/lib/web/ui_utils.js +476 -421
- package/lib/web/view_history.js +59 -208
- package/lib/web/viewer_compatibility.js +9 -6
- package/package.json +2 -9
- package/web/pdf_viewer.css +36 -22
- package/web/pdf_viewer.js +4407 -4516
- package/web/pdf_viewer.js.map +1 -1
- package/webpack.js +14 -5
- package/external/streams/streams-lib.js +0 -3962
- package/external/url/url-lib.js +0 -627
- package/lib/display/dom_utils.js +0 -441
- package/lib/shared/streams_polyfill.js +0 -39
- package/lib/shared/url_polyfill.js +0 -50
- package/lib/test/unit/dom_utils_spec.js +0 -89
- package/lib/web/dom_events.js +0 -140
@@ -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
|
5
|
+
* Copyright 2020 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,143 +19,185 @@
|
|
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 _parser = require(
|
24
|
+
var _parser = require("../../core/parser.js");
|
25
25
|
|
26
|
-
var _util = require(
|
26
|
+
var _util = require("../../shared/util.js");
|
27
27
|
|
28
|
-
var _primitives = require(
|
28
|
+
var _primitives = require("../../core/primitives.js");
|
29
29
|
|
30
|
-
var _stream = require(
|
30
|
+
var _stream = require("../../core/stream.js");
|
31
31
|
|
32
|
-
describe(
|
33
|
-
describe(
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
32
|
+
describe("parser", function () {
|
33
|
+
describe("Parser", function () {
|
34
|
+
describe("inlineStreamSkipEI", function () {
|
35
|
+
it("should skip over the EI marker if it is found", function () {
|
36
|
+
const string = "q 1 0 0 1 0 0 cm BI /W 10 /H 10 /BPC 1 " + "/F /A85 ID abc123~> EI Q";
|
37
|
+
const input = new _stream.StringStream(string);
|
38
|
+
const parser = new _parser.Parser({
|
39
|
+
lexer: new _parser.Lexer(input),
|
40
|
+
xref: null,
|
41
|
+
allowStreams: true
|
42
|
+
});
|
43
|
+
parser.inlineStreamSkipEI(input);
|
44
|
+
expect(input.pos).toEqual(string.indexOf("Q"));
|
45
|
+
expect(input.peekByte()).toEqual(0x51);
|
46
|
+
});
|
47
|
+
it("should skip to the end of stream if the EI marker is not found", function () {
|
48
|
+
const string = "q 1 0 0 1 0 0 cm BI /W 10 /H 10 /BPC 1 /F /A85 ID abc123~> Q";
|
49
|
+
const input = new _stream.StringStream(string);
|
50
|
+
const parser = new _parser.Parser({
|
51
|
+
lexer: new _parser.Lexer(input),
|
52
|
+
xref: null,
|
53
|
+
allowStreams: true
|
54
|
+
});
|
55
|
+
parser.inlineStreamSkipEI(input);
|
56
|
+
expect(input.pos).toEqual(string.length);
|
57
|
+
expect(input.peekByte()).toEqual(-1);
|
58
|
+
});
|
39
59
|
});
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
expect(
|
48
|
-
}
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
});
|
56
|
-
it('should ignore minus signs in the middle of number', function () {
|
57
|
-
var input = new _stream.StringStream('205--.88');
|
58
|
-
var lexer = new _parser.Lexer(input);
|
59
|
-
var result = lexer.getNumber();
|
60
|
-
expect(result).toEqual(205.88);
|
60
|
+
});
|
61
|
+
describe("Lexer", function () {
|
62
|
+
describe("nextChar", function () {
|
63
|
+
it("should return and set -1 when the end of the stream is reached", function () {
|
64
|
+
const input = new _stream.StringStream("");
|
65
|
+
const lexer = new _parser.Lexer(input);
|
66
|
+
expect(lexer.nextChar()).toEqual(-1);
|
67
|
+
expect(lexer.currentChar).toEqual(-1);
|
68
|
+
});
|
69
|
+
it("should return and set the character after the current position", function () {
|
70
|
+
const input = new _stream.StringStream("123");
|
71
|
+
const lexer = new _parser.Lexer(input);
|
72
|
+
expect(lexer.nextChar()).toEqual(0x32);
|
73
|
+
expect(lexer.currentChar).toEqual(0x32);
|
74
|
+
});
|
61
75
|
});
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
76
|
+
describe("peekChar", function () {
|
77
|
+
it("should only return -1 when the end of the stream is reached", function () {
|
78
|
+
const input = new _stream.StringStream("");
|
79
|
+
const lexer = new _parser.Lexer(input);
|
80
|
+
expect(lexer.peekChar()).toEqual(-1);
|
81
|
+
expect(lexer.currentChar).toEqual(-1);
|
82
|
+
});
|
83
|
+
it("should only return the character after the current position", function () {
|
84
|
+
const input = new _stream.StringStream("123");
|
85
|
+
const lexer = new _parser.Lexer(input);
|
86
|
+
expect(lexer.peekChar()).toEqual(0x32);
|
87
|
+
expect(lexer.currentChar).toEqual(0x31);
|
88
|
+
});
|
69
89
|
});
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
var lexer = new _parser.Lexer(input);
|
79
|
-
expect(function () {
|
80
|
-
return lexer.getNumber();
|
81
|
-
}).toThrowError(_util.FormatError, /^Invalid number:\s/);
|
82
|
-
};
|
90
|
+
describe("getNumber", function () {
|
91
|
+
it("should stop parsing numbers at the end of stream", function () {
|
92
|
+
const input = new _stream.StringStream("11.234");
|
93
|
+
const lexer = new _parser.Lexer(input);
|
94
|
+
expect(lexer.getNumber()).toEqual(11.234);
|
95
|
+
});
|
96
|
+
it("should parse PostScript numbers", function () {
|
97
|
+
const numbers = ["-.002", "34.5", "-3.62", "123.6e10", "1E-5", "-1.", "0.0", "123", "-98", "43445", "0", "+17"];
|
83
98
|
|
84
|
-
|
85
|
-
|
86
|
-
|
99
|
+
for (const number of numbers) {
|
100
|
+
const input = new _stream.StringStream(number);
|
101
|
+
const lexer = new _parser.Lexer(input);
|
102
|
+
const result = lexer.getNumber(),
|
103
|
+
expected = parseFloat(number);
|
87
104
|
|
88
|
-
|
89
|
-
|
90
|
-
|
105
|
+
if (result !== expected && Math.abs(result - expected) < 1e-15) {
|
106
|
+
console.error(`Fuzzy matching "${result}" with "${expected}" to ` + "work-around rounding bugs in Chromium browsers.");
|
107
|
+
expect(true).toEqual(true);
|
108
|
+
continue;
|
109
|
+
}
|
91
110
|
|
92
|
-
|
111
|
+
expect(result).toEqual(expected);
|
93
112
|
}
|
94
|
-
}
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
113
|
+
});
|
114
|
+
it("should ignore double negative before number", function () {
|
115
|
+
const input = new _stream.StringStream("--205.88");
|
116
|
+
const lexer = new _parser.Lexer(input);
|
117
|
+
expect(lexer.getNumber()).toEqual(-205.88);
|
118
|
+
});
|
119
|
+
it("should ignore minus signs in the middle of number", function () {
|
120
|
+
const input = new _stream.StringStream("205--.88");
|
121
|
+
const lexer = new _parser.Lexer(input);
|
122
|
+
expect(lexer.getNumber()).toEqual(205.88);
|
123
|
+
});
|
124
|
+
it("should ignore line-breaks between operator and digit in number", function () {
|
125
|
+
const minusInput = new _stream.StringStream("-\r\n205.88");
|
126
|
+
const minusLexer = new _parser.Lexer(minusInput);
|
127
|
+
expect(minusLexer.getNumber()).toEqual(-205.88);
|
128
|
+
const plusInput = new _stream.StringStream("+\r\n205.88");
|
129
|
+
const plusLexer = new _parser.Lexer(plusInput);
|
130
|
+
expect(plusLexer.getNumber()).toEqual(205.88);
|
131
|
+
});
|
132
|
+
it("should treat a single decimal point as zero", function () {
|
133
|
+
const input = new _stream.StringStream(".");
|
134
|
+
const lexer = new _parser.Lexer(input);
|
135
|
+
expect(lexer.getNumber()).toEqual(0);
|
136
|
+
const numbers = ["..", "-.", "+.", "-\r\n.", "+\r\n."];
|
137
|
+
|
138
|
+
for (const number of numbers) {
|
139
|
+
const input = new _stream.StringStream(number);
|
140
|
+
const lexer = new _parser.Lexer(input);
|
141
|
+
expect(function () {
|
142
|
+
return lexer.getNumber();
|
143
|
+
}).toThrowError(_util.FormatError, /^Invalid number:\s/);
|
106
144
|
}
|
107
|
-
}
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
expect(lexer.currentChar).toEqual(0x45);
|
145
|
+
});
|
146
|
+
it("should handle glued numbers and operators", function () {
|
147
|
+
const input = new _stream.StringStream("123ET");
|
148
|
+
const lexer = new _parser.Lexer(input);
|
149
|
+
expect(lexer.getNumber()).toEqual(123);
|
150
|
+
expect(lexer.currentChar).toEqual(0x45);
|
151
|
+
});
|
115
152
|
});
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
153
|
+
describe("getString", function () {
|
154
|
+
it("should stop parsing strings at the end of stream", function () {
|
155
|
+
const input = new _stream.StringStream("(1$4)");
|
156
|
+
|
157
|
+
input.getByte = function (super_getByte) {
|
158
|
+
const ch = super_getByte.call(input);
|
159
|
+
return ch === 0x24 ? -1 : ch;
|
160
|
+
}.bind(input, input.getByte);
|
161
|
+
|
162
|
+
const lexer = new _parser.Lexer(input);
|
163
|
+
expect(lexer.getString()).toEqual("1");
|
164
|
+
});
|
165
|
+
it("should ignore escaped CR and LF", function () {
|
166
|
+
const input = new _stream.StringStream("(\\101\\\r\n\\102\\\r\\103\\\n\\104)");
|
167
|
+
const lexer = new _parser.Lexer(input);
|
168
|
+
expect(lexer.getString()).toEqual("ABCD");
|
169
|
+
});
|
131
170
|
});
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
171
|
+
describe("getHexString", function () {
|
172
|
+
it("should not throw exception on bad input", function () {
|
173
|
+
const input = new _stream.StringStream("<7 0 2 15 5 2 2 2 4 3 2 4>");
|
174
|
+
const lexer = new _parser.Lexer(input);
|
175
|
+
expect(lexer.getHexString()).toEqual('p!U"$2');
|
176
|
+
});
|
137
177
|
});
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
178
|
+
describe("getName", function () {
|
179
|
+
it("should handle Names with invalid usage of NUMBER SIGN (#)", function () {
|
180
|
+
const inputNames = ["/# 680 0 R", "/#AQwerty", "/#A<</B"];
|
181
|
+
const expectedNames = ["#", "#AQwerty", "#A"];
|
182
|
+
|
183
|
+
for (let i = 0, ii = inputNames.length; i < ii; i++) {
|
184
|
+
const input = new _stream.StringStream(inputNames[i]);
|
185
|
+
const lexer = new _parser.Lexer(input);
|
186
|
+
expect(lexer.getName()).toEqual(_primitives.Name.get(expectedNames[i]));
|
187
|
+
}
|
188
|
+
});
|
147
189
|
});
|
148
190
|
});
|
149
|
-
describe(
|
150
|
-
it(
|
151
|
-
|
191
|
+
describe("Linearization", function () {
|
192
|
+
it("should not find a linearization dictionary", function () {
|
193
|
+
const stream1 = new _stream.StringStream("3 0 obj\n" + "<<\n" + "/Length 4622\n" + "/Filter /FlateDecode\n" + ">>\n" + "endobj");
|
152
194
|
expect(_parser.Linearization.create(stream1)).toEqual(null);
|
153
|
-
|
195
|
+
const stream2 = new _stream.StringStream("1 0 obj\n" + "<<\n" + "/Linearized 0\n" + ">>\n" + "endobj");
|
154
196
|
expect(_parser.Linearization.create(stream2)).toEqual(null);
|
155
197
|
});
|
156
|
-
it(
|
157
|
-
|
158
|
-
|
198
|
+
it("should accept a valid linearization dictionary", function () {
|
199
|
+
const stream = new _stream.StringStream("131 0 obj\n" + "<<\n" + "/Linearized 1\n" + "/O 133\n" + "/H [ 1388 863 ]\n" + "/L 90\n" + "/E 43573\n" + "/N 18\n" + "/T 193883\n" + ">>\n" + "endobj");
|
200
|
+
const expectedLinearizationDict = {
|
159
201
|
length: 90,
|
160
202
|
hints: [1388, 863],
|
161
203
|
objectNumberFirst: 133,
|
@@ -166,33 +208,33 @@ describe('parser', function () {
|
|
166
208
|
};
|
167
209
|
expect(_parser.Linearization.create(stream)).toEqual(expectedLinearizationDict);
|
168
210
|
});
|
169
|
-
it(
|
170
|
-
|
211
|
+
it("should reject a linearization dictionary with invalid " + "integer parameters", function () {
|
212
|
+
const stream1 = new _stream.StringStream("1 0 obj\n" + "<<\n" + "/Linearized 1\n" + "/O 133\n" + "/H [ 1388 863 ]\n" + "/L 196622\n" + "/E 43573\n" + "/N 18\n" + "/T 193883\n" + ">>\n" + "endobj");
|
171
213
|
expect(function () {
|
172
214
|
return _parser.Linearization.create(stream1);
|
173
|
-
}).toThrow(new Error('The "L" parameter in the linearization ' +
|
174
|
-
|
215
|
+
}).toThrow(new Error('The "L" parameter in the linearization ' + "dictionary does not equal the stream length."));
|
216
|
+
const stream2 = new _stream.StringStream("1 0 obj\n" + "<<\n" + "/Linearized 1\n" + "/O 133\n" + "/H [ 1388 863 ]\n" + "/L 84\n" + "/E 0\n" + "/N 18\n" + "/T 193883\n" + ">>\n" + "endobj");
|
175
217
|
expect(function () {
|
176
218
|
return _parser.Linearization.create(stream2);
|
177
|
-
}).toThrow(new Error('The "E" parameter in the linearization
|
178
|
-
|
219
|
+
}).toThrow(new Error('The "E" parameter in the linearization dictionary is invalid.'));
|
220
|
+
const stream3 = new _stream.StringStream("1 0 obj\n" + "<<\n" + "/Linearized 1\n" + "/O /abc\n" + "/H [ 1388 863 ]\n" + "/L 89\n" + "/E 43573\n" + "/N 18\n" + "/T 193883\n" + ">>\n" + "endobj");
|
179
221
|
expect(function () {
|
180
222
|
return _parser.Linearization.create(stream3);
|
181
|
-
}).toThrow(new Error('The "O" parameter in the linearization
|
223
|
+
}).toThrow(new Error('The "O" parameter in the linearization dictionary is invalid.'));
|
182
224
|
});
|
183
|
-
it(
|
184
|
-
|
225
|
+
it("should reject a linearization dictionary with invalid hint parameters", function () {
|
226
|
+
const stream1 = new _stream.StringStream("1 0 obj\n" + "<<\n" + "/Linearized 1\n" + "/O 133\n" + "/H 1388\n" + "/L 80\n" + "/E 43573\n" + "/N 18\n" + "/T 193883\n" + ">>\n" + "endobj");
|
185
227
|
expect(function () {
|
186
228
|
return _parser.Linearization.create(stream1);
|
187
|
-
}).toThrow(new Error(
|
188
|
-
|
229
|
+
}).toThrow(new Error("Hint array in the linearization dictionary is invalid."));
|
230
|
+
const stream2 = new _stream.StringStream("1 0 obj\n" + "<<\n" + "/Linearized 1\n" + "/O 133\n" + "/H [ 1388 ]\n" + "/L 84\n" + "/E 43573\n" + "/N 18\n" + "/T 193883\n" + ">>\n" + "endobj");
|
189
231
|
expect(function () {
|
190
232
|
return _parser.Linearization.create(stream2);
|
191
|
-
}).toThrow(new Error(
|
192
|
-
|
233
|
+
}).toThrow(new Error("Hint array in the linearization dictionary is invalid."));
|
234
|
+
const stream3 = new _stream.StringStream("1 0 obj\n" + "<<\n" + "/Linearized 1\n" + "/O 133\n" + "/H [ 1388 863 0 234]\n" + "/L 93\n" + "/E 43573\n" + "/N 18\n" + "/T 193883\n" + ">>\n" + "endobj");
|
193
235
|
expect(function () {
|
194
236
|
return _parser.Linearization.create(stream3);
|
195
|
-
}).toThrow(new Error(
|
237
|
+
}).toThrow(new Error("Hint (2) in the linearization dictionary is invalid."));
|
196
238
|
});
|
197
239
|
});
|
198
240
|
});
|
@@ -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
|
5
|
+
* Copyright 2020 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,74 +19,55 @@
|
|
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 _test_utils = require("./test_utils.js");
|
25
25
|
|
26
|
-
var
|
26
|
+
var _ui_utils = require("../../web/ui_utils.js");
|
27
27
|
|
28
|
-
var
|
28
|
+
var _api = require("../../display/api.js");
|
29
29
|
|
30
|
-
var
|
30
|
+
var _pdf_find_controller = require("../../web/pdf_find_controller.js");
|
31
31
|
|
32
|
-
var
|
32
|
+
var _pdf_link_service = require("../../web/pdf_link_service.js");
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
34
|
+
class MockLinkService extends _pdf_link_service.SimpleLinkService {
|
35
|
+
constructor() {
|
36
|
+
super();
|
37
|
+
this._page = 1;
|
38
|
+
this._pdfDocument = null;
|
39
|
+
}
|
41
40
|
|
42
|
-
|
43
|
-
|
41
|
+
setDocument(pdfDocument) {
|
42
|
+
this._pdfDocument = pdfDocument;
|
43
|
+
}
|
44
44
|
|
45
|
-
|
46
|
-
|
45
|
+
get pagesCount() {
|
46
|
+
return this._pdfDocument.numPages;
|
47
|
+
}
|
47
48
|
|
48
|
-
|
49
|
+
get page() {
|
50
|
+
return this._page;
|
51
|
+
}
|
49
52
|
|
50
|
-
|
51
|
-
|
52
|
-
return _this;
|
53
|
+
set page(value) {
|
54
|
+
this._page = value;
|
53
55
|
}
|
54
56
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
}, {
|
61
|
-
key: 'pagesCount',
|
62
|
-
get: function get() {
|
63
|
-
return this._pdfDocument.numPages;
|
64
|
-
}
|
65
|
-
}, {
|
66
|
-
key: 'page',
|
67
|
-
get: function get() {
|
68
|
-
return this._page;
|
69
|
-
},
|
70
|
-
set: function set(value) {
|
71
|
-
this._page = value;
|
72
|
-
}
|
73
|
-
}]);
|
74
|
-
|
75
|
-
return MockLinkService;
|
76
|
-
}(_pdf_link_service.SimpleLinkService);
|
77
|
-
|
78
|
-
describe('pdf_find_controller', function () {
|
79
|
-
var eventBus = void 0;
|
80
|
-
var pdfFindController = void 0;
|
57
|
+
}
|
58
|
+
|
59
|
+
describe("pdf_find_controller", function () {
|
60
|
+
let eventBus;
|
61
|
+
let pdfFindController;
|
81
62
|
beforeEach(function (done) {
|
82
|
-
|
63
|
+
const loadingTask = (0, _api.getDocument)((0, _test_utils.buildGetDocumentParams)("tracemonkey.pdf"));
|
83
64
|
loadingTask.promise.then(function (pdfDocument) {
|
84
65
|
eventBus = new _ui_utils.EventBus();
|
85
|
-
|
66
|
+
const linkService = new MockLinkService();
|
86
67
|
linkService.setDocument(pdfDocument);
|
87
68
|
pdfFindController = new _pdf_find_controller.PDFFindController({
|
88
|
-
linkService
|
89
|
-
eventBus
|
69
|
+
linkService,
|
70
|
+
eventBus
|
90
71
|
});
|
91
72
|
pdfFindController.setDocument(pdfDocument);
|
92
73
|
done();
|
@@ -96,23 +77,123 @@ describe('pdf_find_controller', function () {
|
|
96
77
|
eventBus = null;
|
97
78
|
pdfFindController = null;
|
98
79
|
});
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
80
|
+
|
81
|
+
function testSearch({
|
82
|
+
parameters,
|
83
|
+
matchesPerPage,
|
84
|
+
selectedMatch
|
85
|
+
}) {
|
86
|
+
return new Promise(function (resolve) {
|
87
|
+
pdfFindController.executeCommand("find", parameters);
|
88
|
+
let totalPages = matchesPerPage.length;
|
89
|
+
|
90
|
+
for (let i = totalPages - 1; i >= 0; i--) {
|
91
|
+
if (matchesPerPage[i] > 0) {
|
92
|
+
totalPages = i + 1;
|
93
|
+
break;
|
94
|
+
}
|
95
|
+
}
|
96
|
+
|
97
|
+
const totalMatches = matchesPerPage.reduce((a, b) => {
|
98
|
+
return a + b;
|
99
|
+
});
|
100
|
+
eventBus.on("updatefindmatchescount", function onUpdateFindMatchesCount(evt) {
|
101
|
+
if (pdfFindController.pageMatches.length !== totalPages) {
|
102
|
+
return;
|
103
|
+
}
|
104
|
+
|
105
|
+
eventBus.off("updatefindmatchescount", onUpdateFindMatchesCount);
|
106
|
+
expect(evt.matchesCount.total).toBe(totalMatches);
|
107
|
+
|
108
|
+
for (let i = 0; i < totalPages; i++) {
|
109
|
+
expect(pdfFindController.pageMatches[i].length).toEqual(matchesPerPage[i]);
|
110
|
+
}
|
111
|
+
|
112
|
+
expect(pdfFindController.selected.pageIdx).toEqual(selectedMatch.pageIndex);
|
113
|
+
expect(pdfFindController.selected.matchIdx).toEqual(selectedMatch.matchIndex);
|
114
|
+
resolve();
|
115
|
+
});
|
105
116
|
});
|
106
|
-
|
107
|
-
|
108
|
-
|
117
|
+
}
|
118
|
+
|
119
|
+
it("performs a normal search", function (done) {
|
120
|
+
testSearch({
|
121
|
+
parameters: {
|
122
|
+
query: "Dynamic",
|
123
|
+
caseSensitive: false,
|
124
|
+
entireWord: false,
|
125
|
+
phraseSearch: true,
|
126
|
+
findPrevious: false
|
127
|
+
},
|
128
|
+
matchesPerPage: [11, 5, 0, 3, 0, 0, 0, 1, 1, 1, 0, 3, 4, 4],
|
129
|
+
selectedMatch: {
|
130
|
+
pageIndex: 0,
|
131
|
+
matchIndex: 0
|
109
132
|
}
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
133
|
+
}).then(done);
|
134
|
+
});
|
135
|
+
it("performs a normal search and finds the previous result", function (done) {
|
136
|
+
testSearch({
|
137
|
+
parameters: {
|
138
|
+
query: "conference",
|
139
|
+
caseSensitive: false,
|
140
|
+
entireWord: false,
|
141
|
+
phraseSearch: true,
|
142
|
+
findPrevious: true
|
143
|
+
},
|
144
|
+
matchesPerPage: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5],
|
145
|
+
selectedMatch: {
|
146
|
+
pageIndex: 13,
|
147
|
+
matchIndex: 4
|
114
148
|
}
|
115
|
-
|
116
|
-
|
149
|
+
}).then(done);
|
150
|
+
});
|
151
|
+
it("performs a case sensitive search", function (done) {
|
152
|
+
testSearch({
|
153
|
+
parameters: {
|
154
|
+
query: "Dynamic",
|
155
|
+
caseSensitive: true,
|
156
|
+
entireWord: false,
|
157
|
+
phraseSearch: true,
|
158
|
+
findPrevious: false
|
159
|
+
},
|
160
|
+
matchesPerPage: [3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3],
|
161
|
+
selectedMatch: {
|
162
|
+
pageIndex: 0,
|
163
|
+
matchIndex: 0
|
164
|
+
}
|
165
|
+
}).then(done);
|
166
|
+
});
|
167
|
+
it("performs an entire word search", function (done) {
|
168
|
+
testSearch({
|
169
|
+
parameters: {
|
170
|
+
query: "Government",
|
171
|
+
caseSensitive: false,
|
172
|
+
entireWord: true,
|
173
|
+
phraseSearch: true,
|
174
|
+
findPrevious: false
|
175
|
+
},
|
176
|
+
matchesPerPage: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
|
177
|
+
selectedMatch: {
|
178
|
+
pageIndex: 12,
|
179
|
+
matchIndex: 0
|
180
|
+
}
|
181
|
+
}).then(done);
|
182
|
+
});
|
183
|
+
it("performs a multiple term (no phrase) search", function (done) {
|
184
|
+
testSearch({
|
185
|
+
parameters: {
|
186
|
+
query: "alternate solution",
|
187
|
+
caseSensitive: false,
|
188
|
+
entireWord: false,
|
189
|
+
phraseSearch: false,
|
190
|
+
findPrevious: false
|
191
|
+
},
|
192
|
+
matchesPerPage: [0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0],
|
193
|
+
selectedMatch: {
|
194
|
+
pageIndex: 5,
|
195
|
+
matchIndex: 0
|
196
|
+
}
|
197
|
+
}).then(done);
|
117
198
|
});
|
118
199
|
});
|