From 5894bfa44936b5056767b8867a29c925004180a8 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Sat, 17 Feb 2018 12:57:15 +0100 Subject: [PATCH] Move API specific compatibility options from `src/shared/compatibility.js` and into a separate file Unfortunately, as far as I can tell, we still need the ability to adjust certain API options depending on the browser environment in PDF.js version `2.0`. However, we should be able to separate this from the general compatibility code in the `src/shared/compatibility.js` file. --- src/display/api_compatibility.js | 50 ++++++++++++++++++++++++++++++++ src/pdf.js | 3 ++ src/shared/compatibility.js | 30 +------------------ 3 files changed, 54 insertions(+), 29 deletions(-) create mode 100644 src/display/api_compatibility.js diff --git a/src/display/api_compatibility.js b/src/display/api_compatibility.js new file mode 100644 index 000000000..09e283e75 --- /dev/null +++ b/src/display/api_compatibility.js @@ -0,0 +1,50 @@ +/* Copyright 2018 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +let compatibilityParams = Object.create(null); +if (typeof PDFJSDev === 'undefined' || PDFJSDev.test('GENERIC')) { + const userAgent = + (typeof navigator !== 'undefined' && navigator.userAgent) || ''; + const isIE = /Trident/.test(userAgent); + const isIOS = /\b(iPad|iPhone|iPod)(?=;)/.test(userAgent); + const isIOSChrome = /CriOS/.test(userAgent); + const isSafari = /Safari\//.test(userAgent) && + !/(Chrome\/|Android\s)/.test(userAgent); + + // Checks if possible to use URL.createObjectURL() + // Support: IE, Chrome on iOS + (function checkOnBlobSupport() { + // Sometimes IE and Chrome on iOS losing the data created with + // createObjectURL(), see issues #3977 and #8081. + if (isIE || isIOSChrome) { + compatibilityParams.disableCreateObjectURL = true; + } + })(); + + // Support: Safari 6.0+, iOS + (function checkRangeRequests() { + // Safari has issues with cached range requests, see issue #3260. + // Last tested with version 6.0.4. + if (isSafari || isIOS) { + compatibilityParams.disableRange = true; + compatibilityParams.disableStream = true; + } + })(); +} +const apiCompatibilityParams = Object.freeze(compatibilityParams); + +export { + apiCompatibilityParams, +}; diff --git a/src/pdf.js b/src/pdf.js index 48657fb95..63fa57b5c 100644 --- a/src/pdf.js +++ b/src/pdf.js @@ -29,6 +29,7 @@ var pdfjsDisplayAnnotationLayer = require('./display/annotation_layer.js'); var pdfjsDisplayDOMUtils = require('./display/dom_utils.js'); var pdfjsDisplaySVG = require('./display/svg.js'); let pdfjsDisplayWorkerOptions = require('./display/worker_options.js'); +let pdfjsDisplayAPICompatibility = require('./display/api_compatibility.js'); if (typeof PDFJSDev === 'undefined' || PDFJSDev.test('GENERIC')) { const isNodeJS = require('./shared/is_node.js'); @@ -96,3 +97,5 @@ exports.getFilenameFromUrl = pdfjsDisplayDOMUtils.getFilenameFromUrl; exports.LinkTarget = pdfjsDisplayDOMUtils.LinkTarget; exports.addLinkAttributes = pdfjsDisplayDOMUtils.addLinkAttributes; exports.GlobalWorkerOptions = pdfjsDisplayWorkerOptions.GlobalWorkerOptions; +exports.apiCompatibilityParams = + pdfjsDisplayAPICompatibility.apiCompatibilityParams; diff --git a/src/shared/compatibility.js b/src/shared/compatibility.js index 10f91958f..1cf763637 100644 --- a/src/shared/compatibility.js +++ b/src/shared/compatibility.js @@ -29,14 +29,7 @@ if (typeof PDFJSDev === 'undefined' || !PDFJSDev.test('CHROME')) { const globalScope = require('./global_scope'); const isNodeJS = require('./is_node'); -var userAgent = (typeof navigator !== 'undefined' && navigator.userAgent) || ''; -var isIOSChrome = userAgent.indexOf('CriOS') >= 0; -var isIE = userAgent.indexOf('Trident') >= 0; -var isIOS = /\b(iPad|iPhone|iPod)(?=;)/.test(userAgent); -var isSafari = /Safari\//.test(userAgent) && - !/(Chrome\/|Android\s)/.test(userAgent); - -var hasDOM = typeof window === 'object' && typeof document === 'object'; +const hasDOM = typeof window === 'object' && typeof document === 'object'; // Initializing PDFJS global object here, it case if we need to change/disable // some PDF.js features, e.g. range requests @@ -68,27 +61,6 @@ PDFJS.compatibilityChecked = true; }; })(); -// Checks if possible to use URL.createObjectURL() -// Support: IE, Chrome on iOS -(function checkOnBlobSupport() { - // sometimes IE and Chrome on iOS loosing the data created with - // createObjectURL(), see #3977 and #8081 - if (isIE || isIOSChrome) { - PDFJS.disableCreateObjectURL = true; - } -})(); - -// Support: Safari 6.0+, iOS -(function checkRangeRequests() { - // Safari has issues with cached range requests see: - // https://github.com/mozilla/pdf.js/issues/3260 - // Last tested with version 6.0.4. - if (isSafari || isIOS) { - PDFJS.disableRange = true; - PDFJS.disableStream = true; - } -})(); - // Provides document.currentScript support // Support: IE, Chrome<29. (function checkCurrentScript() {