From a9db6df68698dc8fd86ea23c948017f45e97722f Mon Sep 17 00:00:00 2001 From: Ryan VanderMeulen Date: Thu, 23 Feb 2017 19:22:10 -0500 Subject: [PATCH] Bug 1342274 - Update pdf.js to version 1.7.312. r=bdahl --HG-- extra : rebase_source : f7798a37748054e11f8e0dfc6a5f6d0f16b5db34 --- browser/extensions/pdfjs/README.mozilla | 2 +- browser/extensions/pdfjs/content/build/pdf.js | 88 ++++++++- .../pdfjs/content/build/pdf.worker.js | 186 +++++++++--------- .../extensions/pdfjs/content/web/viewer.js | 44 ++++- 4 files changed, 207 insertions(+), 113 deletions(-) diff --git a/browser/extensions/pdfjs/README.mozilla b/browser/extensions/pdfjs/README.mozilla index 975b06fbe425..da0e38f01d95 100644 --- a/browser/extensions/pdfjs/README.mozilla +++ b/browser/extensions/pdfjs/README.mozilla @@ -1,3 +1,3 @@ This is the pdf.js project output, https://github.com/mozilla/pdf.js -Current extension version is: 1.7.297 +Current extension version is: 1.7.312 diff --git a/browser/extensions/pdfjs/content/build/pdf.js b/browser/extensions/pdfjs/content/build/pdf.js index 20b137d2ddd5..4b0b7fd115a5 100644 --- a/browser/extensions/pdfjs/content/build/pdf.js +++ b/browser/extensions/pdfjs/content/build/pdf.js @@ -221,6 +221,11 @@ var VERBOSITY_LEVELS = { warnings: 1, infos: 5 }; +var CMapCompressionType = { + NONE: 0, + BINARY: 1, + STREAM: 2 +}; var OPS = { dependency: 1, setLineWidth: 2, @@ -1166,6 +1171,12 @@ function isArrayBuffer(v) { function isSpace(ch) { return ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A; } +function isNodeJS() { + if (typeof __pdfjsdev_webpack__ === 'undefined') { + return typeof process === 'object' && process + '' === '[object process]'; + } + return false; +} function createPromiseCapability() { var capability = {}; capability.promise = new Promise(function (resolve, reject) { @@ -1438,6 +1449,7 @@ exports.AnnotationFlag = AnnotationFlag; exports.AnnotationType = AnnotationType; exports.FontType = FontType; exports.ImageKind = ImageKind; +exports.CMapCompressionType = CMapCompressionType; exports.InvalidPDFException = InvalidPDFException; exports.MessageHandler = MessageHandler; exports.MissingDataException = MissingDataException; @@ -1474,6 +1486,7 @@ exports.isInt = isInt; exports.isNum = isNum; exports.isString = isString; exports.isSpace = isSpace; +exports.isNodeJS = isNodeJS; exports.isSameOrigin = isSameOrigin; exports.createValidAbsoluteUrl = createValidAbsoluteUrl; exports.isLittleEndian = isLittleEndian; @@ -1506,6 +1519,8 @@ var removeNullCharacters = sharedUtil.removeNullCharacters; var warn = sharedUtil.warn; var deprecated = sharedUtil.deprecated; var createValidAbsoluteUrl = sharedUtil.createValidAbsoluteUrl; +var stringToBytes = sharedUtil.stringToBytes; +var CMapCompressionType = sharedUtil.CMapCompressionType; var DEFAULT_LINK_REL = 'noopener noreferrer nofollow'; function DOMCanvasFactory() { } @@ -1535,6 +1550,48 @@ DOMCanvasFactory.prototype = { canvasAndContextPair.context = null; } }; +var DOMCMapReaderFactory = function DOMCMapReaderFactoryClosure() { + function DOMCMapReaderFactory(params) { + this.baseUrl = params.baseUrl || null; + this.isCompressed = params.isCompressed || false; + } + DOMCMapReaderFactory.prototype = { + fetch: function (params) { + if (!params.name) { + return Promise.reject(new Error('CMap name must be specified.')); + } + return new Promise(function (resolve, reject) { + var url = this.baseUrl + params.name; + var request = new XMLHttpRequest(); + if (this.isCompressed) { + url += '.bcmap'; + request.responseType = 'arraybuffer'; + } + request.onreadystatechange = function () { + if (request.readyState === XMLHttpRequest.DONE && (request.status === 200 || request.status === 0)) { + var data; + if (this.isCompressed && request.response) { + data = new Uint8Array(request.response); + } else if (!this.isCompressed && request.responseText) { + data = stringToBytes(request.responseText); + } + if (data) { + resolve({ + cMapData: data, + compressionType: this.isCompressed ? CMapCompressionType.BINARY : CMapCompressionType.NONE + }); + return; + } + reject(new Error('Unable to load ' + (this.isCompressed ? 'binary' : '') + ' CMap at: ' + url)); + } + }.bind(this); + request.open('GET', url, true); + request.send(null); + }.bind(this)); + } + }; + return DOMCMapReaderFactory; +}(); var CustomStyle = function CustomStyleClosure() { var prefixes = [ 'ms', @@ -1694,6 +1751,7 @@ exports.hasCanvasTypedArrays = hasCanvasTypedArrays; exports.getDefaultSetting = getDefaultSetting; exports.DEFAULT_LINK_REL = DEFAULT_LINK_REL; exports.DOMCanvasFactory = DOMCanvasFactory; +exports.DOMCMapReaderFactory = DOMCMapReaderFactory; /***/ }), /* 2 */ @@ -2358,6 +2416,7 @@ var CanvasGraphics = displayCanvas.CanvasGraphics; var Metadata = displayMetadata.Metadata; var getDefaultSetting = displayDOMUtils.getDefaultSetting; var DOMCanvasFactory = displayDOMUtils.DOMCanvasFactory; +var DOMCMapReaderFactory = displayDOMUtils.DOMCMapReaderFactory; var DEFAULT_RANGE_CHUNK_SIZE = 65536; var isWorkerDisabled = false; var workerSrc; @@ -2431,6 +2490,7 @@ function getDocument(src, pdfDataRangeTransport, passwordCallback, progressCallb } params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE; params.disableNativeImageDecoder = params.disableNativeImageDecoder === true; + var CMapReaderFactory = params.CMapReaderFactory || DOMCMapReaderFactory; if (!worker) { worker = new PDFWorker(); task._worker = worker; @@ -2445,7 +2505,7 @@ function getDocument(src, pdfDataRangeTransport, passwordCallback, progressCallb throw new Error('Loading aborted'); } var messageHandler = new MessageHandler(docId, workerId, worker.port); - var transport = new WorkerTransport(messageHandler, task, rangeTransport); + var transport = new WorkerTransport(messageHandler, task, rangeTransport, CMapReaderFactory); task._transport = transport; messageHandler.send('Ready', null); }); @@ -2468,8 +2528,6 @@ function _fetchDocument(worker, source, pdfDataRangeTransport, docId) { source: source, disableRange: getDefaultSetting('disableRange'), maxImageSize: getDefaultSetting('maxImageSize'), - cMapUrl: getDefaultSetting('cMapUrl'), - cMapPacked: getDefaultSetting('cMapPacked'), disableFontFace: getDefaultSetting('disableFontFace'), disableCreateObjectURL: getDefaultSetting('disableCreateObjectURL'), postMessageTransfers: getDefaultSetting('postMessageTransfers') && !isPostMessageTransfersDisabled, @@ -3081,12 +3139,16 @@ var PDFWorker = function PDFWorkerClosure() { return PDFWorker; }(); var WorkerTransport = function WorkerTransportClosure() { - function WorkerTransport(messageHandler, loadingTask, pdfDataRangeTransport) { + function WorkerTransport(messageHandler, loadingTask, pdfDataRangeTransport, CMapReaderFactory) { this.messageHandler = messageHandler; this.loadingTask = loadingTask; this.pdfDataRangeTransport = pdfDataRangeTransport; this.commonObjs = new PDFObjects(); this.fontLoader = new FontLoader(loadingTask.docId); + this.CMapReaderFactory = new CMapReaderFactory({ + baseUrl: getDefaultSetting('cMapUrl'), + isCompressed: getDefaultSetting('cMapPacked') + }); this.destroyed = false; this.destroyCapability = null; this._passwordCapability = null; @@ -3371,6 +3433,12 @@ var WorkerTransport = function WorkerTransportClosure() { img.src = imageUrl; }); }, this); + messageHandler.on('FetchBuiltInCMap', function (data) { + if (this.destroyed) { + return Promise.reject(new Error('Worker was destroyed')); + } + return this.CMapReaderFactory.fetch({ name: data.name }); + }, this); }, getData: function WorkerTransport_getData() { return this.messageHandler.sendWithPromise('GetData', null); @@ -3632,8 +3700,8 @@ var _UnsupportedManager = function UnsupportedManagerClosure() { } }; }(); -exports.version = '1.7.297'; -exports.build = '425ad309'; +exports.version = '1.7.312'; +exports.build = 'cada411a'; exports.getDocument = getDocument; exports.PDFDataRangeTransport = PDFDataRangeTransport; exports.PDFWorker = PDFWorker; @@ -4650,8 +4718,8 @@ if (!globalScope.PDFJS) { globalScope.PDFJS = {}; } var PDFJS = globalScope.PDFJS; -PDFJS.version = '1.7.297'; -PDFJS.build = '425ad309'; +PDFJS.version = '1.7.312'; +PDFJS.build = 'cada411a'; PDFJS.pdfBug = false; if (PDFJS.verbosity !== undefined) { sharedUtil.setVerbosityLevel(PDFJS.verbosity); @@ -7143,8 +7211,8 @@ exports.TilingPattern = TilingPattern; "use strict"; -var pdfjsVersion = '1.7.297'; -var pdfjsBuild = '425ad309'; +var pdfjsVersion = '1.7.312'; +var pdfjsBuild = 'cada411a'; var pdfjsSharedUtil = __w_pdfjs_require__(0); var pdfjsDisplayGlobal = __w_pdfjs_require__(8); var pdfjsDisplayAPI = __w_pdfjs_require__(3); diff --git a/browser/extensions/pdfjs/content/build/pdf.worker.js b/browser/extensions/pdfjs/content/build/pdf.worker.js index 63170673249f..8c47f3c4b461 100644 --- a/browser/extensions/pdfjs/content/build/pdf.worker.js +++ b/browser/extensions/pdfjs/content/build/pdf.worker.js @@ -221,6 +221,11 @@ var VERBOSITY_LEVELS = { warnings: 1, infos: 5 }; +var CMapCompressionType = { + NONE: 0, + BINARY: 1, + STREAM: 2 +}; var OPS = { dependency: 1, setLineWidth: 2, @@ -1166,6 +1171,12 @@ function isArrayBuffer(v) { function isSpace(ch) { return ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A; } +function isNodeJS() { + if (typeof __pdfjsdev_webpack__ === 'undefined') { + return typeof process === 'object' && process + '' === '[object process]'; + } + return false; +} function createPromiseCapability() { var capability = {}; capability.promise = new Promise(function (resolve, reject) { @@ -1438,6 +1449,7 @@ exports.AnnotationFlag = AnnotationFlag; exports.AnnotationType = AnnotationType; exports.FontType = FontType; exports.ImageKind = ImageKind; +exports.CMapCompressionType = CMapCompressionType; exports.InvalidPDFException = InvalidPDFException; exports.MessageHandler = MessageHandler; exports.MissingDataException = MissingDataException; @@ -1474,6 +1486,7 @@ exports.isInt = isInt; exports.isNum = isNum; exports.isString = isString; exports.isSpace = isSpace; +exports.isNodeJS = isNodeJS; exports.isSameOrigin = isSameOrigin; exports.createValidAbsoluteUrl = createValidAbsoluteUrl; exports.isLittleEndian = isLittleEndian; @@ -24787,6 +24800,7 @@ var UNSUPPORTED_FEATURES = sharedUtil.UNSUPPORTED_FEATURES; var ImageKind = sharedUtil.ImageKind; var OPS = sharedUtil.OPS; var TextRenderingMode = sharedUtil.TextRenderingMode; +var CMapCompressionType = sharedUtil.CMapCompressionType; var Util = sharedUtil.Util; var assert = sharedUtil.assert; var createPromiseCapability = sharedUtil.createPromiseCapability; @@ -24845,10 +24859,6 @@ var PartialEvaluator = function PartialEvaluatorClosure() { forceDataSchema: false, maxImageSize: -1, disableFontFace: false, - cMapOptions: { - url: null, - packed: false - }, disableNativeImageDecoder: false }; function NativeImageDecoder(xref, resources, handler, forceDataSchema) { @@ -24892,14 +24902,27 @@ var PartialEvaluator = function PartialEvaluatorClosure() { var cs = ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res); return (cs.numComps === 1 || cs.numComps === 3) && cs.isDefaultDecode(dict.getArray('Decode', 'D')); }; - function PartialEvaluator(pdfManager, xref, handler, pageIndex, idFactory, fontCache, options) { + function PartialEvaluator(pdfManager, xref, handler, pageIndex, idFactory, fontCache, builtInCMapCache, options) { this.pdfManager = pdfManager; this.xref = xref; this.handler = handler; this.pageIndex = pageIndex; this.idFactory = idFactory; this.fontCache = fontCache; + this.builtInCMapCache = builtInCMapCache; this.options = options || DefaultPartialEvaluatorOptions; + this.fetchBuiltInCMap = function (name) { + var cachedCMap = builtInCMapCache[name]; + if (cachedCMap) { + return Promise.resolve(cachedCMap); + } + return handler.sendWithPromise('FetchBuiltInCMap', { name: name }).then(function (data) { + if (data.compressionType !== CMapCompressionType.NONE) { + builtInCMapCache[name] = data; + } + return data; + }); + }; } var TIME_SLOT_DURATION_MS = 20; var CHECK_TIME_EVERY = 100; @@ -26236,7 +26259,11 @@ var PartialEvaluator = function PartialEvaluatorClosure() { var registry = properties.cidSystemInfo.registry; var ordering = properties.cidSystemInfo.ordering; var ucs2CMapName = Name.get(registry + '-' + ordering + '-UCS2'); - return CMapFactory.create(ucs2CMapName, this.options.cMapOptions, null).then(function (ucs2CMap) { + return CMapFactory.create({ + encoding: ucs2CMapName, + fetchBuiltInCMap: this.fetchBuiltInCMap, + useCMap: null + }).then(function (ucs2CMap) { var cMap = properties.cMap; toUnicode = []; cMap.forEach(function (charcode, cid) { @@ -26254,14 +26281,22 @@ var PartialEvaluator = function PartialEvaluatorClosure() { readToUnicode: function PartialEvaluator_readToUnicode(toUnicode) { var cmapObj = toUnicode; if (isName(cmapObj)) { - return CMapFactory.create(cmapObj, this.options.cMapOptions, null).then(function (cmap) { + return CMapFactory.create({ + encoding: cmapObj, + fetchBuiltInCMap: this.fetchBuiltInCMap, + useCMap: null + }).then(function (cmap) { if (cmap instanceof IdentityCMap) { return new IdentityToUnicodeMap(0, 0xFFFF); } return new ToUnicodeMap(cmap.getMap()); }); } else if (isStream(cmapObj)) { - return CMapFactory.create(cmapObj, this.options.cMapOptions, null).then(function (cmap) { + return CMapFactory.create({ + encoding: cmapObj, + fetchBuiltInCMap: this.fetchBuiltInCMap, + useCMap: null + }).then(function (cmap) { if (cmap instanceof IdentityCMap) { return new IdentityToUnicodeMap(0, 0xFFFF); } @@ -26524,7 +26559,6 @@ var PartialEvaluator = function PartialEvaluatorClosure() { var descriptor = preEvaluatedFont.descriptor; var type = preEvaluatedFont.type; var maxCharIndex = composite ? 0xFFFF : 0xFF; - var cMapOptions = this.options.cMapOptions; var properties; if (!descriptor) { if (type === 'Type3') { @@ -26619,7 +26653,11 @@ var PartialEvaluator = function PartialEvaluatorClosure() { if (isName(cidEncoding)) { properties.cidEncoding = cidEncoding.name; } - cMapPromise = CMapFactory.create(cidEncoding, cMapOptions, null).then(function (cMap) { + cMapPromise = CMapFactory.create({ + encoding: cidEncoding, + fetchBuiltInCMap: this.fetchBuiltInCMap, + useCMap: null + }).then(function (cMap) { properties.cMap = cMap; properties.vertical = properties.cMap.vertical; }); @@ -29872,6 +29910,7 @@ var Catalog = function CatalogClosure() { this.xref = xref; this.catDict = xref.getCatalogObj(); this.fontCache = new RefSetCache(); + this.builtInCMapCache = Object.create(null); assert(isDict(this.catDict), 'catalog object is not a dictionary'); this.pageFactory = pageFactory; this.pagePromises = []; @@ -30186,6 +30225,7 @@ var Catalog = function CatalogClosure() { delete font.translated; } this.fontCache.clear(); + this.builtInCMapCache = Object.create(null); }.bind(this)); }, getPage: function Catalog_getPage(pageIndex) { @@ -30193,7 +30233,7 @@ var Catalog = function CatalogClosure() { this.pagePromises[pageIndex] = this.getPageDict(pageIndex).then(function (a) { var dict = a[0]; var ref = a[1]; - return this.pageFactory.createPage(pageIndex, dict, ref, this.fontCache); + return this.pageFactory.createPage(pageIndex, dict, ref, this.fontCache, this.builtInCMapCache); }.bind(this)); } return this.pagePromises[pageIndex]; @@ -33926,6 +33966,7 @@ var error = sharedUtil.error; var info = sharedUtil.info; var warn = sharedUtil.warn; var setVerbosityLevel = sharedUtil.setVerbosityLevel; +var isNodeJS = sharedUtil.isNodeJS; var Ref = corePrimitives.Ref; var LocalPdfManager = corePdfManager.LocalPdfManager; var NetworkPdfManager = corePdfManager.NetworkPdfManager; @@ -34403,15 +34444,10 @@ var WorkerMessageHandler = { }, onFailure); } ensureNotTerminated(); - var cMapOptions = { - url: data.cMapUrl === undefined ? null : data.cMapUrl, - packed: data.cMapPacked === true - }; var evaluatorOptions = { forceDataSchema: data.disableCreateObjectURL, maxImageSize: data.maxImageSize === undefined ? -1 : data.maxImageSize, disableFontFace: data.disableFontFace, - cMapOptions: cMapOptions, disableNativeImageDecoder: data.disableNativeImageDecoder }; getPdfManager(data, evaluatorOptions).then(function (newPdfManager) { @@ -34588,12 +34624,6 @@ function initializeWorker() { WorkerMessageHandler.setup(handler, self); handler.send('ready', null); } -function isNodeJS() { - if (typeof __pdfjsdev_webpack__ === 'undefined') { - return typeof process === 'object' && process + '' === '[object process]'; - } - return false; -} if (typeof window === 'undefined' && !isNodeJS()) { initializeWorker(); } @@ -36580,11 +36610,12 @@ var error = sharedUtil.error; var isInt = sharedUtil.isInt; var isString = sharedUtil.isString; var MissingDataException = sharedUtil.MissingDataException; +var CMapCompressionType = sharedUtil.CMapCompressionType; var isEOF = corePrimitives.isEOF; var isName = corePrimitives.isName; var isCmd = corePrimitives.isCmd; var isStream = corePrimitives.isStream; -var StringStream = coreStream.StringStream; +var Stream = coreStream.Stream; var Lexer = coreParser.Lexer; var BUILT_IN_CMAPS = [ 'Adobe-GB1-UCS2', @@ -36919,23 +36950,6 @@ var IdentityCMap = function IdentityCMapClosure() { return IdentityCMap; }(); var BinaryCMapReader = function BinaryCMapReaderClosure() { - function fetchBinaryData(url) { - return new Promise(function (resolve, reject) { - var request = new XMLHttpRequest(); - request.open('GET', url, true); - request.responseType = 'arraybuffer'; - request.onreadystatechange = function () { - if (request.readyState === XMLHttpRequest.DONE) { - if (!request.response || request.status !== 200 && request.status !== 0) { - reject(new Error('Unable to get binary cMap at: ' + url)); - } else { - resolve(new Uint8Array(request.response)); - } - } - }; - request.send(null); - }); - } function hexToInt(a, size) { var n = 0; for (var i = 0; i <= size; i++) { @@ -37045,8 +37059,8 @@ var BinaryCMapReader = function BinaryCMapReaderClosure() { return s; } }; - function processBinaryCMap(url, cMap, extend) { - return fetchBinaryData(url).then(function (data) { + function processBinaryCMap(data, cMap, extend) { + return new Promise(function (resolve, reject) { var stream = new BinaryCMapStream(data); var header = stream.readByte(); cMap.vertical = !!(header & 1); @@ -37177,19 +37191,20 @@ var BinaryCMapReader = function BinaryCMapReaderClosure() { } break; default: - error('Unknown type: ' + type); - break; + reject(new Error('processBinaryCMap: Unknown type: ' + type)); + return; } } if (useCMap) { - return extend(useCMap); + resolve(extend(useCMap)); + return; } - return cMap; + resolve(cMap); }); } function BinaryCMapReader() { } - BinaryCMapReader.prototype = { read: processBinaryCMap }; + BinaryCMapReader.prototype = { process: processBinaryCMap }; return BinaryCMapReader; }(); var CMapFactory = function CMapFactoryClosure() { @@ -37330,7 +37345,7 @@ var CMapFactory = function CMapFactoryClosure() { cMap.name = obj.name; } } - function parseCMap(cMap, lexer, builtInCMapParams, useCMap) { + function parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap) { var previous; var embededUseCMap; objLoop: @@ -37384,12 +37399,12 @@ var CMapFactory = function CMapFactoryClosure() { useCMap = embededUseCMap; } if (useCMap) { - return extendCMap(cMap, builtInCMapParams, useCMap); + return extendCMap(cMap, fetchBuiltInCMap, useCMap); } return Promise.resolve(cMap); } - function extendCMap(cMap, builtInCMapParams, useCMap) { - return createBuiltInCMap(useCMap, builtInCMapParams).then(function (newCMap) { + function extendCMap(cMap, fetchBuiltInCMap, useCMap) { + return createBuiltInCMap(useCMap, fetchBuiltInCMap).then(function (newCMap) { cMap.useCMap = newCMap; if (cMap.numCodespaceRanges === 0) { var useCodespaceRanges = cMap.useCMap.codespaceRanges; @@ -37406,14 +37421,7 @@ var CMapFactory = function CMapFactoryClosure() { return cMap; }); } - function parseBinaryCMap(name, builtInCMapParams) { - var url = builtInCMapParams.url + name + '.bcmap'; - var cMap = new CMap(true); - return new BinaryCMapReader().read(url, cMap, function (useCMap) { - return extendCMap(cMap, builtInCMapParams, useCMap); - }); - } - function createBuiltInCMap(name, builtInCMapParams) { + function createBuiltInCMap(name, fetchBuiltInCMap) { if (name === 'Identity-H') { return Promise.resolve(new IdentityCMap(false, 2)); } else if (name === 'Identity-V') { @@ -37422,40 +37430,33 @@ var CMapFactory = function CMapFactoryClosure() { if (BUILT_IN_CMAPS.indexOf(name) === -1) { return Promise.reject(new Error('Unknown cMap name: ' + name)); } - assert(builtInCMapParams, 'built-in cMap parameters are not provided'); - if (builtInCMapParams.packed) { - return parseBinaryCMap(name, builtInCMapParams); - } - return new Promise(function (resolve, reject) { - var url = builtInCMapParams.url + name; - var request = new XMLHttpRequest(); - request.onreadystatechange = function () { - if (request.readyState === XMLHttpRequest.DONE) { - if (request.status === 200 || request.status === 0) { - var cMap = new CMap(true); - var lexer = new Lexer(new StringStream(request.responseText)); - parseCMap(cMap, lexer, builtInCMapParams, null).then(function (parsedCMap) { - resolve(parsedCMap); - }); - } else { - reject(new Error('Unable to get cMap at: ' + url)); - } - } - }; - request.open('GET', url, true); - request.send(null); + assert(fetchBuiltInCMap, 'Built-in CMap parameters are not provided.'); + return fetchBuiltInCMap(name).then(function (data) { + var cMapData = data.cMapData, compressionType = data.compressionType; + var cMap = new CMap(true); + if (compressionType === CMapCompressionType.BINARY) { + return new BinaryCMapReader().process(cMapData, cMap, function (useCMap) { + return extendCMap(cMap, fetchBuiltInCMap, useCMap); + }); + } + assert(compressionType === CMapCompressionType.NONE, 'TODO: Only BINARY/NONE CMap compression is currently supported.'); + var lexer = new Lexer(new Stream(cMapData)); + return parseCMap(cMap, lexer, fetchBuiltInCMap, null); }); } return { - create: function (encoding, builtInCMapParams, useCMap) { + create: function (params) { + var encoding = params.encoding; + var fetchBuiltInCMap = params.fetchBuiltInCMap; + var useCMap = params.useCMap; if (isName(encoding)) { - return createBuiltInCMap(encoding.name, builtInCMapParams); + return createBuiltInCMap(encoding.name, fetchBuiltInCMap); } else if (isStream(encoding)) { var cMap = new CMap(); var lexer = new Lexer(encoding); - return parseCMap(cMap, lexer, builtInCMapParams, useCMap).then(function (parsedCMap) { + return parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap).then(function (parsedCMap) { if (parsedCMap.isIdentityCMap) { - return createBuiltInCMap(parsedCMap.name, builtInCMapParams); + return createBuiltInCMap(parsedCMap.name, fetchBuiltInCMap); } return parsedCMap; }); @@ -37520,13 +37521,14 @@ var Page = function PageClosure() { 612, 792 ]; - function Page(pdfManager, xref, pageIndex, pageDict, ref, fontCache) { + function Page(pdfManager, xref, pageIndex, pageDict, ref, fontCache, builtInCMapCache) { this.pdfManager = pdfManager; this.pageIndex = pageIndex; this.pageDict = pageDict; this.xref = xref; this.ref = ref; this.fontCache = fontCache; + this.builtInCMapCache = builtInCMapCache; this.evaluatorOptions = pdfManager.evaluatorOptions; this.resourcesPromise = null; var uniquePrefix = 'p' + this.pageIndex + '_'; @@ -37652,7 +37654,7 @@ var Page = function PageClosure() { 'XObject', 'Font' ]); - var partialEvaluator = new PartialEvaluator(pdfManager, this.xref, handler, this.pageIndex, this.idFactory, this.fontCache, this.evaluatorOptions); + var partialEvaluator = new PartialEvaluator(pdfManager, this.xref, handler, this.pageIndex, this.idFactory, this.fontCache, this.builtInCMapCache, this.evaluatorOptions); var dataPromises = Promise.all([ contentStreamPromise, resourcesPromise @@ -37708,7 +37710,7 @@ var Page = function PageClosure() { ]); return dataPromises.then(function (data) { var contentStream = data[0]; - var partialEvaluator = new PartialEvaluator(pdfManager, self.xref, handler, self.pageIndex, self.idFactory, self.fontCache, self.evaluatorOptions); + var partialEvaluator = new PartialEvaluator(pdfManager, self.xref, handler, self.pageIndex, self.idFactory, self.fontCache, self.builtInCMapCache, self.evaluatorOptions); return partialEvaluator.getTextContent(contentStream, task, self.resources, null, normalizeWhitespace, combineTextItems); }); }, @@ -37901,8 +37903,8 @@ var PDFDocument = function PDFDocumentClosure() { this.xref.parse(recoveryMode); var self = this; var pageFactory = { - createPage: function (pageIndex, dict, ref, fontCache) { - return new Page(self.pdfManager, self.xref, pageIndex, dict, ref, fontCache); + createPage: function (pageIndex, dict, ref, fontCache, builtInCMapCache) { + return new Page(self.pdfManager, self.xref, pageIndex, dict, ref, fontCache, builtInCMapCache); } }; this.catalog = new Catalog(this.pdfManager, this.xref, pageFactory); @@ -49174,8 +49176,8 @@ exports.Type1Parser = Type1Parser; "use strict"; -var pdfjsVersion = '1.7.297'; -var pdfjsBuild = '425ad309'; +var pdfjsVersion = '1.7.312'; +var pdfjsBuild = 'cada411a'; var pdfjsCoreWorker = __w_pdfjs_require__(17); ; exports.WorkerMessageHandler = pdfjsCoreWorker.WorkerMessageHandler; diff --git a/browser/extensions/pdfjs/content/web/viewer.js b/browser/extensions/pdfjs/content/web/viewer.js index e163c108658c..749355fed12c 100644 --- a/browser/extensions/pdfjs/content/web/viewer.js +++ b/browser/extensions/pdfjs/content/web/viewer.js @@ -321,8 +321,11 @@ function getVisibleElements(scrollEl, views, sortByVisibility) { function noContextMenuHandler(e) { e.preventDefault(); } -function getPDFFileNameFromURL(url) { - var reURI = /^(?:([^:]+:)?\/\/[^\/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/; +function getPDFFileNameFromURL(url, defaultFilename) { + if (typeof defaultFilename === 'undefined') { + defaultFilename = 'document.pdf'; + } + var reURI = /^(?:(?:[^:]+:)?\/\/[^\/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/; var reFilename = /[^\/?#=]+\.pdf\b(?!.*\.pdf\b)/i; var splitURI = reURI.exec(url); var suggestedFilename = reFilename.exec(splitURI[1]) || reFilename.exec(splitURI[2]) || reFilename.exec(splitURI[3]); @@ -335,7 +338,7 @@ function getPDFFileNameFromURL(url) { } } } - return suggestedFilename || 'document.pdf'; + return suggestedFilename || defaultFilename; } function normalizeWheelEventDelta(evt) { var delta = Math.sqrt(evt.deltaX * evt.deltaX + evt.deltaY * evt.deltaY); @@ -1148,11 +1151,15 @@ var PDFViewerApplication = { setTitleUsingUrl: function pdfViewSetTitleUsingUrl(url) { this.url = url; this.baseUrl = url.split('#')[0]; - try { - this.setTitle(decodeURIComponent(pdfjsLib.getFilenameFromUrl(url)) || url); - } catch (e) { - this.setTitle(url); + var title = getPDFFileNameFromURL(url, ''); + if (!title) { + try { + title = decodeURIComponent(pdfjsLib.getFilenameFromUrl(url)) || url; + } catch (e) { + title = url; + } } + this.setTitle(title); }, setTitle: function pdfViewSetTitle(title) { if (this.isViewerEmbedded) { @@ -1251,7 +1258,7 @@ var PDFViewerApplication = { downloadManager.downloadUrl(url, filename); } var url = this.baseUrl; - var filename = getPDFFileNameFromURL(url); + var filename = getPDFFileNameFromURL(this.url); var downloadManager = this.downloadManager; downloadManager.onerror = function (err) { PDFViewerApplication.error('PDF failed to download.'); @@ -3896,6 +3903,18 @@ var PDFAttachmentViewer = function PDFAttachmentViewerClosure() { }); this._renderedCapability.resolve(); }, + _bindPdfLink: function PDFAttachmentViewer_bindPdfLink(button, content, filename) { + var blobUrl; + button.onclick = function () { + if (!blobUrl) { + blobUrl = pdfjsLib.createObjectURL(content, 'application/pdf', pdfjsLib.PDFJS.disableCreateObjectURL); + } + var viewerUrl; + viewerUrl = blobUrl + '?' + encodeURIComponent(filename); + window.open(viewerUrl); + return false; + }; + }, _bindLink: function PDFAttachmentViewer_bindLink(button, content, filename) { button.onclick = function downloadFile(e) { this.downloadManager.downloadData(content, filename, ''); @@ -3922,11 +3941,16 @@ var PDFAttachmentViewer = function PDFAttachmentViewerClosure() { for (var i = 0; i < attachmentsCount; i++) { var item = attachments[names[i]]; var filename = pdfjsLib.getFilenameFromUrl(item.filename); + filename = pdfjsLib.removeNullCharacters(filename); var div = document.createElement('div'); div.className = 'attachmentsItem'; var button = document.createElement('button'); - this._bindLink(button, item.content, filename); - button.textContent = pdfjsLib.removeNullCharacters(filename); + button.textContent = filename; + if (/\.pdf$/i.test(filename)) { + this._bindPdfLink(button, item.content, filename); + } else { + this._bindLink(button, item.content, filename); + } div.appendChild(button); this.container.appendChild(div); }