UNPKG

15.2 kBJavaScriptView Raw
1/**
2 * @licstart The following is the entire license notice for the
3 * Javascript code in this page
4 *
5 * Copyright 2017 Mozilla Foundation
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 * @licend The above is the entire license notice for the
20 * Javascript code in this page
21 */
22'use strict';
23
24var _ui_utils = require('../../web/ui_utils');
25
26var _util = require('../../shared/util');
27
28var _is_node = require('../../shared/is_node');
29
30var _is_node2 = _interopRequireDefault(_is_node);
31
32function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
33
34describe('ui_utils', function () {
35 describe('binary search', function () {
36 function isTrue(boolean) {
37 return boolean;
38 }
39 function isGreater3(number) {
40 return number > 3;
41 }
42 it('empty array', function () {
43 expect((0, _ui_utils.binarySearchFirstItem)([], isTrue)).toEqual(0);
44 });
45 it('single boolean entry', function () {
46 expect((0, _ui_utils.binarySearchFirstItem)([false], isTrue)).toEqual(1);
47 expect((0, _ui_utils.binarySearchFirstItem)([true], isTrue)).toEqual(0);
48 });
49 it('three boolean entries', function () {
50 expect((0, _ui_utils.binarySearchFirstItem)([true, true, true], isTrue)).toEqual(0);
51 expect((0, _ui_utils.binarySearchFirstItem)([false, true, true], isTrue)).toEqual(1);
52 expect((0, _ui_utils.binarySearchFirstItem)([false, false, true], isTrue)).toEqual(2);
53 expect((0, _ui_utils.binarySearchFirstItem)([false, false, false], isTrue)).toEqual(3);
54 });
55 it('three numeric entries', function () {
56 expect((0, _ui_utils.binarySearchFirstItem)([0, 1, 2], isGreater3)).toEqual(3);
57 expect((0, _ui_utils.binarySearchFirstItem)([2, 3, 4], isGreater3)).toEqual(2);
58 expect((0, _ui_utils.binarySearchFirstItem)([4, 5, 6], isGreater3)).toEqual(0);
59 });
60 });
61 describe('getPDFFileNameFromURL', function () {
62 it('gets PDF filename', function () {
63 expect((0, _ui_utils.getPDFFileNameFromURL)('/pdfs/file1.pdf')).toEqual('file1.pdf');
64 expect((0, _ui_utils.getPDFFileNameFromURL)('http://www.example.com/pdfs/file2.pdf')).toEqual('file2.pdf');
65 });
66 it('gets fallback filename', function () {
67 expect((0, _ui_utils.getPDFFileNameFromURL)('/pdfs/file1.txt')).toEqual('document.pdf');
68 expect((0, _ui_utils.getPDFFileNameFromURL)('http://www.example.com/pdfs/file2.txt')).toEqual('document.pdf');
69 });
70 it('gets custom fallback filename', function () {
71 expect((0, _ui_utils.getPDFFileNameFromURL)('/pdfs/file1.txt', 'qwerty1.pdf')).toEqual('qwerty1.pdf');
72 expect((0, _ui_utils.getPDFFileNameFromURL)('http://www.example.com/pdfs/file2.txt', 'qwerty2.pdf')).toEqual('qwerty2.pdf');
73 expect((0, _ui_utils.getPDFFileNameFromURL)('/pdfs/file3.txt', '')).toEqual('');
74 });
75 it('gets PDF filename from URL containing leading/trailing whitespace', function () {
76 expect((0, _ui_utils.getPDFFileNameFromURL)(' /pdfs/file1.pdf ')).toEqual('file1.pdf');
77 expect((0, _ui_utils.getPDFFileNameFromURL)(' http://www.example.com/pdfs/file2.pdf ')).toEqual('file2.pdf');
78 });
79 it('gets PDF filename from query string', function () {
80 expect((0, _ui_utils.getPDFFileNameFromURL)('/pdfs/pdfs.html?name=file1.pdf')).toEqual('file1.pdf');
81 expect((0, _ui_utils.getPDFFileNameFromURL)('http://www.example.com/pdfs/pdf.html?file2.pdf')).toEqual('file2.pdf');
82 });
83 it('gets PDF filename from hash string', function () {
84 expect((0, _ui_utils.getPDFFileNameFromURL)('/pdfs/pdfs.html#name=file1.pdf')).toEqual('file1.pdf');
85 expect((0, _ui_utils.getPDFFileNameFromURL)('http://www.example.com/pdfs/pdf.html#file2.pdf')).toEqual('file2.pdf');
86 });
87 it('gets correct PDF filename when multiple ones are present', function () {
88 expect((0, _ui_utils.getPDFFileNameFromURL)('/pdfs/file1.pdf?name=file.pdf')).toEqual('file1.pdf');
89 expect((0, _ui_utils.getPDFFileNameFromURL)('http://www.example.com/pdfs/file2.pdf#file.pdf')).toEqual('file2.pdf');
90 });
91 it('gets PDF filename from URI-encoded data', function () {
92 var encodedUrl = encodeURIComponent('http://www.example.com/pdfs/file1.pdf');
93 expect((0, _ui_utils.getPDFFileNameFromURL)(encodedUrl)).toEqual('file1.pdf');
94 var encodedUrlWithQuery = encodeURIComponent('http://www.example.com/pdfs/file.txt?file2.pdf');
95 expect((0, _ui_utils.getPDFFileNameFromURL)(encodedUrlWithQuery)).toEqual('file2.pdf');
96 });
97 it('gets PDF filename from data mistaken for URI-encoded', function () {
98 expect((0, _ui_utils.getPDFFileNameFromURL)('/pdfs/%AA.pdf')).toEqual('%AA.pdf');
99 expect((0, _ui_utils.getPDFFileNameFromURL)('/pdfs/%2F.pdf')).toEqual('%2F.pdf');
100 });
101 it('gets PDF filename from (some) standard protocols', function () {
102 expect((0, _ui_utils.getPDFFileNameFromURL)('http://www.example.com/file1.pdf')).toEqual('file1.pdf');
103 expect((0, _ui_utils.getPDFFileNameFromURL)('https://www.example.com/file2.pdf')).toEqual('file2.pdf');
104 expect((0, _ui_utils.getPDFFileNameFromURL)('file:///path/to/files/file3.pdf')).toEqual('file3.pdf');
105 expect((0, _ui_utils.getPDFFileNameFromURL)('ftp://www.example.com/file4.pdf')).toEqual('file4.pdf');
106 });
107 it('gets PDF filename from query string appended to "blob:" URL', function () {
108 if ((0, _is_node2.default)()) {
109 pending('Blob in not supported in Node.js.');
110 }
111 var typedArray = new Uint8Array([1, 2, 3, 4, 5]);
112 var blobUrl = (0, _util.createObjectURL)(typedArray, 'application/pdf');
113 expect(blobUrl.indexOf('blob:') === 0).toEqual(true);
114 expect((0, _ui_utils.getPDFFileNameFromURL)(blobUrl + '?file.pdf')).toEqual('file.pdf');
115 });
116 it('gets fallback filename from query string appended to "data:" URL', function () {
117 var typedArray = new Uint8Array([1, 2, 3, 4, 5]);
118 var dataUrl = (0, _util.createObjectURL)(typedArray, 'application/pdf', true);
119 expect(dataUrl.indexOf('data:') === 0).toEqual(true);
120 expect((0, _ui_utils.getPDFFileNameFromURL)(dataUrl + '?file1.pdf')).toEqual('document.pdf');
121 expect((0, _ui_utils.getPDFFileNameFromURL)(' ' + dataUrl + '?file2.pdf')).toEqual('document.pdf');
122 });
123 });
124 describe('EventBus', function () {
125 it('dispatch event', function () {
126 var eventBus = new _ui_utils.EventBus();
127 var count = 0;
128 eventBus.on('test', function () {
129 count++;
130 });
131 eventBus.dispatch('test');
132 expect(count).toEqual(1);
133 });
134 it('dispatch different event', function () {
135 var eventBus = new _ui_utils.EventBus();
136 var count = 0;
137 eventBus.on('test', function () {
138 count++;
139 });
140 eventBus.dispatch('nottest');
141 expect(count).toEqual(0);
142 });
143 it('dispatch event multiple times', function () {
144 var eventBus = new _ui_utils.EventBus();
145 var count = 0;
146 eventBus.dispatch('test');
147 eventBus.on('test', function () {
148 count++;
149 });
150 eventBus.dispatch('test');
151 eventBus.dispatch('test');
152 expect(count).toEqual(2);
153 });
154 it('dispatch event to multiple handlers', function () {
155 var eventBus = new _ui_utils.EventBus();
156 var count = 0;
157 eventBus.on('test', function () {
158 count++;
159 });
160 eventBus.on('test', function () {
161 count++;
162 });
163 eventBus.dispatch('test');
164 expect(count).toEqual(2);
165 });
166 it('dispatch to detached', function () {
167 var eventBus = new _ui_utils.EventBus();
168 var count = 0;
169 var listener = function listener() {
170 count++;
171 };
172 eventBus.on('test', listener);
173 eventBus.dispatch('test');
174 eventBus.off('test', listener);
175 eventBus.dispatch('test');
176 expect(count).toEqual(1);
177 });
178 it('dispatch to wrong detached', function () {
179 var eventBus = new _ui_utils.EventBus();
180 var count = 0;
181 eventBus.on('test', function () {
182 count++;
183 });
184 eventBus.dispatch('test');
185 eventBus.off('test', function () {
186 count++;
187 });
188 eventBus.dispatch('test');
189 expect(count).toEqual(2);
190 });
191 it('dispatch to detached during handling', function () {
192 var eventBus = new _ui_utils.EventBus();
193 var count = 0;
194 var listener1 = function listener1() {
195 eventBus.off('test', listener2);
196 count++;
197 };
198 var listener2 = function listener2() {
199 eventBus.off('test', listener1);
200 count++;
201 };
202 eventBus.on('test', listener1);
203 eventBus.on('test', listener2);
204 eventBus.dispatch('test');
205 eventBus.dispatch('test');
206 expect(count).toEqual(2);
207 });
208 });
209 describe('isValidRotation', function () {
210 it('should reject non-integer angles', function () {
211 expect((0, _ui_utils.isValidRotation)()).toEqual(false);
212 expect((0, _ui_utils.isValidRotation)(null)).toEqual(false);
213 expect((0, _ui_utils.isValidRotation)(NaN)).toEqual(false);
214 expect((0, _ui_utils.isValidRotation)([90])).toEqual(false);
215 expect((0, _ui_utils.isValidRotation)('90')).toEqual(false);
216 expect((0, _ui_utils.isValidRotation)(90.5)).toEqual(false);
217 });
218 it('should reject non-multiple of 90 degree angles', function () {
219 expect((0, _ui_utils.isValidRotation)(45)).toEqual(false);
220 expect((0, _ui_utils.isValidRotation)(-123)).toEqual(false);
221 });
222 it('should accept valid angles', function () {
223 expect((0, _ui_utils.isValidRotation)(0)).toEqual(true);
224 expect((0, _ui_utils.isValidRotation)(90)).toEqual(true);
225 expect((0, _ui_utils.isValidRotation)(-270)).toEqual(true);
226 expect((0, _ui_utils.isValidRotation)(540)).toEqual(true);
227 });
228 });
229 describe('isPortraitOrientation', function () {
230 it('should be portrait orientation', function () {
231 expect((0, _ui_utils.isPortraitOrientation)({
232 width: 200,
233 height: 400
234 })).toEqual(true);
235 expect((0, _ui_utils.isPortraitOrientation)({
236 width: 500,
237 height: 500
238 })).toEqual(true);
239 });
240 it('should be landscape orientation', function () {
241 expect((0, _ui_utils.isPortraitOrientation)({
242 width: 600,
243 height: 300
244 })).toEqual(false);
245 });
246 });
247 describe('waitOnEventOrTimeout', function () {
248 var eventBus = void 0;
249 beforeAll(function (done) {
250 eventBus = new _ui_utils.EventBus();
251 done();
252 });
253 afterAll(function () {
254 eventBus = null;
255 });
256 it('should reject invalid parameters', function (done) {
257 var invalidTarget = (0, _ui_utils.waitOnEventOrTimeout)({
258 target: 'window',
259 name: 'DOMContentLoaded'
260 }).then(function () {
261 throw new Error('Should reject invalid parameters.');
262 }, function (reason) {
263 expect(reason instanceof Error).toEqual(true);
264 });
265 var invalidName = (0, _ui_utils.waitOnEventOrTimeout)({
266 target: eventBus,
267 name: ''
268 }).then(function () {
269 throw new Error('Should reject invalid parameters.');
270 }, function (reason) {
271 expect(reason instanceof Error).toEqual(true);
272 });
273 var invalidDelay = (0, _ui_utils.waitOnEventOrTimeout)({
274 target: eventBus,
275 name: 'pagerendered',
276 delay: -1000
277 }).then(function () {
278 throw new Error('Should reject invalid parameters.');
279 }, function (reason) {
280 expect(reason instanceof Error).toEqual(true);
281 });
282 Promise.all([invalidTarget, invalidName, invalidDelay]).then(done, done.fail);
283 });
284 it('should resolve on event, using the DOM', function (done) {
285 if ((0, _is_node2.default)()) {
286 pending('Document in not supported in Node.js.');
287 }
288 var button = document.createElement('button');
289 var buttonClicked = (0, _ui_utils.waitOnEventOrTimeout)({
290 target: button,
291 name: 'click',
292 delay: 10000
293 });
294 button.click();
295 buttonClicked.then(function (type) {
296 expect(type).toEqual(_ui_utils.WaitOnType.EVENT);
297 done();
298 }, done.fail);
299 });
300 it('should resolve on timeout, using the DOM', function (done) {
301 if ((0, _is_node2.default)()) {
302 pending('Document in not supported in Node.js.');
303 }
304 var button = document.createElement('button');
305 var buttonClicked = (0, _ui_utils.waitOnEventOrTimeout)({
306 target: button,
307 name: 'click',
308 delay: 10
309 });
310 buttonClicked.then(function (type) {
311 expect(type).toEqual(_ui_utils.WaitOnType.TIMEOUT);
312 done();
313 }, done.fail);
314 });
315 it('should resolve on event, using the EventBus', function (done) {
316 var pageRendered = (0, _ui_utils.waitOnEventOrTimeout)({
317 target: eventBus,
318 name: 'pagerendered',
319 delay: 10000
320 });
321 eventBus.dispatch('pagerendered');
322 pageRendered.then(function (type) {
323 expect(type).toEqual(_ui_utils.WaitOnType.EVENT);
324 done();
325 }, done.fail);
326 });
327 it('should resolve on timeout, using the EventBus', function (done) {
328 var pageRendered = (0, _ui_utils.waitOnEventOrTimeout)({
329 target: eventBus,
330 name: 'pagerendered',
331 delay: 10
332 });
333 pageRendered.then(function (type) {
334 expect(type).toEqual(_ui_utils.WaitOnType.TIMEOUT);
335 done();
336 }, done.fail);
337 });
338 });
339 describe('getPageSizeInches', function () {
340 it('gets page size (in inches)', function () {
341 var page = {
342 view: [0, 0, 595.28, 841.89],
343 userUnit: 1.0,
344 rotate: 0
345 };
346
347 var _getPageSizeInches = (0, _ui_utils.getPageSizeInches)(page),
348 width = _getPageSizeInches.width,
349 height = _getPageSizeInches.height;
350
351 expect(+width.toPrecision(3)).toEqual(8.27);
352 expect(+height.toPrecision(4)).toEqual(11.69);
353 });
354 it('gets page size (in inches), for non-default /Rotate entry', function () {
355 var pdfPage1 = {
356 view: [0, 0, 612, 792],
357 userUnit: 1,
358 rotate: 0
359 };
360
361 var _getPageSizeInches2 = (0, _ui_utils.getPageSizeInches)(pdfPage1),
362 width1 = _getPageSizeInches2.width,
363 height1 = _getPageSizeInches2.height;
364
365 expect(width1).toEqual(8.5);
366 expect(height1).toEqual(11);
367 var pdfPage2 = {
368 view: [0, 0, 612, 792],
369 userUnit: 1,
370 rotate: 90
371 };
372
373 var _getPageSizeInches3 = (0, _ui_utils.getPageSizeInches)(pdfPage2),
374 width2 = _getPageSizeInches3.width,
375 height2 = _getPageSizeInches3.height;
376
377 expect(width2).toEqual(11);
378 expect(height2).toEqual(8.5);
379 });
380 });
381});
\No newline at end of file