pdfjs-dist 2.0.489 → 2.2.228

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pdfjs-dist might be problematic. Click here for more details.

Files changed (169) hide show
  1. package/CODE_OF_CONDUCT.md +15 -0
  2. package/bower.json +1 -1
  3. package/build/pdf.js +18515 -11402
  4. package/build/pdf.js.map +1 -1
  5. package/build/pdf.min.js +1 -1
  6. package/build/pdf.worker.js +48266 -37137
  7. package/build/pdf.worker.js.map +1 -1
  8. package/build/pdf.worker.min.js +1 -1
  9. package/external/url/url-lib.js +627 -0
  10. package/image_decoders/pdf.image_decoders.js +11350 -0
  11. package/image_decoders/pdf.image_decoders.js.map +1 -0
  12. package/image_decoders/pdf.image_decoders.min.js +1 -0
  13. package/lib/core/annotation.js +587 -242
  14. package/lib/core/arithmetic_decoder.js +275 -245
  15. package/lib/core/bidi.js +65 -6
  16. package/lib/core/ccitt.js +173 -18
  17. package/lib/core/ccitt_stream.js +15 -6
  18. package/lib/core/cff_parser.js +433 -61
  19. package/lib/core/charsets.js +5 -4
  20. package/lib/core/chunked_stream.js +400 -152
  21. package/lib/core/cmap.js +326 -87
  22. package/lib/core/colorspace.js +874 -594
  23. package/lib/core/core_utils.js +147 -0
  24. package/lib/core/crypto.js +290 -45
  25. package/lib/core/document.js +560 -268
  26. package/lib/core/encodings.js +19 -10
  27. package/lib/core/evaluator.js +1005 -360
  28. package/lib/core/font_renderer.js +331 -97
  29. package/lib/core/fonts.js +812 -195
  30. package/lib/core/function.js +284 -71
  31. package/lib/core/glyphlist.js +4 -3
  32. package/lib/core/image.js +169 -62
  33. package/lib/core/image_utils.js +111 -0
  34. package/lib/core/jbig2.js +479 -66
  35. package/lib/core/jbig2_stream.js +19 -8
  36. package/lib/core/jpeg_stream.js +38 -13
  37. package/lib/core/jpg.js +253 -29
  38. package/lib/core/jpx.js +396 -6
  39. package/lib/core/jpx_stream.js +18 -6
  40. package/lib/core/metrics.js +15 -15
  41. package/lib/core/murmurhash3.js +56 -34
  42. package/lib/core/obj.js +1354 -488
  43. package/lib/core/operator_list.js +144 -31
  44. package/lib/core/parser.js +539 -191
  45. package/lib/core/pattern.js +148 -14
  46. package/lib/core/pdf_manager.js +323 -133
  47. package/lib/core/primitives.js +111 -24
  48. package/lib/core/ps_parser.js +134 -45
  49. package/lib/core/standard_fonts.js +17 -17
  50. package/lib/core/stream.js +313 -34
  51. package/lib/core/type1_parser.js +143 -13
  52. package/lib/core/unicode.js +32 -5
  53. package/lib/core/worker.js +217 -190
  54. package/lib/core/worker_stream.js +277 -0
  55. package/lib/display/annotation_layer.js +450 -133
  56. package/lib/display/api.js +1597 -784
  57. package/lib/display/api_compatibility.js +11 -13
  58. package/lib/display/canvas.js +360 -44
  59. package/lib/display/content_disposition.js +83 -32
  60. package/lib/display/display_utils.js +747 -0
  61. package/lib/display/fetch_stream.js +221 -90
  62. package/lib/display/font_loader.js +468 -236
  63. package/lib/display/metadata.js +38 -16
  64. package/lib/display/network.js +635 -428
  65. package/lib/display/network_utils.js +32 -19
  66. package/lib/display/node_stream.js +367 -175
  67. package/lib/display/pattern_helper.js +81 -31
  68. package/lib/display/svg.js +1235 -519
  69. package/lib/display/text_layer.js +153 -29
  70. package/lib/display/transport_stream.js +345 -94
  71. package/lib/display/webgl.js +64 -18
  72. package/lib/display/worker_options.js +5 -4
  73. package/lib/display/xml_parser.js +166 -53
  74. package/lib/examples/node/domstubs.js +60 -4
  75. package/lib/pdf.js +36 -14
  76. package/lib/pdf.worker.js +5 -3
  77. package/lib/shared/compatibility.js +158 -564
  78. package/lib/shared/global_scope.js +2 -2
  79. package/lib/shared/is_node.js +4 -4
  80. package/lib/shared/message_handler.js +521 -0
  81. package/lib/shared/streams_polyfill.js +21 -17
  82. package/lib/shared/url_polyfill.js +56 -0
  83. package/lib/shared/util.js +243 -710
  84. package/lib/test/unit/annotation_spec.js +870 -401
  85. package/lib/test/unit/api_spec.js +657 -345
  86. package/lib/test/unit/bidi_spec.js +7 -7
  87. package/lib/test/unit/cff_parser_spec.js +54 -11
  88. package/lib/test/unit/clitests_helper.js +10 -8
  89. package/lib/test/unit/cmap_spec.js +95 -41
  90. package/lib/test/unit/colorspace_spec.js +115 -63
  91. package/lib/test/unit/core_utils_spec.js +191 -0
  92. package/lib/test/unit/crypto_spec.js +17 -5
  93. package/lib/test/unit/custom_spec.js +43 -55
  94. package/lib/test/unit/display_svg_spec.js +34 -18
  95. package/lib/test/unit/display_utils_spec.js +273 -0
  96. package/lib/test/unit/document_spec.js +8 -13
  97. package/lib/test/unit/encodings_spec.js +25 -45
  98. package/lib/test/unit/evaluator_spec.js +38 -15
  99. package/lib/test/unit/fetch_stream_spec.js +109 -0
  100. package/lib/test/unit/function_spec.js +17 -5
  101. package/lib/test/unit/jasmine-boot.js +33 -20
  102. package/lib/test/unit/{util_stream_spec.js → message_handler_spec.js} +41 -69
  103. package/lib/test/unit/metadata_spec.js +71 -11
  104. package/lib/test/unit/murmurhash3_spec.js +3 -3
  105. package/lib/test/unit/network_spec.js +19 -54
  106. package/lib/test/unit/network_utils_spec.js +91 -14
  107. package/lib/test/unit/node_stream_spec.js +56 -32
  108. package/lib/test/unit/parser_spec.js +162 -71
  109. package/lib/test/unit/pdf_find_controller_spec.js +230 -0
  110. package/lib/test/unit/pdf_find_utils_spec.js +63 -0
  111. package/lib/test/unit/pdf_history_spec.js +21 -9
  112. package/lib/test/unit/primitives_spec.js +53 -20
  113. package/lib/test/unit/stream_spec.js +12 -4
  114. package/lib/test/unit/test_utils.js +273 -56
  115. package/lib/test/unit/testreporter.js +21 -3
  116. package/lib/test/unit/type1_parser_spec.js +8 -6
  117. package/lib/test/unit/ui_utils_spec.js +454 -16
  118. package/lib/test/unit/unicode_spec.js +18 -15
  119. package/lib/test/unit/util_spec.js +87 -128
  120. package/lib/web/annotation_layer_builder.js +39 -22
  121. package/lib/web/app.js +1290 -588
  122. package/lib/web/app_options.js +100 -62
  123. package/lib/web/base_viewer.js +511 -182
  124. package/lib/web/chromecom.js +261 -117
  125. package/lib/web/debugger.js +166 -22
  126. package/lib/web/download_manager.js +32 -13
  127. package/lib/web/firefox_print_service.js +20 -10
  128. package/lib/web/firefoxcom.js +315 -80
  129. package/lib/web/genericcom.js +89 -30
  130. package/lib/web/genericl10n.js +142 -30
  131. package/lib/web/grab_to_pan.js +28 -4
  132. package/lib/web/interfaces.js +170 -47
  133. package/lib/web/overlay_manager.js +235 -85
  134. package/lib/web/password_prompt.js +22 -14
  135. package/lib/web/pdf_attachment_viewer.js +38 -18
  136. package/lib/web/pdf_cursor_tools.js +39 -16
  137. package/lib/web/pdf_document_properties.js +255 -136
  138. package/lib/web/pdf_find_bar.js +84 -40
  139. package/lib/web/pdf_find_controller.js +495 -184
  140. package/lib/web/pdf_find_utils.js +111 -0
  141. package/lib/web/pdf_history.js +190 -53
  142. package/lib/web/pdf_link_service.js +138 -77
  143. package/lib/web/pdf_outline_viewer.js +122 -46
  144. package/lib/web/pdf_page_view.js +191 -67
  145. package/lib/web/pdf_presentation_mode.js +99 -34
  146. package/lib/web/pdf_print_service.js +61 -13
  147. package/lib/web/pdf_rendering_queue.js +28 -9
  148. package/lib/web/pdf_sidebar.js +141 -81
  149. package/lib/web/pdf_sidebar_resizer.js +42 -16
  150. package/lib/web/pdf_single_page_viewer.js +74 -66
  151. package/lib/web/pdf_thumbnail_view.js +104 -33
  152. package/lib/web/pdf_thumbnail_viewer.js +66 -26
  153. package/lib/web/pdf_viewer.component.js +112 -32
  154. package/lib/web/pdf_viewer.js +91 -52
  155. package/lib/web/preferences.js +284 -89
  156. package/lib/web/secondary_toolbar.js +165 -40
  157. package/lib/web/text_layer_builder.js +134 -59
  158. package/lib/web/toolbar.js +78 -43
  159. package/lib/web/ui_utils.js +462 -136
  160. package/lib/web/view_history.js +215 -67
  161. package/lib/web/viewer_compatibility.js +4 -13
  162. package/package.json +5 -4
  163. package/web/pdf_viewer.css +79 -11
  164. package/web/pdf_viewer.js +6107 -3748
  165. package/web/pdf_viewer.js.map +1 -1
  166. package/lib/display/dom_utils.js +0 -309
  167. package/lib/test/unit/dom_utils_spec.js +0 -89
  168. package/lib/test/unit/fonts_spec.js +0 -81
  169. package/lib/web/dom_events.js +0 -137
