diff --git a/examples/acroforms/forms.js b/examples/acroforms/forms.js index d7c40c8cc..732ea94e5 100644 --- a/examples/acroforms/forms.js +++ b/examples/acroforms/forms.js @@ -140,9 +140,9 @@ function renderPage(div, pdf, pageNumber, callback) { // In production, the bundled pdf.js shall be used instead of RequireJS. require.config({paths: {'pdfjs': '../../src'}}); -require(['pdfjs/display/api'], function (api) { +require(['pdfjs/display/api', 'pdfjs/display/global'], function (api, global) { // In production, change this to point to the built `pdf.worker.js` file. - PDFJS.workerSrc = '../../src/worker_loader.js'; + global.PDFJS.workerSrc = '../../src/worker_loader.js'; // Fetch the PDF document from the URL using promises. api.getDocument(pdfWithFormsPath).then(function getPdfForm(pdf) { diff --git a/examples/helloworld/hello.js b/examples/helloworld/hello.js index 00aac8f61..3571b59a6 100644 --- a/examples/helloworld/hello.js +++ b/examples/helloworld/hello.js @@ -2,9 +2,9 @@ // In production, the bundled pdf.js shall be used instead of RequireJS. require.config({paths: {'pdfjs': '../../src'}}); -require(['pdfjs/display/api'], function (api) { +require(['pdfjs/display/api', 'pdfjs/display/global'], function (api, global) { // In production, change this to point to the built `pdf.worker.js` file. - PDFJS.workerSrc = '../../src/worker_loader.js'; + global.PDFJS.workerSrc = '../../src/worker_loader.js'; // Fetch the PDF document from the URL using promises. api.getDocument('helloworld.pdf').then(function (pdf) { diff --git a/examples/node/domstubs.js b/examples/node/domstubs.js index fd7add63a..b654d6070 100644 --- a/examples/node/domstubs.js +++ b/examples/node/domstubs.js @@ -120,10 +120,6 @@ DOMElement.prototype = { }, } -global.window = global; - -global.navigator = { userAgent: 'node' }; - global.document = { childNodes : [], diff --git a/examples/node/getinfo.js b/examples/node/getinfo.js index c06e05ddd..3bed39297 100644 --- a/examples/node/getinfo.js +++ b/examples/node/getinfo.js @@ -13,7 +13,7 @@ var fs = require('fs'); global.DOMParser = require('./domparsermock.js').DOMParserMock; // Run `gulp dist` to generate 'pdfjs-dist' npm package files. -require('../../build/dist'); +var pdfjsLib = require('../../build/dist'); // Loading file from file system into typed array var pdfPath = process.argv[2] || '../../web/compressed.tracemonkey-pldi-09.pdf'; @@ -21,7 +21,7 @@ var data = new Uint8Array(fs.readFileSync(pdfPath)); // Will be using promises to load document, pages and misc data instead of // callback. -PDFJS.getDocument(data).then(function (doc) { +pdfjsLib.getDocument(data).then(function (doc) { var numPages = doc.numPages; console.log('# Document Loaded'); console.log('Number of Pages: ' + numPages); diff --git a/examples/node/pdf2svg.js b/examples/node/pdf2svg.js index 48268bfce..00d412169 100644 --- a/examples/node/pdf2svg.js +++ b/examples/node/pdf2svg.js @@ -11,7 +11,7 @@ var fs = require('fs'); require('./domstubs.js'); // Run `gulp dist` to generate 'pdfjs-dist' npm package files. -require('../../build/dist'); +var pdfjsLib = require('../../build/dist'); // Loading file from file system into typed array var pdfPath = process.argv[2] || '../../web/compressed.tracemonkey-pldi-09.pdf'; @@ -44,7 +44,7 @@ function getFileNameFromPath(path) { // Will be using promises to load document, pages and misc data instead of // callback. -PDFJS.getDocument(data).then(function (doc) { +pdfjsLib.getDocument(data).then(function (doc) { var numPages = doc.numPages; console.log('# Document Loaded'); console.log('Number of Pages: ' + numPages); @@ -59,7 +59,7 @@ PDFJS.getDocument(data).then(function (doc) { console.log(); return page.getOperatorList().then(function (opList) { - var svgGfx = new PDFJS.SVGGraphics(page.commonObjs, page.objs); + var svgGfx = new pdfjsLib.SVGGraphics(page.commonObjs, page.objs); svgGfx.embedFonts = true; return svgGfx.getSVG(opList, viewport).then(function (svg) { var svgDump = svg.toString(); diff --git a/examples/svgviewer/viewer.js b/examples/svgviewer/viewer.js index 3fe24d954..51f5ad2dd 100644 --- a/examples/svgviewer/viewer.js +++ b/examples/svgviewer/viewer.js @@ -9,7 +9,7 @@ var queryParams = query ? JSON.parse('{' + query.split('&').map(function (a) { var url = queryParams.file || '../../test/pdfs/liveprogramming.pdf'; var scale = +queryParams.scale || 1.5; -function renderDocument(pdf) { +function renderDocument(pdf, svgLib) { var numPages = pdf.numPages; // Using promise to fetch the page @@ -37,7 +37,7 @@ function renderDocument(pdf) { anchor.appendChild(container); return page.getOperatorList().then(function (opList) { - var svgGfx = new PDFJS.SVGGraphics(page.commonObjs, page.objs); + var svgGfx = new svgLib.SVGGraphics(page.commonObjs, page.objs); return svgGfx.getSVG(opList, viewport).then(function (svg) { container.appendChild(svg); }); @@ -49,14 +49,17 @@ function renderDocument(pdf) { // In production, the bundled pdf.js shall be used instead of RequireJS. require.config({paths: {'pdfjs': '../../src'}}); -require(['pdfjs/display/api', 'pdfjs/display/svg'], function (api, svg) { +require(['pdfjs/display/api', 'pdfjs/display/svg', 'pdfjs/display/global'], + function (api, svg, global) { // In production, change this to point to the built `pdf.worker.js` file. - PDFJS.workerSrc = '../../src/worker_loader.js'; + global.PDFJS.workerSrc = '../../src/worker_loader.js'; // In production, change this to point to where the cMaps are placed. - PDFJS.cMapUrl = '../../external/bcmaps/'; - PDFJS.cMapPacked = true; + global.PDFJS.cMapUrl = '../../external/bcmaps/'; + global.PDFJS.cMapPacked = true; // Fetch the PDF document from the URL using promises. - api.getDocument(url).then(renderDocument); + api.getDocument(url).then(function (doc) { + renderDocument(doc, svg); + }); }); diff --git a/examples/webpack/main.js b/examples/webpack/main.js index 2a3509d7a..6b475dc5b 100644 --- a/examples/webpack/main.js +++ b/examples/webpack/main.js @@ -3,7 +3,7 @@ // Hello world example for webpack. -require('pdfjs-dist'); +var pdfjsLib = require('pdfjs-dist'); var pdfPath = '../helloworld/helloworld.pdf'; @@ -11,7 +11,7 @@ var pdfPath = '../helloworld/helloworld.pdf'; // however that might degrade the UI performance in web browsers. // Loading a document. -var loadingTask = PDFJS.getDocument(pdfPath); +var loadingTask = pdfjsLib.getDocument(pdfPath); loadingTask.promise.then(function (pdfDocument) { // Request a first page return pdfDocument.getPage(1).then(function (pdfPage) { diff --git a/make.js b/make.js index 1f6c9242c..5bd5c397f 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' ]; @@ -527,9 +528,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 = [ @@ -539,9 +538,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..3dfb93926 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* globals pdfjsFilePath */ +/* globals pdfjsFilePath, pdfjsVersion, pdfjsBuild */ 'use strict'; @@ -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); @@ -2160,7 +2002,7 @@ var InternalRenderTask = (function InternalRenderTaskClosure() { }, _scheduleNext: function InternalRenderTask__scheduleNext() { - if (this.useRequestAnimationFrame) { + if (this.useRequestAnimationFrame && typeof window !== 'undefined') { window.requestAnimationFrame(this._nextBound); } else { Promise.resolve(undefined).then(this._nextBound); @@ -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,17 @@ PDFJS.UnsupportedManager = (function UnsupportedManagerClosure() { }; })(); -exports.getDocument = PDFJS.getDocument; +if (typeof pdfjsVersion !== 'undefined') { + exports.version = pdfjsVersion; +} +if (typeof pdfjsBuild !== 'undefined') { + exports.build = pdfjsBuild; +} + +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; // <canvas> 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..74f676c72 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,25 +302,26 @@ 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', { get: function () { + if (typeof navigator === 'undefined') { + // node.js - we can pretend sync font loading is supported. + return shadow(FontLoader, 'isSyncFontLoadingSupported', true); + } + var supported = false; // User agent string sniffing is bad, but there is no reliable way to tell // if font is fully loaded and ready to be used with canvas. - var userAgent = window.navigator.userAgent; - var m = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(userAgent); + var m = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(navigator.userAgent); if (m && m[1] >= 14) { supported = true; } // TODO other browsers - if (userAgent === 'node') { - supported = true; - } return shadow(FontLoader, 'isSyncFontLoadingSupported', supported); }, enumerable: true, @@ -337,29 +329,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 +351,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 +370,7 @@ var FontFaceObject = (function FontFaceObjectClosure() { return null; } - if (PDFJS.disableFontFace) { + if (this.options.disableFontFace) { this.disableFontFace = true; return null; } @@ -396,13 +379,11 @@ var FontFaceObject = (function FontFaceObjectClosure() { var fontName = this.loadedName; // Add the font-face rule to the document - var url = ('url(data:' + this.mimetype + ';base64,' + - window.btoa(data) + ');'); + var url = ('url(data:' + this.mimetype + ';base64,' + 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..9b5109c97 100644 --- a/src/frameworks.js +++ b/src/frameworks.js @@ -12,16 +12,17 @@ * 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 'use strict'; var useRequireEnsure = false; -if (typeof module !== 'undefined' && module.require) { +if (typeof window === 'undefined') { // 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..e6dc4920e 100644 --- a/src/main_loader.js +++ b/src/main_loader.js @@ -19,32 +19,48 @@ 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; - + exports.build = displayAPI.build; + exports.version = displayAPI.version; exports.getDocument = displayAPI.getDocument; exports.PDFDataRangeTransport = displayAPI.PDFDataRangeTransport; + exports.PDFWorker = displayAPI.PDFWorker; exports.renderTextLayer = displayTextLayer.renderTextLayer; exports.AnnotationLayer = displayAnnotationLayer.AnnotationLayer; exports.CustomStyle = displayDOMUtils.CustomStyle; exports.PasswordResponses = sharedUtil.PasswordResponses; exports.InvalidPDFException = sharedUtil.InvalidPDFException; exports.MissingPDFException = sharedUtil.MissingPDFException; + exports.SVGGraphics = displaySVG.SVGGraphics; exports.UnexpectedResponseException = sharedUtil.UnexpectedResponseException; + exports.OPS = sharedUtil.OPS; + exports.UNSUPPORTED_FEATURES = sharedUtil.UNSUPPORTED_FEATURES; + exports.isValidUrl = sharedUtil.isValidUrl; + exports.createObjectURL = sharedUtil.createObjectURL; + exports.removeNullCharacters = sharedUtil.removeNullCharacters; + exports.shadow = sharedUtil.shadow; + exports.createBlob = sharedUtil.createBlob; + exports.getFilenameFromUrl = displayDOMUtils.getFilenameFromUrl; + exports.addLinkAttributes = displayDOMUtils.addLinkAttributes; + })); diff --git a/src/pdf.js b/src/pdf.js index c9ef03c19..61dea39ea 100644 --- a/src/pdf.js +++ b/src/pdf.js @@ -45,9 +45,12 @@ //#if MAIN_FILE exports.PDFJS = pdfjsLibs.pdfjsDisplayGlobal.PDFJS; + exports.build = pdfjsLibs.pdfjsDisplayAPI.build; + exports.version = pdfjsLibs.pdfjsDisplayAPI.version; exports.getDocument = pdfjsLibs.pdfjsDisplayAPI.getDocument; exports.PDFDataRangeTransport = pdfjsLibs.pdfjsDisplayAPI.PDFDataRangeTransport; + exports.PDFWorker = pdfjsLibs.pdfjsDisplayAPI.PDFWorker; exports.renderTextLayer = pdfjsLibs.pdfjsDisplayTextLayer.renderTextLayer; exports.AnnotationLayer = pdfjsLibs.pdfjsDisplayAnnotationLayer.AnnotationLayer; @@ -55,8 +58,19 @@ 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; + exports.OPS = pdfjsLibs.pdfjsSharedUtil.OPS; + exports.UNSUPPORTED_FEATURES = pdfjsLibs.pdfjsSharedUtil.UNSUPPORTED_FEATURES; + exports.isValidUrl = pdfjsLibs.pdfjsSharedUtil.isValidUrl; + exports.createObjectURL = pdfjsLibs.pdfjsSharedUtil.createObjectURL; + exports.removeNullCharacters = pdfjsLibs.pdfjsSharedUtil.removeNullCharacters; + exports.shadow = pdfjsLibs.pdfjsSharedUtil.shadow; + exports.createBlob = pdfjsLibs.pdfjsSharedUtil.createBlob; + exports.getFilenameFromUrl = + pdfjsLibs.pdfjsDisplayDOMUtils.getFilenameFromUrl; + exports.addLinkAttributes = pdfjsLibs.pdfjsDisplayDOMUtils.addLinkAttributes; //#else exports.WorkerMessageHandler = pdfjsLibs.pdfjsCoreWorker.WorkerMessageHandler; //#endif 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. <script> require.config({paths: {'pdfjs': '../src'}}); require(['pdfjs/display/api', 'pdfjs/display/text_layer', - 'pdfjs/display/annotation_layer', 'pdfjs/shared/util'], - function (api, textLayer, annotationLayer, pdfjsSharedUtil) { + 'pdfjs/display/annotation_layer', 'pdfjs/display/global', + 'pdfjs/shared/util'], + function (api, textLayer, annotationLayer, global, pdfjsSharedUtil) { window.pdfjsSharedUtil = pdfjsSharedUtil; var driver = new Driver({ diff --git a/web/annotation_layer_builder.js b/web/annotation_layer_builder.js index 6d985b8cc..d2bf28ba2 100644 --- a/web/annotation_layer_builder.js +++ b/web/annotation_layer_builder.js @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/*globals PDFJS, mozL10n, SimpleLinkService */ +/*globals pdfjsLib, mozL10n, SimpleLinkService */ 'use strict'; @@ -68,7 +68,7 @@ var AnnotationLayerBuilder = (function AnnotationLayerBuilderClosure() { if (self.div) { // If an annotationLayer already exists, refresh its children's // transformation matrices. - PDFJS.AnnotationLayer.update(parameters); + pdfjsLib.AnnotationLayer.update(parameters); } else { // Create an annotation layer div and render the annotations // if there is at least one annotation. @@ -81,7 +81,7 @@ var AnnotationLayerBuilder = (function AnnotationLayerBuilderClosure() { self.pageDiv.appendChild(self.div); parameters.div = self.div; - PDFJS.AnnotationLayer.render(parameters); + pdfjsLib.AnnotationLayer.render(parameters); if (typeof mozL10n !== 'undefined') { mozL10n.translate(self.div); } diff --git a/web/app.js b/web/app.js index 0f65a8864..a6c027aa3 100644 --- a/web/app.js +++ b/web/app.js @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* globals PDFJS, PDFBug, FirefoxCom, Stats, ProgressBar, DownloadManager, +/* globals pdfjsLib, PDFBug, FirefoxCom, Stats, ProgressBar, DownloadManager, getPDFFileNameFromURL, PDFHistory, Preferences, SidebarView, ViewHistory, Stats, PDFThumbnailViewer, URL, noContextMenuHandler, SecondaryToolbar, PasswordPrompt, PDFPresentationMode, PDFSidebar, @@ -20,8 +20,7 @@ PDFOutlineViewer, PDFAttachmentViewer, OverlayManager, PDFFindController, PDFFindBar, PDFViewer, PDFRenderingQueue, PresentationModeState, parseQueryString, RenderingStates, - UNKNOWN_SCALE, DEFAULT_SCALE_VALUE, DEFAULT_URL, mozL10n, - IGNORE_CURRENT_POSITION_ON_ZOOM: true */ + UNKNOWN_SCALE, DEFAULT_SCALE_VALUE, DEFAULT_URL, mozL10n */ 'use strict'; @@ -108,7 +107,7 @@ var PDFViewerApplication = { // called once when the document is loaded initialize: function pdfViewInitialize() { - configure(PDFJS); + configure(pdfjsLib.PDFJS); var pdfRenderingQueue = new PDFRenderingQueue(); pdfRenderingQueue.onIdle = this.cleanup.bind(this); @@ -263,6 +262,7 @@ var PDFViewerApplication = { this.pdfSidebar.onToggled = this.forceRendering.bind(this); var self = this; + var PDFJS = pdfjsLib.PDFJS; var initializedPromise = Promise.all([ Preferences.get('enableWebGL').then(function resolved(value) { PDFJS.disableWebGL = !value; @@ -369,7 +369,7 @@ var PDFViewerApplication = { var canvas = document.createElement('canvas'); var value = 'mozPrintCallback' in canvas; - return PDFJS.shadow(this, 'supportsPrinting', value); + return pdfjsLib.shadow(this, 'supportsPrinting', value); }, get supportsFullscreen() { @@ -383,11 +383,11 @@ var PDFViewerApplication = { document.msFullscreenEnabled === false) { support = false; } - if (support && PDFJS.disableFullscreen === true) { + if (support && pdfjsLib.PDFJS.disableFullscreen === true) { support = false; } - return PDFJS.shadow(this, 'supportsFullscreen', support); + return pdfjsLib.shadow(this, 'supportsFullscreen', support); }, get supportsIntegratedFind() { @@ -396,7 +396,7 @@ var PDFViewerApplication = { // support = FirefoxCom.requestSync('supportsIntegratedFind'); //#endif - return PDFJS.shadow(this, 'supportsIntegratedFind', support); + return pdfjsLib.shadow(this, 'supportsIntegratedFind', support); }, get supportsDocumentFonts() { @@ -405,7 +405,7 @@ var PDFViewerApplication = { // support = FirefoxCom.requestSync('supportsDocumentFonts'); //#endif - return PDFJS.shadow(this, 'supportsDocumentFonts', support); + return pdfjsLib.shadow(this, 'supportsDocumentFonts', support); }, get supportsDocumentColors() { @@ -414,13 +414,13 @@ var PDFViewerApplication = { // support = FirefoxCom.requestSync('supportsDocumentColors'); //#endif - return PDFJS.shadow(this, 'supportsDocumentColors', support); + return pdfjsLib.shadow(this, 'supportsDocumentColors', support); }, get loadingBar() { var bar = new ProgressBar('#loadingBar', {}); - return PDFJS.shadow(this, 'loadingBar', bar); + return pdfjsLib.shadow(this, 'loadingBar', bar); }, get supportedMouseWheelZoomModifierKeys() { @@ -432,16 +432,17 @@ var PDFViewerApplication = { // support = FirefoxCom.requestSync('supportedMouseWheelZoomModifierKeys'); //#endif - return PDFJS.shadow(this, 'supportedMouseWheelZoomModifierKeys', support); + return pdfjsLib.shadow(this, 'supportedMouseWheelZoomModifierKeys', + support); }, //#if (FIREFOX || MOZCENTRAL) initPassiveLoading: function pdfViewInitPassiveLoading() { function FirefoxComDataRangeTransport(length, initialData) { - PDFJS.PDFDataRangeTransport.call(this, length, initialData); + pdfjsLib.PDFDataRangeTransport.call(this, length, initialData); } FirefoxComDataRangeTransport.prototype = - Object.create(PDFJS.PDFDataRangeTransport.prototype); + Object.create(pdfjsLib.PDFDataRangeTransport.prototype); FirefoxComDataRangeTransport.prototype.requestDataRange = function FirefoxComDataRangeTransport_requestDataRange(begin, end) { FirefoxCom.request('requestDataRange', { begin: begin, end: end }); @@ -507,7 +508,8 @@ var PDFViewerApplication = { setTitleUsingUrl: function pdfViewSetTitleUsingUrl(url) { this.url = url; try { - this.setTitle(decodeURIComponent(PDFJS.getFilenameFromUrl(url)) || url); + this.setTitle(decodeURIComponent( + pdfjsLib.getFilenameFromUrl(url)) || url); } catch (e) { // decodeURIComponent may throw URIError, // fall back to using the unprocessed url in that case @@ -618,7 +620,7 @@ var PDFViewerApplication = { var self = this; self.downloadComplete = false; - var loadingTask = PDFJS.getDocument(parameters); + var loadingTask = pdfjsLib.getDocument(parameters); this.pdfLoadingTask = loadingTask; loadingTask.onPassword = function passwordNeeded(updatePassword, reason) { @@ -643,15 +645,15 @@ var PDFViewerApplication = { var loadingErrorMessage = mozL10n.get('loading_error', null, 'An error occurred while loading the PDF.'); - if (exception instanceof PDFJS.InvalidPDFException) { + if (exception instanceof pdfjsLib.InvalidPDFException) { // change error message also for other builds loadingErrorMessage = mozL10n.get('invalid_file_error', null, 'Invalid or corrupted PDF file.'); - } else if (exception instanceof PDFJS.MissingPDFException) { + } else if (exception instanceof pdfjsLib.MissingPDFException) { // special message for missing PDF's loadingErrorMessage = mozL10n.get('missing_file_error', null, 'Missing PDF file.'); - } else if (exception instanceof PDFJS.UnexpectedResponseException) { + } else if (exception instanceof pdfjsLib.UnexpectedResponseException) { loadingErrorMessage = mozL10n.get('unexpected_response_error', null, 'Unexpected server response.'); } @@ -697,7 +699,7 @@ var PDFViewerApplication = { this.pdfDocument.getData().then( function getDataSuccess(data) { - var blob = PDFJS.createBlob(data, 'application/pdf'); + var blob = pdfjsLib.createBlob(data, 'application/pdf'); downloadManager.download(blob, url, filename); }, downloadByUrl // Error occurred try downloading with just the url. @@ -737,7 +739,7 @@ var PDFViewerApplication = { */ error: function pdfViewError(message, moreInfo) { var moreInfoText = mozL10n.get('error_version_info', - {version: PDFJS.version || '?', build: PDFJS.build || '?'}, + {version: pdfjsLib.version || '?', build: pdfjsLib.build || '?'}, 'PDF.js v{{version}} (build: {{build}})') + '\n'; if (moreInfo) { moreInfoText += @@ -813,7 +815,7 @@ var PDFViewerApplication = { // the loading bar will not be completely filled, nor will it be hidden. // To prevent displaying a partially filled loading bar permanently, we // hide it when no data has been loaded during a certain amount of time. - if (PDFJS.disableAutoFetch && percent) { + if (pdfjsLib.PDFJS.disableAutoFetch && percent) { if (this.disableAutoFetchLoadingBarTimeout) { clearTimeout(this.disableAutoFetchLoadingBarTimeout); this.disableAutoFetchLoadingBarTimeout = null; @@ -881,7 +883,7 @@ var PDFViewerApplication = { self.loadingBar.setWidth(document.getElementById('viewer')); - if (!PDFJS.disableHistory && !self.isViewerEmbedded) { + if (!pdfjsLib.PDFJS.disableHistory && !self.isViewerEmbedded) { // The browsing history is only enabled when the viewer is standalone, // i.e. not when it is embedded in a web page. if (!self.preferenceShowPreviousViewOnLoad) { @@ -954,7 +956,7 @@ var PDFViewerApplication = { pdfDocument.getJavaScript().then(function(javaScript) { if (javaScript.length) { console.warn('Warning: JavaScript is not supported'); - self.fallback(PDFJS.UNSUPPORTED_FEATURES.javaScript); + self.fallback(pdfjsLib.UNSUPPORTED_FEATURES.javaScript); } // Hack to support auto printing. var regex = /\bprint\s*\(/; @@ -991,8 +993,8 @@ var PDFViewerApplication = { console.log('PDF ' + pdfDocument.fingerprint + ' [' + info.PDFFormatVersion + ' ' + (info.Producer || '-').trim() + ' / ' + (info.Creator || '-').trim() + ']' + - ' (PDF.js: ' + (PDFJS.version || '-') + - (!PDFJS.disableWebGL ? ' [WebGL]' : '') + ')'); + ' (PDF.js: ' + (pdfjsLib.version || '-') + + (!pdfjsLib.PDFJS.disableWebGL ? ' [WebGL]' : '') + ')'); var pdfTitle; if (metadata && metadata.has('dc:title')) { @@ -1013,7 +1015,7 @@ var PDFViewerApplication = { if (info.IsAcroFormPresent) { console.warn('Warning: AcroForm/XFA is not supported'); - self.fallback(PDFJS.UNSUPPORTED_FEATURES.forms); + self.fallback(pdfjsLib.UNSUPPORTED_FEATURES.forms); } //#if !PRODUCTION @@ -1296,9 +1298,7 @@ function webViewerInitialized() { //document.getElementById('secondaryOpenFile').setAttribute('hidden', 'true'); //#endif -//#if !(FIREFOX || MOZCENTRAL) - var locale = PDFJS.locale || navigator.language; -//#endif + var PDFJS = pdfjsLib.PDFJS; //#if !PRODUCTION if (true) { @@ -1337,7 +1337,7 @@ function webViewerInitialized() { PDFJS.verbosity = hashParams['verbosity'] | 0; } if ('ignorecurrentpositiononzoom' in hashParams) { - IGNORE_CURRENT_POSITION_ON_ZOOM = + PDFJS.ignoreCurrentPositionOnZoom = (hashParams['ignorecurrentpositiononzoom'] === 'true'); } //#if !PRODUCTION @@ -1348,7 +1348,7 @@ function webViewerInitialized() { //#endif //#if !(FIREFOX || MOZCENTRAL) if ('locale' in hashParams) { - locale = hashParams['locale']; + PDFJS.locale = hashParams['locale']; } //#endif if ('textlayer' in hashParams) { @@ -1374,7 +1374,7 @@ function webViewerInitialized() { } //#if !(FIREFOX || MOZCENTRAL) - mozL10n.setLanguage(locale); + mozL10n.setLanguage(PDFJS.locale); //#endif //#if (FIREFOX || MOZCENTRAL) if (!PDFViewerApplication.supportsDocumentFonts) { @@ -1518,7 +1518,7 @@ document.addEventListener('pagerendered', function (e) { thumbnailView.setImage(pageView); } - if (PDFJS.pdfBug && Stats.enabled && pageView.stats) { + if (pdfjsLib.PDFJS.pdfBug && Stats.enabled && pageView.stats) { Stats.add(pageNumber, pageView.stats); } @@ -1711,7 +1711,7 @@ window.addEventListener('change', function webViewerChange(evt) { } var file = files[0]; - if (!PDFJS.disableCreateObjectURL && + if (!pdfjsLib.PDFJS.disableCreateObjectURL && typeof URL !== 'undefined' && URL.createObjectURL) { PDFViewerApplication.open(URL.createObjectURL(file)); } else { @@ -1815,7 +1815,7 @@ window.addEventListener('pagechange', function pagechange(evt) { document.getElementById('lastPage').disabled = (page >= numPages); // we need to update stats - if (PDFJS.pdfBug && Stats.enabled) { + if (pdfjsLib.PDFJS.pdfBug && Stats.enabled) { var pageView = PDFViewerApplication.pdfViewer.getPageView(page - 1); if (pageView.stats) { Stats.add(page, pageView.stats); diff --git a/web/chromecom.js b/web/chromecom.js index 8d4014084..f9848f0f8 100644 --- a/web/chromecom.js +++ b/web/chromecom.js @@ -13,7 +13,7 @@ * limitations under the License. */ -/* globals chrome, PDFJS, PDFViewerApplication, OverlayManager */ +/* globals chrome, pdfjsLib, PDFViewerApplication, OverlayManager */ 'use strict'; var ChromeCom = (function ChromeComClosure() { @@ -81,7 +81,7 @@ var ChromeCom = (function ChromeComClosure() { return; } } - if (/^filesystem:/.test(file) && !PDFJS.disableWorker) { + if (/^filesystem:/.test(file) && !pdfjsLib.PDFJS.disableWorker) { // The security origin of filesystem:-URLs are not preserved when the // URL is passed to a Web worker, (http://crbug.com/362061), so we have // to create an intermediate blob:-URL as a work-around. diff --git a/web/debugger.js b/web/debugger.js index 19d29163d..bd3e5620d 100644 --- a/web/debugger.js +++ b/web/debugger.js @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* globals PDFJS */ +/* globals pdfjsLib */ 'use strict'; @@ -307,8 +307,8 @@ var Stepper = (function StepperClosure() { this.table = table; if (!opMap) { opMap = Object.create(null); - for (var key in PDFJS.OPS) { - opMap[PDFJS.OPS[key]] = key; + for (var key in pdfjsLib.OPS) { + opMap[pdfjsLib.OPS[key]] = key; } } }, @@ -460,7 +460,7 @@ var Stats = (function Stats() { manager: null, init: function init() { this.panel.setAttribute('style', 'padding: 5px;'); - PDFJS.enableStats = true; + pdfjsLib.PDFJS.enableStats = true; }, enabled: false, active: false, diff --git a/web/download_manager.js b/web/download_manager.js index 62564e565..dc899e739 100644 --- a/web/download_manager.js +++ b/web/download_manager.js @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* globals URL, PDFJS */ +/* globals URL, pdfjsLib */ 'use strict'; @@ -58,7 +58,7 @@ var DownloadManager = (function DownloadManagerClosure() { DownloadManager.prototype = { downloadUrl: function DownloadManager_downloadUrl(url, filename) { - if (!PDFJS.isValidUrl(url, true)) { + if (!pdfjsLib.isValidUrl(url, true)) { return; // restricted/invalid URL } @@ -72,7 +72,8 @@ var DownloadManager = (function DownloadManagerClosure() { filename); } - var blobUrl = PDFJS.createObjectURL(data, contentType); + var blobUrl = pdfjsLib.createObjectURL(data, contentType, + pdfjsLib.PDFJS.disableCreateObjectURL); download(blobUrl, filename); }, diff --git a/web/firefoxcom.js b/web/firefoxcom.js index 70c5bd126..1931f1fc9 100644 --- a/web/firefoxcom.js +++ b/web/firefoxcom.js @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* globals Preferences, PDFJS, Promise */ +/* globals Preferences, pdfjsLib, Promise */ 'use strict'; @@ -87,7 +87,7 @@ var DownloadManager = (function DownloadManagerClosure() { downloadData: function DownloadManager_downloadData(data, filename, contentType) { - var blobUrl = PDFJS.createObjectURL(data, contentType); + var blobUrl = pdfjsLib.createObjectURL(data, contentType, false); FirefoxCom.request('download', { blobUrl: blobUrl, diff --git a/web/password_prompt.js b/web/password_prompt.js index d2d1e2070..4ca9474df 100644 --- a/web/password_prompt.js +++ b/web/password_prompt.js @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* globals PDFJS, mozL10n, OverlayManager */ +/* globals pdfjsLib, mozL10n, OverlayManager */ 'use strict'; @@ -55,7 +55,7 @@ var PasswordPrompt = { var promptString = mozL10n.get('password_label', null, 'Enter the password to open this PDF file.'); - if (this.reason === PDFJS.PasswordResponses.INCORRECT_PASSWORD) { + if (this.reason === pdfjsLib.PasswordResponses.INCORRECT_PASSWORD) { promptString = mozL10n.get('password_invalid', null, 'Invalid password. Please try again.'); } diff --git a/web/pdf_attachment_viewer.js b/web/pdf_attachment_viewer.js index e5a1d541d..68c90d88d 100644 --- a/web/pdf_attachment_viewer.js +++ b/web/pdf_attachment_viewer.js @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* globals PDFJS */ +/* globals pdfjsLib */ 'use strict'; @@ -98,12 +98,12 @@ var PDFAttachmentViewer = (function PDFAttachmentViewerClosure() { for (var i = 0; i < attachmentsCount; i++) { var item = attachments[names[i]]; - var filename = PDFJS.getFilenameFromUrl(item.filename); + var filename = pdfjsLib.getFilenameFromUrl(item.filename); var div = document.createElement('div'); div.className = 'attachmentsItem'; var button = document.createElement('button'); this._bindLink(button, item.content, filename); - button.textContent = PDFJS.removeNullCharacters(filename); + button.textContent = pdfjsLib.removeNullCharacters(filename); div.appendChild(button); this.container.appendChild(div); } diff --git a/web/pdf_find_controller.js b/web/pdf_find_controller.js index 407cc1651..89fae7515 100644 --- a/web/pdf_find_controller.js +++ b/web/pdf_find_controller.js @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* globals PDFJS, FirefoxCom, Promise, scrollIntoView */ +/* globals FirefoxCom, Promise, scrollIntoView */ 'use strict'; diff --git a/web/pdf_outline_viewer.js b/web/pdf_outline_viewer.js index d778f7e46..235380c99 100644 --- a/web/pdf_outline_viewer.js +++ b/web/pdf_outline_viewer.js @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* globals PDFJS */ +/* globals pdfjsLib */ 'use strict'; @@ -71,7 +71,7 @@ var PDFOutlineViewer = (function PDFOutlineViewerClosure() { */ _bindLink: function PDFOutlineViewer_bindLink(element, item) { if (item.url) { - PDFJS.addLinkAttributes(element, { url: item.url }); + pdfjsLib.addLinkAttributes(element, { url: item.url }); return; } var linkService = this.linkService; @@ -180,7 +180,7 @@ var PDFOutlineViewer = (function PDFOutlineViewerClosure() { this._bindLink(element, item); this._setStyles(element, item); element.textContent = - PDFJS.removeNullCharacters(item.title) || DEFAULT_TITLE; + pdfjsLib.removeNullCharacters(item.title) || DEFAULT_TITLE; div.appendChild(element); diff --git a/web/pdf_page_view.js b/web/pdf_page_view.js index a7cfe5631..81e1c1b17 100644 --- a/web/pdf_page_view.js +++ b/web/pdf_page_view.js @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* globals RenderingStates, PDFJS, DEFAULT_SCALE, CSS_UNITS, getOutputScale, +/* globals RenderingStates, pdfjsLib, DEFAULT_SCALE, CSS_UNITS, getOutputScale, TextLayerBuilder, Promise, approximateFraction, roundToDivide */ 'use strict'; @@ -162,19 +162,18 @@ var PDFPageView = (function PDFPageViewClosure() { }); var isScalingRestricted = false; - if (this.canvas && PDFJS.maxCanvasPixels > 0) { + if (this.canvas && pdfjsLib.PDFJS.maxCanvasPixels > 0) { var outputScale = this.outputScale; var pixelsInViewport = this.viewport.width * this.viewport.height; - var maxScale = Math.sqrt(PDFJS.maxCanvasPixels / pixelsInViewport); if (((Math.floor(this.viewport.width) * outputScale.sx) | 0) * ((Math.floor(this.viewport.height) * outputScale.sy) | 0) > - PDFJS.maxCanvasPixels) { + pdfjsLib.PDFJS.maxCanvasPixels) { isScalingRestricted = true; } } if (this.canvas) { - if (PDFJS.useOnlyCssZoom || + if (pdfjsLib.PDFJS.useOnlyCssZoom || (this.hasRestrictedScaling && isScalingRestricted)) { this.cssTransform(this.canvas, true); @@ -208,7 +207,7 @@ var PDFPageView = (function PDFPageViewClosure() { }, cssTransform: function PDFPageView_transform(canvas, redrawAnnotations) { - var CustomStyle = PDFJS.CustomStyle; + var CustomStyle = pdfjsLib.CustomStyle; // Scale canvas, canvas wrapper, and page container. var width = this.viewport.width; @@ -330,7 +329,7 @@ var PDFPageView = (function PDFPageViewClosure() { var outputScale = getOutputScale(ctx); this.outputScale = outputScale; - if (PDFJS.useOnlyCssZoom) { + if (pdfjsLib.PDFJS.useOnlyCssZoom) { var actualSizeViewport = viewport.clone({scale: CSS_UNITS}); // Use a scale that will make the canvas be the original intended size // of the page. @@ -339,9 +338,10 @@ var PDFPageView = (function PDFPageViewClosure() { outputScale.scaled = true; } - if (PDFJS.maxCanvasPixels > 0) { + if (pdfjsLib.PDFJS.maxCanvasPixels > 0) { var pixelsInViewport = viewport.width * viewport.height; - var maxScale = Math.sqrt(PDFJS.maxCanvasPixels / pixelsInViewport); + var maxScale = + Math.sqrt(pdfjsLib.PDFJS.maxCanvasPixels / pixelsInViewport); if (outputScale.sx > maxScale || outputScale.sy > maxScale) { outputScale.sx = maxScale; outputScale.sy = maxScale; @@ -517,7 +517,7 @@ var PDFPageView = (function PDFPageViewClosure() { }, beforePrint: function PDFPageView_beforePrint() { - var CustomStyle = PDFJS.CustomStyle; + var CustomStyle = pdfjsLib.CustomStyle; var pdfPage = this.pdfPage; var viewport = pdfPage.getViewport(1); diff --git a/web/pdf_viewer.component.js b/web/pdf_viewer.component.js index 22af0e5f7..596362c71 100644 --- a/web/pdf_viewer.component.js +++ b/web/pdf_viewer.component.js @@ -17,14 +17,21 @@ DefaultTextLayerFactory, AnnotationLayerBuilder, PDFHistory, DefaultAnnotationLayerFactory, DownloadManager, ProgressBar */ -// Initializing PDFJS global object (if still undefined) -if (typeof PDFJS === 'undefined') { - (typeof window !== 'undefined' ? window : this).PDFJS = {}; -} - (function pdfViewerWrapper() { 'use strict'; + var root = this; + if (!root.pdfjsLib) { + Object.defineProperty(root, 'pdfjsLib', { + get: function () { + return root.pdfjsDistBuildPdf || root.pdfjsDistBuildPdfCombined || + root.pdfjsMainLoader; + }, + enumerable: true, + configurable: true + }); + } + //#include ui_utils.js //#include pdf_link_service.js //#include pdf_viewer.js diff --git a/web/pdf_viewer.js b/web/pdf_viewer.js index baf28551d..766d88c0a 100644 --- a/web/pdf_viewer.js +++ b/web/pdf_viewer.js @@ -15,7 +15,7 @@ /*globals watchScroll, PDFPageView, UNKNOWN_SCALE, SCROLLBAR_PADDING, VERTICAL_PADDING, MAX_AUTO_SCALE, CSS_UNITS, DEFAULT_SCALE, scrollIntoView, getVisibleElements, RenderingStates, - PDFJS, Promise, TextLayerBuilder, PDFRenderingQueue, + pdfjsLib, Promise, TextLayerBuilder, PDFRenderingQueue, AnnotationLayerBuilder, DEFAULT_SCALE_VALUE */ 'use strict'; @@ -27,7 +27,6 @@ var PresentationModeState = { FULLSCREEN: 3, }; -var IGNORE_CURRENT_POSITION_ON_ZOOM = false; var DEFAULT_CACHE_SIZE = 10; //#include pdf_rendering_queue.js @@ -287,7 +286,7 @@ var PDFViewer = (function pdfViewer() { var viewport = pdfPage.getViewport(scale * CSS_UNITS); for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) { var textLayerFactory = null; - if (!PDFJS.disableTextLayer) { + if (!pdfjsLib.PDFJS.disableTextLayer) { textLayerFactory = this; } var pageView = new PDFPageView({ @@ -309,7 +308,7 @@ var PDFViewer = (function pdfViewer() { // starts to create the correct size canvas. Wait until one page is // rendered so we don't tie up too many resources early on. onePageRendered.then(function () { - if (!PDFJS.disableAutoFetch) { + if (!pdfjsLib.PDFJS.disableAutoFetch) { var getPagesLeft = pagesCount; for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) { pdfDocument.getPage(pageNum).then(function (pageNum, pdfPage) { @@ -399,7 +398,7 @@ var PDFViewer = (function pdfViewer() { if (!noScroll) { var page = this._currentPageNumber, dest; - if (this._location && !IGNORE_CURRENT_POSITION_ON_ZOOM && + if (this._location && !pdfjsLib.PDFJS.ignoreCurrentPositionOnZoom && !(this.isInPresentationMode || this.isChangingPresentationMode)) { page = this._location.pageNumber; dest = [null, { name: 'XYZ' }, this._location.left, diff --git a/web/text_layer_builder.js b/web/text_layer_builder.js index 6ef873684..e246fa91a 100644 --- a/web/text_layer_builder.js +++ b/web/text_layer_builder.js @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* globals PDFJS */ +/* globals pdfjsLib */ 'use strict'; @@ -78,7 +78,7 @@ var TextLayerBuilder = (function TextLayerBuilderClosure() { this.textDivs = []; var textLayerFrag = document.createDocumentFragment(); - this.textLayerRenderTask = PDFJS.renderTextLayer({ + this.textLayerRenderTask = pdfjsLib.renderTextLayer({ textContent: this.textContent, container: textLayerFrag, viewport: this.viewport, diff --git a/web/ui_utils.js b/web/ui_utils.js index 976a45f02..0f54adc48 100644 --- a/web/ui_utils.js +++ b/web/ui_utils.js @@ -12,6 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + /* global PDFJS */ 'use strict'; @@ -25,6 +26,61 @@ var VERTICAL_PADDING = 5; var mozL10n = document.mozL10n || document.webL10n; +if (typeof PDFJS === 'undefined') { + (typeof window !== 'undefined' ? window : this).PDFJS = {}; +} + +/** + * 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); + +/** + * Disables saving of the last position of the viewed PDF. + * @var {boolean} + */ +PDFJS.disableHistory = (PDFJS.disableHistory === undefined ? + false : PDFJS.disableHistory); + +/** + * Disables creation of the text layer that used for text selection and search. + * @var {boolean} + */ +PDFJS.disableTextLayer = (PDFJS.disableTextLayer === undefined ? + false : PDFJS.disableTextLayer); + +/** + * Disables maintaining the current position in the document when zooming. + */ +PDFJS.ignoreCurrentPositionOnZoom = (PDFJS.ignoreCurrentPositionOnZoom === + undefined ? false : PDFJS.ignoreCurrentPositionOnZoom); + +//#if !(FIREFOX || MOZCENTRAL) +/** + * Interface locale settings. + * @var {string} + */ +PDFJS.locale = (PDFJS.locale === undefined ? navigator.language : PDFJS.locale); +//#endif + /** * Returns scale factor for the canvas. It makes sense for the HiDPI displays. * @return {Object} The object with horizontal (sx) and vertical (sy) diff --git a/web/viewer.js b/web/viewer.js index 9709d3579..20b637117 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -41,9 +41,11 @@ function webViewerLoad() { //#if !PRODUCTION require.config({paths: {'pdfjs': '../src'}}); require(['pdfjs/main_loader'], function (loader) { + window.pdfjsLib = loader; PDFViewerApplication.run(); }); //#else +//window.pdfjsLib = window.pdfjsDistBuildPdf; //PDFViewerApplication.run(); //#endif }