diff --git a/make.js b/make.js index 95469251b..7ccf8d8bc 100644 --- a/make.js +++ b/make.js @@ -198,6 +198,7 @@ target.jsdoc = function() { var JSDOC_FILES = [ 'src/doc_helper.js', 'src/display/api.js', + 'src/display/global.js', 'src/shared/util.js', 'src/core/annotation.js' ]; @@ -526,9 +527,7 @@ target.bundle = function(args) { var umd = require('./external/umdutils/verifier.js'); var MAIN_SRC_FILES = [ - SRC_DIR + 'display/annotation_layer.js', - SRC_DIR + 'display/text_layer.js', - SRC_DIR + 'display/api.js' + SRC_DIR + 'display/global.js' ]; var WORKER_SRC_FILES = [ @@ -538,9 +537,8 @@ target.bundle = function(args) { var mainFileName = 'pdf.js'; var workerFileName = 'pdf.worker.js'; - // Extension does not need svg.js and network.js files. + // Extension does not need network.js file. if (!defines.FIREFOX && !defines.MOZCENTRAL) { - MAIN_SRC_FILES.push(SRC_DIR + 'display/svg.js'); WORKER_SRC_FILES.push(SRC_DIR + 'core/network.js'); } diff --git a/src/display/annotation_layer.js b/src/display/annotation_layer.js index d4939a3ac..4ef44aa6b 100644 --- a/src/display/annotation_layer.js +++ b/src/display/annotation_layer.js @@ -12,7 +12,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* globals PDFJS */ 'use strict'; @@ -35,6 +34,7 @@ var addLinkAttributes = displayDOMUtils.addLinkAttributes; var getFilenameFromUrl = displayDOMUtils.getFilenameFromUrl; var warn = sharedUtil.warn; var CustomStyle = displayDOMUtils.CustomStyle; +var getDefaultSetting = displayDOMUtils.getDefaultSetting; /** * @typedef {Object} AnnotationElementParameters @@ -107,6 +107,7 @@ var AnnotationElement = (function AnnotationElementClosure() { this.viewport = parameters.viewport; this.linkService = parameters.linkService; this.downloadManager = parameters.downloadManager; + this.imageResourcesPath = parameters.imageResourcesPath; if (isRenderable) { this.container = this._createContainer(); @@ -363,7 +364,7 @@ var TextAnnotationElement = (function TextAnnotationElementClosure() { var image = document.createElement('img'); image.style.height = this.container.style.height; image.style.width = this.container.style.width; - image.src = PDFJS.imageResourcesPath + 'annotation-' + + image.src = this.imageResourcesPath + 'annotation-' + this.data.name.toLowerCase() + '.svg'; image.alt = '[{{type}} Annotation]'; image.dataset.l10nId = 'text_annotation_type'; @@ -838,6 +839,7 @@ var FileAttachmentAnnotationElement = ( * @property {Array} annotations * @property {PDFPage} page * @property {IPDFLinkService} linkService + * @property {string} imageResourcesPath */ /** @@ -868,7 +870,9 @@ var AnnotationLayer = (function AnnotationLayerClosure() { page: parameters.page, viewport: parameters.viewport, linkService: parameters.linkService, - downloadManager: parameters.downloadManager + downloadManager: parameters.downloadManager, + imageResourcesPath: parameters.imageResourcesPath || + getDefaultSetting('imageResourcesPath') }; var element = annotationElementFactory.create(properties); if (element.isRenderable) { @@ -899,7 +903,5 @@ var AnnotationLayer = (function AnnotationLayerClosure() { }; })(); -PDFJS.AnnotationLayer = AnnotationLayer; - exports.AnnotationLayer = AnnotationLayer; })); diff --git a/src/display/api.js b/src/display/api.js index 681d697f3..0bb61fcde 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -21,23 +21,23 @@ define('pdfjs/display/api', ['exports', 'pdfjs/shared/util', 'pdfjs/display/font_loader', 'pdfjs/display/canvas', 'pdfjs/display/metadata', 'pdfjs/display/dom_utils', - 'pdfjs/display/global', 'require'], factory); + 'require'], factory); } else if (typeof exports !== 'undefined') { factory(exports, require('../shared/util.js'), require('./font_loader.js'), require('./canvas.js'), require('./metadata.js'), - require('./dom_utils.js'), require('./global.js')); + require('./dom_utils.js')); } else { factory((root.pdfjsDisplayAPI = {}), root.pdfjsSharedUtil, root.pdfjsDisplayFontLoader, root.pdfjsDisplayCanvas, - root.pdfjsDisplayMetadata, root.pdfjsDisplayDOMUtils, - root.pdfjsDisplayGlobal); + root.pdfjsDisplayMetadata, root.pdfjsDisplayDOMUtils); } }(this, function (exports, sharedUtil, displayFontLoader, displayCanvas, - displayMetadata, displayDOMUtils, displayGlobal, amdRequire) { + displayMetadata, displayDOMUtils, amdRequire) { var InvalidPDFException = sharedUtil.InvalidPDFException; var MessageHandler = sharedUtil.MessageHandler; var MissingPDFException = sharedUtil.MissingPDFException; +var PageViewport = sharedUtil.PageViewport; var PasswordResponses = sharedUtil.PasswordResponses; var PasswordException = sharedUtil.PasswordException; var StatTimer = sharedUtil.StatTimer; @@ -54,17 +54,21 @@ var isArrayBuffer = sharedUtil.isArrayBuffer; var isSameOrigin = sharedUtil.isSameOrigin; var loadJpegStream = sharedUtil.loadJpegStream; var stringToBytes = sharedUtil.stringToBytes; +var globalScope = sharedUtil.globalScope; var warn = sharedUtil.warn; var FontFaceObject = displayFontLoader.FontFaceObject; var FontLoader = displayFontLoader.FontLoader; var CanvasGraphics = displayCanvas.CanvasGraphics; var createScratchCanvas = displayCanvas.createScratchCanvas; var Metadata = displayMetadata.Metadata; -var PDFJS = displayGlobal.PDFJS; -var globalScope = displayGlobal.globalScope; +var getDefaultSetting = displayDOMUtils.getDefaultSetting; var DEFAULT_RANGE_CHUNK_SIZE = 65536; // 2^16 = 65536 +var isWorkerDisabled = false; +var workerSrc; +var isPostMessageTransfersDisabled = false; + //#if PRODUCTION && !SINGLE_FILE //#if GENERIC //#include ../src/frameworks.js @@ -73,183 +77,6 @@ var DEFAULT_RANGE_CHUNK_SIZE = 65536; // 2^16 = 65536 //#endif //#endif -/** - * The maximum allowed image size in total pixels e.g. width * height. Images - * above this value will not be drawn. Use -1 for no limit. - * @var {number} - */ -PDFJS.maxImageSize = (PDFJS.maxImageSize === undefined ? - -1 : PDFJS.maxImageSize); - -/** - * The url of where the predefined Adobe CMaps are located. Include trailing - * slash. - * @var {string} - */ -PDFJS.cMapUrl = (PDFJS.cMapUrl === undefined ? null : PDFJS.cMapUrl); - -/** - * Specifies if CMaps are binary packed. - * @var {boolean} - */ -PDFJS.cMapPacked = PDFJS.cMapPacked === undefined ? false : PDFJS.cMapPacked; - -/** - * By default fonts are converted to OpenType fonts and loaded via font face - * rules. If disabled, the font will be rendered using a built in font renderer - * that constructs the glyphs with primitive path commands. - * @var {boolean} - */ -PDFJS.disableFontFace = (PDFJS.disableFontFace === undefined ? - false : PDFJS.disableFontFace); - -/** - * Path for image resources, mainly for annotation icons. Include trailing - * slash. - * @var {string} - */ -PDFJS.imageResourcesPath = (PDFJS.imageResourcesPath === undefined ? - '' : PDFJS.imageResourcesPath); - -/** - * Disable the web worker and run all code on the main thread. This will happen - * automatically if the browser doesn't support workers or sending typed arrays - * to workers. - * @var {boolean} - */ -PDFJS.disableWorker = (PDFJS.disableWorker === undefined ? - false : PDFJS.disableWorker); - -/** - * Path and filename of the worker file. Required when the worker is enabled in - * development mode. If unspecified in the production build, the worker will be - * loaded based on the location of the pdf.js file. It is recommended that - * the workerSrc is set in a custom application to prevent issues caused by - * third-party frameworks and libraries. - * @var {string} - */ -PDFJS.workerSrc = (PDFJS.workerSrc === undefined ? null : PDFJS.workerSrc); - -/** - * Disable range request loading of PDF files. When enabled and if the server - * supports partial content requests then the PDF will be fetched in chunks. - * Enabled (false) by default. - * @var {boolean} - */ -PDFJS.disableRange = (PDFJS.disableRange === undefined ? - false : PDFJS.disableRange); - -/** - * Disable streaming of PDF file data. By default PDF.js attempts to load PDF - * in chunks. This default behavior can be disabled. - * @var {boolean} - */ -PDFJS.disableStream = (PDFJS.disableStream === undefined ? - false : PDFJS.disableStream); - -/** - * Disable pre-fetching of PDF file data. When range requests are enabled PDF.js - * will automatically keep fetching more data even if it isn't needed to display - * the current page. This default behavior can be disabled. - * - * NOTE: It is also necessary to disable streaming, see above, - * in order for disabling of pre-fetching to work correctly. - * @var {boolean} - */ -PDFJS.disableAutoFetch = (PDFJS.disableAutoFetch === undefined ? - false : PDFJS.disableAutoFetch); - -/** - * Enables special hooks for debugging PDF.js. - * @var {boolean} - */ -PDFJS.pdfBug = (PDFJS.pdfBug === undefined ? false : PDFJS.pdfBug); - -/** - * Enables transfer usage in postMessage for ArrayBuffers. - * @var {boolean} - */ -PDFJS.postMessageTransfers = (PDFJS.postMessageTransfers === undefined ? - true : PDFJS.postMessageTransfers); - -/** - * Disables URL.createObjectURL usage. - * @var {boolean} - */ -PDFJS.disableCreateObjectURL = (PDFJS.disableCreateObjectURL === undefined ? - false : PDFJS.disableCreateObjectURL); - -/** - * Disables WebGL usage. - * @var {boolean} - */ -PDFJS.disableWebGL = (PDFJS.disableWebGL === undefined ? - true : PDFJS.disableWebGL); - -/** - * Disables fullscreen support, and by extension Presentation Mode, - * in browsers which support the fullscreen API. - * @var {boolean} - */ -PDFJS.disableFullscreen = (PDFJS.disableFullscreen === undefined ? - false : PDFJS.disableFullscreen); - -/** - * Enables CSS only zooming. - * @var {boolean} - */ -PDFJS.useOnlyCssZoom = (PDFJS.useOnlyCssZoom === undefined ? - false : PDFJS.useOnlyCssZoom); - -/** - * The maximum supported canvas size in total pixels e.g. width * height. - * The default value is 4096 * 4096. Use -1 for no limit. - * @var {number} - */ -PDFJS.maxCanvasPixels = (PDFJS.maxCanvasPixels === undefined ? - 16777216 : PDFJS.maxCanvasPixels); - -/** - * (Deprecated) Opens external links in a new window if enabled. - * The default behavior opens external links in the PDF.js window. - * - * NOTE: This property has been deprecated, please use - * `PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK` instead. - * @var {boolean} - */ -PDFJS.openExternalLinksInNewWindow = ( - PDFJS.openExternalLinksInNewWindow === undefined ? - false : PDFJS.openExternalLinksInNewWindow); - -/** - * Specifies the |target| attribute for external links. - * The constants from PDFJS.LinkTarget should be used: - * - NONE [default] - * - SELF - * - BLANK - * - PARENT - * - TOP - * @var {number} - */ -PDFJS.externalLinkTarget = (PDFJS.externalLinkTarget === undefined ? - PDFJS.LinkTarget.NONE : PDFJS.externalLinkTarget); - -/** - * Specifies the |rel| attribute for external links. Defaults to stripping - * the referrer. - * @var {string} - */ -PDFJS.externalLinkRel = (PDFJS.externalLinkRel === undefined ? - 'noreferrer' : PDFJS.externalLinkRel); - -/** - * Determines if we can eval strings as JS. Primarily used to improve - * performance for font rendering. - * @var {boolean} - */ -PDFJS.isEvalSupported = (PDFJS.isEvalSupported === undefined ? - true : PDFJS.isEvalSupported); - /** * Document initialization / loading parameters object. * @@ -309,10 +136,8 @@ PDFJS.isEvalSupported = (PDFJS.isEvalSupported === undefined ? * * @return {PDFDocumentLoadingTask} */ -PDFJS.getDocument = function getDocument(src, - pdfDataRangeTransport, - passwordCallback, - progressCallback) { +function getDocument(src, pdfDataRangeTransport, + passwordCallback, progressCallback) { var task = new PDFDocumentLoadingTask(); // Support of the obsolete arguments (for compatibility with API v1.0) @@ -413,7 +238,7 @@ PDFJS.getDocument = function getDocument(src, }).catch(task._capability.reject); return task; -}; +} /** * Starts fetching of specified PDF document/data. @@ -430,8 +255,8 @@ function _fetchDocument(worker, source, pdfDataRangeTransport, docId) { return Promise.reject(new Error('Worker was destroyed')); } - source.disableAutoFetch = PDFJS.disableAutoFetch; - source.disableStream = PDFJS.disableStream; + source.disableAutoFetch = getDefaultSetting('disableAutoFetch'); + source.disableStream = getDefaultSetting('disableStream'); source.chunkedViewerLoading = !!pdfDataRangeTransport; if (pdfDataRangeTransport) { source.length = pdfDataRangeTransport.length; @@ -440,13 +265,14 @@ function _fetchDocument(worker, source, pdfDataRangeTransport, docId) { return worker.messageHandler.sendWithPromise('GetDocRequest', { docId: docId, source: source, - disableRange: PDFJS.disableRange, - maxImageSize: PDFJS.maxImageSize, - cMapUrl: PDFJS.cMapUrl, - cMapPacked: PDFJS.cMapPacked, - disableFontFace: PDFJS.disableFontFace, - disableCreateObjectURL: PDFJS.disableCreateObjectURL, - postMessageTransfers: PDFJS.postMessageTransfers, + disableRange: getDefaultSetting('disableRange'), + maxImageSize: getDefaultSetting('maxImageSize'), + cMapUrl: getDefaultSetting('cMapUrl'), + cMapPacked: getDefaultSetting('cMapPacked'), + disableFontFace: getDefaultSetting('disableFontFace'), + disableCreateObjectURL: getDefaultSetting('disableCreateObjectURL'), + postMessageTransfers: getDefaultSetting('postMessageTransfers') && + !isPostMessageTransfersDisabled, }).then(function (workerId) { if (worker.destroyed) { throw new Error('Worker was destroyed'); @@ -497,7 +323,7 @@ var PDFDocumentLoadingTask = (function PDFDocumentLoadingTaskClosure() { /** * Callback to when unsupported feature is used. The callback receives - * an {PDFJS.UNSUPPORTED_FEATURES} argument. + * an {UNSUPPORTED_FEATURES} argument. */ this.onUnsupportedFeature = null; } @@ -549,7 +375,7 @@ var PDFDocumentLoadingTask = (function PDFDocumentLoadingTaskClosure() { /** * Abstract class to support range requests file loading. * @class - * @alias PDFJS.PDFDataRangeTransport + * @alias PDFDataRangeTransport * @param {number} length * @param {Uint8Array} initialData */ @@ -621,8 +447,6 @@ var PDFDataRangeTransport = (function pdfDataRangeTransportClosure() { return PDFDataRangeTransport; })(); -PDFJS.PDFDataRangeTransport = PDFDataRangeTransport; - /** * Proxy to a PDFDocument in the worker thread. Also, contains commonly used * properties that can be read synchronously. @@ -825,7 +649,7 @@ var PDFDocumentProxy = (function PDFDocumentProxyClosure() { * * @typedef {Object} RenderParameters * @property {Object} canvasContext - A 2D context of a DOM Canvas object. - * @property {PDFJS.PageViewport} viewport - Rendering viewport obtained by + * @property {PageViewport} viewport - Rendering viewport obtained by * calling of PDFPage.getViewport method. * @property {string} intent - Rendering intent, can be 'display' or 'print' * (default value is 'display'). @@ -859,7 +683,7 @@ var PDFPageProxy = (function PDFPageProxyClosure() { this.pageInfo = pageInfo; this.transport = transport; this.stats = new StatTimer(); - this.stats.enabled = !!globalScope.PDFJS.enableStats; + this.stats.enabled = getDefaultSetting('enableStats'); this.commonObjs = transport.commonObjs; this.objs = new PDFObjects(); this.cleanupAfterRender = false; @@ -898,14 +722,14 @@ var PDFPageProxy = (function PDFPageProxyClosure() { * @param {number} scale The desired scale of the viewport. * @param {number} rotate Degrees to rotate the viewport. If omitted this * defaults to the page rotation. - * @return {PDFJS.PageViewport} Contains 'width' and 'height' properties + * @return {PageViewport} Contains 'width' and 'height' properties * along with transforms required for rendering. */ getViewport: function PDFPageProxy_getViewport(scale, rotate) { if (arguments.length < 2) { rotate = this.rotate; } - return new PDFJS.PageViewport(this.view, scale, rotate, 0, 0); + return new PageViewport(this.view, scale, rotate, 0, 0); }, /** * @param {GetAnnotationsParameters} params - Annotation parameters. @@ -1193,8 +1017,11 @@ var PDFWorker = (function PDFWorkerClosure() { var nextFakeWorkerId = 0; function getWorkerSrc() { - if (PDFJS.workerSrc) { - return PDFJS.workerSrc; + if (typeof workerSrc !== 'undefined') { + return workerSrc; + } + if (getDefaultSetting('workerSrc')) { + return getDefaultSetting('workerSrc'); } //#if PRODUCTION && !(MOZCENTRAL || FIREFOX) // if (pdfjsFilePath) { @@ -1284,7 +1111,8 @@ var PDFWorker = (function PDFWorkerClosure() { // Right now, the requirement is, that an Uint8Array is still an // Uint8Array as it arrives on the worker. (Chrome added this with v.15.) //#if !SINGLE_FILE - if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') { + if (!isWorkerDisabled && !getDefaultSetting('disableWorker') && + typeof Worker !== 'undefined') { var workerSrc = getWorkerSrc(); try { @@ -1334,10 +1162,10 @@ var PDFWorker = (function PDFWorkerClosure() { this._port = worker; this._webWorker = worker; if (!data.supportTransfers) { - PDFJS.postMessageTransfers = false; + isPostMessageTransfersDisabled = true; } this._readyCapability.resolve(); - // Send global PDFJS setting, e.g. verbosity level. + // Send global setting, e.g. verbosity level. messageHandler.send('configure', { verbosity: getVerbosityLevel() }); @@ -1370,8 +1198,10 @@ var PDFWorker = (function PDFWorkerClosure() { }.bind(this)); var sendTest = function () { - var testObj = new Uint8Array( - [PDFJS.postMessageTransfers ? 255 : 0]); + var postMessageTransfers = + getDefaultSetting('postMessageTransfers') && + !isPostMessageTransfersDisabled; + var testObj = new Uint8Array([postMessageTransfers ? 255 : 0]); // Some versions of Opera throw a DATA_CLONE_ERR on serializing the // typed array. Also, checking if we can use transfers. try { @@ -1400,9 +1230,9 @@ var PDFWorker = (function PDFWorkerClosure() { }, _setupFakeWorker: function PDFWorker_setupFakeWorker() { - if (!globalScope.PDFJS.disableWorker) { + if (!isWorkerDisabled && !getDefaultSetting('disableWorker')) { warn('Setting up fake worker.'); - globalScope.PDFJS.disableWorker = true; + isWorkerDisabled = true; } setupFakeWorkerGlobal().then(function (WorkerMessageHandler) { @@ -1465,7 +1295,6 @@ var PDFWorker = (function PDFWorkerClosure() { return PDFWorker; })(); -PDFJS.PDFWorker = PDFWorker; /** * For internal use only. @@ -1665,7 +1494,20 @@ var WorkerTransport = (function WorkerTransportClosure() { this.commonObjs.resolve(id, error); break; } else { - font = new FontFaceObject(exportedData); + var fontRegistry = null; + if (getDefaultSetting('pdfBug') && globalScope.FontInspector && + globalScope['FontInspector'].enabled) { + fontRegistry = { + registerFont: function (font, url) { + globalScope['FontInspector'].fontAdded(font, url); + } + }; + } + font = new FontFaceObject(exportedData, { + isEvalSuported: getDefaultSetting('isEvalSupported'), + disableFontFace: getDefaultSetting('disableFontFace'), + fontRegistry: fontRegistry + }); } this.fontLoader.bind( @@ -1765,7 +1607,7 @@ var WorkerTransport = (function WorkerTransportClosure() { if (loadingTask.onUnsupportedFeature) { loadingTask.onUnsupportedFeature(featureId); } - PDFJS.UnsupportedManager.notify(featureId); + _UnsupportedManager.notify(featureId); }, this); messageHandler.on('JpegDecode', function(data) { @@ -2104,7 +1946,7 @@ var InternalRenderTask = (function InternalRenderTaskClosure() { if (this.cancelled) { return; } - if (PDFJS.pdfBug && 'StepperManager' in globalScope && + if (getDefaultSetting('pdfBug') && globalScope.StepperManager && globalScope.StepperManager.enabled) { this.stepper = globalScope.StepperManager.create(this.pageNumber - 1); this.stepper.init(this.operatorList); @@ -2193,7 +2035,7 @@ var InternalRenderTask = (function InternalRenderTaskClosure() { * (Deprecated) Global observer of unsupported feature usages. Use * onUnsupportedFeature callback of the {PDFDocumentLoadingTask} instance. */ -PDFJS.UnsupportedManager = (function UnsupportedManagerClosure() { +var _UnsupportedManager = (function UnsupportedManagerClosure() { var listeners = []; return { listen: function (cb) { @@ -2209,8 +2051,10 @@ PDFJS.UnsupportedManager = (function UnsupportedManagerClosure() { }; })(); -exports.getDocument = PDFJS.getDocument; +exports.getDocument = getDocument; exports.PDFDataRangeTransport = PDFDataRangeTransport; +exports.PDFWorker = PDFWorker; exports.PDFDocumentProxy = PDFDocumentProxy; exports.PDFPageProxy = PDFPageProxy; +exports._UnsupportedManager = _UnsupportedManager; })); diff --git a/src/display/canvas.js b/src/display/canvas.js index 44e0e62e2..5df5a73c1 100644 --- a/src/display/canvas.js +++ b/src/display/canvas.js @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* globals PDFJS, ImageData */ +/* globals ImageData */ 'use strict'; @@ -43,12 +43,14 @@ var assert = sharedUtil.assert; var info = sharedUtil.info; var isNum = sharedUtil.isNum; var isArray = sharedUtil.isArray; +var isLittleEndian = sharedUtil.isLittleEndian; var error = sharedUtil.error; var shadow = sharedUtil.shadow; var warn = sharedUtil.warn; var TilingPattern = displayPatternHelper.TilingPattern; var getShadingPatternFromIR = displayPatternHelper.getShadingPatternFromIR; var WebGLUtils = displayWebGL.WebGLUtils; +var hasCanvasTypedArrays = displayDOMUtils.hasCanvasTypedArrays; // contexts store most of the state we need natively. // However, PDF needs a bit more state, which we store here. @@ -67,6 +69,18 @@ var MAX_SIZE_TO_COMPILE = 1000; var FULL_CHUNK_HEIGHT = 16; +var HasCanvasTypedArraysCached = { + get value() { + return shadow(HasCanvasTypedArraysCached, 'value', hasCanvasTypedArrays()); + } +}; + +var IsLittleEndianCached = { + get value() { + return shadow(IsLittleEndianCached, 'value', isLittleEndian()); + } +}; + function createScratchCanvas(width, height) { var canvas = document.createElement('canvas'); canvas.width = width; @@ -505,13 +519,13 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { if (imgData.kind === ImageKind.GRAYSCALE_1BPP) { // Grayscale, 1 bit per pixel (i.e. black-and-white). var srcLength = src.byteLength; - var dest32 = PDFJS.hasCanvasTypedArrays ? new Uint32Array(dest.buffer) : - new Uint32ArrayView(dest); + var dest32 = HasCanvasTypedArraysCached.value ? + new Uint32Array(dest.buffer) : new Uint32ArrayView(dest); var dest32DataLength = dest32.length; var fullSrcDiff = (width + 7) >> 3; var white = 0xFFFFFFFF; - var black = (PDFJS.isLittleEndian || !PDFJS.hasCanvasTypedArrays) ? - 0xFF000000 : 0x000000FF; + var black = (IsLittleEndianCached.value || + !HasCanvasTypedArraysCached.value) ? 0xFF000000 : 0x000000FF; for (i = 0; i < totalChunks; i++) { thisChunkHeight = (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight; diff --git a/src/display/dom_utils.js b/src/display/dom_utils.js index 0d56f297f..65a2b7461 100644 --- a/src/display/dom_utils.js +++ b/src/display/dom_utils.js @@ -17,21 +17,17 @@ (function (root, factory) { if (typeof define === 'function' && define.amd) { - define('pdfjs/display/dom_utils', ['exports', 'pdfjs/shared/util', - 'pdfjs/display/global'], factory); + define('pdfjs/display/dom_utils', ['exports', 'pdfjs/shared/util'], + factory); } else if (typeof exports !== 'undefined') { - factory(exports, require('../shared/util.js'), require('./global.js')); + factory(exports, require('../shared/util.js')); } else { - factory((root.pdfjsDisplayDOMUtils = {}), root.pdfjsSharedUtil, - root.pdfjsDisplayGlobal); + factory((root.pdfjsDisplayDOMUtils = {}), root.pdfjsSharedUtil); } -}(this, function (exports, sharedUtil, displayGlobal) { +}(this, function (exports, sharedUtil) { -var deprecated = sharedUtil.deprecated; var removeNullCharacters = sharedUtil.removeNullCharacters; -var shadow = sharedUtil.shadow; var warn = sharedUtil.warn; -var PDFJS = displayGlobal.PDFJS; /** * Optimised CSS custom property getter/setter. @@ -87,10 +83,7 @@ var CustomStyle = (function CustomStyleClosure() { return CustomStyle; })(); -PDFJS.CustomStyle = CustomStyle; - //#if !(FIREFOX || MOZCENTRAL || CHROME) -//// Lazy test if the userAgent support CanvasTypedArrays function hasCanvasTypedArrays() { var canvas = document.createElement('canvas'); canvas.width = canvas.height = 1; @@ -98,15 +91,8 @@ function hasCanvasTypedArrays() { var imageData = ctx.createImageData(1, 1); return (typeof imageData.data.buffer !== 'undefined'); } - -Object.defineProperty(PDFJS, 'hasCanvasTypedArrays', { - configurable: true, - get: function PDFJS_hasCanvasTypedArrays() { - return shadow(PDFJS, 'hasCanvasTypedArrays', hasCanvasTypedArrays()); - } -}); //#else -//PDFJS.hasCanvasTypedArrays = true; +//function hasCanvasTypedArrays() { return true; } //#endif var LinkTarget = { @@ -117,8 +103,6 @@ var LinkTarget = { TOP: 4, }; -PDFJS.LinkTarget = LinkTarget; - var LinkTargetStringMap = [ '', '_self', @@ -127,53 +111,37 @@ var LinkTargetStringMap = [ '_top' ]; -function isExternalLinkTargetSet() { -//#if !MOZCENTRAL - if (PDFJS.openExternalLinksInNewWindow) { - deprecated('PDFJS.openExternalLinksInNewWindow, please use ' + - '"PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK" instead.'); - if (PDFJS.externalLinkTarget === LinkTarget.NONE) { - PDFJS.externalLinkTarget = LinkTarget.BLANK; - } - // Reset the deprecated parameter, to suppress further warnings. - PDFJS.openExternalLinksInNewWindow = false; - } -//#endif - switch (PDFJS.externalLinkTarget) { - case LinkTarget.NONE: - return false; - case LinkTarget.SELF: - case LinkTarget.BLANK: - case LinkTarget.PARENT: - case LinkTarget.TOP: - return true; - } - warn('PDFJS.externalLinkTarget is invalid: ' + PDFJS.externalLinkTarget); - // Reset the external link target, to suppress further warnings. - PDFJS.externalLinkTarget = LinkTarget.NONE; - return false; -} -PDFJS.isExternalLinkTargetSet = isExternalLinkTargetSet; +/** + * @typedef ExternalLinkParameters + * @typedef {Object} ExternalLinkParameters + * @property {string} url + * @property {LinkTarget} target + * @property {string} rel + */ /** * Adds various attributes (href, title, target, rel) to hyperlinks. * @param {HTMLLinkElement} link - The link element. - * @param {Object} params - An object with the properties: - * @param {string} params.url - An absolute URL. + * @param {ExternalLinkParameters} params - An object with the properties. */ function addLinkAttributes(link, params) { var url = params && params.url; link.href = link.title = (url ? removeNullCharacters(url) : ''); if (url) { - if (isExternalLinkTargetSet()) { - link.target = LinkTargetStringMap[PDFJS.externalLinkTarget]; + var target = params.target; + if (typeof target === 'undefined') { + target = getDefaultSetting('externalLinkTarget'); } + link.target = LinkTargetStringMap[target]; // Strip referrer from the URL. - link.rel = PDFJS.externalLinkRel; + var rel = params.rel; + if (typeof rel === 'undefined') { + rel = getDefaultSetting('externalLinkRel'); + } + link.rel = rel; } } -PDFJS.addLinkAttributes = addLinkAttributes; // Gets the file name from a given URL. function getFilenameFromUrl(url) { @@ -184,11 +152,86 @@ function getFilenameFromUrl(url) { query > 0 ? query : url.length); return url.substring(url.lastIndexOf('/', end) + 1, end); } -PDFJS.getFilenameFromUrl = getFilenameFromUrl; + +function getDefaultSetting(id) { + // The list of the settings and their default is maintained for backward + // compatibility and shall not be extended or modified. See also global.js. + var globalSettings = sharedUtil.globalScope.PDFJS; + switch (id) { + case 'pdfBug': + return globalSettings ? globalSettings.pdfBug : false; + case 'disableAutoFetch': + return globalSettings ? globalSettings.disableAutoFetch : false; + case 'disableStream': + return globalSettings ? globalSettings.disableStream : false; + case 'disableRange': + return globalSettings ? globalSettings.disableRange : false; + case 'disableFontFace': + return globalSettings ? globalSettings.disableFontFace : false; + case 'disableCreateObjectURL': + return globalSettings ? globalSettings.disableCreateObjectURL : false; + case 'disableWebGL': + return globalSettings ? globalSettings.disableWebGL : true; + case 'cMapUrl': + return globalSettings ? globalSettings.cMapUrl : null; + case 'cMapPacked': + return globalSettings ? globalSettings.cMapPacked : false; + case 'postMessageTransfers': + return globalSettings ? globalSettings.postMessageTransfers : true; + case 'workerSrc': + return globalSettings ? globalSettings.workerSrc : null; + case 'disableWorker': + return globalSettings ? globalSettings.disableWorker : false; + case 'maxImageSize': + return globalSettings ? globalSettings.maxImageSize : -1; + case 'imageResourcesPath': + return globalSettings ? globalSettings.imageResourcesPath : ''; + case 'isEvalSupported': + return globalSettings ? globalSettings.isEvalSupported : true; + case 'externalLinkTarget': + if (!globalSettings) { + return LinkTarget.NONE; + } + switch (globalSettings.externalLinkTarget) { + case LinkTarget.NONE: + case LinkTarget.SELF: + case LinkTarget.BLANK: + case LinkTarget.PARENT: + case LinkTarget.TOP: + return globalSettings.externalLinkTarget; + } + warn('PDFJS.externalLinkTarget is invalid: ' + + globalSettings.externalLinkTarget); + // Reset the external link target, to suppress further warnings. + globalSettings.externalLinkTarget = LinkTarget.NONE; + return LinkTarget.NONE; + case 'externalLinkRel': + return globalSettings ? globalSettings.externalLinkRel : 'noreferrer'; + case 'enableStats': + return !!(globalSettings && globalSettings.enableStats); + default: + throw new Error('Unknown default setting: ' + id); + } +} + +function isExternalLinkTargetSet() { + var externalLinkTarget = getDefaultSetting('externalLinkTarget'); + switch (externalLinkTarget) { + case LinkTarget.NONE: + return false; + case LinkTarget.SELF: + case LinkTarget.BLANK: + case LinkTarget.PARENT: + case LinkTarget.TOP: + return true; + } +} exports.CustomStyle = CustomStyle; exports.addLinkAttributes = addLinkAttributes; exports.isExternalLinkTargetSet = isExternalLinkTargetSet; exports.getFilenameFromUrl = getFilenameFromUrl; exports.LinkTarget = LinkTarget; +exports.hasCanvasTypedArrays = hasCanvasTypedArrays; +exports.getDefaultSetting = getDefaultSetting; })); diff --git a/src/display/font_loader.js b/src/display/font_loader.js index 3109e868c..e6b09bb4d 100644 --- a/src/display/font_loader.js +++ b/src/display/font_loader.js @@ -18,15 +18,14 @@ (function (root, factory) { if (typeof define === 'function' && define.amd) { - define('pdfjs/display/font_loader', ['exports', 'pdfjs/shared/util', - 'pdfjs/display/global'], factory); + define('pdfjs/display/font_loader', ['exports', 'pdfjs/shared/util'], + factory); } else if (typeof exports !== 'undefined') { - factory(exports, require('../shared/util.js'), require('./global.js')); + factory(exports, require('../shared/util.js')); } else { - factory((root.pdfjsDisplayFontLoader = {}), root.pdfjsSharedUtil, - root.pdfjsDisplayGlobal); + factory((root.pdfjsDisplayFontLoader = {}), root.pdfjsSharedUtil); } -}(this, function (exports, sharedUtil, displayGlobal) { +}(this, function (exports, sharedUtil) { var assert = sharedUtil.assert; var bytesToString = sharedUtil.bytesToString; @@ -34,10 +33,6 @@ var string32 = sharedUtil.string32; var shadow = sharedUtil.shadow; var warn = sharedUtil.warn; -var PDFJS = displayGlobal.PDFJS; -var globalScope = displayGlobal.globalScope; -var isWorker = displayGlobal.isWorker; - function FontLoader(docId) { this.docId = docId; this.styleElement = null; @@ -113,8 +108,6 @@ FontLoader.prototype = { }, bind: function fontLoaderBind(fonts, callback) { - assert(!isWorker, 'bind() shall be called from main thread'); - var rules = []; var fontsToLoad = []; var fontLoadPromises = []; @@ -291,8 +284,6 @@ FontLoader.prototype = { } //#else //bind: function fontLoaderBind(fonts, callback) { -// assert(!isWorker, 'bind() shall be called from main thread'); -// // for (var i = 0, ii = fonts.length; i < ii; i++) { // var font = fonts[i]; // if (font.attached) { @@ -311,8 +302,8 @@ FontLoader.prototype = { //#endif }; //#if !(MOZCENTRAL) -FontLoader.isFontLoadingAPISupported = (!isWorker && - typeof document !== 'undefined' && !!document.fonts); +FontLoader.isFontLoadingAPISupported = typeof document !== 'undefined' && + !!document.fonts; //#endif //#if !(MOZCENTRAL || CHROME) Object.defineProperty(FontLoader, 'isSyncFontLoadingSupported', { @@ -337,29 +328,21 @@ Object.defineProperty(FontLoader, 'isSyncFontLoadingSupported', { }); //#endif +var IsEvalSupportedCached = { + get value() { + return shadow(this, 'value', sharedUtil.isEvalSupported()); + } +}; + var FontFaceObject = (function FontFaceObjectClosure() { - function FontFaceObject(translatedData) { + function FontFaceObject(translatedData, options) { this.compiledGlyphs = Object.create(null); // importing translated data for (var i in translatedData) { this[i] = translatedData[i]; } + this.options = options; } - Object.defineProperty(FontFaceObject, 'isEvalSupported', { - get: function () { - var evalSupport = false; - if (PDFJS.isEvalSupported) { - try { - /* jshint evil: true */ - new Function(''); - evalSupport = true; - } catch (e) {} - } - return shadow(this, 'isEvalSupported', evalSupport); - }, - enumerable: true, - configurable: true - }); FontFaceObject.prototype = { //#if !(MOZCENTRAL) createNativeFontFace: function FontFaceObject_createNativeFontFace() { @@ -367,16 +350,15 @@ var FontFaceObject = (function FontFaceObjectClosure() { return null; } - if (PDFJS.disableFontFace) { + if (this.options.disableFontFace) { this.disableFontFace = true; return null; } var nativeFontFace = new FontFace(this.loadedName, this.data, {}); - if (PDFJS.pdfBug && 'FontInspector' in globalScope && - globalScope['FontInspector'].enabled) { - globalScope['FontInspector'].fontAdded(this); + if (this.options.fontRegistry) { + this.options.fontRegistry.registerFont(this); } return nativeFontFace; }, @@ -387,7 +369,7 @@ var FontFaceObject = (function FontFaceObjectClosure() { return null; } - if (PDFJS.disableFontFace) { + if (this.options.disableFontFace) { this.disableFontFace = true; return null; } @@ -400,9 +382,8 @@ var FontFaceObject = (function FontFaceObjectClosure() { window.btoa(data) + ');'); var rule = '@font-face { font-family:"' + fontName + '";src:' + url + '}'; - if (PDFJS.pdfBug && 'FontInspector' in globalScope && - globalScope['FontInspector'].enabled) { - globalScope['FontInspector'].fontAdded(this, url); + if (this.options.fontRegistry) { + this.options.fontRegistry.registerFont(this, url); } return rule; @@ -415,7 +396,7 @@ var FontFaceObject = (function FontFaceObjectClosure() { var current, i, len; // If we can, compile cmds into JS for MAXIMUM SPEED - if (FontFaceObject.isEvalSupported) { + if (this.options.isEvalSupported && IsEvalSupportedCached.value) { var args, js = ''; for (i = 0, len = cmds.length; i < len; i++) { current = cmds[i]; diff --git a/src/display/global.js b/src/display/global.js index cfc6e55c4..70def4c7c 100644 --- a/src/display/global.js +++ b/src/display/global.js @@ -18,21 +18,36 @@ (function (root, factory) { if (typeof define === 'function' && define.amd) { - define('pdfjs/display/global', ['exports', 'pdfjs/shared/util'], factory); + define('pdfjs/display/global', ['exports', 'pdfjs/shared/util', + 'pdfjs/display/dom_utils', 'pdfjs/display/api', + 'pdfjs/display/annotation_layer', 'pdfjs/display/text_layer', + 'pdfjs/display/metadata', 'pdfjs/display/svg'], factory); } else if (typeof exports !== 'undefined') { - factory(exports, require('../shared/util.js')); + factory(exports, require('../shared/util.js'), require('./dom_utils.js'), + require('./api.js'), require('./annotation_layer.js'), + require('./text_layer.js'), require('./metadata.js'), + require('./svg.js')); } else { - factory((root.pdfjsDisplayGlobal = {}), root.pdfjsSharedUtil); + factory((root.pdfjsDisplayGlobal = {}), root.pdfjsSharedUtil, + root.pdfjsDisplayDOMUtils, root.pdfjsDisplayAPI, + root.pdfjsDisplayAnnotationLayer, root.pdfjsDisplayTextLayer, + root.pdfjsDisplayMetadata, root.pdfjsDisplaySVG); } -}(this, function (exports, sharedUtil) { +}(this, function (exports, sharedUtil, displayDOMUtils, displayAPI, + displayAnnotationLayer, displayTextLayer, displayMetadata, + displaySVG) { var globalScope = sharedUtil.globalScope; + var deprecated = sharedUtil.deprecated; + var warn = sharedUtil.warn; + var LinkTarget = displayDOMUtils.LinkTarget; var isWorker = (typeof window === 'undefined'); - // The global PDFJS object exposes the API - // In production, it will be declared outside a global wrapper - // In development, it will be declared here + // The global PDFJS object is now deprecated and will not be supported in + // the future. The members below are maintained for backward compatibility + // and shall not be extended or modified. If the global.js is included as + // a module, we will create a global PDFJS object instance or use existing. if (!globalScope.PDFJS) { globalScope.PDFJS = {}; } @@ -86,6 +101,209 @@ PDFJS.PageViewport = sharedUtil.PageViewport; PDFJS.createPromiseCapability = sharedUtil.createPromiseCapability; + /** + * The maximum allowed image size in total pixels e.g. width * height. Images + * above this value will not be drawn. Use -1 for no limit. + * @var {number} + */ + PDFJS.maxImageSize = (PDFJS.maxImageSize === undefined ? + -1 : PDFJS.maxImageSize); + + /** + * The url of where the predefined Adobe CMaps are located. Include trailing + * slash. + * @var {string} + */ + PDFJS.cMapUrl = (PDFJS.cMapUrl === undefined ? null : PDFJS.cMapUrl); + + /** + * Specifies if CMaps are binary packed. + * @var {boolean} + */ + PDFJS.cMapPacked = PDFJS.cMapPacked === undefined ? false : PDFJS.cMapPacked; + + /** + * By default fonts are converted to OpenType fonts and loaded via font face + * rules. If disabled, the font will be rendered using a built in font + * renderer that constructs the glyphs with primitive path commands. + * @var {boolean} + */ + PDFJS.disableFontFace = (PDFJS.disableFontFace === undefined ? + false : PDFJS.disableFontFace); + + /** + * Path for image resources, mainly for annotation icons. Include trailing + * slash. + * @var {string} + */ + PDFJS.imageResourcesPath = (PDFJS.imageResourcesPath === undefined ? + '' : PDFJS.imageResourcesPath); + + /** + * Disable the web worker and run all code on the main thread. This will + * happen automatically if the browser doesn't support workers or sending + * typed arrays to workers. + * @var {boolean} + */ + PDFJS.disableWorker = (PDFJS.disableWorker === undefined ? + false : PDFJS.disableWorker); + + /** + * Path and filename of the worker file. Required when the worker is enabled + * in development mode. If unspecified in the production build, the worker + * will be loaded based on the location of the pdf.js file. It is recommended + * that the workerSrc is set in a custom application to prevent issues caused + * by third-party frameworks and libraries. + * @var {string} + */ + PDFJS.workerSrc = (PDFJS.workerSrc === undefined ? null : PDFJS.workerSrc); + + /** + * Disable range request loading of PDF files. When enabled and if the server + * supports partial content requests then the PDF will be fetched in chunks. + * Enabled (false) by default. + * @var {boolean} + */ + PDFJS.disableRange = (PDFJS.disableRange === undefined ? + false : PDFJS.disableRange); + + /** + * Disable streaming of PDF file data. By default PDF.js attempts to load PDF + * in chunks. This default behavior can be disabled. + * @var {boolean} + */ + PDFJS.disableStream = (PDFJS.disableStream === undefined ? + false : PDFJS.disableStream); + + /** + * Disable pre-fetching of PDF file data. When range requests are enabled + * PDF.js will automatically keep fetching more data even if it isn't needed + * to display the current page. This default behavior can be disabled. + * + * NOTE: It is also necessary to disable streaming, see above, + * in order for disabling of pre-fetching to work correctly. + * @var {boolean} + */ + PDFJS.disableAutoFetch = (PDFJS.disableAutoFetch === undefined ? + false : PDFJS.disableAutoFetch); + + /** + * Enables special hooks for debugging PDF.js. + * @var {boolean} + */ + PDFJS.pdfBug = (PDFJS.pdfBug === undefined ? false : PDFJS.pdfBug); + + /** + * Enables transfer usage in postMessage for ArrayBuffers. + * @var {boolean} + */ + PDFJS.postMessageTransfers = (PDFJS.postMessageTransfers === undefined ? + true : PDFJS.postMessageTransfers); + + /** + * Disables URL.createObjectURL usage. + * @var {boolean} + */ + PDFJS.disableCreateObjectURL = (PDFJS.disableCreateObjectURL === undefined ? + false : PDFJS.disableCreateObjectURL); + + /** + * Disables WebGL usage. + * @var {boolean} + */ + PDFJS.disableWebGL = (PDFJS.disableWebGL === undefined ? + true : PDFJS.disableWebGL); + + /** + * Specifies the |target| attribute for external links. + * The constants from PDFJS.LinkTarget should be used: + * - NONE [default] + * - SELF + * - BLANK + * - PARENT + * - TOP + * @var {number} + */ + PDFJS.externalLinkTarget = (PDFJS.externalLinkTarget === undefined ? + LinkTarget.NONE : PDFJS.externalLinkTarget); + + /** + * Specifies the |rel| attribute for external links. Defaults to stripping + * the referrer. + * @var {string} + */ + PDFJS.externalLinkRel = (PDFJS.externalLinkRel === undefined ? + 'noreferrer' : PDFJS.externalLinkRel); + + /** + * Determines if we can eval strings as JS. Primarily used to improve + * performance for font rendering. + * @var {boolean} + */ + PDFJS.isEvalSupported = (PDFJS.isEvalSupported === undefined ? + true : PDFJS.isEvalSupported); + +//#if !MOZCENTRAL + var savedOpenExternalLinksInNewWindow = PDFJS.openExternalLinksInNewWindow; + delete PDFJS.openExternalLinksInNewWindow; + Object.defineProperty(PDFJS, 'openExternalLinksInNewWindow', { + get: function () { + return PDFJS.externalLinkTarget === LinkTarget.BLANK; + }, + set: function (value) { + if (value) { + deprecated('PDFJS.openExternalLinksInNewWindow, please use ' + + '"PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK" instead.'); + } + if (PDFJS.externalLinkTarget !== LinkTarget.NONE) { + warn('PDFJS.externalLinkTarget is already initialized'); + return; + } + PDFJS.externalLinkTarget = value ? LinkTarget.BLANK : LinkTarget.NONE; + }, + enumerable: true, + configurable: true + }); + if (savedOpenExternalLinksInNewWindow) { + /** + * (Deprecated) Opens external links in a new window if enabled. + * The default behavior opens external links in the PDF.js window. + * + * NOTE: This property has been deprecated, please use + * `PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK` instead. + * @var {boolean} + */ + PDFJS.openExternalLinksInNewWindow = savedOpenExternalLinksInNewWindow; + } +//#endif + + PDFJS.getDocument = displayAPI.getDocument; + PDFJS.PDFDataRangeTransport = displayAPI.PDFDataRangeTransport; + PDFJS.PDFWorker = displayAPI.PDFWorker; + + Object.defineProperty(PDFJS, 'hasCanvasTypedArrays', { + configurable: true, + get: function PDFJS_hasCanvasTypedArrays() { + var value = displayDOMUtils.hasCanvasTypedArrays(); + return sharedUtil.shadow(PDFJS, 'hasCanvasTypedArrays', value); + } + }); + PDFJS.CustomStyle = displayDOMUtils.CustomStyle; + PDFJS.LinkTarget = LinkTarget; + PDFJS.addLinkAttributes = displayDOMUtils.addLinkAttributes; + PDFJS.getFilenameFromUrl = displayDOMUtils.getFilenameFromUrl; + PDFJS.isExternalLinkTargetSet = displayDOMUtils.isExternalLinkTargetSet; + + PDFJS.AnnotationLayer = displayAnnotationLayer.AnnotationLayer; + + PDFJS.renderTextLayer = displayTextLayer.renderTextLayer; + + PDFJS.Metadata = displayMetadata.Metadata; + + PDFJS.SVGGraphics = displaySVG.SVGGraphics; + + PDFJS.UnsupportedManager = displayAPI._UnsupportedManager; + exports.globalScope = globalScope; exports.isWorker = isWorker; exports.PDFJS = globalScope.PDFJS; diff --git a/src/display/metadata.js b/src/display/metadata.js index 558af3337..fea13ebd7 100644 --- a/src/display/metadata.js +++ b/src/display/metadata.js @@ -18,20 +18,16 @@ (function (root, factory) { if (typeof define === 'function' && define.amd) { - define('pdfjs/display/metadata', ['exports', 'pdfjs/shared/util', - 'pdfjs/display/global'], factory); + define('pdfjs/display/metadata', ['exports', 'pdfjs/shared/util'], factory); } else if (typeof exports !== 'undefined') { - factory(exports, require('../shared/util.js'), require('./global.js')); + factory(exports, require('../shared/util.js')); } else { - factory((root.pdfjsDisplayMetadata = {}), root.pdfjsSharedUtil, - root.pdfjsDisplayGlobal); + factory((root.pdfjsDisplayMetadata = {}), root.pdfjsSharedUtil); } -}(this, function (exports, sharedUtil, displayGlobal) { +}(this, function (exports, sharedUtil) { var error = sharedUtil.error; -var PDFJS = displayGlobal.PDFJS; -var Metadata = PDFJS.Metadata = (function MetadataClosure() { function fixMetadata(meta) { return meta.replace(/>\\376\\377([^<]+)/g, function(all, codes) { var bytes = codes.replace(/\\([0-3])([0-7])([0-7])/g, @@ -108,8 +104,5 @@ var Metadata = PDFJS.Metadata = (function MetadataClosure() { } }; - return Metadata; -})(); - exports.Metadata = Metadata; })); diff --git a/src/display/svg.js b/src/display/svg.js index 685f6e050..2d210f9fc 100644 --- a/src/display/svg.js +++ b/src/display/svg.js @@ -15,19 +15,16 @@ 'use strict'; -//#if (GENERIC || SINGLE_FILE) (function (root, factory) { if (typeof define === 'function' && define.amd) { - define('pdfjs/display/svg', ['exports', 'pdfjs/shared/util', - 'pdfjs/display/global'], factory); + define('pdfjs/display/svg', ['exports', 'pdfjs/shared/util'], factory); } else if (typeof exports !== 'undefined') { - factory(exports, require('../shared/util.js'), require('./global.js')); + factory(exports, require('../shared/util.js')); } else { - factory((root.pdfjsDisplaySVG = {}), root.pdfjsSharedUtil, - root.pdfjsDisplayGlobal); + factory((root.pdfjsDisplaySVG = {}), root.pdfjsSharedUtil); } -}(this, function (exports, sharedUtil, displayGlobal) { - +}(this, function (exports, sharedUtil) { +//#if (GENERIC || SINGLE_FILE) var FONT_IDENTITY_MATRIX = sharedUtil.FONT_IDENTITY_MATRIX; var IDENTITY_MATRIX = sharedUtil.IDENTITY_MATRIX; var ImageKind = sharedUtil.ImageKind; @@ -36,7 +33,7 @@ var Util = sharedUtil.Util; var isNum = sharedUtil.isNum; var isArray = sharedUtil.isArray; var warn = sharedUtil.warn; -var PDFJS = displayGlobal.PDFJS; +var createObjectURL = sharedUtil.createObjectURL; var SVG_DEFAULTS = { fontStyle: 'normal', @@ -110,7 +107,7 @@ var convertImgDataToPng = (function convertImgDataToPngClosure() { return (b << 16) | a; } - function encode(imgData, kind) { + function encode(imgData, kind, forceDataSchema) { var width = imgData.width; var height = imgData.height; var bitDepth, colorType, lineSize; @@ -226,13 +223,13 @@ var convertImgDataToPng = (function convertImgDataToPngClosure() { offset += CHUNK_WRAPPER_SIZE + idat.length; writePngChunk('IEND', new Uint8Array(0), data, offset); - return PDFJS.createObjectURL(data, 'image/png'); + return createObjectURL(data, 'image/png', forceDataSchema); } - return function convertImgDataToPng(imgData) { + return function convertImgDataToPng(imgData, forceDataSchema) { var kind = (imgData.kind === undefined ? ImageKind.GRAYSCALE_1BPP : imgData.kind); - return encode(imgData, kind); + return encode(imgData, kind, forceDataSchema); }; })(); @@ -377,7 +374,7 @@ var SVGGraphics = (function SVGGraphicsClosure() { pf(m[3]) + ' ' + pf(m[4]) + ' ' + pf(m[5]) + ')'; } - function SVGGraphics(commonObjs, objs) { + function SVGGraphics(commonObjs, objs, forceDataSchema) { this.current = new SVGExtraState(); this.transformMatrix = IDENTITY_MATRIX; // Graphics state matrix this.transformStack = []; @@ -389,6 +386,7 @@ var SVGGraphics = (function SVGGraphicsClosure() { this.embedFonts = false; this.embeddedFonts = Object.create(null); this.cssStyle = null; + this.forceDataSchema = !!forceDataSchema; } var NS = 'http://www.w3.org/2000/svg'; @@ -453,8 +451,8 @@ var SVGGraphics = (function SVGGraphicsClosure() { transform: function SVGGraphics_transform(a, b, c, d, e, f) { var transformMatrix = [a, b, c, d, e, f]; - this.transformMatrix = PDFJS.Util.transform(this.transformMatrix, - transformMatrix); + this.transformMatrix = Util.transform(this.transformMatrix, + transformMatrix); this.tgrp = document.createElementNS(NS, 'svg:g'); this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); @@ -777,7 +775,8 @@ var SVGGraphics = (function SVGGraphicsClosure() { this.defs.appendChild(this.cssStyle); } - var url = PDFJS.createObjectURL(fontObj.data, fontObj.mimetype); + var url = createObjectURL(fontObj.data, fontObj.mimetype, + this.forceDataSchema); this.cssStyle.textContent += '@font-face { font-family: "' + fontObj.loadedName + '";' + ' src: url(' + url + '); }\n'; @@ -1122,7 +1121,7 @@ var SVGGraphics = (function SVGGraphicsClosure() { var width = imgData.width; var height = imgData.height; - var imgSrc = convertImgDataToPng(imgData); + var imgSrc = convertImgDataToPng(imgData, this.forceDataSchema); var cliprect = document.createElementNS(NS, 'svg:rect'); cliprect.setAttributeNS(null, 'x', '0'); cliprect.setAttributeNS(null, 'y', '0'); @@ -1208,8 +1207,6 @@ var SVGGraphics = (function SVGGraphicsClosure() { return SVGGraphics; })(); -PDFJS.SVGGraphics = SVGGraphics; - exports.SVGGraphics = SVGGraphics; -})); //#endif +})); diff --git a/src/display/text_layer.js b/src/display/text_layer.js index 62b59a3da..0eaddcfc9 100644 --- a/src/display/text_layer.js +++ b/src/display/text_layer.js @@ -18,20 +18,20 @@ (function (root, factory) { if (typeof define === 'function' && define.amd) { define('pdfjs/display/text_layer', ['exports', 'pdfjs/shared/util', - 'pdfjs/display/dom_utils', 'pdfjs/display/global'], factory); + 'pdfjs/display/dom_utils'], factory); } else if (typeof exports !== 'undefined') { - factory(exports, require('../shared/util.js'), require('./dom_utils.js'), - require('./global.js')); + factory(exports, require('../shared/util.js'), require('./dom_utils.js')); } else { factory((root.pdfjsDisplayTextLayer = {}), root.pdfjsSharedUtil, - root.pdfjsDisplayDOMUtils, root.pdfjsDisplayGlobal); + root.pdfjsDisplayDOMUtils); } -}(this, function (exports, sharedUtil, displayDOMUtils, displayGlobal) { +}(this, function (exports, sharedUtil, displayDOMUtils) { var Util = sharedUtil.Util; var createPromiseCapability = sharedUtil.createPromiseCapability; var CustomStyle = displayDOMUtils.CustomStyle; -var PDFJS = displayGlobal.PDFJS; +var getDefaultSetting = displayDOMUtils.getDefaultSetting; +var PageViewport = sharedUtil.PageViewport; /** * Text layer render parameters. @@ -40,7 +40,7 @@ var PDFJS = displayGlobal.PDFJS; * @property {TextContent} textContent - Text content to render (the object is * returned by the page's getTextContent() method). * @property {HTMLElement} container - HTML element that will contain text runs. - * @property {PDFJS.PageViewport} viewport - The target viewport to properly + * @property {PageViewport} viewport - The target viewport to properly * layout the text runs. * @property {Array} textDivs - (optional) HTML elements that are correspond * the text items of the textContent input. This is output and shall be @@ -96,7 +96,7 @@ var renderTextLayer = (function renderTextLayerClosure() { // |fontName| is only used by the Font Inspector. This test will succeed // when e.g. the Font Inspector is off but the Stepper is on, but it's // not worth the effort to do a more accurate test. - if (PDFJS.pdfBug) { + if (getDefaultSetting('pdfBug')) { textDiv.dataset.fontName = geom.fontName; } // Storing into dataset will convert number into string. @@ -183,7 +183,7 @@ var renderTextLayer = (function renderTextLayerClosure() { * * @param {TextContent} textContent * @param {HTMLElement} container - * @param {PDFJS.PageViewport} viewport + * @param {PageViewport} viewport * @param {Array} textDivs * @private */ @@ -251,7 +251,5 @@ var renderTextLayer = (function renderTextLayerClosure() { return renderTextLayer; })(); -PDFJS.renderTextLayer = renderTextLayer; - exports.renderTextLayer = renderTextLayer; })); diff --git a/src/display/webgl.js b/src/display/webgl.js index bce7aae3c..bd4586184 100644 --- a/src/display/webgl.js +++ b/src/display/webgl.js @@ -19,17 +19,17 @@ (function (root, factory) { if (typeof define === 'function' && define.amd) { define('pdfjs/display/webgl', ['exports', 'pdfjs/shared/util', - 'pdfjs/display/global'], factory); + 'pdfjs/display/dom_utils'], factory); } else if (typeof exports !== 'undefined') { - factory(exports, require('../shared/util.js'), require('./global.js')); + factory(exports, require('../shared/util.js'), require('./dom_utils.js')); } else { factory((root.pdfjsDisplayWebGL = {}), root.pdfjsSharedUtil, - root.pdfjsDisplayGlobal); + root.pdfjsDisplayDOMUtils); } -}(this, function (exports, sharedUtil, displayGlobal) { +}(this, function (exports, sharedUtil, displayDOMUtils) { var shadow = sharedUtil.shadow; -var PDFJS = displayGlobal.PDFJS; +var getDefaultSetting = displayDOMUtils.getDefaultSetting; var WebGLUtils = (function WebGLUtilsClosure() { function loadShader(gl, code, shaderType) { @@ -432,7 +432,7 @@ var WebGLUtils = (function WebGLUtilsClosure() { return { get isEnabled() { - if (PDFJS.disableWebGL) { + if (getDefaultSetting('disableWebGL')) { return false; } var enabled = false; diff --git a/src/frameworks.js b/src/frameworks.js index 01493218f..ac21dcbe9 100644 --- a/src/frameworks.js +++ b/src/frameworks.js @@ -12,7 +12,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* globals PDFJS, require, module, requirejs */ +/* globals require, module, requirejs, + workerSrc: true, isWorkerDisabled: true */ // included from api.js for GENERIC build @@ -21,7 +22,7 @@ var useRequireEnsure = false; if (typeof module !== 'undefined' && module.require) { // node.js - disable worker and set require.ensure. - PDFJS.disableWorker = true; + isWorkerDisabled = true; if (typeof require.ensure === 'undefined') { require.ensure = require('node-ensure'); } @@ -29,11 +30,11 @@ if (typeof module !== 'undefined' && module.require) { } if (typeof __webpack_require__ !== 'undefined') { // Webpack - get/bundle pdf.worker.js as additional file. - PDFJS.workerSrc = require('entry?name=[hash]-worker.js!./pdf.worker.js'); + workerSrc = require('entry?name=[hash]-worker.js!./pdf.worker.js'); useRequireEnsure = true; } if (typeof requirejs !== 'undefined' && requirejs.toUrl) { - PDFJS.workerSrc = requirejs.toUrl('pdfjs-dist/build/pdf.worker.js'); + workerSrc = requirejs.toUrl('pdfjs-dist/build/pdf.worker.js'); } var fakeWorkerFilesLoader = useRequireEnsure ? (function (callback) { require.ensure([], function () { diff --git a/src/main_loader.js b/src/main_loader.js index 5ac1c42c8..e9afea7c2 100644 --- a/src/main_loader.js +++ b/src/main_loader.js @@ -19,21 +19,24 @@ if (typeof define === 'function' && define.amd) { define('pdfjs/main_loader', ['exports', 'pdfjs/display/api', 'pdfjs/display/annotation_layer', 'pdfjs/display/text_layer', - 'pdfjs/display/dom_utils', 'pdfjs/shared/util', 'pdfjs/display/global'], + 'pdfjs/display/dom_utils', 'pdfjs/shared/util', 'pdfjs/display/svg', + 'pdfjs/display/global'], factory); } else if (typeof exports !== 'undefined') { factory(exports, require('./display/api.js'), require('./display/annotation_layer.js'), require('./display/text_layer.js'), require('./display/dom_utils.js'), - require('./shared/util.js'), require('./display/global.js')); + require('./shared/util.js'), require('./display/svg.js'), + require('./display/global.js')); } else { factory((root.pdfjsMainLoader = {}), root.pdfjsDisplayAPI, root.pdfjsDisplayAnnotationLayer, root.pdfjsDisplayTextLayer, - root.pdfjsDisplayDOMUtils, root.pdfjsSharedUtil, root.pdfjsDisplayGlobal); + root.pdfjsDisplayDOMUtils, root.pdfjsSharedUtil, root.pdfjsDisplaySVG, + root.pdfjsDisplayGlobal); } }(this, function (exports, displayAPI, displayAnnotationLayer, displayTextLayer, displayDOMUtils, sharedUtil, - displayGlobal) { + displaySVG, displayGlobal) { // Sync the exports below with ./pdf.js file/template. exports.PDFJS = displayGlobal.PDFJS; @@ -46,5 +49,6 @@ exports.PasswordResponses = sharedUtil.PasswordResponses; exports.InvalidPDFException = sharedUtil.InvalidPDFException; exports.MissingPDFException = sharedUtil.MissingPDFException; + exports.SVGGraphics = displaySVG.SVGGraphics; exports.UnexpectedResponseException = sharedUtil.UnexpectedResponseException; })); diff --git a/src/pdf.js b/src/pdf.js index c9ef03c19..4c0087d5c 100644 --- a/src/pdf.js +++ b/src/pdf.js @@ -55,6 +55,7 @@ exports.PasswordResponses = pdfjsLibs.pdfjsSharedUtil.PasswordResponses; exports.InvalidPDFException = pdfjsLibs.pdfjsSharedUtil.InvalidPDFException; exports.MissingPDFException = pdfjsLibs.pdfjsSharedUtil.MissingPDFException; + exports.SVGGraphics = pdfjsLibs.pdfjsDisplaySVG.SVGGraphics; exports.UnexpectedResponseException = pdfjsLibs.pdfjsSharedUtil.UnexpectedResponseException; //#else diff --git a/src/shared/util.js b/src/shared/util.js index 5fe38b544..c6c189e63 100644 --- a/src/shared/util.js +++ b/src/shared/util.js @@ -592,6 +592,17 @@ function isLittleEndian() { return (buffer16[0] === 1); } +// Checks if it's possible to eval JS expressions. +function isEvalSupported() { + try { + /* jshint evil: true */ + new Function(''); + return true; + } catch (e) { + return false; + } +} + //#if !(FIREFOX || MOZCENTRAL || CHROME) var Uint32ArrayView = (function Uint32ArrayViewClosure() { @@ -889,7 +900,7 @@ var Util = (function UtilClosure() { /** * PDF page viewport created based on scale, rotation and offset. * @class - * @alias PDFJS.PageViewport + * @alias PageViewport */ var PageViewport = (function PageViewportClosure() { /** @@ -965,13 +976,13 @@ var PageViewport = (function PageViewportClosure() { this.height = height; this.fontScale = scale; } - PageViewport.prototype = /** @lends PDFJS.PageViewport.prototype */ { + PageViewport.prototype = /** @lends PageViewport.prototype */ { /** * Clones viewport with additional properties. * @param args {Object} (optional) If specified, may contain the 'scale' or * 'rotation' properties to override the corresponding properties in * the cloned viewport. - * @returns {PDFJS.PageViewport} Cloned viewport. + * @returns {PageViewport} Cloned viewport. */ clone: function PageViewPort_clone(args) { args = args || {}; @@ -1101,7 +1112,7 @@ function isArrayBuffer(v) { /** * Creates a promise capability object. - * @alias PDFJS.createPromiseCapability + * @alias createPromiseCapability * * @return {PromiseCapability} A capability object contains: * - a Promise, resolve and reject methods. @@ -2347,6 +2358,7 @@ exports.isString = isString; exports.isSameOrigin = isSameOrigin; exports.isValidUrl = isValidUrl; exports.isLittleEndian = isLittleEndian; +exports.isEvalSupported = isEvalSupported; exports.loadJpegStream = loadJpegStream; exports.log2 = log2; exports.readInt8 = readInt8; diff --git a/test/test_slave.html b/test/test_slave.html index de7fda3f5..7fa8fb5bb 100644 --- a/test/test_slave.html +++ b/test/test_slave.html @@ -33,8 +33,9 @@ limitations under the License.