This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
||
2 | /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ |
||
3 | /* Copyright 2012 Mozilla Foundation |
||
4 | * |
||
5 | * Licensed under the Apache License, Version 2.0 (the "License"); |
||
6 | * you may not use this file except in compliance with the License. |
||
7 | * You may obtain a copy of the License at |
||
8 | * |
||
9 | * http://www.apache.org/licenses/LICENSE-2.0 |
||
10 | * |
||
11 | * Unless required by applicable law or agreed to in writing, software |
||
12 | * distributed under the License is distributed on an "AS IS" BASIS, |
||
13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||
14 | * See the License for the specific language governing permissions and |
||
15 | * limitations under the License. |
||
16 | */ |
||
17 | /* globals VBArray, PDFJS */ |
||
18 | |||
19 | 'use strict'; |
||
20 | |||
21 | // Initializing PDFJS global object here, it case if we need to change/disable |
||
22 | // some PDF.js features, e.g. range requests |
||
23 | if (typeof PDFJS === 'undefined') { |
||
24 | (typeof window !== 'undefined' ? window : this).PDFJS = {}; |
||
25 | } |
||
26 | |||
27 | // Checking if the typed arrays are supported |
||
28 | // Support: iOS<6.0 (subarray), IE<10, Android<4.0 |
||
29 | (function checkTypedArrayCompatibility() { |
||
30 | if (typeof Uint8Array !== 'undefined') { |
||
31 | // Support: iOS<6.0 |
||
32 | if (typeof Uint8Array.prototype.subarray === 'undefined') { |
||
33 | Uint8Array.prototype.subarray = function subarray(start, end) { |
||
34 | return new Uint8Array(this.slice(start, end)); |
||
35 | }; |
||
36 | Float32Array.prototype.subarray = function subarray(start, end) { |
||
37 | return new Float32Array(this.slice(start, end)); |
||
38 | }; |
||
39 | } |
||
40 | |||
41 | // Support: Android<4.1 |
||
42 | if (typeof Float64Array === 'undefined') { |
||
43 | window.Float64Array = Float32Array; |
||
44 | } |
||
45 | return; |
||
46 | } |
||
47 | |||
48 | function subarray(start, end) { |
||
49 | return new TypedArray(this.slice(start, end)); |
||
50 | } |
||
51 | |||
52 | function setArrayOffset(array, offset) { |
||
53 | if (arguments.length < 2) { |
||
54 | offset = 0; |
||
55 | } |
||
56 | for (var i = 0, n = array.length; i < n; ++i, ++offset) { |
||
57 | this[offset] = array[i] & 0xFF; |
||
58 | } |
||
59 | } |
||
60 | |||
61 | function TypedArray(arg1) { |
||
62 | var result, i, n; |
||
63 | if (typeof arg1 === 'number') { |
||
64 | result = []; |
||
65 | for (i = 0; i < arg1; ++i) { |
||
66 | result[i] = 0; |
||
67 | } |
||
68 | } else if ('slice' in arg1) { |
||
69 | result = arg1.slice(0); |
||
70 | } else { |
||
71 | result = []; |
||
72 | for (i = 0, n = arg1.length; i < n; ++i) { |
||
73 | result[i] = arg1[i]; |
||
74 | } |
||
75 | } |
||
76 | |||
77 | result.subarray = subarray; |
||
78 | result.buffer = result; |
||
79 | result.byteLength = result.length; |
||
80 | result.set = setArrayOffset; |
||
81 | |||
82 | if (typeof arg1 === 'object' && arg1.buffer) { |
||
83 | result.buffer = arg1.buffer; |
||
84 | } |
||
85 | return result; |
||
86 | } |
||
87 | |||
88 | window.Uint8Array = TypedArray; |
||
89 | window.Int8Array = TypedArray; |
||
90 | |||
91 | // we don't need support for set, byteLength for 32-bit array |
||
92 | // so we can use the TypedArray as well |
||
93 | window.Uint32Array = TypedArray; |
||
94 | window.Int32Array = TypedArray; |
||
95 | window.Uint16Array = TypedArray; |
||
96 | window.Float32Array = TypedArray; |
||
97 | window.Float64Array = TypedArray; |
||
98 | })(); |
||
99 | |||
100 | // URL = URL || webkitURL |
||
101 | // Support: Safari<7, Android 4.2+ |
||
102 | (function normalizeURLObject() { |
||
103 | if (!window.URL) { |
||
104 | window.URL = window.webkitURL; |
||
105 | } |
||
106 | })(); |
||
107 | |||
108 | // Object.defineProperty()? |
||
109 | // Support: Android<4.0, Safari<5.1 |
||
110 | (function checkObjectDefinePropertyCompatibility() { |
||
111 | if (typeof Object.defineProperty !== 'undefined') { |
||
112 | var definePropertyPossible = true; |
||
113 | try { |
||
114 | // some browsers (e.g. safari) cannot use defineProperty() on DOM objects |
||
115 | // and thus the native version is not sufficient |
||
116 | Object.defineProperty(new Image(), 'id', { value: 'test' }); |
||
117 | // ... another test for android gb browser for non-DOM objects |
||
118 | var Test = function Test() {}; |
||
119 | Test.prototype = { get id() { } }; |
||
120 | Object.defineProperty(new Test(), 'id', |
||
121 | { value: '', configurable: true, enumerable: true, writable: false }); |
||
122 | } catch (e) { |
||
123 | definePropertyPossible = false; |
||
124 | } |
||
125 | if (definePropertyPossible) { |
||
126 | return; |
||
127 | } |
||
128 | } |
||
129 | |||
130 | Object.defineProperty = function objectDefineProperty(obj, name, def) { |
||
131 | delete obj[name]; |
||
132 | if ('get' in def) { |
||
133 | obj.__defineGetter__(name, def['get']); |
||
134 | } |
||
135 | if ('set' in def) { |
||
136 | obj.__defineSetter__(name, def['set']); |
||
137 | } |
||
138 | if ('value' in def) { |
||
139 | obj.__defineSetter__(name, function objectDefinePropertySetter(value) { |
||
140 | this.__defineGetter__(name, function objectDefinePropertyGetter() { |
||
141 | return value; |
||
142 | }); |
||
143 | return value; |
||
144 | }); |
||
145 | obj[name] = def.value; |
||
146 | } |
||
147 | }; |
||
148 | })(); |
||
149 | |||
150 | |||
151 | // No XMLHttpRequest#response? |
||
152 | // Support: IE<11, Android <4.0 |
||
153 | (function checkXMLHttpRequestResponseCompatibility() { |
||
154 | var xhrPrototype = XMLHttpRequest.prototype; |
||
155 | var xhr = new XMLHttpRequest(); |
||
156 | if (!('overrideMimeType' in xhr)) { |
||
157 | // IE10 might have response, but not overrideMimeType |
||
158 | // Support: IE10 |
||
159 | Object.defineProperty(xhrPrototype, 'overrideMimeType', { |
||
160 | value: function xmlHttpRequestOverrideMimeType(mimeType) {} |
||
0 ignored issues
–
show
|
|||
161 | }); |
||
162 | } |
||
163 | if ('responseType' in xhr) { |
||
164 | return; |
||
165 | } |
||
166 | |||
167 | // The worker will be using XHR, so we can save time and disable worker. |
||
168 | PDFJS.disableWorker = true; |
||
169 | |||
170 | Object.defineProperty(xhrPrototype, 'responseType', { |
||
171 | get: function xmlHttpRequestGetResponseType() { |
||
172 | return this._responseType || 'text'; |
||
173 | }, |
||
174 | set: function xmlHttpRequestSetResponseType(value) { |
||
175 | if (value === 'text' || value === 'arraybuffer') { |
||
176 | this._responseType = value; |
||
177 | if (value === 'arraybuffer' && |
||
178 | typeof this.overrideMimeType === 'function') { |
||
179 | this.overrideMimeType('text/plain; charset=x-user-defined'); |
||
180 | } |
||
181 | } |
||
182 | } |
||
183 | }); |
||
184 | |||
185 | // Support: IE9 |
||
186 | if (typeof VBArray !== 'undefined') { |
||
187 | Object.defineProperty(xhrPrototype, 'response', { |
||
188 | get: function xmlHttpRequestResponseGet() { |
||
189 | if (this.responseType === 'arraybuffer') { |
||
190 | return new Uint8Array(new VBArray(this.responseBody).toArray()); |
||
191 | } else { |
||
192 | return this.responseText; |
||
193 | } |
||
194 | } |
||
195 | }); |
||
196 | return; |
||
197 | } |
||
198 | |||
199 | Object.defineProperty(xhrPrototype, 'response', { |
||
200 | get: function xmlHttpRequestResponseGet() { |
||
201 | if (this.responseType !== 'arraybuffer') { |
||
202 | return this.responseText; |
||
203 | } |
||
204 | var text = this.responseText; |
||
205 | var i, n = text.length; |
||
206 | var result = new Uint8Array(n); |
||
207 | for (i = 0; i < n; ++i) { |
||
208 | result[i] = text.charCodeAt(i) & 0xFF; |
||
209 | } |
||
210 | return result.buffer; |
||
211 | } |
||
212 | }); |
||
213 | })(); |
||
214 | |||
215 | // window.btoa (base64 encode function) ? |
||
216 | // Support: IE<10 |
||
217 | (function checkWindowBtoaCompatibility() { |
||
218 | if ('btoa' in window) { |
||
219 | return; |
||
220 | } |
||
221 | |||
222 | var digits = |
||
223 | 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; |
||
224 | |||
225 | window.btoa = function windowBtoa(chars) { |
||
226 | var buffer = ''; |
||
227 | var i, n; |
||
228 | for (i = 0, n = chars.length; i < n; i += 3) { |
||
229 | var b1 = chars.charCodeAt(i) & 0xFF; |
||
230 | var b2 = chars.charCodeAt(i + 1) & 0xFF; |
||
231 | var b3 = chars.charCodeAt(i + 2) & 0xFF; |
||
232 | var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4); |
||
233 | var d3 = i + 1 < n ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64; |
||
234 | var d4 = i + 2 < n ? (b3 & 0x3F) : 64; |
||
235 | buffer += (digits.charAt(d1) + digits.charAt(d2) + |
||
236 | digits.charAt(d3) + digits.charAt(d4)); |
||
237 | } |
||
238 | return buffer; |
||
239 | }; |
||
240 | })(); |
||
241 | |||
242 | // window.atob (base64 encode function)? |
||
243 | // Support: IE<10 |
||
244 | (function checkWindowAtobCompatibility() { |
||
245 | if ('atob' in window) { |
||
246 | return; |
||
247 | } |
||
248 | |||
249 | // https://github.com/davidchambers/Base64.js |
||
250 | var digits = |
||
251 | 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; |
||
252 | window.atob = function (input) { |
||
253 | input = input.replace(/=+$/, ''); |
||
254 | if (input.length % 4 === 1) { |
||
255 | throw new Error('bad atob input'); |
||
256 | } |
||
257 | for ( |
||
258 | // initialize result and counters |
||
259 | var bc = 0, bs, buffer, idx = 0, output = ''; |
||
260 | // get next character |
||
261 | buffer = input.charAt(idx++); |
||
262 | // character found in table? |
||
263 | // initialize bit storage and add its ascii value |
||
264 | ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, |
||
265 | // and if not first of each 4 characters, |
||
266 | // convert the first 8 bits to one ascii character |
||
267 | bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0 |
||
268 | ) { |
||
269 | // try to find character in table (0-63, not found => -1) |
||
270 | buffer = digits.indexOf(buffer); |
||
271 | } |
||
272 | return output; |
||
273 | }; |
||
274 | })(); |
||
275 | |||
276 | // Function.prototype.bind? |
||
277 | // Support: Android<4.0, iOS<6.0 |
||
278 | (function checkFunctionPrototypeBindCompatibility() { |
||
279 | if (typeof Function.prototype.bind !== 'undefined') { |
||
280 | return; |
||
281 | } |
||
282 | |||
283 | Function.prototype.bind = function functionPrototypeBind(obj) { |
||
284 | var fn = this, headArgs = Array.prototype.slice.call(arguments, 1); |
||
285 | var bound = function functionPrototypeBindBound() { |
||
286 | var args = headArgs.concat(Array.prototype.slice.call(arguments)); |
||
287 | return fn.apply(obj, args); |
||
288 | }; |
||
289 | return bound; |
||
290 | }; |
||
291 | })(); |
||
292 | |||
293 | // HTMLElement dataset property |
||
294 | // Support: IE<11, Safari<5.1, Android<4.0 |
||
295 | (function checkDatasetProperty() { |
||
296 | var div = document.createElement('div'); |
||
297 | if ('dataset' in div) { |
||
298 | return; // dataset property exists |
||
299 | } |
||
300 | |||
301 | Object.defineProperty(HTMLElement.prototype, 'dataset', { |
||
302 | get: function() { |
||
303 | if (this._dataset) { |
||
304 | return this._dataset; |
||
305 | } |
||
306 | |||
307 | var dataset = {}; |
||
308 | for (var j = 0, jj = this.attributes.length; j < jj; j++) { |
||
309 | var attribute = this.attributes[j]; |
||
310 | if (attribute.name.substring(0, 5) !== 'data-') { |
||
311 | continue; |
||
312 | } |
||
313 | var key = attribute.name.substring(5).replace(/\-([a-z])/g, |
||
314 | function(all, ch) { |
||
315 | return ch.toUpperCase(); |
||
316 | }); |
||
317 | dataset[key] = attribute.value; |
||
318 | } |
||
319 | |||
320 | Object.defineProperty(this, '_dataset', { |
||
321 | value: dataset, |
||
322 | writable: false, |
||
323 | enumerable: false |
||
324 | }); |
||
325 | return dataset; |
||
326 | }, |
||
327 | enumerable: true |
||
328 | }); |
||
329 | })(); |
||
330 | |||
331 | // HTMLElement classList property |
||
332 | // Support: IE<10, Android<4.0, iOS<5.0 |
||
333 | (function checkClassListProperty() { |
||
334 | var div = document.createElement('div'); |
||
335 | if ('classList' in div) { |
||
336 | return; // classList property exists |
||
337 | } |
||
338 | |||
339 | function changeList(element, itemName, add, remove) { |
||
340 | var s = element.className || ''; |
||
341 | var list = s.split(/\s+/g); |
||
342 | if (list[0] === '') { |
||
343 | list.shift(); |
||
344 | } |
||
345 | var index = list.indexOf(itemName); |
||
346 | if (index < 0 && add) { |
||
347 | list.push(itemName); |
||
348 | } |
||
349 | if (index >= 0 && remove) { |
||
350 | list.splice(index, 1); |
||
351 | } |
||
352 | element.className = list.join(' '); |
||
353 | return (index >= 0); |
||
354 | } |
||
355 | |||
356 | var classListPrototype = { |
||
357 | add: function(name) { |
||
358 | changeList(this.element, name, true, false); |
||
359 | }, |
||
360 | contains: function(name) { |
||
361 | return changeList(this.element, name, false, false); |
||
362 | }, |
||
363 | remove: function(name) { |
||
364 | changeList(this.element, name, false, true); |
||
365 | }, |
||
366 | toggle: function(name) { |
||
367 | changeList(this.element, name, true, true); |
||
368 | } |
||
369 | }; |
||
370 | |||
371 | Object.defineProperty(HTMLElement.prototype, 'classList', { |
||
372 | get: function() { |
||
373 | if (this._classList) { |
||
374 | return this._classList; |
||
375 | } |
||
376 | |||
377 | var classList = Object.create(classListPrototype, { |
||
378 | element: { |
||
379 | value: this, |
||
380 | writable: false, |
||
381 | enumerable: true |
||
382 | } |
||
383 | }); |
||
384 | Object.defineProperty(this, '_classList', { |
||
385 | value: classList, |
||
386 | writable: false, |
||
387 | enumerable: false |
||
388 | }); |
||
389 | return classList; |
||
390 | }, |
||
391 | enumerable: true |
||
392 | }); |
||
393 | })(); |
||
394 | |||
395 | // Check console compatibility |
||
396 | // In older IE versions the console object is not available |
||
397 | // unless console is open. |
||
398 | // Support: IE<10 |
||
399 | (function checkConsoleCompatibility() { |
||
400 | if (!('console' in window)) { |
||
401 | window.console = { |
||
402 | log: function() {}, |
||
403 | error: function() {}, |
||
404 | warn: function() {} |
||
405 | }; |
||
406 | } else if (!('bind' in console.log)) { |
||
407 | // native functions in IE9 might not have bind |
||
408 | console.log = (function(fn) { |
||
409 | return function(msg) { return fn(msg); }; |
||
410 | })(console.log); |
||
411 | console.error = (function(fn) { |
||
412 | return function(msg) { return fn(msg); }; |
||
413 | })(console.error); |
||
414 | console.warn = (function(fn) { |
||
415 | return function(msg) { return fn(msg); }; |
||
416 | })(console.warn); |
||
417 | } |
||
418 | })(); |
||
419 | |||
420 | // Check onclick compatibility in Opera |
||
421 | // Support: Opera<15 |
||
422 | (function checkOnClickCompatibility() { |
||
423 | // workaround for reported Opera bug DSK-354448: |
||
424 | // onclick fires on disabled buttons with opaque content |
||
425 | function ignoreIfTargetDisabled(event) { |
||
426 | if (isDisabled(event.target)) { |
||
427 | event.stopPropagation(); |
||
428 | } |
||
429 | } |
||
430 | function isDisabled(node) { |
||
431 | return node.disabled || (node.parentNode && isDisabled(node.parentNode)); |
||
432 | } |
||
433 | if (navigator.userAgent.indexOf('Opera') !== -1) { |
||
434 | // use browser detection since we cannot feature-check this bug |
||
435 | document.addEventListener('click', ignoreIfTargetDisabled, true); |
||
436 | } |
||
437 | })(); |
||
438 | |||
439 | // Checks if possible to use URL.createObjectURL() |
||
440 | // Support: IE |
||
441 | (function checkOnBlobSupport() { |
||
442 | // sometimes IE loosing the data created with createObjectURL(), see #3977 |
||
443 | if (navigator.userAgent.indexOf('Trident') >= 0) { |
||
444 | PDFJS.disableCreateObjectURL = true; |
||
445 | } |
||
446 | })(); |
||
447 | |||
448 | // Checks if navigator.language is supported |
||
449 | (function checkNavigatorLanguage() { |
||
450 | if ('language' in navigator) { |
||
451 | return; |
||
452 | } |
||
453 | PDFJS.locale = navigator.userLanguage || 'en-US'; |
||
454 | })(); |
||
455 | |||
456 | (function checkRangeRequests() { |
||
457 | // Safari has issues with cached range requests see: |
||
458 | // https://github.com/mozilla/pdf.js/issues/3260 |
||
459 | // Last tested with version 6.0.4. |
||
460 | // Support: Safari 6.0+ |
||
461 | var isSafari = Object.prototype.toString.call( |
||
462 | window.HTMLElement).indexOf('Constructor') > 0; |
||
463 | |||
464 | // Older versions of Android (pre 3.0) has issues with range requests, see: |
||
465 | // https://github.com/mozilla/pdf.js/issues/3381. |
||
466 | // Make sure that we only match webkit-based Android browsers, |
||
467 | // since Firefox/Fennec works as expected. |
||
468 | // Support: Android<3.0 |
||
469 | var regex = /Android\s[0-2][^\d]/; |
||
470 | var isOldAndroid = regex.test(navigator.userAgent); |
||
471 | |||
472 | // Range requests are broken in Chrome 39 and 40, https://crbug.com/442318 |
||
473 | var isChromeWithRangeBug = /Chrome\/(39|40)\./.test(navigator.userAgent); |
||
474 | |||
475 | if (isSafari || isOldAndroid || isChromeWithRangeBug) { |
||
476 | PDFJS.disableRange = true; |
||
477 | PDFJS.disableStream = true; |
||
478 | } |
||
479 | })(); |
||
480 | |||
481 | // Check if the browser supports manipulation of the history. |
||
482 | // Support: IE<10, Android<4.2 |
||
483 | (function checkHistoryManipulation() { |
||
484 | // Android 2.x has so buggy pushState support that it was removed in |
||
485 | // Android 3.0 and restored as late as in Android 4.2. |
||
486 | // Support: Android 2.x |
||
487 | if (!history.pushState || navigator.userAgent.indexOf('Android 2.') >= 0) { |
||
488 | PDFJS.disableHistory = true; |
||
489 | } |
||
490 | })(); |
||
491 | |||
492 | // Support: IE<11, Chrome<21, Android<4.4, Safari<6 |
||
493 | (function checkSetPresenceInImageData() { |
||
494 | // IE < 11 will use window.CanvasPixelArray which lacks set function. |
||
495 | if (window.CanvasPixelArray) { |
||
496 | if (typeof window.CanvasPixelArray.prototype.set !== 'function') { |
||
497 | window.CanvasPixelArray.prototype.set = function(arr) { |
||
498 | for (var i = 0, ii = this.length; i < ii; i++) { |
||
499 | this[i] = arr[i]; |
||
500 | } |
||
501 | }; |
||
502 | } |
||
503 | } else { |
||
504 | // Old Chrome and Android use an inaccessible CanvasPixelArray prototype. |
||
505 | // Because we cannot feature detect it, we rely on user agent parsing. |
||
506 | var polyfill = false, versionMatch; |
||
507 | if (navigator.userAgent.indexOf('Chrom') >= 0) { |
||
508 | versionMatch = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./); |
||
509 | // Chrome < 21 lacks the set function. |
||
510 | polyfill = versionMatch && parseInt(versionMatch[2]) < 21; |
||
511 | } else if (navigator.userAgent.indexOf('Android') >= 0) { |
||
512 | // Android < 4.4 lacks the set function. |
||
513 | // Android >= 4.4 will contain Chrome in the user agent, |
||
514 | // thus pass the Chrome check above and not reach this block. |
||
515 | polyfill = /Android\s[0-4][^\d]/g.test(navigator.userAgent); |
||
516 | } else if (navigator.userAgent.indexOf('Safari') >= 0) { |
||
517 | versionMatch = navigator.userAgent. |
||
518 | match(/Version\/([0-9]+)\.([0-9]+)\.([0-9]+) Safari\//); |
||
519 | // Safari < 6 lacks the set function. |
||
520 | polyfill = versionMatch && parseInt(versionMatch[1]) < 6; |
||
521 | } |
||
522 | |||
523 | if (polyfill) { |
||
524 | var contextPrototype = window.CanvasRenderingContext2D.prototype; |
||
525 | contextPrototype._createImageData = contextPrototype.createImageData; |
||
526 | contextPrototype.createImageData = function(w, h) { |
||
527 | var imageData = this._createImageData(w, h); |
||
528 | imageData.data.set = function(arr) { |
||
529 | for (var i = 0, ii = this.length; i < ii; i++) { |
||
530 | this[i] = arr[i]; |
||
531 | } |
||
532 | }; |
||
533 | return imageData; |
||
534 | }; |
||
535 | } |
||
536 | } |
||
537 | })(); |
||
538 | |||
539 | // Support: IE<10, Android<4.0, iOS |
||
540 | (function checkRequestAnimationFrame() { |
||
541 | function fakeRequestAnimationFrame(callback) { |
||
542 | window.setTimeout(callback, 20); |
||
543 | } |
||
544 | |||
545 | var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent); |
||
546 | if (isIOS) { |
||
547 | // requestAnimationFrame on iOS is broken, replacing with fake one. |
||
548 | window.requestAnimationFrame = fakeRequestAnimationFrame; |
||
549 | return; |
||
550 | } |
||
551 | if ('requestAnimationFrame' in window) { |
||
552 | return; |
||
553 | } |
||
554 | window.requestAnimationFrame = |
||
555 | window.mozRequestAnimationFrame || |
||
556 | window.webkitRequestAnimationFrame || |
||
557 | fakeRequestAnimationFrame; |
||
558 | })(); |
||
559 | |||
560 | (function checkCanvasSizeLimitation() { |
||
561 | var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent); |
||
562 | var isAndroid = /Android/g.test(navigator.userAgent); |
||
563 | if (isIOS || isAndroid) { |
||
564 | // 5MP |
||
565 | PDFJS.maxCanvasPixels = 5242880; |
||
566 | } |
||
567 | })(); |
||
568 | |||
569 | // Disable fullscreen support for certain problematic configurations. |
||
570 | // Support: IE11+ (when embedded). |
||
571 | (function checkFullscreenSupport() { |
||
572 | var isEmbeddedIE = (navigator.userAgent.indexOf('Trident') >= 0 && |
||
573 | window.parent !== window); |
||
574 | if (isEmbeddedIE) { |
||
575 | PDFJS.disableFullscreen = true; |
||
576 | } |
||
577 | })(); |
||
578 |
This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.