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.
- package/CODE_OF_CONDUCT.md +15 -0
- package/bower.json +1 -1
- package/build/pdf.js +18515 -11402
- package/build/pdf.js.map +1 -1
- package/build/pdf.min.js +1 -1
- package/build/pdf.worker.js +48266 -37137
- package/build/pdf.worker.js.map +1 -1
- package/build/pdf.worker.min.js +1 -1
- package/external/url/url-lib.js +627 -0
- package/image_decoders/pdf.image_decoders.js +11350 -0
- package/image_decoders/pdf.image_decoders.js.map +1 -0
- package/image_decoders/pdf.image_decoders.min.js +1 -0
- package/lib/core/annotation.js +587 -242
- package/lib/core/arithmetic_decoder.js +275 -245
- package/lib/core/bidi.js +65 -6
- package/lib/core/ccitt.js +173 -18
- package/lib/core/ccitt_stream.js +15 -6
- package/lib/core/cff_parser.js +433 -61
- package/lib/core/charsets.js +5 -4
- package/lib/core/chunked_stream.js +400 -152
- package/lib/core/cmap.js +326 -87
- package/lib/core/colorspace.js +874 -594
- package/lib/core/core_utils.js +147 -0
- package/lib/core/crypto.js +290 -45
- package/lib/core/document.js +560 -268
- package/lib/core/encodings.js +19 -10
- package/lib/core/evaluator.js +1005 -360
- package/lib/core/font_renderer.js +331 -97
- package/lib/core/fonts.js +812 -195
- package/lib/core/function.js +284 -71
- package/lib/core/glyphlist.js +4 -3
- package/lib/core/image.js +169 -62
- package/lib/core/image_utils.js +111 -0
- package/lib/core/jbig2.js +479 -66
- package/lib/core/jbig2_stream.js +19 -8
- package/lib/core/jpeg_stream.js +38 -13
- package/lib/core/jpg.js +253 -29
- package/lib/core/jpx.js +396 -6
- package/lib/core/jpx_stream.js +18 -6
- package/lib/core/metrics.js +15 -15
- package/lib/core/murmurhash3.js +56 -34
- package/lib/core/obj.js +1354 -488
- package/lib/core/operator_list.js +144 -31
- package/lib/core/parser.js +539 -191
- package/lib/core/pattern.js +148 -14
- package/lib/core/pdf_manager.js +323 -133
- package/lib/core/primitives.js +111 -24
- package/lib/core/ps_parser.js +134 -45
- package/lib/core/standard_fonts.js +17 -17
- package/lib/core/stream.js +313 -34
- package/lib/core/type1_parser.js +143 -13
- package/lib/core/unicode.js +32 -5
- package/lib/core/worker.js +217 -190
- package/lib/core/worker_stream.js +277 -0
- package/lib/display/annotation_layer.js +450 -133
- package/lib/display/api.js +1597 -784
- package/lib/display/api_compatibility.js +11 -13
- package/lib/display/canvas.js +360 -44
- package/lib/display/content_disposition.js +83 -32
- package/lib/display/display_utils.js +747 -0
- package/lib/display/fetch_stream.js +221 -90
- package/lib/display/font_loader.js +468 -236
- package/lib/display/metadata.js +38 -16
- package/lib/display/network.js +635 -428
- package/lib/display/network_utils.js +32 -19
- package/lib/display/node_stream.js +367 -175
- package/lib/display/pattern_helper.js +81 -31
- package/lib/display/svg.js +1235 -519
- package/lib/display/text_layer.js +153 -29
- package/lib/display/transport_stream.js +345 -94
- package/lib/display/webgl.js +64 -18
- package/lib/display/worker_options.js +5 -4
- package/lib/display/xml_parser.js +166 -53
- package/lib/examples/node/domstubs.js +60 -4
- package/lib/pdf.js +36 -14
- package/lib/pdf.worker.js +5 -3
- package/lib/shared/compatibility.js +158 -564
- package/lib/shared/global_scope.js +2 -2
- package/lib/shared/is_node.js +4 -4
- package/lib/shared/message_handler.js +521 -0
- package/lib/shared/streams_polyfill.js +21 -17
- package/lib/shared/url_polyfill.js +56 -0
- package/lib/shared/util.js +243 -710
- package/lib/test/unit/annotation_spec.js +870 -401
- package/lib/test/unit/api_spec.js +657 -345
- package/lib/test/unit/bidi_spec.js +7 -7
- package/lib/test/unit/cff_parser_spec.js +54 -11
- package/lib/test/unit/clitests_helper.js +10 -8
- package/lib/test/unit/cmap_spec.js +95 -41
- package/lib/test/unit/colorspace_spec.js +115 -63
- package/lib/test/unit/core_utils_spec.js +191 -0
- package/lib/test/unit/crypto_spec.js +17 -5
- package/lib/test/unit/custom_spec.js +43 -55
- package/lib/test/unit/display_svg_spec.js +34 -18
- package/lib/test/unit/display_utils_spec.js +273 -0
- package/lib/test/unit/document_spec.js +8 -13
- package/lib/test/unit/encodings_spec.js +25 -45
- package/lib/test/unit/evaluator_spec.js +38 -15
- package/lib/test/unit/fetch_stream_spec.js +109 -0
- package/lib/test/unit/function_spec.js +17 -5
- package/lib/test/unit/jasmine-boot.js +33 -20
- package/lib/test/unit/{util_stream_spec.js → message_handler_spec.js} +41 -69
- package/lib/test/unit/metadata_spec.js +71 -11
- package/lib/test/unit/murmurhash3_spec.js +3 -3
- package/lib/test/unit/network_spec.js +19 -54
- package/lib/test/unit/network_utils_spec.js +91 -14
- package/lib/test/unit/node_stream_spec.js +56 -32
- package/lib/test/unit/parser_spec.js +162 -71
- package/lib/test/unit/pdf_find_controller_spec.js +230 -0
- package/lib/test/unit/pdf_find_utils_spec.js +63 -0
- package/lib/test/unit/pdf_history_spec.js +21 -9
- package/lib/test/unit/primitives_spec.js +53 -20
- package/lib/test/unit/stream_spec.js +12 -4
- package/lib/test/unit/test_utils.js +273 -56
- package/lib/test/unit/testreporter.js +21 -3
- package/lib/test/unit/type1_parser_spec.js +8 -6
- package/lib/test/unit/ui_utils_spec.js +454 -16
- package/lib/test/unit/unicode_spec.js +18 -15
- package/lib/test/unit/util_spec.js +87 -128
- package/lib/web/annotation_layer_builder.js +39 -22
- package/lib/web/app.js +1290 -588
- package/lib/web/app_options.js +100 -62
- package/lib/web/base_viewer.js +511 -182
- package/lib/web/chromecom.js +261 -117
- package/lib/web/debugger.js +166 -22
- package/lib/web/download_manager.js +32 -13
- package/lib/web/firefox_print_service.js +20 -10
- package/lib/web/firefoxcom.js +315 -80
- package/lib/web/genericcom.js +89 -30
- package/lib/web/genericl10n.js +142 -30
- package/lib/web/grab_to_pan.js +28 -4
- package/lib/web/interfaces.js +170 -47
- package/lib/web/overlay_manager.js +235 -85
- package/lib/web/password_prompt.js +22 -14
- package/lib/web/pdf_attachment_viewer.js +38 -18
- package/lib/web/pdf_cursor_tools.js +39 -16
- package/lib/web/pdf_document_properties.js +255 -136
- package/lib/web/pdf_find_bar.js +84 -40
- package/lib/web/pdf_find_controller.js +495 -184
- package/lib/web/pdf_find_utils.js +111 -0
- package/lib/web/pdf_history.js +190 -53
- package/lib/web/pdf_link_service.js +138 -77
- package/lib/web/pdf_outline_viewer.js +122 -46
- package/lib/web/pdf_page_view.js +191 -67
- package/lib/web/pdf_presentation_mode.js +99 -34
- package/lib/web/pdf_print_service.js +61 -13
- package/lib/web/pdf_rendering_queue.js +28 -9
- package/lib/web/pdf_sidebar.js +141 -81
- package/lib/web/pdf_sidebar_resizer.js +42 -16
- package/lib/web/pdf_single_page_viewer.js +74 -66
- package/lib/web/pdf_thumbnail_view.js +104 -33
- package/lib/web/pdf_thumbnail_viewer.js +66 -26
- package/lib/web/pdf_viewer.component.js +112 -32
- package/lib/web/pdf_viewer.js +91 -52
- package/lib/web/preferences.js +284 -89
- package/lib/web/secondary_toolbar.js +165 -40
- package/lib/web/text_layer_builder.js +134 -59
- package/lib/web/toolbar.js +78 -43
- package/lib/web/ui_utils.js +462 -136
- package/lib/web/view_history.js +215 -67
- package/lib/web/viewer_compatibility.js +4 -13
- package/package.json +5 -4
- package/web/pdf_viewer.css +79 -11
- package/web/pdf_viewer.js +6107 -3748
- package/web/pdf_viewer.js.map +1 -1
- package/lib/display/dom_utils.js +0 -309
- package/lib/test/unit/dom_utils_spec.js +0 -89
- package/lib/test/unit/fonts_spec.js +0 -81
- 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
|
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,26 +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 _ui_utils = require(
|
24
|
+
var _ui_utils = require("../../web/ui_utils");
|
25
25
|
|
26
|
-
var _util = require(
|
26
|
+
var _util = require("../../shared/util");
|
27
27
|
|
28
|
-
var _is_node = require(
|
28
|
+
var _is_node = _interopRequireDefault(require("../../shared/is_node"));
|
29
29
|
|
30
|
-
|
30
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
31
31
|
|
32
|
-
function
|
32
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
|
33
|
+
|
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; }
|
33
39
|
|
34
40
|
describe('ui_utils', function () {
|
35
41
|
describe('binary search', function () {
|
36
|
-
function isTrue(
|
37
|
-
return
|
42
|
+
function isTrue(_boolean) {
|
43
|
+
return _boolean;
|
38
44
|
}
|
45
|
+
|
39
46
|
function isGreater3(number) {
|
40
47
|
return number > 3;
|
41
48
|
}
|
49
|
+
|
42
50
|
it('empty array', function () {
|
43
51
|
expect((0, _ui_utils.binarySearchFirstItem)([], isTrue)).toEqual(0);
|
44
52
|
});
|
@@ -72,6 +80,10 @@ describe('ui_utils', function () {
|
|
72
80
|
expect((0, _ui_utils.getPDFFileNameFromURL)('http://www.example.com/pdfs/file2.txt', 'qwerty2.pdf')).toEqual('qwerty2.pdf');
|
73
81
|
expect((0, _ui_utils.getPDFFileNameFromURL)('/pdfs/file3.txt', '')).toEqual('');
|
74
82
|
});
|
83
|
+
it('gets fallback filename when url is not a string', function () {
|
84
|
+
expect((0, _ui_utils.getPDFFileNameFromURL)(null)).toEqual('document.pdf');
|
85
|
+
expect((0, _ui_utils.getPDFFileNameFromURL)(null, 'file.pdf')).toEqual('file.pdf');
|
86
|
+
});
|
75
87
|
it('gets PDF filename from URL containing leading/trailing whitespace', function () {
|
76
88
|
expect((0, _ui_utils.getPDFFileNameFromURL)(' /pdfs/file1.pdf ')).toEqual('file1.pdf');
|
77
89
|
expect((0, _ui_utils.getPDFFileNameFromURL)(' http://www.example.com/pdfs/file2.pdf ')).toEqual('file2.pdf');
|
@@ -105,18 +117,19 @@ describe('ui_utils', function () {
|
|
105
117
|
expect((0, _ui_utils.getPDFFileNameFromURL)('ftp://www.example.com/file4.pdf')).toEqual('file4.pdf');
|
106
118
|
});
|
107
119
|
it('gets PDF filename from query string appended to "blob:" URL', function () {
|
108
|
-
if ((0,
|
120
|
+
if ((0, _is_node["default"])()) {
|
109
121
|
pending('Blob in not supported in Node.js.');
|
110
122
|
}
|
123
|
+
|
111
124
|
var typedArray = new Uint8Array([1, 2, 3, 4, 5]);
|
112
125
|
var blobUrl = (0, _util.createObjectURL)(typedArray, 'application/pdf');
|
113
|
-
expect(blobUrl.
|
126
|
+
expect(blobUrl.startsWith('blob:')).toEqual(true);
|
114
127
|
expect((0, _ui_utils.getPDFFileNameFromURL)(blobUrl + '?file.pdf')).toEqual('file.pdf');
|
115
128
|
});
|
116
129
|
it('gets fallback filename from query string appended to "data:" URL', function () {
|
117
130
|
var typedArray = new Uint8Array([1, 2, 3, 4, 5]);
|
118
131
|
var dataUrl = (0, _util.createObjectURL)(typedArray, 'application/pdf', true);
|
119
|
-
expect(dataUrl.
|
132
|
+
expect(dataUrl.startsWith('data:')).toEqual(true);
|
120
133
|
expect((0, _ui_utils.getPDFFileNameFromURL)(dataUrl + '?file1.pdf')).toEqual('document.pdf');
|
121
134
|
expect((0, _ui_utils.getPDFFileNameFromURL)(' ' + dataUrl + '?file2.pdf')).toEqual('document.pdf');
|
122
135
|
});
|
@@ -125,12 +138,27 @@ describe('ui_utils', function () {
|
|
125
138
|
it('dispatch event', function () {
|
126
139
|
var eventBus = new _ui_utils.EventBus();
|
127
140
|
var count = 0;
|
128
|
-
eventBus.on('test', function () {
|
141
|
+
eventBus.on('test', function (evt) {
|
142
|
+
expect(evt).toEqual(undefined);
|
129
143
|
count++;
|
130
144
|
});
|
131
145
|
eventBus.dispatch('test');
|
132
146
|
expect(count).toEqual(1);
|
133
147
|
});
|
148
|
+
it('dispatch event with arguments', function () {
|
149
|
+
var eventBus = new _ui_utils.EventBus();
|
150
|
+
var count = 0;
|
151
|
+
eventBus.on('test', function (evt) {
|
152
|
+
expect(evt).toEqual({
|
153
|
+
abc: 123
|
154
|
+
});
|
155
|
+
count++;
|
156
|
+
});
|
157
|
+
eventBus.dispatch('test', {
|
158
|
+
abc: 123
|
159
|
+
});
|
160
|
+
expect(count).toEqual(1);
|
161
|
+
});
|
134
162
|
it('dispatch different event', function () {
|
135
163
|
var eventBus = new _ui_utils.EventBus();
|
136
164
|
var count = 0;
|
@@ -166,9 +194,11 @@ describe('ui_utils', function () {
|
|
166
194
|
it('dispatch to detached', function () {
|
167
195
|
var eventBus = new _ui_utils.EventBus();
|
168
196
|
var count = 0;
|
197
|
+
|
169
198
|
var listener = function listener() {
|
170
199
|
count++;
|
171
200
|
};
|
201
|
+
|
172
202
|
eventBus.on('test', listener);
|
173
203
|
eventBus.dispatch('test');
|
174
204
|
eventBus.off('test', listener);
|
@@ -191,20 +221,101 @@ describe('ui_utils', function () {
|
|
191
221
|
it('dispatch to detached during handling', function () {
|
192
222
|
var eventBus = new _ui_utils.EventBus();
|
193
223
|
var count = 0;
|
224
|
+
|
194
225
|
var listener1 = function listener1() {
|
195
226
|
eventBus.off('test', listener2);
|
196
227
|
count++;
|
197
228
|
};
|
229
|
+
|
198
230
|
var listener2 = function listener2() {
|
199
231
|
eventBus.off('test', listener1);
|
200
232
|
count++;
|
201
233
|
};
|
234
|
+
|
202
235
|
eventBus.on('test', listener1);
|
203
236
|
eventBus.on('test', listener2);
|
204
237
|
eventBus.dispatch('test');
|
205
238
|
eventBus.dispatch('test');
|
206
239
|
expect(count).toEqual(2);
|
207
240
|
});
|
241
|
+
it('should not, by default, re-dispatch to DOM', function (done) {
|
242
|
+
if ((0, _is_node["default"])()) {
|
243
|
+
pending('Document in not supported in Node.js.');
|
244
|
+
}
|
245
|
+
|
246
|
+
var eventBus = new _ui_utils.EventBus();
|
247
|
+
var count = 0;
|
248
|
+
eventBus.on('test', function (evt) {
|
249
|
+
expect(evt).toEqual(undefined);
|
250
|
+
count++;
|
251
|
+
});
|
252
|
+
|
253
|
+
function domEventListener() {
|
254
|
+
done.fail('shall not dispatch DOM event.');
|
255
|
+
}
|
256
|
+
|
257
|
+
document.addEventListener('test', domEventListener);
|
258
|
+
eventBus.dispatch('test');
|
259
|
+
Promise.resolve().then(function () {
|
260
|
+
expect(count).toEqual(1);
|
261
|
+
document.removeEventListener('test', domEventListener);
|
262
|
+
done();
|
263
|
+
});
|
264
|
+
});
|
265
|
+
it('should re-dispatch to DOM', function (done) {
|
266
|
+
if ((0, _is_node["default"])()) {
|
267
|
+
pending('Document in not supported in Node.js.');
|
268
|
+
}
|
269
|
+
|
270
|
+
var eventBus = new _ui_utils.EventBus({
|
271
|
+
dispatchToDOM: true
|
272
|
+
});
|
273
|
+
var count = 0;
|
274
|
+
eventBus.on('test', function (evt) {
|
275
|
+
expect(evt).toEqual(undefined);
|
276
|
+
count++;
|
277
|
+
});
|
278
|
+
|
279
|
+
function domEventListener(evt) {
|
280
|
+
expect(evt.detail).toEqual({});
|
281
|
+
count++;
|
282
|
+
}
|
283
|
+
|
284
|
+
document.addEventListener('test', domEventListener);
|
285
|
+
eventBus.dispatch('test');
|
286
|
+
Promise.resolve().then(function () {
|
287
|
+
expect(count).toEqual(2);
|
288
|
+
document.removeEventListener('test', domEventListener);
|
289
|
+
done();
|
290
|
+
});
|
291
|
+
});
|
292
|
+
it('should re-dispatch to DOM, with arguments (without internal listeners)', function (done) {
|
293
|
+
if ((0, _is_node["default"])()) {
|
294
|
+
pending('Document in not supported in Node.js.');
|
295
|
+
}
|
296
|
+
|
297
|
+
var eventBus = new _ui_utils.EventBus({
|
298
|
+
dispatchToDOM: true
|
299
|
+
});
|
300
|
+
var count = 0;
|
301
|
+
|
302
|
+
function domEventListener(evt) {
|
303
|
+
expect(evt.detail).toEqual({
|
304
|
+
abc: 123
|
305
|
+
});
|
306
|
+
count++;
|
307
|
+
}
|
308
|
+
|
309
|
+
document.addEventListener('test', domEventListener);
|
310
|
+
eventBus.dispatch('test', {
|
311
|
+
abc: 123
|
312
|
+
});
|
313
|
+
Promise.resolve().then(function () {
|
314
|
+
expect(count).toEqual(1);
|
315
|
+
document.removeEventListener('test', domEventListener);
|
316
|
+
done();
|
317
|
+
});
|
318
|
+
});
|
208
319
|
});
|
209
320
|
describe('isValidRotation', function () {
|
210
321
|
it('should reject non-integer angles', function () {
|
@@ -245,7 +356,7 @@ describe('ui_utils', function () {
|
|
245
356
|
});
|
246
357
|
});
|
247
358
|
describe('waitOnEventOrTimeout', function () {
|
248
|
-
var eventBus
|
359
|
+
var eventBus;
|
249
360
|
beforeAll(function (done) {
|
250
361
|
eventBus = new _ui_utils.EventBus();
|
251
362
|
done();
|
@@ -282,9 +393,10 @@ describe('ui_utils', function () {
|
|
282
393
|
Promise.all([invalidTarget, invalidName, invalidDelay]).then(done, done.fail);
|
283
394
|
});
|
284
395
|
it('should resolve on event, using the DOM', function (done) {
|
285
|
-
if ((0,
|
396
|
+
if ((0, _is_node["default"])()) {
|
286
397
|
pending('Document in not supported in Node.js.');
|
287
398
|
}
|
399
|
+
|
288
400
|
var button = document.createElement('button');
|
289
401
|
var buttonClicked = (0, _ui_utils.waitOnEventOrTimeout)({
|
290
402
|
target: button,
|
@@ -298,9 +410,10 @@ describe('ui_utils', function () {
|
|
298
410
|
}, done.fail);
|
299
411
|
});
|
300
412
|
it('should resolve on timeout, using the DOM', function (done) {
|
301
|
-
if ((0,
|
413
|
+
if ((0, _is_node["default"])()) {
|
302
414
|
pending('Document in not supported in Node.js.');
|
303
415
|
}
|
416
|
+
|
304
417
|
var button = document.createElement('button');
|
305
418
|
var buttonClicked = (0, _ui_utils.waitOnEventOrTimeout)({
|
306
419
|
target: button,
|
@@ -378,4 +491,329 @@ describe('ui_utils', function () {
|
|
378
491
|
expect(height2).toEqual(8.5);
|
379
492
|
});
|
380
493
|
});
|
494
|
+
describe('getVisibleElements', function () {
|
495
|
+
var BORDER_WIDTH = 9;
|
496
|
+
var SPACING = 2 * BORDER_WIDTH - 7;
|
497
|
+
|
498
|
+
function makePages(lines) {
|
499
|
+
var result = [];
|
500
|
+
var lineTop = 0,
|
501
|
+
id = 0;
|
502
|
+
var _iteratorNormalCompletion = true;
|
503
|
+
var _didIteratorError = false;
|
504
|
+
var _iteratorError = undefined;
|
505
|
+
|
506
|
+
try {
|
507
|
+
for (var _iterator = lines[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
508
|
+
var line = _step.value;
|
509
|
+
var lineHeight = line.reduce(function (maxHeight, pair) {
|
510
|
+
return Math.max(maxHeight, pair[1]);
|
511
|
+
}, 0);
|
512
|
+
var offsetLeft = -BORDER_WIDTH;
|
513
|
+
var _iteratorNormalCompletion2 = true;
|
514
|
+
var _didIteratorError2 = false;
|
515
|
+
var _iteratorError2 = undefined;
|
516
|
+
|
517
|
+
try {
|
518
|
+
for (var _iterator2 = line[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
519
|
+
var _step2$value = _slicedToArray(_step2.value, 2),
|
520
|
+
clientWidth = _step2$value[0],
|
521
|
+
clientHeight = _step2$value[1];
|
522
|
+
|
523
|
+
var offsetTop = lineTop + (lineHeight - clientHeight) / 2 - BORDER_WIDTH;
|
524
|
+
var div = {
|
525
|
+
offsetLeft: offsetLeft,
|
526
|
+
offsetTop: offsetTop,
|
527
|
+
clientWidth: clientWidth,
|
528
|
+
clientHeight: clientHeight,
|
529
|
+
clientLeft: BORDER_WIDTH,
|
530
|
+
clientTop: BORDER_WIDTH
|
531
|
+
};
|
532
|
+
result.push({
|
533
|
+
id: id,
|
534
|
+
div: div
|
535
|
+
});
|
536
|
+
++id;
|
537
|
+
offsetLeft += clientWidth + SPACING;
|
538
|
+
}
|
539
|
+
} catch (err) {
|
540
|
+
_didIteratorError2 = true;
|
541
|
+
_iteratorError2 = err;
|
542
|
+
} finally {
|
543
|
+
try {
|
544
|
+
if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) {
|
545
|
+
_iterator2["return"]();
|
546
|
+
}
|
547
|
+
} finally {
|
548
|
+
if (_didIteratorError2) {
|
549
|
+
throw _iteratorError2;
|
550
|
+
}
|
551
|
+
}
|
552
|
+
}
|
553
|
+
|
554
|
+
lineTop += lineHeight + SPACING;
|
555
|
+
}
|
556
|
+
} catch (err) {
|
557
|
+
_didIteratorError = true;
|
558
|
+
_iteratorError = err;
|
559
|
+
} finally {
|
560
|
+
try {
|
561
|
+
if (!_iteratorNormalCompletion && _iterator["return"] != null) {
|
562
|
+
_iterator["return"]();
|
563
|
+
}
|
564
|
+
} finally {
|
565
|
+
if (_didIteratorError) {
|
566
|
+
throw _iteratorError;
|
567
|
+
}
|
568
|
+
}
|
569
|
+
}
|
570
|
+
|
571
|
+
return result;
|
572
|
+
}
|
573
|
+
|
574
|
+
function slowGetVisibleElements(scroll, pages) {
|
575
|
+
var views = [];
|
576
|
+
var scrollLeft = scroll.scrollLeft,
|
577
|
+
scrollTop = scroll.scrollTop;
|
578
|
+
var scrollRight = scrollLeft + scroll.clientWidth;
|
579
|
+
var scrollBottom = scrollTop + scroll.clientHeight;
|
580
|
+
var _iteratorNormalCompletion3 = true;
|
581
|
+
var _didIteratorError3 = false;
|
582
|
+
var _iteratorError3 = undefined;
|
583
|
+
|
584
|
+
try {
|
585
|
+
for (var _iterator3 = pages[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
|
586
|
+
var view = _step3.value;
|
587
|
+
var div = view.div;
|
588
|
+
var viewLeft = div.offsetLeft + div.clientLeft;
|
589
|
+
var viewRight = viewLeft + div.clientWidth;
|
590
|
+
var viewTop = div.offsetTop + div.clientTop;
|
591
|
+
var viewBottom = viewTop + div.clientHeight;
|
592
|
+
|
593
|
+
if (viewLeft < scrollRight && viewRight > scrollLeft && viewTop < scrollBottom && viewBottom > scrollTop) {
|
594
|
+
var hiddenHeight = Math.max(0, scrollTop - viewTop) + Math.max(0, viewBottom - scrollBottom);
|
595
|
+
var hiddenWidth = Math.max(0, scrollLeft - viewLeft) + Math.max(0, viewRight - scrollRight);
|
596
|
+
var visibleArea = (div.clientHeight - hiddenHeight) * (div.clientWidth - hiddenWidth);
|
597
|
+
var percent = visibleArea * 100 / div.clientHeight / div.clientWidth | 0;
|
598
|
+
views.push({
|
599
|
+
id: view.id,
|
600
|
+
x: viewLeft,
|
601
|
+
y: viewTop,
|
602
|
+
view: view,
|
603
|
+
percent: percent
|
604
|
+
});
|
605
|
+
}
|
606
|
+
}
|
607
|
+
} catch (err) {
|
608
|
+
_didIteratorError3 = true;
|
609
|
+
_iteratorError3 = err;
|
610
|
+
} finally {
|
611
|
+
try {
|
612
|
+
if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) {
|
613
|
+
_iterator3["return"]();
|
614
|
+
}
|
615
|
+
} finally {
|
616
|
+
if (_didIteratorError3) {
|
617
|
+
throw _iteratorError3;
|
618
|
+
}
|
619
|
+
}
|
620
|
+
}
|
621
|
+
|
622
|
+
return {
|
623
|
+
first: views[0],
|
624
|
+
last: views[views.length - 1],
|
625
|
+
views: views
|
626
|
+
};
|
627
|
+
}
|
628
|
+
|
629
|
+
function scrollOverDocument(pages) {
|
630
|
+
var horizontally = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
631
|
+
var size = pages.reduce(function (max, _ref) {
|
632
|
+
var div = _ref.div;
|
633
|
+
return Math.max(max, horizontally ? div.offsetLeft + div.clientLeft + div.clientWidth : div.offsetTop + div.clientTop + div.clientHeight);
|
634
|
+
}, 0);
|
635
|
+
|
636
|
+
for (var i = 0; i < size; i += 7) {
|
637
|
+
for (var j = i + 5; j < size; j += j - i) {
|
638
|
+
var scroll = horizontally ? {
|
639
|
+
scrollTop: 0,
|
640
|
+
scrollLeft: i,
|
641
|
+
clientHeight: 10000,
|
642
|
+
clientWidth: j - i
|
643
|
+
} : {
|
644
|
+
scrollTop: i,
|
645
|
+
scrollLeft: 0,
|
646
|
+
clientHeight: j - i,
|
647
|
+
clientWidth: 10000
|
648
|
+
};
|
649
|
+
expect((0, _ui_utils.getVisibleElements)(scroll, pages, false, horizontally)).toEqual(slowGetVisibleElements(scroll, pages));
|
650
|
+
}
|
651
|
+
}
|
652
|
+
}
|
653
|
+
|
654
|
+
it('with pages of varying height', function () {
|
655
|
+
var pages = makePages([[[50, 20], [20, 50]], [[30, 12], [12, 30]], [[20, 50], [50, 20]], [[50, 20], [20, 50]]]);
|
656
|
+
scrollOverDocument(pages);
|
657
|
+
});
|
658
|
+
it('widescreen challenge', function () {
|
659
|
+
var pages = makePages([[[10, 50], [10, 60], [10, 70], [10, 80], [10, 90]], [[10, 90], [10, 80], [10, 70], [10, 60], [10, 50]], [[10, 50], [10, 60], [10, 70], [10, 80], [10, 90]]]);
|
660
|
+
scrollOverDocument(pages);
|
661
|
+
});
|
662
|
+
it('works with horizontal scrolling', function () {
|
663
|
+
var pages = makePages([[[10, 50], [20, 20], [30, 10]]]);
|
664
|
+
scrollOverDocument(pages, true);
|
665
|
+
});
|
666
|
+
it('handles `sortByVisibility` correctly', function () {
|
667
|
+
var scrollEl = {
|
668
|
+
scrollTop: 75,
|
669
|
+
scrollLeft: 0,
|
670
|
+
clientHeight: 750,
|
671
|
+
clientWidth: 1500
|
672
|
+
};
|
673
|
+
var views = makePages([[[100, 150]], [[100, 150]], [[100, 150]]]);
|
674
|
+
var visible = (0, _ui_utils.getVisibleElements)(scrollEl, views);
|
675
|
+
var visibleSorted = (0, _ui_utils.getVisibleElements)(scrollEl, views, true);
|
676
|
+
var viewsOrder = [],
|
677
|
+
viewsSortedOrder = [];
|
678
|
+
var _iteratorNormalCompletion4 = true;
|
679
|
+
var _didIteratorError4 = false;
|
680
|
+
var _iteratorError4 = undefined;
|
681
|
+
|
682
|
+
try {
|
683
|
+
for (var _iterator4 = visible.views[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
|
684
|
+
var view = _step4.value;
|
685
|
+
viewsOrder.push(view.id);
|
686
|
+
}
|
687
|
+
} catch (err) {
|
688
|
+
_didIteratorError4 = true;
|
689
|
+
_iteratorError4 = err;
|
690
|
+
} finally {
|
691
|
+
try {
|
692
|
+
if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) {
|
693
|
+
_iterator4["return"]();
|
694
|
+
}
|
695
|
+
} finally {
|
696
|
+
if (_didIteratorError4) {
|
697
|
+
throw _iteratorError4;
|
698
|
+
}
|
699
|
+
}
|
700
|
+
}
|
701
|
+
|
702
|
+
var _iteratorNormalCompletion5 = true;
|
703
|
+
var _didIteratorError5 = false;
|
704
|
+
var _iteratorError5 = undefined;
|
705
|
+
|
706
|
+
try {
|
707
|
+
for (var _iterator5 = visibleSorted.views[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
|
708
|
+
var _view = _step5.value;
|
709
|
+
viewsSortedOrder.push(_view.id);
|
710
|
+
}
|
711
|
+
} catch (err) {
|
712
|
+
_didIteratorError5 = true;
|
713
|
+
_iteratorError5 = err;
|
714
|
+
} finally {
|
715
|
+
try {
|
716
|
+
if (!_iteratorNormalCompletion5 && _iterator5["return"] != null) {
|
717
|
+
_iterator5["return"]();
|
718
|
+
}
|
719
|
+
} finally {
|
720
|
+
if (_didIteratorError5) {
|
721
|
+
throw _iteratorError5;
|
722
|
+
}
|
723
|
+
}
|
724
|
+
}
|
725
|
+
|
726
|
+
expect(viewsOrder).toEqual([0, 1, 2]);
|
727
|
+
expect(viewsSortedOrder).toEqual([1, 2, 0]);
|
728
|
+
});
|
729
|
+
it('handles views being empty', function () {
|
730
|
+
var scrollEl = {
|
731
|
+
scrollTop: 10,
|
732
|
+
scrollLeft: 0,
|
733
|
+
clientHeight: 750,
|
734
|
+
clientWidth: 1500
|
735
|
+
};
|
736
|
+
var views = [];
|
737
|
+
expect((0, _ui_utils.getVisibleElements)(scrollEl, views)).toEqual({
|
738
|
+
first: undefined,
|
739
|
+
last: undefined,
|
740
|
+
views: []
|
741
|
+
});
|
742
|
+
});
|
743
|
+
it('handles all views being hidden (without errors)', function () {
|
744
|
+
var scrollEl = {
|
745
|
+
scrollTop: 100000,
|
746
|
+
scrollLeft: 0,
|
747
|
+
clientHeight: 750,
|
748
|
+
clientWidth: 1500
|
749
|
+
};
|
750
|
+
var views = makePages([[[100, 150]], [[100, 150]], [[100, 150]]]);
|
751
|
+
expect((0, _ui_utils.getVisibleElements)(scrollEl, views)).toEqual({
|
752
|
+
first: undefined,
|
753
|
+
last: undefined,
|
754
|
+
views: []
|
755
|
+
});
|
756
|
+
});
|
757
|
+
describe('backtrackBeforeAllVisibleElements', function () {
|
758
|
+
var tallPage = [10, 50];
|
759
|
+
var shortPage = [10, 10];
|
760
|
+
var top1 = 20 + SPACING + 40;
|
761
|
+
var top2 = 20 + SPACING + 10;
|
762
|
+
it('handles case 1', function () {
|
763
|
+
var pages = makePages([[[10, 20], [10, 20], [10, 20], [10, 20]], [tallPage, shortPage, tallPage, shortPage], [[10, 50], [10, 50], [10, 50], [10, 50]], [[10, 20], [10, 20], [10, 20], [10, 20]], [[10, 20]]]);
|
764
|
+
var bsResult = 4;
|
765
|
+
expect((0, _ui_utils.backtrackBeforeAllVisibleElements)(bsResult, pages, top1)).toEqual(4);
|
766
|
+
});
|
767
|
+
it('handles case 2', function () {
|
768
|
+
var pages = makePages([[[10, 20], [10, 20], [10, 20], [10, 20]], [tallPage, shortPage, tallPage, tallPage], [[10, 50], [10, 50], [10, 50], [10, 50]], [[10, 20], [10, 20], [10, 20], [10, 20]]]);
|
769
|
+
var bsResult = 6;
|
770
|
+
expect((0, _ui_utils.backtrackBeforeAllVisibleElements)(bsResult, pages, top1)).toEqual(4);
|
771
|
+
});
|
772
|
+
it('handles case 3', function () {
|
773
|
+
var pages = makePages([[[10, 20], [10, 20], [10, 20], [10, 20]], [tallPage, shortPage, tallPage, shortPage], [[10, 50], [10, 50], [10, 50], [10, 50]], [[10, 20], [10, 20], [10, 20], [10, 20]]]);
|
774
|
+
var bsResult = 8;
|
775
|
+
expect((0, _ui_utils.backtrackBeforeAllVisibleElements)(bsResult, pages, top1)).toEqual(4);
|
776
|
+
});
|
777
|
+
it('handles case 4', function () {
|
778
|
+
var pages = makePages([[[10, 20], [10, 20], [10, 20], [10, 20]], [tallPage, shortPage, tallPage, shortPage], [[10, 50], [10, 50], [10, 50], [10, 50]], [[10, 20], [10, 20], [10, 20], [10, 20]]]);
|
779
|
+
var bsResult = 4;
|
780
|
+
expect((0, _ui_utils.backtrackBeforeAllVisibleElements)(bsResult, pages, top2)).toEqual(4);
|
781
|
+
});
|
782
|
+
});
|
783
|
+
});
|
784
|
+
describe('moveToEndOfArray', function () {
|
785
|
+
it('works on empty arrays', function () {
|
786
|
+
var data = [];
|
787
|
+
(0, _ui_utils.moveToEndOfArray)(data, function () {});
|
788
|
+
expect(data).toEqual([]);
|
789
|
+
});
|
790
|
+
it('works when moving everything', function () {
|
791
|
+
var data = [1, 2, 3, 4, 5];
|
792
|
+
(0, _ui_utils.moveToEndOfArray)(data, function () {
|
793
|
+
return true;
|
794
|
+
});
|
795
|
+
expect(data).toEqual([1, 2, 3, 4, 5]);
|
796
|
+
});
|
797
|
+
it('works when moving some things', function () {
|
798
|
+
var data = [1, 2, 3, 4, 5];
|
799
|
+
(0, _ui_utils.moveToEndOfArray)(data, function (x) {
|
800
|
+
return x % 2 === 0;
|
801
|
+
});
|
802
|
+
expect(data).toEqual([1, 3, 5, 2, 4]);
|
803
|
+
});
|
804
|
+
it('works when moving one thing', function () {
|
805
|
+
var data = [1, 2, 3, 4, 5];
|
806
|
+
(0, _ui_utils.moveToEndOfArray)(data, function (x) {
|
807
|
+
return x === 1;
|
808
|
+
});
|
809
|
+
expect(data).toEqual([2, 3, 4, 5, 1]);
|
810
|
+
});
|
811
|
+
it('works when moving nothing', function () {
|
812
|
+
var data = [1, 2, 3, 4, 5];
|
813
|
+
(0, _ui_utils.moveToEndOfArray)(data, function (x) {
|
814
|
+
return x === 0;
|
815
|
+
});
|
816
|
+
expect(data).toEqual([1, 2, 3, 4, 5]);
|
817
|
+
});
|
818
|
+
});
|
381
819
|
});
|
@@ -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 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,11 +19,11 @@
|
|
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 _glyphlist = require(
|
24
|
+
var _glyphlist = require("../../core/glyphlist");
|
25
25
|
|
26
|
-
var _unicode = require(
|
26
|
+
var _unicode = require("../../core/unicode");
|
27
27
|
|
28
28
|
describe('unicode', function () {
|
29
29
|
describe('mapSpecialUnicodeValues', function () {
|
@@ -80,8 +80,8 @@ describe('unicode', function () {
|
|
80
80
|
NormalizedUnicodes = null;
|
81
81
|
});
|
82
82
|
it('should get normalized Unicode values for ligatures', function () {
|
83
|
-
expect(NormalizedUnicodes[
|
84
|
-
expect(NormalizedUnicodes[
|
83
|
+
expect(NormalizedUnicodes["\uFB01"]).toEqual('fi');
|
84
|
+
expect(NormalizedUnicodes["\u0675"]).toEqual("\u0627\u0674");
|
85
85
|
});
|
86
86
|
it('should not normalize standard characters', function () {
|
87
87
|
expect(NormalizedUnicodes['A']).toEqual(undefined);
|
@@ -89,12 +89,15 @@ describe('unicode', function () {
|
|
89
89
|
});
|
90
90
|
describe('reverseIfRtl', function () {
|
91
91
|
var NormalizedUnicodes;
|
92
|
-
|
93
|
-
|
94
|
-
|
92
|
+
|
93
|
+
function getGlyphUnicode(_char) {
|
94
|
+
if (NormalizedUnicodes[_char] !== undefined) {
|
95
|
+
return NormalizedUnicodes[_char];
|
95
96
|
}
|
96
|
-
|
97
|
+
|
98
|
+
return _char;
|
97
99
|
}
|
100
|
+
|
98
101
|
beforeAll(function (done) {
|
99
102
|
NormalizedUnicodes = (0, _unicode.getNormalizedUnicodes)();
|
100
103
|
done();
|
@@ -105,14 +108,14 @@ describe('unicode', function () {
|
|
105
108
|
it('should not reverse LTR characters', function () {
|
106
109
|
var A = getGlyphUnicode('A');
|
107
110
|
expect((0, _unicode.reverseIfRtl)(A)).toEqual('A');
|
108
|
-
var fi = getGlyphUnicode(
|
111
|
+
var fi = getGlyphUnicode("\uFB01");
|
109
112
|
expect((0, _unicode.reverseIfRtl)(fi)).toEqual('fi');
|
110
113
|
});
|
111
114
|
it('should reverse RTL characters', function () {
|
112
|
-
var heAlef = getGlyphUnicode(
|
113
|
-
expect((0, _unicode.reverseIfRtl)(heAlef)).toEqual(
|
114
|
-
var arAlef = getGlyphUnicode(
|
115
|
-
expect((0, _unicode.reverseIfRtl)(arAlef)).toEqual(
|
115
|
+
var heAlef = getGlyphUnicode("\u05D0");
|
116
|
+
expect((0, _unicode.reverseIfRtl)(heAlef)).toEqual("\u05D0");
|
117
|
+
var arAlef = getGlyphUnicode("\u0675");
|
118
|
+
expect((0, _unicode.reverseIfRtl)(arAlef)).toEqual("\u0674\u0627");
|
116
119
|
});
|
117
120
|
});
|
118
121
|
});
|