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() {