@@ -2,7 +2,7 @@
2
2
  * @licstart The following is the entire license notice for the
3
3
  * Javascript code in this page
4
4
  *
5
- * Copyright 2017 Mozilla Foundation
5
+ * Copyright 2019 Mozilla Foundation
6
6
  *
7
7
  * Licensed under the Apache License, Version 2.0 (the "License");
8
8
  * you may not use this file except in compliance with the License.
@@ -19,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
- 'use strict';
22
+ "use strict";
23
23
 
24
- var _ui_utils = require('../../web/ui_utils');
24
+ var _ui_utils = require("../../web/ui_utils");
25
25
 
26
- var _util = require('../../shared/util');
26
+ var _util = require("../../shared/util");
27
27
 
28
- var _is_node = require('../../shared/is_node');
28
+ var _is_node = _interopRequireDefault(require("../../shared/is_node"));
29
29
 
30
- var _is_node2 = _interopRequireDefault(_is_node);
30
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
31
31
 
32
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
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(boolean) {
37
- return boolean;
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, _is_node2.default)()) {
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.indexOf('blob:') === 0).toEqual(true);
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.indexOf('data:') === 0).toEqual(true);
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 = void 0;
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, _is_node2.default)()) {
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, _is_node2.default)()) {
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 2017 Mozilla Foundation
5
+ * Copyright 2019 Mozilla Foundation
6
6
  *
7
7
  * Licensed under the Apache License, Version 2.0 (the "License");
8
8
  * you may not use this file except in compliance with the License.
@@ -19,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
- 'use strict';
22
+ "use strict";
23
23
 
24
- var _glyphlist = require('../../core/glyphlist');
24
+ var _glyphlist = require("../../core/glyphlist");
25
25
 
26
- var _unicode = require('../../core/unicode');
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['\uFB01']).toEqual('fi');
84
- expect(NormalizedUnicodes['\u0675']).toEqual('\u0627\u0674');
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
- function getGlyphUnicode(char) {
93
- if (NormalizedUnicodes[char] !== undefined) {
94
- return NormalizedUnicodes[char];
92
+
93
+ function getGlyphUnicode(_char) {
94
+ if (NormalizedUnicodes[_char] !== undefined) {
95
+ return NormalizedUnicodes[_char];
95
96
  }
96
- return char;
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('\uFB01');
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('\u05D0');
113
- expect((0, _unicode.reverseIfRtl)(heAlef)).toEqual('\u05D0');
114
- var arAlef = getGlyphUnicode('\u0675');
115
- expect((0, _unicode.reverseIfRtl)(arAlef)).toEqual('\u0674\u0627');
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
  });