|
|
@ -62,6 +62,31 @@ var RenderingQueue = (function RenderingQueueClosure() { |
|
|
|
return RenderingQueue; |
|
|
|
return RenderingQueue; |
|
|
|
})(); |
|
|
|
})(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var FirefoxCom = (function FirefoxComClosure() { |
|
|
|
|
|
|
|
return { |
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Creates an event that hopefully the extension is listening for and will |
|
|
|
|
|
|
|
* synchronously respond to. |
|
|
|
|
|
|
|
* @param {String} action The action to trigger. |
|
|
|
|
|
|
|
* @param {String} data Optional data to send. |
|
|
|
|
|
|
|
* @return {*} The response. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
request: function(action, data) { |
|
|
|
|
|
|
|
var request = document.createTextNode(''); |
|
|
|
|
|
|
|
request.setUserData('action', action, null); |
|
|
|
|
|
|
|
request.setUserData('data', data, null); |
|
|
|
|
|
|
|
document.documentElement.appendChild(request); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var sender = document.createEvent('Events'); |
|
|
|
|
|
|
|
sender.initEvent('pdf.js.message', true, false); |
|
|
|
|
|
|
|
request.dispatchEvent(sender); |
|
|
|
|
|
|
|
var response = request.getUserData('response'); |
|
|
|
|
|
|
|
document.documentElement.removeChild(request); |
|
|
|
|
|
|
|
return response; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
})(); |
|
|
|
|
|
|
|
|
|
|
|
// Settings Manager - This is a utility for saving settings
|
|
|
|
// 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, FF bug #495747
|
|
|
|
// If not, we use FUEL in FF
|
|
|
|
// If not, we use FUEL in FF
|
|
|
@ -74,22 +99,14 @@ var Settings = (function SettingsClosure() { |
|
|
|
} |
|
|
|
} |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
})(); |
|
|
|
})(); |
|
|
|
var extPrefix = 'extensions.uriloader@pdf.js'; |
|
|
|
|
|
|
|
var isExtension = location.protocol == 'chrome:' && !isLocalStorageEnabled; |
|
|
|
var isFirefoxExtension = PDFJS.isFirefoxExtension; |
|
|
|
var inPrivateBrowsing = false; |
|
|
|
|
|
|
|
if (isExtension) { |
|
|
|
|
|
|
|
var pbs = Components.classes['@mozilla.org/privatebrowsing;1'] |
|
|
|
|
|
|
|
.getService(Components.interfaces.nsIPrivateBrowsingService); |
|
|
|
|
|
|
|
inPrivateBrowsing = pbs.privateBrowsingEnabled; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Settings(fingerprint) { |
|
|
|
function Settings(fingerprint) { |
|
|
|
var database = null; |
|
|
|
var database = null; |
|
|
|
var index; |
|
|
|
var index; |
|
|
|
if (inPrivateBrowsing) |
|
|
|
if (isFirefoxExtension) |
|
|
|
return false; |
|
|
|
database = FirefoxCom.request('getDatabase', null); |
|
|
|
else if (isExtension) |
|
|
|
|
|
|
|
database = Application.prefs.getValue(extPrefix + '.database', '{}'); |
|
|
|
|
|
|
|
else if (isLocalStorageEnabled) |
|
|
|
else if (isLocalStorageEnabled) |
|
|
|
database = localStorage.getItem('database') || '{}'; |
|
|
|
database = localStorage.getItem('database') || '{}'; |
|
|
|
else |
|
|
|
else |
|
|
@ -111,30 +128,22 @@ var Settings = (function SettingsClosure() { |
|
|
|
index = database.files.push({fingerprint: fingerprint}) - 1; |
|
|
|
index = database.files.push({fingerprint: fingerprint}) - 1; |
|
|
|
this.file = database.files[index]; |
|
|
|
this.file = database.files[index]; |
|
|
|
this.database = database; |
|
|
|
this.database = database; |
|
|
|
if (isExtension) |
|
|
|
if (isLocalStorageEnabled) |
|
|
|
Application.prefs.setValue(extPrefix + '.database', |
|
|
|
|
|
|
|
JSON.stringify(database)); |
|
|
|
|
|
|
|
else if (isLocalStorageEnabled) |
|
|
|
|
|
|
|
localStorage.setItem('database', JSON.stringify(database)); |
|
|
|
localStorage.setItem('database', JSON.stringify(database)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Settings.prototype = { |
|
|
|
Settings.prototype = { |
|
|
|
set: function settingsSet(name, val) { |
|
|
|
set: function settingsSet(name, val) { |
|
|
|
if (inPrivateBrowsing) |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
var file = this.file; |
|
|
|
var file = this.file; |
|
|
|
file[name] = val; |
|
|
|
file[name] = val; |
|
|
|
if (isExtension) |
|
|
|
var database = JSON.stringify(this.database); |
|
|
|
Application.prefs.setValue(extPrefix + '.database', |
|
|
|
if (isFirefoxExtension) |
|
|
|
JSON.stringify(this.database)); |
|
|
|
FirefoxCom.request('setDatabase', database); |
|
|
|
else if (isLocalStorageEnabled) |
|
|
|
else if (isLocalStorageEnabled) |
|
|
|
localStorage.setItem('database', JSON.stringify(this.database)); |
|
|
|
localStorage.setItem('database', database); |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
get: function settingsGet(name, defaultValue) { |
|
|
|
get: function settingsGet(name, defaultValue) { |
|
|
|
if (inPrivateBrowsing) |
|
|
|
|
|
|
|
return defaultValue; |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
return this.file[name] || defaultValue; |
|
|
|
return this.file[name] || defaultValue; |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
}; |
|
|
@ -258,7 +267,7 @@ var PDFView = { |
|
|
|
}, |
|
|
|
}, |
|
|
|
error: function getPdfError(e) { |
|
|
|
error: function getPdfError(e) { |
|
|
|
var loadingIndicator = document.getElementById('loading'); |
|
|
|
var loadingIndicator = document.getElementById('loading'); |
|
|
|
loadingIndicator.innerHTML = 'Error'; |
|
|
|
loadingIndicator.textContent = 'Error'; |
|
|
|
var moreInfo = { |
|
|
|
var moreInfo = { |
|
|
|
message: 'Unexpected server response of ' + e.target.status + '.' |
|
|
|
message: 'Unexpected server response of ' + e.target.status + '.' |
|
|
|
}; |
|
|
|
}; |
|
|
@ -273,7 +282,13 @@ var PDFView = { |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
download: function pdfViewDownload() { |
|
|
|
download: function pdfViewDownload() { |
|
|
|
window.open(this.url + '#pdfjs.action=download', '_parent'); |
|
|
|
var url = this.url.split('#')[0]; |
|
|
|
|
|
|
|
if (PDFJS.isFirefoxExtension) { |
|
|
|
|
|
|
|
FirefoxCom.request('download', url); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
url += '#pdfjs.action=download', '_parent'; |
|
|
|
|
|
|
|
window.open(url, '_parent'); |
|
|
|
|
|
|
|
} |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
navigateTo: function pdfViewNavigateTo(dest) { |
|
|
|
navigateTo: function pdfViewNavigateTo(dest) { |
|
|
@ -294,14 +309,14 @@ var PDFView = { |
|
|
|
|
|
|
|
|
|
|
|
getDestinationHash: function pdfViewGetDestinationHash(dest) { |
|
|
|
getDestinationHash: function pdfViewGetDestinationHash(dest) { |
|
|
|
if (typeof dest === 'string') |
|
|
|
if (typeof dest === 'string') |
|
|
|
return '#' + escape(dest); |
|
|
|
return PDFView.getAnchorUrl('#' + escape(dest)); |
|
|
|
if (dest instanceof Array) { |
|
|
|
if (dest instanceof Array) { |
|
|
|
var destRef = dest[0]; // see navigateTo method for dest format
|
|
|
|
var destRef = dest[0]; // see navigateTo method for dest format
|
|
|
|
var pageNumber = destRef instanceof Object ? |
|
|
|
var pageNumber = destRef instanceof Object ? |
|
|
|
this.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] : |
|
|
|
this.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] : |
|
|
|
(destRef + 1); |
|
|
|
(destRef + 1); |
|
|
|
if (pageNumber) { |
|
|
|
if (pageNumber) { |
|
|
|
var pdfOpenParams = '#page=' + pageNumber; |
|
|
|
var pdfOpenParams = PDFView.getAnchorUrl('#page=' + pageNumber); |
|
|
|
var destKind = dest[1]; |
|
|
|
var destKind = dest[1]; |
|
|
|
if ('name' in destKind && destKind.name == 'XYZ') { |
|
|
|
if ('name' in destKind && destKind.name == 'XYZ') { |
|
|
|
var scale = (dest[4] || this.currentScale); |
|
|
|
var scale = (dest[4] || this.currentScale); |
|
|
@ -316,6 +331,17 @@ var PDFView = { |
|
|
|
return ''; |
|
|
|
return ''; |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* For the firefox extension we prefix the full url on anchor links so they |
|
|
|
|
|
|
|
* don't come up as resource:// urls and so open in new tab/window works.
|
|
|
|
|
|
|
|
* @param {String} anchor The anchor hash include the #. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
getAnchorUrl: function getAnchorUrl(anchor) { |
|
|
|
|
|
|
|
if (PDFJS.isFirefoxExtension) |
|
|
|
|
|
|
|
return this.url.split('#')[0] + anchor; |
|
|
|
|
|
|
|
return anchor; |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Show the error box. |
|
|
|
* Show the error box. |
|
|
|
* @param {String} message A message that is human readable. |
|
|
|
* @param {String} message A message that is human readable. |
|
|
@ -328,7 +354,7 @@ var PDFView = { |
|
|
|
errorWrapper.removeAttribute('hidden'); |
|
|
|
errorWrapper.removeAttribute('hidden'); |
|
|
|
|
|
|
|
|
|
|
|
var errorMessage = document.getElementById('errorMessage'); |
|
|
|
var errorMessage = document.getElementById('errorMessage'); |
|
|
|
errorMessage.innerHTML = message; |
|
|
|
errorMessage.textContent = message; |
|
|
|
|
|
|
|
|
|
|
|
var closeButton = document.getElementById('errorClose'); |
|
|
|
var closeButton = document.getElementById('errorClose'); |
|
|
|
closeButton.onclick = function() { |
|
|
|
closeButton.onclick = function() { |
|
|
@ -363,7 +389,7 @@ var PDFView = { |
|
|
|
progress: function pdfViewProgress(level) { |
|
|
|
progress: function pdfViewProgress(level) { |
|
|
|
var percent = Math.round(level * 100); |
|
|
|
var percent = Math.round(level * 100); |
|
|
|
var loadingIndicator = document.getElementById('loading'); |
|
|
|
var loadingIndicator = document.getElementById('loading'); |
|
|
|
loadingIndicator.innerHTML = 'Loading... ' + percent + '%'; |
|
|
|
loadingIndicator.textContent = 'Loading... ' + percent + '%'; |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
load: function pdfViewLoad(data, scale) { |
|
|
|
load: function pdfViewLoad(data, scale) { |
|
|
@ -403,7 +429,7 @@ var PDFView = { |
|
|
|
var pagesCount = pdf.numPages; |
|
|
|
var pagesCount = pdf.numPages; |
|
|
|
var id = pdf.fingerprint; |
|
|
|
var id = pdf.fingerprint; |
|
|
|
var storedHash = null; |
|
|
|
var storedHash = null; |
|
|
|
document.getElementById('numPages').innerHTML = pagesCount; |
|
|
|
document.getElementById('numPages').textContent = pagesCount; |
|
|
|
document.getElementById('pageNumber').max = pagesCount; |
|
|
|
document.getElementById('pageNumber').max = pagesCount; |
|
|
|
PDFView.documentFingerprint = id; |
|
|
|
PDFView.documentFingerprint = id; |
|
|
|
var store = PDFView.store = new Settings(id); |
|
|
|
var store = PDFView.store = new Settings(id); |
|
|
@ -655,7 +681,15 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight, |
|
|
|
if (!item.content) { |
|
|
|
if (!item.content) { |
|
|
|
content.setAttribute('hidden', true); |
|
|
|
content.setAttribute('hidden', true); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
text.innerHTML = item.content.replace('\n', '<br />'); |
|
|
|
var e = document.createElement('span'); |
|
|
|
|
|
|
|
var lines = item.content.split('\n'); |
|
|
|
|
|
|
|
for (var i = 0, ii = lines.length; i < ii; ++i) { |
|
|
|
|
|
|
|
var line = lines[i]; |
|
|
|
|
|
|
|
e.appendChild(document.createTextNode(line)); |
|
|
|
|
|
|
|
if (i < (ii - 1)) |
|
|
|
|
|
|
|
e.appendChild(document.createElement('br')); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
text.appendChild(e); |
|
|
|
image.addEventListener('mouseover', function annotationImageOver() { |
|
|
|
image.addEventListener('mouseover', function annotationImageOver() { |
|
|
|
this.nextSibling.removeAttribute('hidden'); |
|
|
|
this.nextSibling.removeAttribute('hidden'); |
|
|
|
}, false); |
|
|
|
}, false); |
|
|
@ -831,13 +865,13 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight, |
|
|
|
var t1 = stats.compile, t2 = stats.fonts, t3 = stats.render; |
|
|
|
var t1 = stats.compile, t2 = stats.fonts, t3 = stats.render; |
|
|
|
var str = 'Time to compile/fonts/render: ' + |
|
|
|
var str = 'Time to compile/fonts/render: ' + |
|
|
|
(t1 - stats.begin) + '/' + (t2 - t1) + '/' + (t3 - t2) + ' ms'; |
|
|
|
(t1 - stats.begin) + '/' + (t2 - t1) + '/' + (t3 - t2) + ' ms'; |
|
|
|
document.getElementById('info').innerHTML = str; |
|
|
|
document.getElementById('info').textContent = str; |
|
|
|
}; |
|
|
|
}; |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
var ThumbnailView = function thumbnailView(container, page, id, pageRatio) { |
|
|
|
var ThumbnailView = function thumbnailView(container, page, id, pageRatio) { |
|
|
|
var anchor = document.createElement('a'); |
|
|
|
var anchor = document.createElement('a'); |
|
|
|
anchor.href = '#' + id; |
|
|
|
anchor.href = PDFView.getAnchorUrl('#page=' + id); |
|
|
|
anchor.onclick = function stopNivigation() { |
|
|
|
anchor.onclick = function stopNivigation() { |
|
|
|
PDFView.page = id; |
|
|
|
PDFView.page = id; |
|
|
|
return false; |
|
|
|
return false; |
|
|
@ -1045,12 +1079,18 @@ window.addEventListener('load', function webViewerLoad(evt) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var scale = ('scale' in params) ? params.scale : 0; |
|
|
|
var scale = ('scale' in params) ? params.scale : 0; |
|
|
|
PDFView.open(params.file || kDefaultURL, parseFloat(scale)); |
|
|
|
var file = PDFJS.isFirefoxExtension ? |
|
|
|
|
|
|
|
window.location.toString() : params.file || kDefaultURL; |
|
|
|
|
|
|
|
PDFView.open(file, parseFloat(scale)); |
|
|
|
|
|
|
|
|
|
|
|
if (!window.File || !window.FileReader || !window.FileList || !window.Blob) |
|
|
|
if (PDFJS.isFirefoxExtension || !window.File || !window.FileReader || |
|
|
|
|
|
|
|
!window.FileList || !window.Blob) { |
|
|
|
document.getElementById('fileInput').setAttribute('hidden', 'true'); |
|
|
|
document.getElementById('fileInput').setAttribute('hidden', 'true'); |
|
|
|
else |
|
|
|
document.getElementById('fileInputSeperator') |
|
|
|
|
|
|
|
.setAttribute('hidden', 'true'); |
|
|
|
|
|
|
|
} else { |
|
|
|
document.getElementById('fileInput').value = null; |
|
|
|
document.getElementById('fileInput').value = null; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if ('disableWorker' in params) |
|
|
|
if ('disableWorker' in params) |
|
|
|
PDFJS.disableWorker = (params['disableWorker'] === 'true'); |
|
|
|
PDFJS.disableWorker = (params['disableWorker'] === 'true'); |
|
|
@ -1135,8 +1175,8 @@ function updateViewarea() { |
|
|
|
store.set('zoom', normalizedScaleValue); |
|
|
|
store.set('zoom', normalizedScaleValue); |
|
|
|
store.set('scrollLeft', Math.round(topLeft.x)); |
|
|
|
store.set('scrollLeft', Math.round(topLeft.x)); |
|
|
|
store.set('scrollTop', Math.round(topLeft.y)); |
|
|
|
store.set('scrollTop', Math.round(topLeft.y)); |
|
|
|
|
|
|
|
var href = PDFView.getAnchorUrl(pdfOpenParams); |
|
|
|
document.getElementById('viewBookmark').href = pdfOpenParams; |
|
|
|
document.getElementById('viewBookmark').href = href; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
window.addEventListener('scroll', function webViewerScroll(evt) { |
|
|
|
window.addEventListener('scroll', function webViewerScroll(evt) { |
|
|
|