From 7f3d5ae6d3e82b3a14129b219a210e794a927188 Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Thu, 19 Jan 2012 14:19:19 -0500 Subject: [PATCH 01/20] Fix worker message, better error handling --- src/evaluator.js | 11 +++++++---- src/worker.js | 24 ++++++++++++++++++++---- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/evaluator.js b/src/evaluator.js index 21530f42f..1c277e027 100644 --- a/src/evaluator.js +++ b/src/evaluator.js @@ -159,6 +159,10 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { // a Stream in the main thread. if (translated.file) translated.file = translated.file.getBytes(); + if (translated.properties.file) { + translated.properties.file = + translated.properties.file.getBytes(); + } handler.send('obj', [ loadedName, @@ -779,12 +783,11 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { dict: baseDict, properties: properties }; - } - - } + } // if (type.name == 'Type3') + } // if (!descriptor) // According to the spec if 'FontDescriptor' is declared, 'FirstChar', - // 'LastChar' and 'Widths' should exists too, but some PDF encoders seems + // 'LastChar' and 'Widths' should exist too, but some PDF encoders seem // to ignore this rule when a variant of a standart font is used. // TODO Fill the width array depending on which of the base font this is // a variant. diff --git a/src/worker.js b/src/worker.js index 4d9dd1bb6..468cce019 100644 --- a/src/worker.js +++ b/src/worker.js @@ -109,11 +109,27 @@ var WorkerMessageHandler = { // Pre compile the pdf page and fetch the fonts/images. IRQueue = page.getIRQueue(handler, dependency); } catch (e) { + var minimumStackMessage = + 'worker.js: while trying to getPage() and getIRQueue()'; + // Turn the error into an obj that can be serialized - e = { - message: typeof e === 'object' ? e.message : e, - stack: typeof e === 'object' ? e.stack : null - }; + if (typeof e === 'string') { + e = { + message: e, + stack: minimumStackMessage + }; + } else if (typeof e === 'object') { + e = { + message: e.message || e.toString(), + stack: e.stack || minimumStackMessage + }; + } else { + e = { + message: 'Unknown exception type: ' + (typeof e), + stack: minimumStackMessage + } + } + handler.send('page_error', { pageNum: pageNum, error: e From 38d28ecb2e81eaeeb319c76719878cb22f7b8ad5 Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Thu, 19 Jan 2012 16:02:27 -0500 Subject: [PATCH 02/20] Improved error handling/message --- web/viewer.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/web/viewer.js b/web/viewer.js index ac3fbff0c..9f8b772ab 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -353,8 +353,14 @@ var PDFView = { if (moreInfo) { errorMoreInfo.value += 'Message: ' + moreInfo.message; - if (moreInfo.stack) + if (moreInfo.stack) { errorMoreInfo.value += '\n' + 'Stack: ' + moreInfo.stack; + } else { + if (moreInfo.filename) + errorMoreInfo.value += '\n' + 'File: ' + moreInfo.filename; + if (moreInfo.filename) + errorMoreInfo.value += '\n' + 'Line: ' + moreInfo.lineNumber; + } } errorMoreInfo.rows = errorMoreInfo.value.split('\n').length - 1; }, From 66eff7a5cb6fea0dbb8737bc40bcc3f7ee23c8c0 Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Fri, 20 Jan 2012 14:55:52 -0500 Subject: [PATCH 03/20] more robust fontMatrix parsing, error checking --- src/canvas.js | 10 ++++++++++ src/fonts.js | 10 +++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/canvas.js b/src/canvas.js index 5ef900861..6ec8076cf 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -551,6 +551,16 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { throw 'Can\'t find font for ' + fontRefName; } + // If any of the diagonal elements of a transformation matrix are null + // ctx.restore() will fail in FF. See bugzilla bug #719844. + if (fontObj.fontMatrix[0] === 0 || + fontObj.fontMatrix[3] === 0 ) { + warn('Invalid font matrix for font ' + fontRefName); + + // Fallback + fontObj.fontMatrix = IDENTITY_MATRIX; + } + var name = fontObj.loadedName || 'sans-serif'; this.current.font = fontObj; diff --git a/src/fonts.js b/src/fonts.js index f96c15458..96a11d1fa 100644 --- a/src/fonts.js +++ b/src/fonts.js @@ -2594,7 +2594,15 @@ var Type1Parser = function type1Parser() { while (str[index++] != ']') count++; - var array = str.substr(start, count).split(' '); + str = str.substr(start, count); + + // Trim + str = str.replace(/^\s+/, ''); + str = str.replace(/\s+$/, ''); + // Remove adjacent spaces + str = str.replace(/\s+/g, ' '); + + var array = str.split(' '); for (var i = 0, ii = array.length; i < ii; i++) array[i] = parseFloat(array[i] || 0); return array; From 357f4cc6659ca8ff2dfefcc2878416c11401265a Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Fri, 20 Jan 2012 15:20:25 -0500 Subject: [PATCH 04/20] Clarifying variable role --- src/canvas.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/canvas.js b/src/canvas.js index 6ec8076cf..792a09c97 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -703,12 +703,12 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { if (textSelection) text.geom = this.getTextGeometry(); - var width = 0; + var x = 0; for (var i = 0; i < glyphsLength; ++i) { var glyph = glyphs[i]; if (glyph === null) { // word break - width += wordSpacing; + x += wordSpacing; continue; } @@ -719,28 +719,28 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { default: // other unsupported rendering modes case TextRenderingMode.FILL: case TextRenderingMode.FILL_ADD_TO_PATH: - ctx.fillText(char, width, 0); + ctx.fillText(char, x, 0); break; case TextRenderingMode.STROKE: case TextRenderingMode.STROKE_ADD_TO_PATH: - ctx.strokeText(char, width, 0); + ctx.strokeText(char, x, 0); break; case TextRenderingMode.FILL_STROKE: case TextRenderingMode.FILL_STROKE_ADD_TO_PATH: - ctx.fillText(char, width, 0); - ctx.strokeText(char, width, 0); + ctx.fillText(char, x, 0); + ctx.strokeText(char, x, 0); break; case TextRenderingMode.INVISIBLE: break; } - width += charWidth; + x += charWidth; text.str += glyph.unicode === ' ' ? '\u00A0' : glyph.unicode; text.length++; text.canvasWidth += charWidth; } - current.x += width * textHScale2; + current.x += x * textHScale2; ctx.restore(); } From 86de8aca3368f6aa63cd49ebf68cf0c6d4471e41 Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Fri, 20 Jan 2012 16:25:06 -0500 Subject: [PATCH 05/20] Nit --- src/fonts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fonts.js b/src/fonts.js index 96a11d1fa..5d0114476 100644 --- a/src/fonts.js +++ b/src/fonts.js @@ -3603,7 +3603,7 @@ var Type2CFF = (function Type2CFFClosure() { dict['cidOperatorPresent'] = true; break; default: - TODO('interpret top dict key'); + TODO('interpret top dict key: ' + key); } } return dict; From 786cccf636a17c8a8644cf5529c0fb67e4c5a4a5 Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Fri, 20 Jan 2012 18:41:01 -0500 Subject: [PATCH 06/20] setFont() supports negative size, closes #1049 --- src/canvas.js | 32 ++++++++++++++++++++++++-------- test/pdfs/issue1049.pdf.link | 1 + test/test_manifest.json | 7 +++++++ 3 files changed, 32 insertions(+), 8 deletions(-) create mode 100644 test/pdfs/issue1049.pdf.link diff --git a/src/canvas.js b/src/canvas.js index 792a09c97..b36772fe0 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -551,8 +551,8 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { throw 'Can\'t find font for ' + fontRefName; } - // If any of the diagonal elements of a transformation matrix are null - // ctx.restore() will fail in FF. See bugzilla bug #719844. + // A valid matrix needs all main diagonal elements to be non-zero + // This also ensures we bypass FF bugzilla bug #719844. if (fontObj.fontMatrix[0] === 0 || fontObj.fontMatrix[3] === 0 ) { warn('Invalid font matrix for font ' + fontRefName); @@ -563,9 +563,23 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { var name = fontObj.loadedName || 'sans-serif'; + // Clone fontMatrix so we can manipulate it without affecting original + this.current.fontMatrix = fontObj.fontMatrix.slice(0); + + // The spec for Tf (setFont) says that 'size' specifies the font 'scale', + // and in some docs this can be negative. We implement this in fontMatrix. + if (size < 0) { + size = -size; + this.current.fontMatrix[0] = -fontObj.fontMatrix[0]; + this.current.fontMatrix[3] = -fontObj.fontMatrix[3]; + } + this.current.font = fontObj; this.current.fontSize = size; + // Cache font matrix sign + this.current.fontMatrixXSign = this.current.fontMatrix[0] > 0 ? 1 : -1; + var name = fontObj.loadedName || 'sans-serif'; var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') : (fontObj.bold ? 'bold' : 'normal'); @@ -605,7 +619,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { var ctx = this.ctx; var current = this.current; var textHScale = current.textHScale; - var fontMatrix = current.font.fontMatrix || IDENTITY_MATRIX; + var fontMatrix = current.fontMatrix || IDENTITY_MATRIX; ctx.transform.apply(ctx, current.textMatrix); ctx.scale(1, -1); @@ -639,7 +653,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { var charSpacing = current.charSpacing; var wordSpacing = current.wordSpacing; var textHScale = current.textHScale; - var fontMatrix = font.fontMatrix || IDENTITY_MATRIX; + var fontMatrix = current.fontMatrix || IDENTITY_MATRIX; var textHScale2 = textHScale * fontMatrix[0]; var glyphsLength = glyphs.length; var textLayer = this.textLayer; @@ -677,7 +691,8 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { this.restore(); var transformed = Util.applyTransform([glyph.width, 0], fontMatrix); - var width = transformed[0] * fontSize + charSpacing; + var width = transformed[0] * fontSize + + current.fontMatrixXSign * charSpacing; ctx.translate(width, 0); current.x += width * textHScale; @@ -708,12 +723,13 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { var glyph = glyphs[i]; if (glyph === null) { // word break - x += wordSpacing; + x += current.fontMatrixXSign * wordSpacing; continue; } var char = glyph.fontChar; - var charWidth = glyph.width * fontSize * 0.001 + charSpacing; + var charWidth = glyph.width * fontSize * 0.001 + + current.fontMatrixXSign * charSpacing; switch (textRenderingMode) { default: // other unsupported rendering modes @@ -756,7 +772,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { var fontSize = current.fontSize; var textHScale = current.textHScale; if (!font.coded) - textHScale *= (font.fontMatrix || IDENTITY_MATRIX)[0]; + textHScale *= (current.fontMatrix || IDENTITY_MATRIX)[0]; var arrLength = arr.length; var textLayer = this.textLayer; var text = {str: '', length: 0, canvasWidth: 0, geom: {}}; diff --git a/test/pdfs/issue1049.pdf.link b/test/pdfs/issue1049.pdf.link new file mode 100644 index 000000000..c486dda43 --- /dev/null +++ b/test/pdfs/issue1049.pdf.link @@ -0,0 +1 @@ +http://ernestinefont.com/wp-content/themes/iA3%201.2.1/assets/pdf/ErnestinePro-InfoGuide.pdf diff --git a/test/test_manifest.json b/test/test_manifest.json index 26ddceaf9..f934f3509 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -423,5 +423,12 @@ "rounds": 1, "link": false, "type": "eq" + }, + { "id": "issue1049", + "file": "pdfs/issue1049.pdf", + "md5": "15473fffcdde9fb8f3756a4cf1aab347", + "rounds": 1, + "link": true, + "type": "eq" } ] From bbdec90c0dc9aefe93b7a356a60c8176d6f2e3cd Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Fri, 20 Jan 2012 18:44:51 -0500 Subject: [PATCH 07/20] Lint --- src/canvas.js | 2 +- src/worker.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/canvas.js b/src/canvas.js index b36772fe0..e6ba9f88d 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -554,7 +554,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { // A valid matrix needs all main diagonal elements to be non-zero // This also ensures we bypass FF bugzilla bug #719844. if (fontObj.fontMatrix[0] === 0 || - fontObj.fontMatrix[3] === 0 ) { + fontObj.fontMatrix[3] === 0) { warn('Invalid font matrix for font ' + fontRefName); // Fallback diff --git a/src/worker.js b/src/worker.js index 468cce019..3bf935f17 100644 --- a/src/worker.js +++ b/src/worker.js @@ -127,7 +127,7 @@ var WorkerMessageHandler = { e = { message: 'Unknown exception type: ' + (typeof e), stack: minimumStackMessage - } + }; } handler.send('page_error', { From 5c8753dcbac9e7870d1a66efbc5bb484efc07864 Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Mon, 23 Jan 2012 15:23:09 -0500 Subject: [PATCH 08/20] Fixing regression errors, better logic --- src/canvas.js | 39 ++++++++++++++++++--------------------- src/util.js | 4 ++++ 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/canvas.js b/src/canvas.js index e6ba9f88d..0a73e034c 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -23,6 +23,7 @@ var CanvasExtraState = (function CanvasExtraStateClosure() { this.alphaIsShape = false; this.fontSize = 0; this.textMatrix = IDENTITY_MATRIX; + this.fontMatrix = IDENTITY_MATRIX; this.leading = 0; // Current point (in user coordinates) this.x = 0; @@ -546,40 +547,36 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { }, setFont: function canvasGraphicsSetFont(fontRefName, size) { var fontObj = this.objs.get(fontRefName).fontObj; + var current = this.current; - if (!fontObj) { + if (!fontObj) throw 'Can\'t find font for ' + fontRefName; - } + + // Slice-clone matrix so we can manipulate it without affecting original + if (fontObj.fontMatrix) + current.fontMatrix = fontObj.fontMatrix.slice(0); + else + current.fontMatrix = IDENTITY_MATRIX.slice(0); // A valid matrix needs all main diagonal elements to be non-zero // This also ensures we bypass FF bugzilla bug #719844. - if (fontObj.fontMatrix[0] === 0 || - fontObj.fontMatrix[3] === 0) { + if (current.fontMatrix[0] === 0 || + current.fontMatrix[3] === 0) { warn('Invalid font matrix for font ' + fontRefName); - - // Fallback - fontObj.fontMatrix = IDENTITY_MATRIX; } - var name = fontObj.loadedName || 'sans-serif'; - - // Clone fontMatrix so we can manipulate it without affecting original - this.current.fontMatrix = fontObj.fontMatrix.slice(0); - // The spec for Tf (setFont) says that 'size' specifies the font 'scale', - // and in some docs this can be negative. We implement this in fontMatrix. + // and in some docs this can be negative (inverted x-y axes). + // We implement this condition with fontMatrix. if (size < 0) { size = -size; - this.current.fontMatrix[0] = -fontObj.fontMatrix[0]; - this.current.fontMatrix[3] = -fontObj.fontMatrix[3]; + current.fontMatrix[0] *= -1; + current.fontMatrix[3] *= -1; } this.current.font = fontObj; this.current.fontSize = size; - // Cache font matrix sign - this.current.fontMatrixXSign = this.current.fontMatrix[0] > 0 ? 1 : -1; - var name = fontObj.loadedName || 'sans-serif'; var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') : (fontObj.bold ? 'bold' : 'normal'); @@ -692,7 +689,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { var transformed = Util.applyTransform([glyph.width, 0], fontMatrix); var width = transformed[0] * fontSize + - current.fontMatrixXSign * charSpacing; + Util.sign(current.fontMatrix[0]) * charSpacing; ctx.translate(width, 0); current.x += width * textHScale; @@ -723,13 +720,13 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { var glyph = glyphs[i]; if (glyph === null) { // word break - x += current.fontMatrixXSign * wordSpacing; + x += Util.sign(current.fontMatrix[0]) * wordSpacing; continue; } var char = glyph.fontChar; var charWidth = glyph.width * fontSize * 0.001 + - current.fontMatrixXSign * charSpacing; + Util.sign(current.fontMatrix[0]) * charSpacing; switch (textRenderingMode) { default: // other unsupported rendering modes diff --git a/src/util.js b/src/util.js index 99b422296..ce0daa17d 100644 --- a/src/util.js +++ b/src/util.js @@ -93,6 +93,10 @@ var Util = (function UtilClosure() { return [xt, yt]; }; + Util.sign = function sign(num) { + return num < 0 ? -1 : 1; + }; + return Util; })(); From b34c55cc3cdaecd7aad66a7fbf613f90637b48d7 Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Mon, 23 Jan 2012 15:29:15 -0500 Subject: [PATCH 09/20] Use ES5 .trim() --- src/fonts.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/fonts.js b/src/fonts.js index 5d0114476..f68ccd9ff 100644 --- a/src/fonts.js +++ b/src/fonts.js @@ -2596,9 +2596,7 @@ var Type1Parser = function type1Parser() { str = str.substr(start, count); - // Trim - str = str.replace(/^\s+/, ''); - str = str.replace(/\s+$/, ''); + str = str.trim(); // Remove adjacent spaces str = str.replace(/\s+/g, ' '); From 5c62f99fee6bad235d80d337ede1a3620c031652 Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Tue, 24 Jan 2012 10:08:18 -0500 Subject: [PATCH 10/20] Fix localStorage feature detection. Close #1099 --- web/viewer.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/web/viewer.js b/web/viewer.js index b6b62af83..87f1c4b37 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -66,12 +66,12 @@ var RenderingQueue = (function RenderingQueueClosure() { // If not, we use FUEL in FF var Settings = (function SettingsClosure() { var isLocalStorageEnabled = (function localStorageEnabledTest() { + // Feature test as per http://diveintohtml5.info/storage.html try { - localStorage; + return 'localStorage' in window && window['localStorage'] !== null; } catch (e) { return false; } - return true; })(); var extPrefix = 'extensions.uriloader@pdf.js'; var isExtension = location.protocol == 'chrome:' && !isLocalStorageEnabled; @@ -119,8 +119,9 @@ var Settings = (function SettingsClosure() { Settings.prototype = { set: function settingsSet(name, val) { - if (inPrivateBrowsing) + if (inPrivateBrowsing || !('file' in this)) return false; + var file = this.file; file[name] = val; if (isExtension) @@ -131,10 +132,10 @@ var Settings = (function SettingsClosure() { }, get: function settingsGet(name, defaultValue) { - if (inPrivateBrowsing) + if (inPrivateBrowsing || !('file' in this)) return defaultValue; - else - return this.file[name] || defaultValue; + + return this.file[name] || defaultValue; } }; From 843830cea0be94083f66bf65f525d66fe097fa61 Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Tue, 24 Jan 2012 10:39:57 -0500 Subject: [PATCH 11/20] Workaround for FF bug --- web/viewer.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/web/viewer.js b/web/viewer.js index 87f1c4b37..11c0769a3 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -62,13 +62,16 @@ var RenderingQueue = (function RenderingQueueClosure() { })(); // Settings Manager - This is a utility for saving settings -// First we see if localStorage is available, FF bug #495747 +// First we see if localStorage is available // If not, we use FUEL in FF var Settings = (function SettingsClosure() { var isLocalStorageEnabled = (function localStorageEnabledTest() { // Feature test as per http://diveintohtml5.info/storage.html + // The additional localStorage call is to get around a FF quirk, see + // bug #495747 in bugzilla try { - return 'localStorage' in window && window['localStorage'] !== null; + return 'localStorage' in window && window['localStorage'] !== null && + localStorage; } catch (e) { return false; } From 30a01c5da6eeef910228c234619a26fdaf99f524 Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Mon, 30 Jan 2012 09:24:49 -0500 Subject: [PATCH 12/20] addressing reviewer comments, bug fix --- src/evaluator.js | 4 ++-- web/viewer.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/evaluator.js b/src/evaluator.js index 1c277e027..e1e064f07 100644 --- a/src/evaluator.js +++ b/src/evaluator.js @@ -783,8 +783,8 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { dict: baseDict, properties: properties }; - } // if (type.name == 'Type3') - } // if (!descriptor) + } + } // According to the spec if 'FontDescriptor' is declared, 'FirstChar', // 'LastChar' and 'Widths' should exist too, but some PDF encoders seem diff --git a/web/viewer.js b/web/viewer.js index 9f8b772ab..e0ab1cc90 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -358,7 +358,7 @@ var PDFView = { } else { if (moreInfo.filename) errorMoreInfo.value += '\n' + 'File: ' + moreInfo.filename; - if (moreInfo.filename) + if (moreInfo.lineNumber) errorMoreInfo.value += '\n' + 'Line: ' + moreInfo.lineNumber; } } From 47f24cd27bf524b9738129abc83bd68f4bc2aef4 Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Tue, 31 Jan 2012 16:20:09 -0500 Subject: [PATCH 13/20] Show animated loading icon if page renders slow --- web/images/loading-icon.gif | Bin 0 -> 2545 bytes web/viewer.css | 14 +++++++++++++ web/viewer.js | 39 +++++++++++++++++++++++++----------- 3 files changed, 41 insertions(+), 12 deletions(-) create mode 100644 web/images/loading-icon.gif diff --git a/web/images/loading-icon.gif b/web/images/loading-icon.gif new file mode 100644 index 0000000000000000000000000000000000000000..1c72ebb554be018511ae972c3f2361dff02dce02 GIT binary patch literal 2545 zcma*pX;2es8VB%~zPr=ibVMCx-JQ^BhLDAsK)^**h(ZDp9YGuzZ%~j!}+w%FI;|aC7){7CdVvG)P{bng1y9Te*f}~*`1kQl$jwb z$tlW~rRS!X?#xfm_&6tTdp_`cjgYwbRFLNdoJCN$S-yhg`ZnC-yvedRSmOh%;Y`Gl6bY$Z-}#C=#F4%9!I1b zWQ~f+9P?;vhCxWwlwl=lrWG|7IYo;{jjmzJ5R9?f>n%-d@>kLINUc z4wM5dAO;kq<$}Dk{2-u0$I6@2N}&cUx9nmV1dYc8jfC}%=F9WCg^OQK9C6poh#2!A z3^EU*UFZvS^)?bu3T?J;@Ahb~%I?+@4!l5!*TjC}GIslNan-RCrrd~PdHYnNLJk+m&`$Y+NV(e>CCu%R#_8GqY4cv#j`#uRWdsg9DxWy(?oOvgCU}&@jy%c!H&-Q zqXJxajAtmQRoRa9V-RFXXh-bK*;Fum{BjpkYQGX~i@OZ^Dx0n&H}kvGKqQ?w(6iGXu_g08T|_hp#ZvFzIwKF*a=oMJ~3UGAjZ?g}GOxm44td zXoyYrU*I=y*vHv89hkYH(v5R#wc)BC3dZJKb3K)f>zaM3%JP(mpecViP0eKKYf3zy z->jx_mc?mCtPEvCQ?uppk?eLJt}_IR7giW%Jr)RyI!+E-voIs*lXI*z`GQc_&D#X( z{6G};HPYj6O|$lXxBJeDaweqa{4L=tOZCjTI^&UOxXg})LRG_cr^B9Rqt(i5ORbQX zq`_xCRsH>xEYY%&*Nyi#{S_JZNlTm#K56`RI%7^amom;*h90Si&g1CfaFV3D|a!`3Y-GKKbL*KSbl z>I96`TR@CqPJl(>QqB~RvK~-U)`e`l4LIqj+IU^~yyIe*|BRVB>4Bup%j{tLdKz4j zY^<8P8m~GRGz*yv0&-RJE+-keJ+%m3wNeopzsltWd->eWmBVwUr)pX` zK~CD<;~Z*Uy3W`3+MrEYxm5qYQ!z%YI;y7DTG`UVH0;@{M{!B&id_}3DBQ?zsotuR zEGLdRx25nLm%-wjlnEi;-aN_1S7???rO~WgA67jjr&(vRa3y$u#kqJbeKnw z{!T!1li9>M+sJ6AUe+*9d}2uGjhzd z|L1Rtp8uTGYyZoQ*`DS^m2dw-X{a)l+3m?ncvn^+O>)hdd3(hMtlhkRGns{<8c0I! zDDjpmwtj?@!6kA|iu3q+Ai;@JR+ zfk+ln&YFC{4bhK6IxVgLs4W%^8Lk`qzWU*L>yq0A3;l}{!wKZ!ue)C)SKI)9dl1hl zhIRLV@8E}rwvE{gX(}$f6x*k)_`*Ijt1=EU-Ls6-(phomeQBgtUs z5Xz~Cd*nE)Ac!0i4ep}Z1AugMB(&F?)#CU{Qc{Sp^vKsdL}vRB30H+Bbzrn`M##H3 z{W8dc_mDroEE+p8_}mnJtzZ4!RNe)zhB)Ds;S57nYSJxtek>^~&(7B+N5MPf2+2xx z5Dl&4X|c@f{Kd|z1r+N|$DmsoVp*3yOdxT^J^-VAk)Z@$4^XrPrFP-Co+MXZ+KJ(W z{JNYvraLLWA;&tRhIKOvhW|HC|L-dLvAUF(MG0(Nl?4tB{RzN7I(}Cb%hwN{crFC8 zji#aJElKvDFV+&VI1V?oUMA>*kto0^;3W8FQBSZ|{ z$v~TqE=(8DZa^i$^oht&h};P1N&wMXorKh*Z68gPV&ouy>%f36Oqkwemyeas$Qbz# zV?7Jy%o7KY6^I=P@eCji%W`o5sf(5hySYo9$l4e2`(hIV_?=H-#R6}0$WVA|*(K@3 z=5?@RlcLh(meW%A4)hGzcvEpm(_w?>zhL*i&s9$2>r zAtk{8Cia|+Y+V!uX9BtpXoF%lswuRKsM!pSs!?yhlCy!269K0|b M?FSZn2B>%I-}ej|s{jB1 literal 0 HcmV?d00001 diff --git a/web/viewer.css b/web/viewer.css index e355f7fc2..65f2928fa 100644 --- a/web/viewer.css +++ b/web/viewer.css @@ -235,6 +235,20 @@ canvas { -webkit-box-shadow: 0px 2px 10px #ff0; } +.loadingIcon { + position: absolute; + display: none; + left: 0; + top: 0; + right: 0; + bottom: 0; + background: url('images/loading-icon.gif') center no-repeat; */ +} + +.loadingIcon.show { + display: block; +} + .textLayer { position: absolute; left: 0; diff --git a/web/viewer.js b/web/viewer.js index dd16b0282..f319fcdc1 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -790,6 +790,10 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight, div.appendChild(canvas); this.canvas = canvas; + var loadingIconDiv = document.createElement('div'); + loadingIconDiv.className = 'loadingIcon'; + div.appendChild(loadingIconDiv); + var textLayerDiv = null; if (!PDFJS.disableTextLayer) { textLayerDiv = document.createElement('div'); @@ -809,19 +813,30 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight, ctx.restore(); ctx.translate(-this.x * scale, -this.y * scale); - stats.begin = Date.now(); - this.content.startRendering(ctx, - (function pageViewDrawCallback(error) { - if (error) - PDFView.error('An error occurred while rendering the page.', error); - this.updateStats(); - if (this.onAfterDraw) - this.onAfterDraw(); + // Rendering area - cache.push(this); - callback(); - }).bind(this), textLayer - ); + var self = this; + + // Display loading icon if page hasn't finished rendering after XXXX ms + var loadingTimer = setTimeout(function loadingTimerCallback() { + loadingIconDiv.classList.add('show'); + }, 1000); + + stats.begin = Date.now(); + this.content.startRendering(ctx, function pageViewDrawCallback(error) { + clearTimeout(loadingTimer); + loadingIconDiv.classList.remove('show'); + + if (error) + PDFView.error('An error occurred while rendering the page.', error); + + self.updateStats(); + if (self.onAfterDraw) + self.onAfterDraw(); + + cache.push(self); + callback(); + }, textLayer); setupAnnotations(this.content, this.scale); div.setAttribute('data-loaded', true); From 5ef79dca14b2f54fbcd549c2d962f1a13c2d8be3 Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Tue, 31 Jan 2012 16:49:48 -0500 Subject: [PATCH 14/20] New version: show loading icon until page renders --- web/viewer.css | 6 +++--- web/viewer.js | 19 ++++++------------- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/web/viewer.css b/web/viewer.css index 65f2928fa..6f4856e17 100644 --- a/web/viewer.css +++ b/web/viewer.css @@ -237,7 +237,7 @@ canvas { .loadingIcon { position: absolute; - display: none; + display: block; left: 0; top: 0; right: 0; @@ -245,8 +245,8 @@ canvas { background: url('images/loading-icon.gif') center no-repeat; */ } -.loadingIcon.show { - display: block; +.loadingIcon.hide { + display: none; } .textLayer { diff --git a/web/viewer.js b/web/viewer.js index f319fcdc1..a999ec553 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -618,6 +618,10 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight, div.removeAttribute('data-loaded'); delete this.canvas; + + this.loadingIconDiv = document.createElement('div'); + this.loadingIconDiv.className = 'loadingIcon'; + div.appendChild(this.loadingIconDiv); }; function setupAnnotations(content, scale) { @@ -774,7 +778,7 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight, }; this.drawingRequired = function() { - return !div.hasChildNodes(); + return !div.querySelector('canvas'); }; this.draw = function pageviewDraw(callback) { @@ -790,10 +794,6 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight, div.appendChild(canvas); this.canvas = canvas; - var loadingIconDiv = document.createElement('div'); - loadingIconDiv.className = 'loadingIcon'; - div.appendChild(loadingIconDiv); - var textLayerDiv = null; if (!PDFJS.disableTextLayer) { textLayerDiv = document.createElement('div'); @@ -816,16 +816,9 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight, // Rendering area var self = this; - - // Display loading icon if page hasn't finished rendering after XXXX ms - var loadingTimer = setTimeout(function loadingTimerCallback() { - loadingIconDiv.classList.add('show'); - }, 1000); - stats.begin = Date.now(); this.content.startRendering(ctx, function pageViewDrawCallback(error) { - clearTimeout(loadingTimer); - loadingIconDiv.classList.remove('show'); + self.loadingIconDiv.classList.add('hide'); if (error) PDFView.error('An error occurred while rendering the page.', error); From 8950d0bca9429ab7f1040b209268823503fed29a Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Tue, 31 Jan 2012 16:53:54 -0500 Subject: [PATCH 15/20] Remove instead of hide icon --- web/viewer.css | 4 ---- web/viewer.js | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/web/viewer.css b/web/viewer.css index 6f4856e17..ddbba7f2f 100644 --- a/web/viewer.css +++ b/web/viewer.css @@ -245,10 +245,6 @@ canvas { background: url('images/loading-icon.gif') center no-repeat; */ } -.loadingIcon.hide { - display: none; -} - .textLayer { position: absolute; left: 0; diff --git a/web/viewer.js b/web/viewer.js index a999ec553..809966e84 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -818,7 +818,7 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight, var self = this; stats.begin = Date.now(); this.content.startRendering(ctx, function pageViewDrawCallback(error) { - self.loadingIconDiv.classList.add('hide'); + div.removeChild(self.loadingIconDiv); if (error) PDFView.error('An error occurred while rendering the page.', error); From 2f1252af364e2024e623f2fad4b6d742572e1628 Mon Sep 17 00:00:00 2001 From: Artur Adib Date: Wed, 1 Feb 2012 15:19:01 -0500 Subject: [PATCH 16/20] CSS fix --- web/viewer.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/viewer.css b/web/viewer.css index ddbba7f2f..94e48612f 100644 --- a/web/viewer.css +++ b/web/viewer.css @@ -242,7 +242,7 @@ canvas { top: 0; right: 0; bottom: 0; - background: url('images/loading-icon.gif') center no-repeat; */ + background: url('images/loading-icon.gif') center no-repeat; } .textLayer { From e73e10c4d9e1232fafa02a5c61a1a472bac519e4 Mon Sep 17 00:00:00 2001 From: Jeff Wagner Date: Thu, 2 Feb 2012 12:33:28 -0800 Subject: [PATCH 17/20] IE9 SVG images need viewport defined --- web/images/bookmark.svg | 3 ++- web/images/document-print.svg | 3 ++- web/images/download.svg | 3 ++- web/images/go-down.svg | 3 ++- web/images/go-up.svg | 3 ++- web/images/zoom-in.svg | 3 ++- web/images/zoom-out.svg | 3 ++- 7 files changed, 14 insertions(+), 7 deletions(-) diff --git a/web/images/bookmark.svg b/web/images/bookmark.svg index 2c1fa130d..bee6efefd 100644 --- a/web/images/bookmark.svg +++ b/web/images/bookmark.svg @@ -20,7 +20,8 @@ height="48.000000px" width="48.000000px" inkscape:output_extension="org.inkscape.output.svg.inkscape" - version="1.1"> + version="1.1" + viewbox="0 0 48 48"> + inkscape:output_extension="org.inkscape.output.svg.inkscape" + viewbox="0 0 48 48"> + inkscape:output_extension="org.inkscape.output.svg.inkscape" + viewbox="0 0 48 48"> + inkscape:output_extension="org.inkscape.output.svg.inkscape" + viewbox="0 0 48 48"> + inkscape:output_extension="org.inkscape.output.svg.inkscape" + viewbox="0 0 48 48"> + inkscape:output_extension="org.inkscape.output.svg.inkscape" + viewbox="0 0 48 48"> + inkscape:output_extension="org.inkscape.output.svg.inkscape" + viewbox="0 0 48 48"> Date: Thu, 2 Feb 2012 18:29:08 -0600 Subject: [PATCH 18/20] Fix HTTP redirection for the extension --- extensions/firefox/components/PdfStreamConverter.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/firefox/components/PdfStreamConverter.js b/extensions/firefox/components/PdfStreamConverter.js index 984915d23..bd3bfffcf 100644 --- a/extensions/firefox/components/PdfStreamConverter.js +++ b/extensions/firefox/components/PdfStreamConverter.js @@ -127,14 +127,14 @@ PdfStreamConverter.prototype = { 'resource://pdf.js/web/viewer.html', null, null); // Keep the URL the same so the browser sees it as the same. - channel.originalURI = aRequest.originalURI; + channel.originalURI = aRequest.URI; channel.asyncOpen(this.listener, aContext); // Setup a global listener waiting for the next DOM to be created and verfiy // that its the one we want by its URL. When the correct DOM is found create // an event listener on that window for the pdf.js events that require // chrome priviledges. - var url = aRequest.originalURI.spec; + var url = aRequest.URI.spec; var gb = Services.wm.getMostRecentWindow('navigator:browser'); var domListener = function domListener(event) { var doc = event.originalTarget; From 03cb546f29befdc959e551d742480550e24ad01a Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Thu, 2 Feb 2012 21:06:13 -0600 Subject: [PATCH 19/20] FTP protocol support (#1165) --- src/core.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core.js b/src/core.js index cb601398e..a34954ab1 100644 --- a/src/core.js +++ b/src/core.js @@ -33,7 +33,8 @@ function getPdf(arg, callback) { var xhr = new XMLHttpRequest(); xhr.open('GET', params.url); xhr.mozResponseType = xhr.responseType = 'arraybuffer'; - xhr.expected = (params.url.indexOf('file:') === 0) ? 0 : 200; + xhr.expected = (params.url.indexOf('http:') === 0 || + params.url.indexOf('https:') === 0) ? 200 : 0; if ('progress' in params) xhr.onprogress = params.progress || undefined; From cba531e3cd7b3f4d37864c918e667c0ae1f90f07 Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Thu, 2 Feb 2012 23:31:12 -0600 Subject: [PATCH 20/20] Fixing test execution / relative URL protocol detection --- src/core.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/core.js b/src/core.js index a34954ab1..ae0f97231 100644 --- a/src/core.js +++ b/src/core.js @@ -33,8 +33,9 @@ function getPdf(arg, callback) { var xhr = new XMLHttpRequest(); xhr.open('GET', params.url); xhr.mozResponseType = xhr.responseType = 'arraybuffer'; - xhr.expected = (params.url.indexOf('http:') === 0 || - params.url.indexOf('https:') === 0) ? 200 : 0; + var protocol = params.url.indexOf(':') < 0 ? window.location.protocol : + params.url.substring(0, params.url.indexOf(':') + 1); + xhr.expected = (protocol === 'http:' || protocol === 'https:') ? 200 : 0; if ('progress' in params) xhr.onprogress = params.progress || undefined;