diff --git a/Makefile b/Makefile index f515bf717..b11b015b6 100644 --- a/Makefile +++ b/Makefile @@ -60,7 +60,7 @@ test: shell-test browser-test production: | bundle @echo "Preparing web/viewer-production.html"; \ cd web; \ - sed '/PDFJSSCRIPT_REMOVE/d' viewer.html > viewer-1.tmp; \ + sed '/PDFJSSCRIPT_REMOVE_CORE/d' viewer.html > viewer-1.tmp; \ sed '/PDFJSSCRIPT_INCLUDE_BUILD/ r viewer-snippet.html' viewer-1.tmp > viewer-production.html; \ rm -f *.tmp; \ cd .. @@ -216,6 +216,7 @@ EXTENSION_WEB_FILES = \ web/viewer.js \ web/viewer.html \ web/viewer-production.html \ + web/debugger.js \ $(NULL) FIREFOX_BUILD_DIR := $(BUILD_DIR)/firefox @@ -257,7 +258,7 @@ extension: | production # Modify the viewer so it does all the extension only stuff. @cd $(FIREFOX_BUILD_CONTENT)/web; \ sed -i.bak '/PDFJSSCRIPT_INCLUDE_BUNDLE/ r ../build/pdf.js' viewer-snippet-firefox-extension.html; \ - sed -i.bak '/PDFJSSCRIPT_REMOVE/d' viewer.html; \ + sed -i.bak '/PDFJSSCRIPT_REMOVE_CORE/d' viewer.html; \ sed -i.bak '/PDFJSSCRIPT_REMOVE_FIREFOX_EXTENSION/d' viewer.html; \ sed -i.bak '/PDFJSSCRIPT_INCLUDE_FIREFOX_EXTENSION/ r viewer-snippet-firefox-extension.html' viewer.html; \ rm -f *.bak; diff --git a/README.md b/README.md index 80763aa75..33bb30b66 100644 --- a/README.md +++ b/README.md @@ -37,8 +37,8 @@ auto-update extensions on a daily basis (you can change this through the `extensions.update.interval` option in `about:config`). For an experimental Chrome extension, get the code as explained below and issue `make extension`. -Then open Chrome with the flag `--enable-experimental-extension-apis`, go to `Tools > Extension` -and load the (unpackaged) extension from the directory `extensions/chrome`. +Then open Chrome, go to `Tools > Extension` and load the (unpackaged) extension +from the directory `build/chrome`. ### Getting the code diff --git a/extensions/chrome/manifest.json b/extensions/chrome/manifest.json index 629e41b31..9b34437b2 100644 --- a/extensions/chrome/manifest.json +++ b/extensions/chrome/manifest.json @@ -3,7 +3,7 @@ "version": "0.1", "description": "Read PDF Document", "permissions": [ - "experimental", + "webRequest", "webRequestBlocking", "http://*/*.pdf", "file:///*/*.pdf" ], diff --git a/extensions/chrome/pdfHandler.html b/extensions/chrome/pdfHandler.html index c13e24c57..1d213bbba 100644 --- a/extensions/chrome/pdfHandler.html +++ b/extensions/chrome/pdfHandler.html @@ -1,6 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + @@ -123,6 +125,7 @@ +
Loading... 0%
diff --git a/web/viewer.js b/web/viewer.js index dbb72202f..0a1ad7508 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -37,10 +37,6 @@ var RenderingQueue = (function RenderingQueueClosure() { if (!item.drawingRequired()) return; // as no redraw required, no need for queueing. - if ('rendering' in item) - return; // is already in the queue - - item.rendering = true; this.items.push(item); if (this.items.length > 1) return; // not first item @@ -49,7 +45,6 @@ var RenderingQueue = (function RenderingQueueClosure() { }, continueExecution: function RenderingQueueContinueExecution() { var item = this.items.shift(); - delete item.rendering; if (this.items.length == 0) return; // queue is empty @@ -325,7 +320,8 @@ var PDFView = { if (pageNumber) { var pdfOpenParams = PDFView.getAnchorUrl('#page=' + pageNumber); var destKind = dest[1]; - if ('name' in destKind && destKind.name == 'XYZ') { + if (typeof destKind === 'object' && 'name' in destKind && + destKind.name == 'XYZ') { var scale = (dest[4] || this.currentScale); pdfOpenParams += '&zoom=' + (scale * 100); if (dest[2] || dest[3]) { @@ -509,13 +505,7 @@ var PDFView = { return; if (hash.indexOf('=') >= 0) { - // parsing query string - var paramsPairs = hash.split('&'); - var params = {}; - for (var i = 0; i < paramsPairs.length; ++i) { - var paramPair = paramsPairs[i].split('='); - params[paramPair[0]] = paramPair[1]; - } + var params = PDFView.parseQueryString(hash); // borrowing syntax from "Parameters for Opening PDF Files" if ('nameddest' in params) { PDFView.navigateTo(params.nameddest); @@ -571,6 +561,10 @@ var PDFView = { } }, + pinSidebar: function pdfViewPinSidebar() { + document.getElementById('sidebar').classList.toggle('pinned'); + }, + getVisiblePages: function pdfViewGetVisiblePages() { var pages = this.pages; var kBottomMargin = 10; @@ -623,6 +617,19 @@ var PDFView = { } return visibleThumbs; + }, + + // Helper function to parse query string (e.g. ?param1=value&parm2=...). + parseQueryString: function pdfViewParseQueryString(query) { + var parts = query.split('&'); + var params = {}; + for (var i = 0, ii = parts.length; i < parts.length; ++i) { + var param = parts[i].split('='); + var key = param[0]; + var value = param.length > 1 ? param[1] : null; + params[unescape(key)] = unescape(value); + } + return params; } }; @@ -865,7 +872,10 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight, var self = this; stats.begin = Date.now(); this.content.startRendering(ctx, function pageViewDrawCallback(error) { - div.removeChild(self.loadingIconDiv); + if (self.loadingIconDiv) { + div.removeChild(self.loadingIconDiv); + delete self.loadingIconDiv; + } if (error) PDFView.error('An error occurred while rendering the page.', error); @@ -965,7 +975,7 @@ var ThumbnailView = function thumbnailView(container, page, id, pageRatio) { }; this.setImage = function thumbnailViewSetImage(img) { - if (this.hasImage) + if (this.hasImage || !img) return; var ctx = getPageDrawContext(); @@ -1082,6 +1092,7 @@ var TextLayerBuilder = function textLayerBuilder(textLayerDiv) { // vScale and hScale already contain the scaling to pixel units var fontHeight = fontSize * text.geom.vScale; textDiv.dataset.canvasWidth = text.canvasWidth * text.geom.hScale; + textDiv.dataset.fontName = fontName; textDiv.style.fontSize = fontHeight + 'px'; textDiv.style.left = text.geom.x + 'px'; @@ -1094,16 +1105,11 @@ var TextLayerBuilder = function textLayerBuilder(textLayerDiv) { }; window.addEventListener('load', function webViewerLoad(evt) { - var params = document.location.search.substring(1).split('&'); - for (var i = 0; i < params.length; i++) { - var param = params[i].split('='); - params[unescape(param[0])] = unescape(param[1]); - } + var params = PDFView.parseQueryString(document.location.search.substring(1)); - var scale = ('scale' in params) ? params.scale : 0; var file = PDFJS.isFirefoxExtension ? window.location.toString() : params.file || kDefaultURL; - PDFView.open(file, parseFloat(scale)); + PDFView.open(file, 0); if (PDFJS.isFirefoxExtension || !window.File || !window.FileReader || !window.FileList || !window.Blob) { @@ -1114,11 +1120,32 @@ window.addEventListener('load', function webViewerLoad(evt) { document.getElementById('fileInput').value = null; } - if ('disableWorker' in params) - PDFJS.disableWorker = (params['disableWorker'] === 'true'); + // Special debugging flags in the hash section of the URL. + var hash = document.location.hash.substring(1); + var hashParams = PDFView.parseQueryString(hash); - if ('disableTextLayer' in params) - PDFJS.disableTextLayer = (params['disableTextLayer'] === 'true'); + if ('disableWorker' in hashParams) + PDFJS.disableWorker = (hashParams['disableWorker'] === 'true'); + + if ('disableTextLayer' in hashParams) + PDFJS.disableTextLayer = (hashParams['disableTextLayer'] === 'true'); + + if ('pdfBug' in hashParams) { + PDFJS.pdfBug = true; + var pdfBug = hashParams['pdfBug']; + var all = false, enabled = []; + if (pdfBug === 'all') + all = true; + else + enabled = pdfBug.split(','); + var debugTools = PDFBug.tools; + for (var i = 0; i < debugTools.length; ++i) { + var tool = debugTools[i]; + if (all || enabled.indexOf(tool.id) !== -1) + tool.enabled = true; + } + PDFBug.init(); + } var sidebarScrollView = document.getElementById('sidebarScrollView'); sidebarScrollView.addEventListener('scroll', updateThumbViewArea, true); @@ -1205,7 +1232,6 @@ window.addEventListener('scroll', function webViewerScroll(evt) { updateViewarea(); }, true); - var thumbnailTimer; function updateThumbViewArea() {