2011-09-13 02:37:33 +09:00
|
|
|
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2011-07-06 15:06:45 +09:00
|
|
|
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
|
2012-09-01 07:48:21 +09:00
|
|
|
/* Copyright 2012 Mozilla Foundation
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
2013-07-13 03:14:13 +09:00
|
|
|
/* globals PDFJS, PDFBug, FirefoxCom, Stats, Cache, PDFFindBar, CustomStyle,
|
|
|
|
PDFFindController, ProgressBar, TextLayerBuilder, DownloadManager,
|
2013-07-19 00:18:27 +09:00
|
|
|
getFileName, getOutputScale, scrollIntoView, getPDFFileNameFromURL,
|
2013-10-02 22:55:31 +09:00
|
|
|
PDFHistory, Settings, PageView, ThumbnailView, noContextMenuHandler,
|
2013-10-02 06:11:46 +09:00
|
|
|
SecondaryToolbar, PasswordPrompt, PresentationMode */
|
2011-05-26 23:02:52 +09:00
|
|
|
|
2011-07-06 15:06:45 +09:00
|
|
|
'use strict';
|
2011-06-19 09:35:28 +09:00
|
|
|
|
2012-11-10 06:34:11 +09:00
|
|
|
var DEFAULT_URL = 'compressed.tracemonkey-pldi-09.pdf';
|
|
|
|
var DEFAULT_SCALE = 'auto';
|
|
|
|
var DEFAULT_SCALE_DELTA = 1.1;
|
|
|
|
var UNKNOWN_SCALE = 0;
|
|
|
|
var CACHE_SIZE = 20;
|
|
|
|
var CSS_UNITS = 96.0 / 72.0;
|
|
|
|
var SCROLLBAR_PADDING = 40;
|
|
|
|
var VERTICAL_PADDING = 5;
|
|
|
|
var MIN_SCALE = 0.25;
|
|
|
|
var MAX_SCALE = 4.0;
|
|
|
|
var SETTINGS_MEMORY = 20;
|
2013-06-02 21:31:28 +09:00
|
|
|
var SCALE_SELECT_CONTAINER_PADDING = 8;
|
|
|
|
var SCALE_SELECT_PADDING = 22;
|
2013-10-03 01:05:46 +09:00
|
|
|
var USE_ONLY_CSS_ZOOM = false;
|
|
|
|
//#if B2G
|
|
|
|
//USE_ONLY_CSS_ZOOM = true;
|
|
|
|
//#endif
|
2012-06-19 01:48:47 +09:00
|
|
|
var RenderingStates = {
|
|
|
|
INITIAL: 0,
|
|
|
|
RUNNING: 1,
|
|
|
|
PAUSED: 2,
|
|
|
|
FINISHED: 3
|
|
|
|
};
|
2012-09-29 03:18:45 +09:00
|
|
|
var FindStates = {
|
|
|
|
FIND_FOUND: 0,
|
|
|
|
FIND_NOTFOUND: 1,
|
|
|
|
FIND_WRAPPED: 2,
|
|
|
|
FIND_PENDING: 3
|
|
|
|
};
|
2012-06-19 01:48:47 +09:00
|
|
|
|
2013-07-09 22:40:58 +09:00
|
|
|
PDFJS.imageResourcesPath = './images/';
|
2012-10-30 04:44:18 +09:00
|
|
|
//#if (FIREFOX || MOZCENTRAL || B2G || GENERIC || CHROME)
|
2013-08-13 02:48:06 +09:00
|
|
|
//PDFJS.workerSrc = '../build/pdf.worker.js';
|
2012-09-11 09:39:51 +09:00
|
|
|
//#endif
|
2011-07-29 20:26:43 +09:00
|
|
|
|
2012-05-01 05:29:05 +09:00
|
|
|
var mozL10n = document.mozL10n || document.webL10n;
|
|
|
|
|
2013-06-19 01:05:55 +09:00
|
|
|
//#include ui_utils.js
|
Add mozPrintCallback shim
This shim does the following:
1. Intercept window.print()
2. For a window.print() call (if allowed, ie. no previous print job):
1. Dispatch the beforeprint event.
2. Render a printg progress dialog.
3. For each canvas, call mozPrintCallback if existent (one at a time, async).
4. During each mozPrintCallback callback, update the progress dialog.
5. When all <canvas>es have been rendered, invoke the real window.print().
6. Dispatch the afterprint event.
The shim is not included in Firefox through the preprocessor.
Keyboard shortcuts (Ctrl/Cmd + P) are intercepted and default behavior
(i.e. printing) is prevented, and the steps for window.print() are run.
window.attachEvent is used, in order to cancel printing in IE10 and
earlier (courtesy of Stack Overflow - http://stackoverflow.com/a/15302847).
Unfortunately, this doesn't work in IE11 - if Ctrl + P is used, the
print dialog will be shown twice: Once because of Ctrl + P, and again
when all pages have finished rendering.
This logic of this polyfill is not specific to PDF.js, so it can also
be used in other projects.
There's one additional modification in PDF.js's viewer.js: The printed
<canvas> element is wrapped in a <div>. This is needed, because Chrome
would otherwise print one canvas on two pages.
2013-09-11 01:17:26 +09:00
|
|
|
|
|
|
|
//#if !(FIREFOX || MOZCENTRAL || B2G)
|
|
|
|
//#include mozPrintCallback_polyfill.js
|
|
|
|
//#endif
|
|
|
|
|
2013-07-13 03:14:13 +09:00
|
|
|
//#if GENERIC || CHROME
|
|
|
|
//#include download_manager.js
|
|
|
|
//#endif
|
2012-03-22 07:36:10 +09:00
|
|
|
|
2012-08-02 03:29:13 +09:00
|
|
|
//#if FIREFOX || MOZCENTRAL
|
2012-08-02 07:31:25 +09:00
|
|
|
//#include firefoxcom.js
|
2012-08-02 03:29:13 +09:00
|
|
|
//#endif
|
2012-01-26 10:40:08 +09:00
|
|
|
|
2012-11-10 06:34:11 +09:00
|
|
|
var cache = new Cache(CACHE_SIZE);
|
2011-10-02 03:54:37 +09:00
|
|
|
var currentPageNumber = 1;
|
2011-07-29 20:26:43 +09:00
|
|
|
|
2013-10-02 22:55:31 +09:00
|
|
|
//#include settings.js
|
2013-06-19 01:05:55 +09:00
|
|
|
//#include pdf_find_bar.js
|
|
|
|
//#include pdf_find_controller.js
|
2013-07-19 00:18:27 +09:00
|
|
|
//#include pdf_history.js
|
2013-09-05 06:48:31 +09:00
|
|
|
//#include secondary_toolbar.js
|
2013-09-25 00:46:54 +09:00
|
|
|
//#include password_prompt.js
|
2013-10-02 06:11:46 +09:00
|
|
|
//#include presentation_mode.js
|
2013-05-16 07:31:17 +09:00
|
|
|
|
2011-07-29 02:48:05 +09:00
|
|
|
var PDFView = {
|
|
|
|
pages: [],
|
|
|
|
thumbnails: [],
|
2012-11-10 06:34:11 +09:00
|
|
|
currentScale: UNKNOWN_SCALE,
|
2012-01-03 04:15:45 +09:00
|
|
|
currentScaleValue: null,
|
2011-10-02 03:54:37 +09:00
|
|
|
initialBookmark: document.location.hash.substring(1),
|
2012-04-26 03:34:28 +09:00
|
|
|
container: null,
|
2012-06-19 01:48:47 +09:00
|
|
|
thumbnailContainer: null,
|
2012-05-01 05:05:32 +09:00
|
|
|
initialized: false,
|
2012-05-15 09:19:09 +09:00
|
|
|
fellback: false,
|
2012-06-02 06:17:09 +09:00
|
|
|
pdfDocument: null,
|
2012-06-19 01:48:47 +09:00
|
|
|
sidebarOpen: false,
|
|
|
|
pageViewScroll: null,
|
|
|
|
thumbnailViewScroll: null,
|
2012-09-08 08:05:14 +09:00
|
|
|
pageRotation: 0,
|
2012-09-14 05:23:44 +09:00
|
|
|
mouseScrollTimeStamp: 0,
|
|
|
|
mouseScrollDelta: 0,
|
2012-09-13 06:26:01 +09:00
|
|
|
lastScroll: 0,
|
2013-01-11 06:56:36 +09:00
|
|
|
previousPageNumber: 1,
|
2013-07-20 23:33:40 +09:00
|
|
|
isViewerEmbedded: (window.parent !== window),
|
2012-06-19 01:48:47 +09:00
|
|
|
|
2012-04-26 03:34:28 +09:00
|
|
|
// called once when the document is loaded
|
2012-05-01 05:05:32 +09:00
|
|
|
initialize: function pdfViewInitialize() {
|
2012-09-13 06:26:01 +09:00
|
|
|
var self = this;
|
2012-06-19 01:48:47 +09:00
|
|
|
var container = this.container = document.getElementById('viewerContainer');
|
|
|
|
this.pageViewScroll = {};
|
|
|
|
this.watchScroll(container, this.pageViewScroll, updateViewarea);
|
|
|
|
|
|
|
|
var thumbnailContainer = this.thumbnailContainer =
|
|
|
|
document.getElementById('thumbnailView');
|
|
|
|
this.thumbnailViewScroll = {};
|
|
|
|
this.watchScroll(thumbnailContainer, this.thumbnailViewScroll,
|
|
|
|
this.renderHighestPriority.bind(this));
|
|
|
|
|
2013-10-02 06:11:46 +09:00
|
|
|
PDFFindBar.initialize({
|
|
|
|
bar: document.getElementById('findbar'),
|
|
|
|
toggleButton: document.getElementById('viewFind'),
|
|
|
|
findField: document.getElementById('findInput'),
|
|
|
|
highlightAllCheckbox: document.getElementById('findHighlightAll'),
|
|
|
|
caseSensitiveCheckbox: document.getElementById('findMatchCase'),
|
|
|
|
findMsg: document.getElementById('findMsg'),
|
|
|
|
findStatusIcon: document.getElementById('findStatusIcon'),
|
|
|
|
findPreviousButton: document.getElementById('findPrevious'),
|
|
|
|
findNextButton: document.getElementById('findNext')
|
|
|
|
});
|
|
|
|
|
|
|
|
PDFFindController.initialize({
|
|
|
|
pdfPageSource: this,
|
|
|
|
integratedFind: this.supportsIntegratedFind
|
|
|
|
});
|
|
|
|
|
2013-09-05 06:48:31 +09:00
|
|
|
SecondaryToolbar.initialize({
|
|
|
|
toolbar: document.getElementById('secondaryToolbar'),
|
|
|
|
toggleButton: document.getElementById('secondaryToolbarToggle'),
|
|
|
|
presentationMode: document.getElementById('secondaryPresentationMode'),
|
|
|
|
openFile: document.getElementById('secondaryOpenFile'),
|
|
|
|
print: document.getElementById('secondaryPrint'),
|
|
|
|
download: document.getElementById('secondaryDownload'),
|
|
|
|
firstPage: document.getElementById('firstPage'),
|
|
|
|
lastPage: document.getElementById('lastPage'),
|
|
|
|
pageRotateCw: document.getElementById('pageRotateCw'),
|
|
|
|
pageRotateCcw: document.getElementById('pageRotateCcw')
|
|
|
|
});
|
|
|
|
|
2013-09-25 00:46:54 +09:00
|
|
|
PasswordPrompt.initialize({
|
|
|
|
overlayContainer: document.getElementById('overlayContainer'),
|
|
|
|
passwordField: document.getElementById('password'),
|
|
|
|
passwordText: document.getElementById('passwordText'),
|
|
|
|
passwordSubmit: document.getElementById('passwordSubmit'),
|
|
|
|
passwordCancel: document.getElementById('passwordCancel')
|
|
|
|
});
|
|
|
|
|
2013-10-07 03:05:13 +09:00
|
|
|
PresentationMode.initialize({
|
2013-10-09 03:11:04 +09:00
|
|
|
container: container,
|
|
|
|
secondaryToolbar: SecondaryToolbar,
|
|
|
|
firstPage: document.getElementById('contextFirstPage'),
|
|
|
|
lastPage: document.getElementById('contextLastPage'),
|
|
|
|
pageRotateCw: document.getElementById('contextPageRotateCw'),
|
|
|
|
pageRotateCcw: document.getElementById('contextPageRotateCcw')
|
2013-10-07 03:05:13 +09:00
|
|
|
});
|
|
|
|
|
2012-05-01 05:05:32 +09:00
|
|
|
this.initialized = true;
|
2012-09-13 06:26:01 +09:00
|
|
|
container.addEventListener('scroll', function() {
|
|
|
|
self.lastScroll = Date.now();
|
|
|
|
}, false);
|
2012-04-26 03:34:28 +09:00
|
|
|
},
|
2011-07-29 02:48:05 +09:00
|
|
|
|
2013-03-09 11:08:37 +09:00
|
|
|
getPage: function pdfViewGetPage(n) {
|
|
|
|
return this.pdfDocument.getPage(n);
|
|
|
|
},
|
|
|
|
|
2012-06-19 01:48:47 +09:00
|
|
|
// Helper function to keep track whether a div was scrolled up or down and
|
|
|
|
// then call a callback.
|
|
|
|
watchScroll: function pdfViewWatchScroll(viewAreaElement, state, callback) {
|
|
|
|
state.down = true;
|
|
|
|
state.lastY = viewAreaElement.scrollTop;
|
|
|
|
viewAreaElement.addEventListener('scroll', function webViewerScroll(evt) {
|
|
|
|
var currentY = viewAreaElement.scrollTop;
|
|
|
|
var lastY = state.lastY;
|
|
|
|
if (currentY > lastY)
|
|
|
|
state.down = true;
|
|
|
|
else if (currentY < lastY)
|
|
|
|
state.down = false;
|
|
|
|
// else do nothing and use previous value
|
|
|
|
state.lastY = currentY;
|
|
|
|
callback();
|
|
|
|
}, true);
|
|
|
|
},
|
|
|
|
|
2013-08-05 21:52:24 +09:00
|
|
|
setScale: function pdfViewSetScale(val, resetAutoSettings, noScroll) {
|
|
|
|
if (val == this.currentScale)
|
2011-12-23 03:02:52 +09:00
|
|
|
return;
|
|
|
|
|
2013-08-05 21:52:24 +09:00
|
|
|
var pages = this.pages;
|
|
|
|
for (var i = 0; i < pages.length; i++)
|
2013-10-03 01:05:46 +09:00
|
|
|
pages[i].update(val);
|
2011-08-26 02:20:19 +09:00
|
|
|
|
2013-08-05 21:52:24 +09:00
|
|
|
if (!noScroll && this.currentScale != val)
|
|
|
|
this.pages[this.page - 1].scrollIntoView();
|
|
|
|
this.currentScale = val;
|
2011-07-30 01:17:04 +09:00
|
|
|
|
2011-08-26 02:20:19 +09:00
|
|
|
var event = document.createEvent('UIEvents');
|
2011-09-03 10:16:52 +09:00
|
|
|
event.initUIEvent('scalechange', false, false, window, 0);
|
2013-08-05 21:52:24 +09:00
|
|
|
event.scale = val;
|
2011-09-03 10:16:52 +09:00
|
|
|
event.resetAutoSettings = resetAutoSettings;
|
2011-07-30 01:17:04 +09:00
|
|
|
window.dispatchEvent(event);
|
2011-07-29 02:48:05 +09:00
|
|
|
},
|
|
|
|
|
2012-06-19 06:12:00 +09:00
|
|
|
parseScale: function pdfViewParseScale(value, resetAutoSettings, noScroll) {
|
2013-08-05 21:52:24 +09:00
|
|
|
if ('custom' == value)
|
2011-09-05 23:07:18 +09:00
|
|
|
return;
|
|
|
|
|
2011-09-03 10:16:52 +09:00
|
|
|
var scale = parseFloat(value);
|
2012-01-03 04:15:45 +09:00
|
|
|
this.currentScaleValue = value;
|
2011-09-03 10:16:52 +09:00
|
|
|
if (scale) {
|
2012-06-19 06:12:00 +09:00
|
|
|
this.setScale(scale, true, noScroll);
|
2011-09-03 10:16:52 +09:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-04-26 03:34:28 +09:00
|
|
|
var container = this.container;
|
2011-09-03 10:16:52 +09:00
|
|
|
var currentPage = this.pages[this.page - 1];
|
2012-10-15 23:01:09 +09:00
|
|
|
if (!currentPage) {
|
|
|
|
return;
|
|
|
|
}
|
2012-07-31 00:12:49 +09:00
|
|
|
|
2012-11-10 06:34:11 +09:00
|
|
|
var pageWidthScale = (container.clientWidth - SCROLLBAR_PADDING) /
|
2013-10-03 01:05:46 +09:00
|
|
|
currentPage.width * currentPage.scale;
|
2012-11-10 06:34:11 +09:00
|
|
|
var pageHeightScale = (container.clientHeight - VERTICAL_PADDING) /
|
2013-10-03 01:05:46 +09:00
|
|
|
currentPage.height * currentPage.scale;
|
2012-04-26 07:55:11 +09:00
|
|
|
switch (value) {
|
|
|
|
case 'page-actual':
|
2012-06-19 06:12:00 +09:00
|
|
|
scale = 1;
|
2012-04-26 07:55:11 +09:00
|
|
|
break;
|
|
|
|
case 'page-width':
|
2012-06-19 06:12:00 +09:00
|
|
|
scale = pageWidthScale;
|
2012-04-26 07:55:11 +09:00
|
|
|
break;
|
|
|
|
case 'page-height':
|
2012-06-19 06:12:00 +09:00
|
|
|
scale = pageHeightScale;
|
2012-04-26 07:55:11 +09:00
|
|
|
break;
|
|
|
|
case 'page-fit':
|
2012-06-19 06:12:00 +09:00
|
|
|
scale = Math.min(pageWidthScale, pageHeightScale);
|
2012-04-26 07:55:11 +09:00
|
|
|
break;
|
|
|
|
case 'auto':
|
2012-06-19 06:12:00 +09:00
|
|
|
scale = Math.min(1.0, pageWidthScale);
|
2012-04-26 07:55:11 +09:00
|
|
|
break;
|
2011-09-05 09:46:06 +09:00
|
|
|
}
|
2012-06-19 06:12:00 +09:00
|
|
|
this.setScale(scale, resetAutoSettings, noScroll);
|
2011-12-23 02:24:13 +09:00
|
|
|
|
|
|
|
selectScaleOption(value);
|
2011-09-03 10:16:52 +09:00
|
|
|
},
|
|
|
|
|
2013-08-27 04:00:35 +09:00
|
|
|
zoomIn: function pdfViewZoomIn(ticks) {
|
|
|
|
var newScale = this.currentScale;
|
|
|
|
do {
|
|
|
|
newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2);
|
|
|
|
newScale = Math.ceil(newScale * 10) / 10;
|
|
|
|
newScale = Math.min(MAX_SCALE, newScale);
|
|
|
|
} while (--ticks && newScale < MAX_SCALE);
|
2012-01-20 03:25:29 +09:00
|
|
|
this.parseScale(newScale, true);
|
2011-09-03 10:16:52 +09:00
|
|
|
},
|
|
|
|
|
2013-08-27 04:00:35 +09:00
|
|
|
zoomOut: function pdfViewZoomOut(ticks) {
|
|
|
|
var newScale = this.currentScale;
|
|
|
|
do {
|
|
|
|
newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2);
|
|
|
|
newScale = Math.floor(newScale * 10) / 10;
|
|
|
|
newScale = Math.max(MIN_SCALE, newScale);
|
|
|
|
} while (--ticks && newScale > MIN_SCALE);
|
2012-01-20 03:25:29 +09:00
|
|
|
this.parseScale(newScale, true);
|
2011-09-03 10:16:52 +09:00
|
|
|
},
|
|
|
|
|
2011-07-29 02:48:05 +09:00
|
|
|
set page(val) {
|
|
|
|
var pages = this.pages;
|
2011-08-09 05:13:32 +09:00
|
|
|
var input = document.getElementById('pageNumber');
|
2012-08-08 00:00:42 +09:00
|
|
|
var event = document.createEvent('UIEvents');
|
2012-08-09 01:38:45 +09:00
|
|
|
event.initUIEvent('pagechange', false, false, window, 0);
|
|
|
|
|
2011-08-30 11:11:46 +09:00
|
|
|
if (!(0 < val && val <= pages.length)) {
|
2013-01-11 06:56:36 +09:00
|
|
|
this.previousPageNumber = val;
|
2011-10-15 11:05:57 +09:00
|
|
|
event.pageNumber = this.page;
|
|
|
|
window.dispatchEvent(event);
|
2011-07-29 02:48:05 +09:00
|
|
|
return;
|
|
|
|
}
|
2011-08-09 05:13:32 +09:00
|
|
|
|
2012-01-12 09:48:51 +09:00
|
|
|
pages[val - 1].updateStats();
|
2013-01-11 06:56:36 +09:00
|
|
|
this.previousPageNumber = currentPageNumber;
|
2011-10-02 03:54:37 +09:00
|
|
|
currentPageNumber = val;
|
2011-10-15 11:05:57 +09:00
|
|
|
event.pageNumber = val;
|
|
|
|
window.dispatchEvent(event);
|
|
|
|
|
|
|
|
// checking if the this.page was called from the updateViewarea function:
|
|
|
|
// avoiding the creation of two "set page" method (internal and public)
|
|
|
|
if (updateViewarea.inProgress)
|
|
|
|
return;
|
2011-07-29 02:48:05 +09:00
|
|
|
|
2011-10-20 05:14:34 +09:00
|
|
|
// Avoid scrolling the first page during loading
|
|
|
|
if (this.loading && val == 1)
|
|
|
|
return;
|
|
|
|
|
2011-10-02 03:54:37 +09:00
|
|
|
pages[val - 1].scrollIntoView();
|
2011-07-29 02:48:05 +09:00
|
|
|
},
|
|
|
|
|
|
|
|
get page() {
|
2011-10-02 03:54:37 +09:00
|
|
|
return currentPageNumber;
|
2011-07-29 02:48:05 +09:00
|
|
|
},
|
|
|
|
|
2012-06-29 01:50:25 +09:00
|
|
|
get supportsPrinting() {
|
|
|
|
var canvas = document.createElement('canvas');
|
2012-07-13 02:31:20 +09:00
|
|
|
var value = 'mozPrintCallback' in canvas;
|
|
|
|
// shadow
|
|
|
|
Object.defineProperty(this, 'supportsPrinting', { value: value,
|
|
|
|
enumerable: true,
|
|
|
|
configurable: true,
|
|
|
|
writable: false });
|
|
|
|
return value;
|
2012-06-29 01:50:25 +09:00
|
|
|
},
|
|
|
|
|
2012-07-31 00:12:49 +09:00
|
|
|
get supportsFullscreen() {
|
|
|
|
var doc = document.documentElement;
|
2012-09-24 05:22:17 +09:00
|
|
|
var support = doc.requestFullscreen || doc.mozRequestFullScreen ||
|
2013-09-11 04:40:14 +09:00
|
|
|
doc.webkitRequestFullScreen || doc.msRequestFullscreen;
|
2012-11-10 22:59:25 +09:00
|
|
|
|
2013-06-06 01:01:09 +09:00
|
|
|
if (document.fullscreenEnabled === false ||
|
|
|
|
document.mozFullScreenEnabled === false ||
|
2013-09-11 04:40:14 +09:00
|
|
|
document.webkitFullscreenEnabled === false ||
|
|
|
|
document.msFullscreenEnabled === false) {
|
2012-11-10 22:59:25 +09:00
|
|
|
support = false;
|
2013-09-05 07:23:16 +09:00
|
|
|
} else if (this.isViewerEmbedded) {
|
|
|
|
// Need to check if the viewer is embedded as well, to prevent issues with
|
|
|
|
// presentation mode when the viewer is embedded in '<object>' tags.
|
|
|
|
support = false;
|
2013-03-02 05:54:02 +09:00
|
|
|
}
|
2012-11-10 22:59:25 +09:00
|
|
|
|
2013-03-02 05:54:02 +09:00
|
|
|
Object.defineProperty(this, 'supportsFullscreen', { value: support,
|
2012-07-31 00:12:49 +09:00
|
|
|
enumerable: true,
|
|
|
|
configurable: true,
|
|
|
|
writable: false });
|
|
|
|
return support;
|
|
|
|
},
|
|
|
|
|
2012-10-06 05:59:13 +09:00
|
|
|
get supportsIntegratedFind() {
|
|
|
|
var support = false;
|
|
|
|
//#if !(FIREFOX || MOZCENTRAL)
|
|
|
|
//#else
|
|
|
|
// support = FirefoxCom.requestSync('supportsIntegratedFind');
|
|
|
|
//#endif
|
|
|
|
Object.defineProperty(this, 'supportsIntegratedFind', { value: support,
|
|
|
|
enumerable: true,
|
|
|
|
configurable: true,
|
|
|
|
writable: false });
|
|
|
|
return support;
|
|
|
|
},
|
|
|
|
|
2012-12-01 07:59:51 +09:00
|
|
|
get supportsDocumentFonts() {
|
|
|
|
var support = true;
|
|
|
|
//#if !(FIREFOX || MOZCENTRAL)
|
|
|
|
//#else
|
|
|
|
// support = FirefoxCom.requestSync('supportsDocumentFonts');
|
|
|
|
//#endif
|
|
|
|
Object.defineProperty(this, 'supportsDocumentFonts', { value: support,
|
|
|
|
enumerable: true,
|
|
|
|
configurable: true,
|
|
|
|
writable: false });
|
|
|
|
return support;
|
|
|
|
},
|
|
|
|
|
2013-04-04 01:49:03 +09:00
|
|
|
get supportsDocumentColors() {
|
|
|
|
var support = true;
|
|
|
|
//#if !(FIREFOX || MOZCENTRAL)
|
|
|
|
//#else
|
|
|
|
// support = FirefoxCom.requestSync('supportsDocumentColors');
|
|
|
|
//#endif
|
|
|
|
Object.defineProperty(this, 'supportsDocumentColors', { value: support,
|
|
|
|
enumerable: true,
|
|
|
|
configurable: true,
|
|
|
|
writable: false });
|
|
|
|
return support;
|
|
|
|
},
|
|
|
|
|
2013-07-19 01:28:59 +09:00
|
|
|
get loadingBar() {
|
|
|
|
var bar = new ProgressBar('#loadingBar', {});
|
|
|
|
Object.defineProperty(this, 'loadingBar', { value: bar,
|
|
|
|
enumerable: true,
|
|
|
|
configurable: true,
|
|
|
|
writable: false });
|
|
|
|
return bar;
|
|
|
|
},
|
|
|
|
|
2012-12-14 05:10:21 +09:00
|
|
|
get isHorizontalScrollbarEnabled() {
|
|
|
|
var div = document.getElementById('viewerContainer');
|
|
|
|
return div.scrollWidth > div.clientWidth;
|
|
|
|
},
|
|
|
|
|
2012-08-01 02:21:07 +09:00
|
|
|
initPassiveLoading: function pdfViewInitPassiveLoading() {
|
2013-02-07 08:19:29 +09:00
|
|
|
var pdfDataRangeTransport = {
|
2013-04-20 05:53:22 +09:00
|
|
|
rangeListeners: [],
|
|
|
|
progressListeners: [],
|
2013-02-07 08:19:29 +09:00
|
|
|
|
2013-04-20 05:53:22 +09:00
|
|
|
addRangeListener: function PdfDataRangeTransport_addRangeListener(
|
|
|
|
listener) {
|
|
|
|
this.rangeListeners.push(listener);
|
|
|
|
},
|
|
|
|
|
|
|
|
addProgressListener: function PdfDataRangeTransport_addProgressListener(
|
|
|
|
listener) {
|
|
|
|
this.progressListeners.push(listener);
|
2013-02-07 08:19:29 +09:00
|
|
|
},
|
|
|
|
|
|
|
|
onDataRange: function PdfDataRangeTransport_onDataRange(begin, chunk) {
|
2013-04-20 05:53:22 +09:00
|
|
|
var listeners = this.rangeListeners;
|
|
|
|
for (var i = 0, n = listeners.length; i < n; ++i) {
|
|
|
|
listeners[i](begin, chunk);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
onDataProgress: function PdfDataRangeTransport_onDataProgress(loaded) {
|
|
|
|
var listeners = this.progressListeners;
|
|
|
|
for (var i = 0, n = listeners.length; i < n; ++i) {
|
|
|
|
listeners[i](loaded);
|
2013-02-07 08:19:29 +09:00
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
requestDataRange: function PdfDataRangeTransport_requestDataRange(
|
|
|
|
begin, end) {
|
|
|
|
FirefoxCom.request('requestDataRange', { begin: begin, end: end });
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
window.addEventListener('message', function windowMessage(e) {
|
2012-08-01 02:21:07 +09:00
|
|
|
var args = e.data;
|
|
|
|
|
2012-08-16 00:38:15 +09:00
|
|
|
if (typeof args !== 'object' || !('pdfjsLoadAction' in args))
|
2012-08-01 02:21:07 +09:00
|
|
|
return;
|
|
|
|
switch (args.pdfjsLoadAction) {
|
2013-02-07 08:19:29 +09:00
|
|
|
case 'supportsRangedLoading':
|
|
|
|
PDFView.open(args.pdfUrl, 0, undefined, pdfDataRangeTransport, {
|
|
|
|
length: args.length
|
|
|
|
});
|
|
|
|
break;
|
|
|
|
case 'range':
|
|
|
|
pdfDataRangeTransport.onDataRange(args.begin, args.chunk);
|
|
|
|
break;
|
2013-04-20 05:53:22 +09:00
|
|
|
case 'rangeProgress':
|
|
|
|
pdfDataRangeTransport.onDataProgress(args.loaded);
|
|
|
|
break;
|
2012-08-01 02:21:07 +09:00
|
|
|
case 'progress':
|
|
|
|
PDFView.progress(args.loaded / args.total);
|
|
|
|
break;
|
|
|
|
case 'complete':
|
2012-08-21 07:16:04 +09:00
|
|
|
if (!args.data) {
|
|
|
|
PDFView.error(mozL10n.get('loading_error', null,
|
|
|
|
'An error occurred while loading the PDF.'), e);
|
|
|
|
break;
|
|
|
|
}
|
2012-08-01 02:21:07 +09:00
|
|
|
PDFView.open(args.data, 0);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
FirefoxCom.requestSync('initPassiveLoading', null);
|
|
|
|
},
|
|
|
|
|
|
|
|
setTitleUsingUrl: function pdfViewSetTitleUsingUrl(url) {
|
|
|
|
this.url = url;
|
2012-08-27 08:49:07 +09:00
|
|
|
try {
|
2012-11-29 04:02:56 +09:00
|
|
|
this.setTitle(decodeURIComponent(getFileName(url)) || url);
|
2012-08-27 16:02:10 +09:00
|
|
|
} catch (e) {
|
|
|
|
// decodeURIComponent may throw URIError,
|
|
|
|
// fall back to using the unprocessed url in that case
|
2012-11-29 04:02:56 +09:00
|
|
|
this.setTitle(url);
|
2012-08-27 08:49:07 +09:00
|
|
|
}
|
2012-08-01 02:21:07 +09:00
|
|
|
},
|
|
|
|
|
2012-11-29 04:02:56 +09:00
|
|
|
setTitle: function pdfViewSetTitle(title) {
|
|
|
|
document.title = title;
|
|
|
|
//#if B2G
|
|
|
|
// document.getElementById('activityTitle').textContent = title;
|
|
|
|
//#endif
|
|
|
|
},
|
|
|
|
|
2013-02-07 08:19:29 +09:00
|
|
|
// TODO(mack): This function signature should really be pdfViewOpen(url, args)
|
|
|
|
open: function pdfViewOpen(url, scale, password,
|
|
|
|
pdfDataRangeTransport, args) {
|
2012-05-15 03:45:07 +09:00
|
|
|
var parameters = {password: password};
|
2012-05-18 04:00:29 +09:00
|
|
|
if (typeof url === 'string') { // URL
|
2012-08-01 02:21:07 +09:00
|
|
|
this.setTitleUsingUrl(url);
|
2012-07-27 02:11:28 +09:00
|
|
|
parameters.url = url;
|
2012-05-18 04:00:29 +09:00
|
|
|
} else if (url && 'byteLength' in url) { // ArrayBuffer
|
2012-05-15 03:45:07 +09:00
|
|
|
parameters.data = url;
|
|
|
|
}
|
2013-02-07 08:19:29 +09:00
|
|
|
if (args) {
|
|
|
|
for (var prop in args) {
|
|
|
|
parameters[prop] = args[prop];
|
|
|
|
}
|
|
|
|
}
|
2011-07-29 02:48:05 +09:00
|
|
|
|
2012-06-02 06:17:09 +09:00
|
|
|
this.pdfDocument = null;
|
2011-10-20 05:14:34 +09:00
|
|
|
var self = this;
|
2012-04-10 14:20:57 +09:00
|
|
|
self.loading = true;
|
2013-05-10 07:35:23 +09:00
|
|
|
var passwordNeeded = function passwordNeeded(updatePassword, reason) {
|
2013-09-25 00:46:54 +09:00
|
|
|
PasswordPrompt.updatePassword = updatePassword;
|
|
|
|
PasswordPrompt.reason = reason;
|
|
|
|
PasswordPrompt.show();
|
2013-05-10 07:35:23 +09:00
|
|
|
};
|
|
|
|
|
2013-06-06 04:28:31 +09:00
|
|
|
function getDocumentProgress(progressData) {
|
|
|
|
self.progress(progressData.loaded / progressData.total);
|
|
|
|
}
|
|
|
|
|
|
|
|
PDFJS.getDocument(parameters, pdfDataRangeTransport, passwordNeeded,
|
|
|
|
getDocumentProgress).then(
|
2012-04-10 14:20:57 +09:00
|
|
|
function getDocumentCallback(pdfDocument) {
|
|
|
|
self.load(pdfDocument, scale);
|
|
|
|
self.loading = false;
|
2011-09-28 20:21:07 +09:00
|
|
|
},
|
2012-04-10 14:20:57 +09:00
|
|
|
function getDocumentError(message, exception) {
|
2012-10-16 19:10:37 +09:00
|
|
|
var loadingErrorMessage = mozL10n.get('loading_error', null,
|
|
|
|
'An error occurred while loading the PDF.');
|
|
|
|
|
|
|
|
if (exception && exception.name === 'InvalidPDFException') {
|
|
|
|
// change error message also for other builds
|
|
|
|
var loadingErrorMessage = mozL10n.get('invalid_file_error', null,
|
|
|
|
'Invalid or corrupted PDF file.');
|
|
|
|
//#if B2G
|
|
|
|
// window.alert(loadingErrorMessage);
|
|
|
|
// return window.close();
|
|
|
|
//#endif
|
|
|
|
}
|
|
|
|
|
2013-01-30 03:13:28 +09:00
|
|
|
if (exception && exception.name === 'MissingPDFException') {
|
|
|
|
// special message for missing PDF's
|
|
|
|
var loadingErrorMessage = mozL10n.get('missing_file_error', null,
|
|
|
|
'Missing PDF file.');
|
|
|
|
|
|
|
|
//#if B2G
|
|
|
|
// window.alert(loadingErrorMessage);
|
|
|
|
// return window.close();
|
|
|
|
//#endif
|
|
|
|
}
|
|
|
|
|
2012-04-10 14:20:57 +09:00
|
|
|
var moreInfo = {
|
|
|
|
message: message
|
|
|
|
};
|
2012-10-16 19:10:37 +09:00
|
|
|
self.error(loadingErrorMessage, moreInfo);
|
2011-10-20 05:14:34 +09:00
|
|
|
self.loading = false;
|
2012-04-10 14:20:57 +09:00
|
|
|
}
|
|
|
|
);
|
2011-07-29 02:48:05 +09:00
|
|
|
},
|
|
|
|
|
2011-10-19 13:29:14 +09:00
|
|
|
download: function pdfViewDownload() {
|
2013-07-03 00:15:32 +09:00
|
|
|
function noData() {
|
2013-07-13 03:14:13 +09:00
|
|
|
downloadManager.downloadUrl(url, filename);
|
2013-03-25 02:25:57 +09:00
|
|
|
}
|
2013-07-13 03:14:13 +09:00
|
|
|
|
|
|
|
var url = this.url.split('#')[0];
|
|
|
|
var filename = getPDFFileNameFromURL(url);
|
|
|
|
var downloadManager = new DownloadManager();
|
|
|
|
downloadManager.onerror = function (err) {
|
|
|
|
// This error won't really be helpful because it's likely the
|
|
|
|
// fallback won't work either (or is already open).
|
|
|
|
PDFView.error('PDF failed to download.');
|
|
|
|
};
|
|
|
|
|
|
|
|
if (!this.pdfDocument) { // the PDF is not ready yet
|
|
|
|
noData();
|
|
|
|
return;
|
2013-07-03 00:15:32 +09:00
|
|
|
}
|
2013-07-13 03:14:13 +09:00
|
|
|
|
2013-07-03 00:15:32 +09:00
|
|
|
this.pdfDocument.getData().then(
|
|
|
|
function getDataSuccess(data) {
|
2013-09-01 23:45:26 +09:00
|
|
|
var blob = PDFJS.createBlob(data, 'application/pdf');
|
2013-07-13 03:14:13 +09:00
|
|
|
downloadManager.download(blob, url, filename);
|
2013-07-03 00:15:32 +09:00
|
|
|
},
|
|
|
|
noData // Error occurred try downloading with just the url.
|
2013-07-11 05:07:23 +09:00
|
|
|
).then(null, noData);
|
2011-10-19 13:29:14 +09:00
|
|
|
},
|
|
|
|
|
2012-05-26 06:52:00 +09:00
|
|
|
fallback: function pdfViewFallback() {
|
2012-08-02 03:29:13 +09:00
|
|
|
//#if !(FIREFOX || MOZCENTRAL)
|
2012-08-09 01:38:45 +09:00
|
|
|
// return;
|
2012-08-02 03:29:13 +09:00
|
|
|
//#else
|
|
|
|
// // Only trigger the fallback once so we don't spam the user with messages
|
|
|
|
// // for one PDF.
|
|
|
|
// if (this.fellback)
|
|
|
|
// return;
|
|
|
|
// this.fellback = true;
|
|
|
|
// var url = this.url.split('#')[0];
|
|
|
|
// FirefoxCom.request('fallback', url, function response(download) {
|
|
|
|
// if (!download)
|
|
|
|
// return;
|
|
|
|
// PDFView.download();
|
|
|
|
// });
|
|
|
|
//#endif
|
2012-05-11 07:54:58 +09:00
|
|
|
},
|
|
|
|
|
2011-10-05 04:21:40 +09:00
|
|
|
navigateTo: function pdfViewNavigateTo(dest) {
|
2013-06-06 05:15:39 +09:00
|
|
|
var destString = '';
|
2013-04-23 09:19:15 +09:00
|
|
|
var self = this;
|
2013-06-06 05:15:39 +09:00
|
|
|
|
|
|
|
var goToDestination = function(destRef) {
|
|
|
|
self.pendingRefStr = null;
|
2013-04-23 09:19:15 +09:00
|
|
|
// dest array looks like that: <page-ref> </XYZ|FitXXX> <args..>
|
|
|
|
var pageNumber = destRef instanceof Object ?
|
|
|
|
self.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] :
|
|
|
|
(destRef + 1);
|
|
|
|
if (pageNumber) {
|
|
|
|
if (pageNumber > self.pages.length) {
|
|
|
|
pageNumber = self.pages.length;
|
|
|
|
}
|
2013-05-16 07:31:17 +09:00
|
|
|
var currentPage = self.pages[pageNumber - 1];
|
|
|
|
currentPage.scrollIntoView(dest);
|
|
|
|
|
|
|
|
// Update the browsing history.
|
|
|
|
PDFHistory.push({ dest: dest, hash: destString, page: pageNumber });
|
2013-06-06 05:15:39 +09:00
|
|
|
} else {
|
|
|
|
self.pendingRefStrLoaded = new PDFJS.Promise();
|
|
|
|
self.pendingRefStr = destRef.num + ' ' + destRef.gen + ' R';
|
|
|
|
self.pendingRefStrLoaded.then(function() {
|
|
|
|
goToDestination(destRef);
|
|
|
|
});
|
2013-04-23 09:19:15 +09:00
|
|
|
}
|
2013-06-06 05:15:39 +09:00
|
|
|
};
|
|
|
|
|
|
|
|
this.destinationsPromise.then(function() {
|
|
|
|
if (typeof dest === 'string') {
|
|
|
|
destString = dest;
|
|
|
|
dest = self.destinations[dest];
|
|
|
|
}
|
|
|
|
if (!(dest instanceof Array)) {
|
|
|
|
return; // invalid destination
|
|
|
|
}
|
|
|
|
goToDestination(dest[0]);
|
2013-04-23 09:19:15 +09:00
|
|
|
});
|
2011-08-20 12:41:56 +09:00
|
|
|
},
|
|
|
|
|
2011-10-05 04:21:40 +09:00
|
|
|
getDestinationHash: function pdfViewGetDestinationHash(dest) {
|
2011-10-02 03:54:37 +09:00
|
|
|
if (typeof dest === 'string')
|
2012-01-25 08:46:53 +09:00
|
|
|
return PDFView.getAnchorUrl('#' + escape(dest));
|
2011-10-02 03:54:37 +09:00
|
|
|
if (dest instanceof Array) {
|
2011-10-15 11:05:57 +09:00
|
|
|
var destRef = dest[0]; // see navigateTo method for dest format
|
2011-10-02 03:54:37 +09:00
|
|
|
var pageNumber = destRef instanceof Object ?
|
2011-10-02 04:03:04 +09:00
|
|
|
this.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] :
|
|
|
|
(destRef + 1);
|
2011-10-02 03:54:37 +09:00
|
|
|
if (pageNumber) {
|
2012-01-25 08:46:53 +09:00
|
|
|
var pdfOpenParams = PDFView.getAnchorUrl('#page=' + pageNumber);
|
2011-12-01 09:54:04 +09:00
|
|
|
var destKind = dest[1];
|
2012-02-18 09:40:56 +09:00
|
|
|
if (typeof destKind === 'object' && 'name' in destKind &&
|
|
|
|
destKind.name == 'XYZ') {
|
2013-05-16 07:31:17 +09:00
|
|
|
var scale = (dest[4] || this.currentScaleValue);
|
|
|
|
var scaleNumber = parseFloat(scale);
|
|
|
|
if (scaleNumber) {
|
|
|
|
scale = scaleNumber * 100;
|
|
|
|
}
|
|
|
|
pdfOpenParams += '&zoom=' + scale;
|
2011-10-15 11:05:57 +09:00
|
|
|
if (dest[2] || dest[3]) {
|
|
|
|
pdfOpenParams += ',' + (dest[2] || 0) + ',' + (dest[3] || 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return pdfOpenParams;
|
2011-10-02 03:54:37 +09:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return '';
|
|
|
|
},
|
|
|
|
|
2012-01-25 08:46:53 +09:00
|
|
|
/**
|
|
|
|
* 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) {
|
2012-08-02 03:29:13 +09:00
|
|
|
//#if !(FIREFOX || MOZCENTRAL)
|
2012-01-25 08:46:53 +09:00
|
|
|
return anchor;
|
2012-08-02 03:29:13 +09:00
|
|
|
//#else
|
|
|
|
// return this.url.split('#')[0] + anchor;
|
|
|
|
//#endif
|
2012-01-25 08:46:53 +09:00
|
|
|
},
|
|
|
|
|
2012-10-20 03:05:12 +09:00
|
|
|
|
2011-11-30 04:28:05 +09:00
|
|
|
/**
|
|
|
|
* Show the error box.
|
|
|
|
* @param {String} message A message that is human readable.
|
|
|
|
* @param {Object} moreInfo (optional) Further information about the error
|
|
|
|
* that is more technical. Should have a 'message'
|
|
|
|
* and optionally a 'stack' property.
|
|
|
|
*/
|
|
|
|
error: function pdfViewError(message, moreInfo) {
|
2013-01-05 02:01:31 +09:00
|
|
|
var moreInfoText = mozL10n.get('error_version_info',
|
|
|
|
{version: PDFJS.version || '?', build: PDFJS.build || '?'},
|
|
|
|
'PDF.js v{{version}} (build: {{build}})') + '\n';
|
2012-05-15 09:19:09 +09:00
|
|
|
if (moreInfo) {
|
|
|
|
moreInfoText +=
|
|
|
|
mozL10n.get('error_message', {message: moreInfo.message},
|
|
|
|
'Message: {{message}}');
|
|
|
|
if (moreInfo.stack) {
|
|
|
|
moreInfoText += '\n' +
|
|
|
|
mozL10n.get('error_stack', {stack: moreInfo.stack},
|
|
|
|
'Stack: {{stack}}');
|
|
|
|
} else {
|
|
|
|
if (moreInfo.filename) {
|
|
|
|
moreInfoText += '\n' +
|
|
|
|
mozL10n.get('error_file', {file: moreInfo.filename},
|
|
|
|
'File: {{file}}');
|
|
|
|
}
|
|
|
|
if (moreInfo.lineNumber) {
|
|
|
|
moreInfoText += '\n' +
|
|
|
|
mozL10n.get('error_line', {line: moreInfo.lineNumber},
|
|
|
|
'Line: {{line}}');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2012-08-23 00:48:56 +09:00
|
|
|
|
2012-08-02 03:29:13 +09:00
|
|
|
//#if !(FIREFOX || MOZCENTRAL)
|
2011-11-29 09:55:09 +09:00
|
|
|
var errorWrapper = document.getElementById('errorWrapper');
|
|
|
|
errorWrapper.removeAttribute('hidden');
|
|
|
|
|
|
|
|
var errorMessage = document.getElementById('errorMessage');
|
2012-01-21 07:48:57 +09:00
|
|
|
errorMessage.textContent = message;
|
2011-11-29 09:55:09 +09:00
|
|
|
|
2011-11-30 04:28:05 +09:00
|
|
|
var closeButton = document.getElementById('errorClose');
|
|
|
|
closeButton.onclick = function() {
|
|
|
|
errorWrapper.setAttribute('hidden', 'true');
|
|
|
|
};
|
|
|
|
|
|
|
|
var errorMoreInfo = document.getElementById('errorMoreInfo');
|
|
|
|
var moreInfoButton = document.getElementById('errorShowMore');
|
|
|
|
var lessInfoButton = document.getElementById('errorShowLess');
|
|
|
|
moreInfoButton.onclick = function() {
|
|
|
|
errorMoreInfo.removeAttribute('hidden');
|
|
|
|
moreInfoButton.setAttribute('hidden', 'true');
|
|
|
|
lessInfoButton.removeAttribute('hidden');
|
2013-07-18 07:40:15 +09:00
|
|
|
errorMoreInfo.style.height = errorMoreInfo.scrollHeight + 'px';
|
2011-11-30 04:28:05 +09:00
|
|
|
};
|
|
|
|
lessInfoButton.onclick = function() {
|
|
|
|
errorMoreInfo.setAttribute('hidden', 'true');
|
2011-11-29 09:55:09 +09:00
|
|
|
moreInfoButton.removeAttribute('hidden');
|
2011-11-30 04:28:05 +09:00
|
|
|
lessInfoButton.setAttribute('hidden', 'true');
|
|
|
|
};
|
2013-07-31 06:36:45 +09:00
|
|
|
moreInfoButton.oncontextmenu = noContextMenuHandler;
|
|
|
|
lessInfoButton.oncontextmenu = noContextMenuHandler;
|
|
|
|
closeButton.oncontextmenu = noContextMenuHandler;
|
2011-11-30 04:28:05 +09:00
|
|
|
moreInfoButton.removeAttribute('hidden');
|
|
|
|
lessInfoButton.setAttribute('hidden', 'true');
|
2012-05-15 09:19:09 +09:00
|
|
|
errorMoreInfo.value = moreInfoText;
|
2012-08-02 03:29:13 +09:00
|
|
|
//#else
|
|
|
|
// console.error(message + '\n' + moreInfoText);
|
|
|
|
// this.fallback();
|
|
|
|
//#endif
|
2011-09-28 19:53:53 +09:00
|
|
|
},
|
|
|
|
|
2011-10-05 04:21:40 +09:00
|
|
|
progress: function pdfViewProgress(level) {
|
2011-09-28 19:53:53 +09:00
|
|
|
var percent = Math.round(level * 100);
|
2013-04-24 02:00:31 +09:00
|
|
|
// When we transition from full request to range requests, it's possible
|
|
|
|
// that we discard some of the loaded data. This can cause the loading
|
|
|
|
// bar to move backwards. So prevent this by only updating the bar if it
|
|
|
|
// increases.
|
|
|
|
if (percent > PDFView.loadingBar.percent) {
|
|
|
|
PDFView.loadingBar.percent = percent;
|
|
|
|
}
|
2011-09-28 19:53:53 +09:00
|
|
|
},
|
|
|
|
|
2012-04-10 14:20:57 +09:00
|
|
|
load: function pdfViewLoad(pdfDocument, scale) {
|
2011-11-25 03:53:11 +09:00
|
|
|
function bindOnAfterDraw(pageView, thumbnailView) {
|
|
|
|
// when page is painted, using the image as thumbnail base
|
|
|
|
pageView.onAfterDraw = function pdfViewLoadOnAfterDraw() {
|
|
|
|
thumbnailView.setImage(pageView.canvas);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2013-08-23 03:03:51 +09:00
|
|
|
PDFFindController.reset();
|
|
|
|
|
2012-06-02 06:17:09 +09:00
|
|
|
this.pdfDocument = pdfDocument;
|
|
|
|
|
2011-11-30 04:28:05 +09:00
|
|
|
var errorWrapper = document.getElementById('errorWrapper');
|
|
|
|
errorWrapper.setAttribute('hidden', 'true');
|
|
|
|
|
2013-02-07 08:19:29 +09:00
|
|
|
pdfDocument.dataLoaded().then(function() {
|
2013-07-19 01:28:59 +09:00
|
|
|
PDFView.loadingBar.hide();
|
2013-02-07 08:19:29 +09:00
|
|
|
var outerContainer = document.getElementById('outerContainer');
|
|
|
|
outerContainer.classList.remove('loadingInProgress');
|
|
|
|
});
|
2011-09-28 19:53:53 +09:00
|
|
|
|
2012-04-13 07:08:07 +09:00
|
|
|
var thumbsView = document.getElementById('thumbnailView');
|
|
|
|
thumbsView.parentNode.scrollTop = 0;
|
2011-07-29 02:48:05 +09:00
|
|
|
|
2012-04-13 07:08:07 +09:00
|
|
|
while (thumbsView.hasChildNodes())
|
|
|
|
thumbsView.removeChild(thumbsView.lastChild);
|
2011-10-18 03:39:29 +09:00
|
|
|
|
2012-04-13 07:08:07 +09:00
|
|
|
if ('_loadingInterval' in thumbsView)
|
|
|
|
clearInterval(thumbsView._loadingInterval);
|
2011-07-29 02:48:05 +09:00
|
|
|
|
|
|
|
var container = document.getElementById('viewer');
|
|
|
|
while (container.hasChildNodes())
|
|
|
|
container.removeChild(container.lastChild);
|
|
|
|
|
2012-04-10 14:20:57 +09:00
|
|
|
var pagesCount = pdfDocument.numPages;
|
2013-06-19 01:05:55 +09:00
|
|
|
|
2012-04-10 14:20:57 +09:00
|
|
|
var id = pdfDocument.fingerprint;
|
2012-05-01 08:32:37 +09:00
|
|
|
document.getElementById('numPages').textContent =
|
2012-05-04 22:37:08 +09:00
|
|
|
mozL10n.get('page_of', {pageCount: pagesCount}, 'of {{pageCount}}');
|
2011-10-02 05:52:27 +09:00
|
|
|
document.getElementById('pageNumber').max = pagesCount;
|
2012-10-11 02:26:41 +09:00
|
|
|
|
2011-12-26 08:42:46 +09:00
|
|
|
PDFView.documentFingerprint = id;
|
2011-12-26 23:07:24 +09:00
|
|
|
var store = PDFView.store = new Settings(id);
|
2011-07-29 02:48:05 +09:00
|
|
|
|
2012-09-08 08:05:14 +09:00
|
|
|
this.pageRotation = 0;
|
|
|
|
|
2011-07-29 02:48:05 +09:00
|
|
|
var pages = this.pages = [];
|
2013-03-09 11:08:37 +09:00
|
|
|
var pagesRefMap = this.pagesRefMap = {};
|
2011-07-29 02:48:05 +09:00
|
|
|
var thumbnails = this.thumbnails = [];
|
2013-03-09 11:08:37 +09:00
|
|
|
|
2013-04-23 09:19:15 +09:00
|
|
|
var pagesPromise = this.pagesPromise = new PDFJS.Promise();
|
2012-04-10 14:20:57 +09:00
|
|
|
var self = this;
|
|
|
|
|
2013-03-09 11:08:37 +09:00
|
|
|
var firstPagePromise = pdfDocument.getPage(1);
|
|
|
|
|
|
|
|
// Fetch a single page so we can get a viewport that will be the default
|
|
|
|
// viewport for all pages
|
|
|
|
firstPagePromise.then(function(pdfPage) {
|
2013-10-03 01:05:46 +09:00
|
|
|
var viewport = pdfPage.getViewport((scale || 1.0) * CSS_UNITS);
|
2013-03-09 11:08:37 +09:00
|
|
|
var pagePromises = [];
|
|
|
|
for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {
|
|
|
|
var viewportClone = viewport.clone();
|
|
|
|
var pageView = new PageView(container, pageNum, scale,
|
|
|
|
self.navigateTo.bind(self),
|
|
|
|
viewportClone);
|
|
|
|
var thumbnailView = new ThumbnailView(thumbsView, pageNum,
|
|
|
|
viewportClone);
|
|
|
|
bindOnAfterDraw(pageView, thumbnailView);
|
2012-04-10 14:20:57 +09:00
|
|
|
pages.push(pageView);
|
|
|
|
thumbnails.push(thumbnailView);
|
|
|
|
}
|
2011-07-29 02:48:05 +09:00
|
|
|
|
2013-03-09 11:08:37 +09:00
|
|
|
var event = document.createEvent('CustomEvent');
|
|
|
|
event.initCustomEvent('documentload', true, true, {});
|
|
|
|
window.dispatchEvent(event);
|
|
|
|
|
2013-07-19 01:28:59 +09:00
|
|
|
PDFView.loadingBar.setWidth(container);
|
|
|
|
|
2013-03-09 11:08:37 +09:00
|
|
|
for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {
|
|
|
|
var pagePromise = pdfDocument.getPage(pageNum);
|
|
|
|
pagePromise.then(function(pdfPage) {
|
|
|
|
var pageNum = pdfPage.pageNumber;
|
|
|
|
var pageView = pages[pageNum - 1];
|
|
|
|
if (!pageView.pdfPage) {
|
|
|
|
// The pdfPage might already be set if we've already entered
|
|
|
|
// pageView.draw()
|
|
|
|
pageView.setPdfPage(pdfPage);
|
|
|
|
}
|
|
|
|
var thumbnailView = thumbnails[pageNum - 1];
|
|
|
|
if (!thumbnailView.pdfPage) {
|
|
|
|
thumbnailView.setPdfPage(pdfPage);
|
|
|
|
}
|
|
|
|
|
|
|
|
var pageRef = pdfPage.ref;
|
|
|
|
var refStr = pageRef.num + ' ' + pageRef.gen + ' R';
|
|
|
|
pagesRefMap[refStr] = pdfPage.pageNumber;
|
2013-06-06 05:15:39 +09:00
|
|
|
|
|
|
|
if (self.pendingRefStr && self.pendingRefStr === refStr) {
|
|
|
|
self.pendingRefStrLoaded.resolve();
|
|
|
|
}
|
2013-03-09 11:08:37 +09:00
|
|
|
});
|
|
|
|
pagePromises.push(pagePromise);
|
|
|
|
}
|
|
|
|
|
2013-09-05 07:25:19 +09:00
|
|
|
PDFFindController.firstPagePromise.resolve();
|
|
|
|
|
2013-03-09 11:08:37 +09:00
|
|
|
PDFJS.Promise.all(pagePromises).then(function(pages) {
|
|
|
|
pagesPromise.resolve(pages);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
var storePromise = store.initializedPromise;
|
|
|
|
PDFJS.Promise.all([firstPagePromise, storePromise]).then(function() {
|
2013-05-27 05:53:55 +09:00
|
|
|
var storedHash = null;
|
2013-03-09 11:08:37 +09:00
|
|
|
if (store.get('exists', false)) {
|
2013-05-27 05:53:55 +09:00
|
|
|
var pageNum = store.get('page', '1');
|
2013-03-09 11:08:37 +09:00
|
|
|
var zoom = store.get('zoom', PDFView.currentScale);
|
|
|
|
var left = store.get('scrollLeft', '0');
|
|
|
|
var top = store.get('scrollTop', '0');
|
2013-03-01 08:29:07 +09:00
|
|
|
|
2013-03-09 11:08:37 +09:00
|
|
|
storedHash = 'page=' + pageNum + '&zoom=' + zoom + ',' +
|
2013-05-16 07:31:17 +09:00
|
|
|
left + ',' + top;
|
2013-03-09 11:08:37 +09:00
|
|
|
}
|
2013-05-16 07:31:17 +09:00
|
|
|
// Initialize the browsing history.
|
2013-05-27 05:53:55 +09:00
|
|
|
PDFHistory.initialize(self.documentFingerprint);
|
2013-05-16 07:31:17 +09:00
|
|
|
|
2013-03-09 11:08:37 +09:00
|
|
|
self.setInitialView(storedHash, scale);
|
2013-04-30 23:44:51 +09:00
|
|
|
|
|
|
|
// Make all navigation keys work on document load,
|
2013-07-20 23:33:40 +09:00
|
|
|
// unless the viewer is embedded in a web page.
|
|
|
|
if (!self.isViewerEmbedded) {
|
|
|
|
self.container.focus();
|
2013-07-20 05:09:37 +09:00
|
|
|
//#if (FIREFOX || MOZCENTRAL)
|
2013-07-20 23:33:40 +09:00
|
|
|
// self.container.blur();
|
2013-07-20 05:09:37 +09:00
|
|
|
//#endif
|
2013-04-30 23:44:51 +09:00
|
|
|
}
|
2013-03-09 11:08:37 +09:00
|
|
|
});
|
|
|
|
|
|
|
|
pagesPromise.then(function() {
|
2013-03-01 08:29:07 +09:00
|
|
|
if (PDFView.supportsPrinting) {
|
|
|
|
pdfDocument.getJavaScript().then(function(javaScript) {
|
|
|
|
if (javaScript.length) {
|
2013-03-17 00:13:08 +09:00
|
|
|
console.warn('Warning: JavaScript is not supported');
|
2013-03-01 08:29:07 +09:00
|
|
|
PDFView.fallback();
|
|
|
|
}
|
|
|
|
// Hack to support auto printing.
|
|
|
|
var regex = /\bprint\s*\(/g;
|
|
|
|
for (var i = 0, ii = javaScript.length; i < ii; i++) {
|
|
|
|
var js = javaScript[i];
|
|
|
|
if (js && regex.test(js)) {
|
|
|
|
setTimeout(function() {
|
|
|
|
window.print();
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2012-04-10 14:20:57 +09:00
|
|
|
});
|
2011-12-01 10:04:45 +09:00
|
|
|
|
2013-04-23 09:19:15 +09:00
|
|
|
var destinationsPromise =
|
|
|
|
this.destinationsPromise = pdfDocument.getDestinations();
|
2012-04-10 14:20:57 +09:00
|
|
|
destinationsPromise.then(function(destinations) {
|
|
|
|
self.destinations = destinations;
|
|
|
|
});
|
|
|
|
|
2013-03-09 11:08:37 +09:00
|
|
|
// outline depends on destinations and pagesRefMap
|
|
|
|
var promises = [pagesPromise, destinationsPromise,
|
2013-01-26 04:58:49 +09:00
|
|
|
PDFView.animationStartedPromise];
|
2012-10-03 08:16:42 +09:00
|
|
|
PDFJS.Promise.all(promises).then(function() {
|
2012-04-10 14:20:57 +09:00
|
|
|
pdfDocument.getOutline().then(function(outline) {
|
|
|
|
self.outline = new DocumentOutlineView(outline);
|
2013-04-06 23:01:44 +09:00
|
|
|
document.getElementById('viewOutline').disabled = !outline;
|
2012-04-10 14:20:57 +09:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2012-04-13 07:56:17 +09:00
|
|
|
pdfDocument.getMetadata().then(function(data) {
|
|
|
|
var info = data.info, metadata = data.metadata;
|
2012-04-10 14:20:57 +09:00
|
|
|
self.documentInfo = info;
|
|
|
|
self.metadata = metadata;
|
|
|
|
|
2012-11-06 02:12:17 +09:00
|
|
|
// Provides some basic debug information
|
|
|
|
console.log('PDF ' + pdfDocument.fingerprint + ' [' +
|
|
|
|
info.PDFFormatVersion + ' ' + (info.Producer || '-') +
|
2013-01-05 02:01:31 +09:00
|
|
|
' / ' + (info.Creator || '-') + ']' +
|
|
|
|
(PDFJS.version ? ' (PDF.js: ' + PDFJS.version + ')' : ''));
|
2012-11-06 02:12:17 +09:00
|
|
|
|
2012-04-10 14:20:57 +09:00
|
|
|
var pdfTitle;
|
|
|
|
if (metadata) {
|
|
|
|
if (metadata.has('dc:title'))
|
|
|
|
pdfTitle = metadata.get('dc:title');
|
|
|
|
}
|
2011-10-02 03:54:37 +09:00
|
|
|
|
2012-04-10 14:20:57 +09:00
|
|
|
if (!pdfTitle && info && info['Title'])
|
|
|
|
pdfTitle = info['Title'];
|
|
|
|
|
|
|
|
if (pdfTitle)
|
2012-11-29 04:02:56 +09:00
|
|
|
self.setTitle(pdfTitle + ' - ' + document.title);
|
2013-02-01 06:46:44 +09:00
|
|
|
|
|
|
|
if (info.IsAcroFormPresent) {
|
2013-03-17 00:13:08 +09:00
|
|
|
console.warn('Warning: AcroForm/XFA is not supported');
|
2013-02-01 06:46:44 +09:00
|
|
|
PDFView.fallback();
|
|
|
|
}
|
2013-08-16 23:53:05 +09:00
|
|
|
|
|
|
|
//#if (FIREFOX || MOZCENTRAL)
|
|
|
|
// var versionId = String(info.PDFFormatVersion).slice(-1) | 0;
|
|
|
|
// var generatorId = 0;
|
|
|
|
// var KNOWN_GENERATORS = ["acrobat distiller", "acrobat pdfwritter",
|
|
|
|
// "adobe livecycle", "adobe pdf library", "adobe photoshop", "ghostscript",
|
|
|
|
// "tcpdf", "cairo", "dvipdfm", "dvips", "pdftex", "pdfkit", "itext",
|
|
|
|
// "prince", "quarkxpress", "mac os x", "microsoft", "openoffice", "oracle",
|
|
|
|
// "luradocument", "pdf-xchange", "antenna house", "aspose.cells", "fpdf"];
|
|
|
|
// var generatorId = 0;
|
|
|
|
// if (info.Producer) {
|
|
|
|
// KNOWN_GENERATORS.some(function (generator, s, i) {
|
|
|
|
// if (generator.indexOf(s) < 0) {
|
|
|
|
// return false;
|
|
|
|
// }
|
|
|
|
// generatorId = i + 1;
|
|
|
|
// return true;
|
|
|
|
// }.bind(null, info.Producer.toLowerCase()));
|
|
|
|
// }
|
|
|
|
// var formType = !info.IsAcroFormPresent ? null : info.IsXFAPresent ?
|
|
|
|
// 'xfa' : 'acroform';
|
|
|
|
// FirefoxCom.request('reportTelemetry', JSON.stringify({
|
|
|
|
// type: 'documentInfo',
|
|
|
|
// version: versionId,
|
|
|
|
// generator: generatorId,
|
|
|
|
// formType: formType
|
|
|
|
// }));
|
|
|
|
//#endif
|
2012-04-10 14:20:57 +09:00
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
setInitialView: function pdfViewSetInitialView(storedHash, scale) {
|
2012-01-04 17:24:09 +09:00
|
|
|
// Reset the current scale, as otherwise the page's scale might not get
|
|
|
|
// updated if the zoom level stayed the same.
|
|
|
|
this.currentScale = 0;
|
|
|
|
this.currentScaleValue = null;
|
2013-08-02 23:09:33 +09:00
|
|
|
// When opening a new file (when one is already loaded in the viewer):
|
|
|
|
// Reset 'currentPageNumber', since otherwise the page's scale will be wrong
|
|
|
|
// if 'currentPageNumber' is larger than the number of pages in the file.
|
|
|
|
document.getElementById('pageNumber').value = currentPageNumber = 1;
|
|
|
|
|
2013-05-16 07:31:17 +09:00
|
|
|
if (PDFHistory.initialDestination) {
|
|
|
|
this.navigateTo(PDFHistory.initialDestination);
|
|
|
|
PDFHistory.initialDestination = null;
|
|
|
|
} else if (this.initialBookmark) {
|
2011-10-02 03:54:37 +09:00
|
|
|
this.setHash(this.initialBookmark);
|
2013-05-27 05:53:55 +09:00
|
|
|
PDFHistory.push({ hash: this.initialBookmark }, !!this.initialBookmark);
|
2011-10-02 03:54:37 +09:00
|
|
|
this.initialBookmark = null;
|
2013-05-16 07:31:17 +09:00
|
|
|
} else if (storedHash) {
|
2011-12-29 10:18:55 +09:00
|
|
|
this.setHash(storedHash);
|
2013-05-16 07:31:17 +09:00
|
|
|
} else if (scale) {
|
2013-08-05 21:52:24 +09:00
|
|
|
this.parseScale(scale, true);
|
2011-10-02 03:54:37 +09:00
|
|
|
this.page = 1;
|
2011-12-29 10:18:55 +09:00
|
|
|
}
|
2012-01-26 12:52:10 +09:00
|
|
|
|
2012-11-10 06:34:11 +09:00
|
|
|
if (PDFView.currentScale === UNKNOWN_SCALE) {
|
2012-01-26 12:52:10 +09:00
|
|
|
// Scale was not initialized: invalid bookmark or scale was not specified.
|
|
|
|
// Setting the default one.
|
2013-08-05 21:52:24 +09:00
|
|
|
this.parseScale(DEFAULT_SCALE, true);
|
2012-01-26 12:52:10 +09:00
|
|
|
}
|
2011-10-02 03:54:37 +09:00
|
|
|
},
|
|
|
|
|
2012-06-19 01:48:47 +09:00
|
|
|
renderHighestPriority: function pdfViewRenderHighestPriority() {
|
|
|
|
// Pages have a higher priority than thumbnails, so check them first.
|
|
|
|
var visiblePages = this.getVisiblePages();
|
|
|
|
var pageView = this.getHighestPriority(visiblePages, this.pages,
|
|
|
|
this.pageViewScroll.down);
|
|
|
|
if (pageView) {
|
|
|
|
this.renderView(pageView, 'page');
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
// No pages needed rendering so check thumbnails.
|
|
|
|
if (this.sidebarOpen) {
|
|
|
|
var visibleThumbs = this.getVisibleThumbs();
|
|
|
|
var thumbView = this.getHighestPriority(visibleThumbs,
|
|
|
|
this.thumbnails,
|
|
|
|
this.thumbnailViewScroll.down);
|
|
|
|
if (thumbView)
|
|
|
|
this.renderView(thumbView, 'thumbnail');
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2012-08-08 08:52:22 +09:00
|
|
|
getHighestPriority: function pdfViewGetHighestPriority(visible, views,
|
2012-06-19 01:48:47 +09:00
|
|
|
scrolledDown) {
|
|
|
|
// The state has changed figure out which page has the highest priority to
|
|
|
|
// render next (if any).
|
|
|
|
// Priority:
|
|
|
|
// 1 visible pages
|
|
|
|
// 2 if last scrolled down page after the visible pages
|
|
|
|
// 2 if last scrolled up page before the visible pages
|
2012-08-08 08:52:22 +09:00
|
|
|
var visibleViews = visible.views;
|
|
|
|
|
2012-06-19 01:48:47 +09:00
|
|
|
var numVisible = visibleViews.length;
|
|
|
|
if (numVisible === 0) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
for (var i = 0; i < numVisible; ++i) {
|
|
|
|
var view = visibleViews[i].view;
|
2012-07-31 00:12:49 +09:00
|
|
|
if (!this.isViewFinished(view))
|
2012-06-19 01:48:47 +09:00
|
|
|
return view;
|
|
|
|
}
|
|
|
|
|
|
|
|
// All the visible views have rendered, try to render next/previous pages.
|
|
|
|
if (scrolledDown) {
|
2012-08-08 08:52:22 +09:00
|
|
|
var nextPageIndex = visible.last.id;
|
2012-06-19 01:48:47 +09:00
|
|
|
// ID's start at 1 so no need to add 1.
|
2012-07-31 00:12:49 +09:00
|
|
|
if (views[nextPageIndex] && !this.isViewFinished(views[nextPageIndex]))
|
2012-06-19 01:48:47 +09:00
|
|
|
return views[nextPageIndex];
|
|
|
|
} else {
|
2012-08-08 08:52:22 +09:00
|
|
|
var previousPageIndex = visible.first.id - 2;
|
2012-06-19 01:48:47 +09:00
|
|
|
if (views[previousPageIndex] &&
|
2012-07-31 00:12:49 +09:00
|
|
|
!this.isViewFinished(views[previousPageIndex]))
|
2012-06-19 01:48:47 +09:00
|
|
|
return views[previousPageIndex];
|
|
|
|
}
|
|
|
|
// Everything that needs to be rendered has been.
|
|
|
|
return false;
|
|
|
|
},
|
|
|
|
|
2012-07-31 00:12:49 +09:00
|
|
|
isViewFinished: function pdfViewNeedsRendering(view) {
|
2012-06-19 01:48:47 +09:00
|
|
|
return view.renderingState === RenderingStates.FINISHED;
|
|
|
|
},
|
|
|
|
|
|
|
|
// Render a page or thumbnail view. This calls the appropriate function based
|
|
|
|
// on the views state. If the view is already rendered it will return false.
|
|
|
|
renderView: function pdfViewRender(view, type) {
|
|
|
|
var state = view.renderingState;
|
|
|
|
switch (state) {
|
|
|
|
case RenderingStates.FINISHED:
|
|
|
|
return false;
|
|
|
|
case RenderingStates.PAUSED:
|
|
|
|
PDFView.highestPriorityPage = type + view.id;
|
|
|
|
view.resume();
|
|
|
|
break;
|
|
|
|
case RenderingStates.RUNNING:
|
|
|
|
PDFView.highestPriorityPage = type + view.id;
|
|
|
|
break;
|
|
|
|
case RenderingStates.INITIAL:
|
|
|
|
PDFView.highestPriorityPage = type + view.id;
|
|
|
|
view.draw(this.renderHighestPriority.bind(this));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
},
|
|
|
|
|
2011-10-05 04:21:40 +09:00
|
|
|
setHash: function pdfViewSetHash(hash) {
|
2011-10-02 03:54:37 +09:00
|
|
|
if (!hash)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (hash.indexOf('=') >= 0) {
|
2012-02-16 09:03:04 +09:00
|
|
|
var params = PDFView.parseQueryString(hash);
|
2011-10-15 11:05:57 +09:00
|
|
|
// borrowing syntax from "Parameters for Opening PDF Files"
|
|
|
|
if ('nameddest' in params) {
|
2013-05-27 05:53:55 +09:00
|
|
|
PDFHistory.updateNextHashParam(params.nameddest);
|
2011-10-15 11:05:57 +09:00
|
|
|
PDFView.navigateTo(params.nameddest);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if ('page' in params) {
|
2013-05-27 05:53:55 +09:00
|
|
|
var pageNumber = (params.page | 0) || 1;
|
2011-10-15 11:05:57 +09:00
|
|
|
if ('zoom' in params) {
|
|
|
|
var zoomArgs = params.zoom.split(','); // scale,left,top
|
|
|
|
// building destination array
|
2012-01-03 04:15:45 +09:00
|
|
|
|
|
|
|
// If the zoom value, it has to get divided by 100. If it is a string,
|
|
|
|
// it should stay as it is.
|
|
|
|
var zoomArg = zoomArgs[0];
|
|
|
|
var zoomArgNumber = parseFloat(zoomArg);
|
|
|
|
if (zoomArgNumber)
|
|
|
|
zoomArg = zoomArgNumber / 100;
|
|
|
|
|
2013-03-02 18:29:13 +09:00
|
|
|
var dest = [null, {name: 'XYZ'},
|
|
|
|
zoomArgs.length > 1 ? (zoomArgs[1] | 0) : null,
|
|
|
|
zoomArgs.length > 2 ? (zoomArgs[2] | 0) : null,
|
|
|
|
zoomArg];
|
2011-10-15 11:05:57 +09:00
|
|
|
var currentPage = this.pages[pageNumber - 1];
|
|
|
|
currentPage.scrollIntoView(dest);
|
2012-07-19 03:20:20 +09:00
|
|
|
} else {
|
2012-08-01 05:58:25 +09:00
|
|
|
this.page = pageNumber; // simple page
|
2012-07-19 03:20:20 +09:00
|
|
|
}
|
2011-10-15 11:05:57 +09:00
|
|
|
}
|
2013-02-07 00:58:32 +09:00
|
|
|
if ('pagemode' in params) {
|
|
|
|
var toggle = document.getElementById('sidebarToggle');
|
|
|
|
if (params.pagemode === 'thumbs' || params.pagemode === 'bookmarks') {
|
|
|
|
if (!this.sidebarOpen) {
|
|
|
|
toggle.click();
|
|
|
|
}
|
|
|
|
this.switchSidebarView(params.pagemode === 'thumbs' ?
|
|
|
|
'thumbs' : 'outline');
|
|
|
|
} else if (params.pagemode === 'none' && this.sidebarOpen) {
|
|
|
|
toggle.click();
|
|
|
|
}
|
|
|
|
}
|
2013-05-16 07:31:17 +09:00
|
|
|
} else if (/^\d+$/.test(hash)) { // page number
|
2013-05-27 05:53:55 +09:00
|
|
|
this.page = hash;
|
|
|
|
} else { // named destination
|
|
|
|
PDFHistory.updateNextHashParam(unescape(hash));
|
2011-10-02 03:54:37 +09:00
|
|
|
PDFView.navigateTo(unescape(hash));
|
2013-05-27 05:53:55 +09:00
|
|
|
}
|
2011-08-22 11:05:10 +09:00
|
|
|
},
|
|
|
|
|
2011-10-05 04:21:40 +09:00
|
|
|
switchSidebarView: function pdfViewSwitchSidebarView(view) {
|
2012-04-13 08:29:15 +09:00
|
|
|
var thumbsView = document.getElementById('thumbnailView');
|
|
|
|
var outlineView = document.getElementById('outlineView');
|
2012-05-22 00:15:24 +09:00
|
|
|
|
2012-05-09 06:22:48 +09:00
|
|
|
var thumbsButton = document.getElementById('viewThumbnail');
|
|
|
|
var outlineButton = document.getElementById('viewOutline');
|
2012-04-13 08:29:15 +09:00
|
|
|
|
2011-08-26 02:20:19 +09:00
|
|
|
switch (view) {
|
2011-08-22 11:05:10 +09:00
|
|
|
case 'thumbs':
|
2013-01-11 06:56:36 +09:00
|
|
|
var wasOutlineViewVisible = thumbsView.classList.contains('hidden');
|
|
|
|
|
2012-05-09 06:22:48 +09:00
|
|
|
thumbsButton.classList.add('toggled');
|
|
|
|
outlineButton.classList.remove('toggled');
|
|
|
|
thumbsView.classList.remove('hidden');
|
|
|
|
outlineView.classList.add('hidden');
|
|
|
|
|
2012-06-19 01:48:47 +09:00
|
|
|
PDFView.renderHighestPriority();
|
2013-01-11 06:56:36 +09:00
|
|
|
|
|
|
|
if (wasOutlineViewVisible) {
|
|
|
|
// Ensure that the thumbnail of the current page is visible
|
|
|
|
// when switching from the outline view.
|
|
|
|
scrollIntoView(document.getElementById('thumbnailContainer' +
|
|
|
|
this.page));
|
|
|
|
}
|
2011-08-22 11:05:10 +09:00
|
|
|
break;
|
2011-12-12 10:38:20 +09:00
|
|
|
|
2011-08-22 11:05:10 +09:00
|
|
|
case 'outline':
|
2012-05-09 06:22:48 +09:00
|
|
|
thumbsButton.classList.remove('toggled');
|
|
|
|
outlineButton.classList.add('toggled');
|
|
|
|
thumbsView.classList.add('hidden');
|
|
|
|
outlineView.classList.remove('hidden');
|
2011-12-12 10:38:20 +09:00
|
|
|
|
2012-05-09 06:22:48 +09:00
|
|
|
if (outlineButton.getAttribute('disabled'))
|
|
|
|
return;
|
|
|
|
break;
|
2011-08-22 11:05:10 +09:00
|
|
|
}
|
2011-07-29 02:48:05 +09:00
|
|
|
},
|
|
|
|
|
2011-10-05 04:21:40 +09:00
|
|
|
getVisiblePages: function pdfViewGetVisiblePages() {
|
2013-09-05 07:42:36 +09:00
|
|
|
return this.getVisibleElements(this.container, this.pages,
|
2013-10-02 06:11:46 +09:00
|
|
|
!PresentationMode.active);
|
2011-12-01 04:19:07 +09:00
|
|
|
},
|
|
|
|
|
|
|
|
getVisibleThumbs: function pdfViewGetVisibleThumbs() {
|
2013-03-12 08:29:34 +09:00
|
|
|
return this.getVisibleElements(this.thumbnailContainer, this.thumbnails);
|
2012-06-19 01:48:47 +09:00
|
|
|
},
|
2011-12-01 04:19:07 +09:00
|
|
|
|
2012-06-19 01:48:47 +09:00
|
|
|
// Generic helper to find out what elements are visible within a scroll pane.
|
2012-08-08 08:52:22 +09:00
|
|
|
getVisibleElements: function pdfViewGetVisibleElements(
|
|
|
|
scrollEl, views, sortByVisibility) {
|
2013-03-12 08:29:34 +09:00
|
|
|
var top = scrollEl.scrollTop, bottom = top + scrollEl.clientHeight;
|
|
|
|
var left = scrollEl.scrollLeft, right = left + scrollEl.clientWidth;
|
|
|
|
|
|
|
|
var visible = [], view;
|
|
|
|
var currentHeight, viewHeight, hiddenHeight, percentHeight;
|
|
|
|
var currentWidth, viewWidth;
|
|
|
|
for (var i = 0, ii = views.length; i < ii; ++i) {
|
|
|
|
view = views[i];
|
2013-03-08 05:11:49 +09:00
|
|
|
currentHeight = view.el.offsetTop + view.el.clientTop;
|
2013-03-12 08:29:34 +09:00
|
|
|
viewHeight = view.el.clientHeight;
|
|
|
|
if ((currentHeight + viewHeight) < top) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (currentHeight > bottom) {
|
2012-06-19 01:48:47 +09:00
|
|
|
break;
|
2013-03-12 08:29:34 +09:00
|
|
|
}
|
|
|
|
currentWidth = view.el.offsetLeft + view.el.clientLeft;
|
|
|
|
viewWidth = view.el.clientWidth;
|
|
|
|
if ((currentWidth + viewWidth) < left || currentWidth > right) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
hiddenHeight = Math.max(0, top - currentHeight) +
|
|
|
|
Math.max(0, currentHeight + viewHeight - bottom);
|
|
|
|
percentHeight = ((viewHeight - hiddenHeight) * 100 / viewHeight) | 0;
|
2012-07-31 00:12:49 +09:00
|
|
|
|
2012-06-19 01:48:47 +09:00
|
|
|
visible.push({ id: view.id, y: currentHeight,
|
2013-03-12 08:29:34 +09:00
|
|
|
view: view, percent: percentHeight });
|
2011-12-01 04:19:07 +09:00
|
|
|
}
|
|
|
|
|
2012-08-08 08:52:22 +09:00
|
|
|
var first = visible[0];
|
|
|
|
var last = visible[visible.length - 1];
|
|
|
|
|
|
|
|
if (sortByVisibility) {
|
|
|
|
visible.sort(function(a, b) {
|
|
|
|
var pc = a.percent - b.percent;
|
2013-03-12 08:29:34 +09:00
|
|
|
if (Math.abs(pc) > 0.001) {
|
2012-08-08 08:52:22 +09:00
|
|
|
return -pc;
|
2013-03-12 08:29:34 +09:00
|
|
|
}
|
2012-08-08 08:52:22 +09:00
|
|
|
return a.id - b.id; // ensure stability
|
|
|
|
});
|
2011-12-01 04:19:07 +09:00
|
|
|
}
|
2012-08-08 08:52:22 +09:00
|
|
|
return {first: first, last: last, views: visible};
|
2012-02-16 09:03:04 +09:00
|
|
|
},
|
|
|
|
|
|
|
|
// Helper function to parse query string (e.g. ?param1=value&parm2=...).
|
|
|
|
parseQueryString: function pdfViewParseQueryString(query) {
|
2012-02-18 02:43:50 +09:00
|
|
|
var parts = query.split('&');
|
2012-02-18 02:49:17 +09:00
|
|
|
var params = {};
|
2012-02-18 02:43:50 +09:00
|
|
|
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;
|
2013-04-20 21:23:44 +09:00
|
|
|
params[decodeURIComponent(key)] = decodeURIComponent(value);
|
2012-02-16 09:03:04 +09:00
|
|
|
}
|
|
|
|
return params;
|
2012-06-29 01:50:25 +09:00
|
|
|
},
|
|
|
|
|
|
|
|
beforePrint: function pdfViewSetupBeforePrint() {
|
|
|
|
if (!this.supportsPrinting) {
|
2012-07-10 08:04:55 +09:00
|
|
|
var printMessage = mozL10n.get('printing_not_supported', null,
|
2012-07-13 02:31:20 +09:00
|
|
|
'Warning: Printing is not fully supported by this browser.');
|
2012-07-13 03:58:06 +09:00
|
|
|
this.error(printMessage);
|
2012-06-29 01:50:25 +09:00
|
|
|
return;
|
|
|
|
}
|
2013-03-09 11:08:37 +09:00
|
|
|
|
|
|
|
var alertNotReady = false;
|
|
|
|
if (!this.pages.length) {
|
|
|
|
alertNotReady = true;
|
|
|
|
} else {
|
|
|
|
for (var i = 0, ii = this.pages.length; i < ii; ++i) {
|
|
|
|
if (!this.pages[i].pdfPage) {
|
|
|
|
alertNotReady = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (alertNotReady) {
|
|
|
|
var notReadyMessage = mozL10n.get('printing_not_ready', null,
|
|
|
|
'Warning: The PDF is not fully loaded for printing.');
|
|
|
|
window.alert(notReadyMessage);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-07-13 02:31:20 +09:00
|
|
|
var body = document.querySelector('body');
|
|
|
|
body.setAttribute('data-mozPrintCallback', true);
|
2012-06-29 01:50:25 +09:00
|
|
|
for (var i = 0, ii = this.pages.length; i < ii; ++i) {
|
|
|
|
this.pages[i].beforePrint();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
afterPrint: function pdfViewSetupAfterPrint() {
|
|
|
|
var div = document.getElementById('printContainer');
|
|
|
|
while (div.hasChildNodes())
|
|
|
|
div.removeChild(div.lastChild);
|
2012-07-31 00:12:49 +09:00
|
|
|
},
|
|
|
|
|
2012-09-08 08:05:14 +09:00
|
|
|
rotatePages: function pdfViewPageRotation(delta) {
|
|
|
|
|
|
|
|
this.pageRotation = (this.pageRotation + 360 + delta) % 360;
|
|
|
|
|
|
|
|
for (var i = 0, l = this.pages.length; i < l; i++) {
|
|
|
|
var page = this.pages[i];
|
|
|
|
page.update(page.scale, this.pageRotation);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (var i = 0, l = this.thumbnails.length; i < l; i++) {
|
|
|
|
var thumb = this.thumbnails[i];
|
2013-03-09 11:08:37 +09:00
|
|
|
thumb.update(this.pageRotation);
|
2012-09-08 08:05:14 +09:00
|
|
|
}
|
|
|
|
|
2012-09-08 09:07:16 +09:00
|
|
|
this.parseScale(this.currentScaleValue, true);
|
2012-09-08 08:05:14 +09:00
|
|
|
|
|
|
|
this.renderHighestPriority();
|
|
|
|
|
2013-03-09 11:08:37 +09:00
|
|
|
var currentPage = this.pages[this.page - 1];
|
2013-08-05 21:52:24 +09:00
|
|
|
if (!currentPage) {
|
|
|
|
return;
|
2013-08-01 02:43:03 +09:00
|
|
|
}
|
2013-08-05 21:52:24 +09:00
|
|
|
|
|
|
|
// Wait for presentation mode to take effect
|
|
|
|
setTimeout(function() {
|
|
|
|
currentPage.scrollIntoView();
|
|
|
|
}, 0);
|
2012-09-14 05:23:44 +09:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This function flips the page in presentation mode if the user scrolls up
|
|
|
|
* or down with large enough motion and prevents page flipping too often.
|
|
|
|
*
|
|
|
|
* @this {PDFView}
|
|
|
|
* @param {number} mouseScrollDelta The delta value from the mouse event.
|
|
|
|
*/
|
|
|
|
mouseScroll: function pdfViewMouseScroll(mouseScrollDelta) {
|
|
|
|
var MOUSE_SCROLL_COOLDOWN_TIME = 50;
|
|
|
|
|
|
|
|
var currentTime = (new Date()).getTime();
|
|
|
|
var storedTime = this.mouseScrollTimeStamp;
|
|
|
|
|
|
|
|
// In case one page has already been flipped there is a cooldown time
|
|
|
|
// which has to expire before next page can be scrolled on to.
|
|
|
|
if (currentTime > storedTime &&
|
|
|
|
currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME)
|
|
|
|
return;
|
|
|
|
|
|
|
|
// In case the user decides to scroll to the opposite direction than before
|
|
|
|
// clear the accumulated delta.
|
|
|
|
if ((this.mouseScrollDelta > 0 && mouseScrollDelta < 0) ||
|
|
|
|
(this.mouseScrollDelta < 0 && mouseScrollDelta > 0))
|
|
|
|
this.clearMouseScrollState();
|
|
|
|
|
|
|
|
this.mouseScrollDelta += mouseScrollDelta;
|
|
|
|
|
|
|
|
var PAGE_FLIP_THRESHOLD = 120;
|
|
|
|
if (Math.abs(this.mouseScrollDelta) >= PAGE_FLIP_THRESHOLD) {
|
|
|
|
|
|
|
|
var PageFlipDirection = {
|
|
|
|
UP: -1,
|
|
|
|
DOWN: 1
|
|
|
|
};
|
|
|
|
|
2013-03-02 05:54:02 +09:00
|
|
|
// In presentation mode scroll one page at a time.
|
2012-09-14 05:23:44 +09:00
|
|
|
var pageFlipDirection = (this.mouseScrollDelta > 0) ?
|
|
|
|
PageFlipDirection.UP :
|
|
|
|
PageFlipDirection.DOWN;
|
|
|
|
this.clearMouseScrollState();
|
|
|
|
var currentPage = this.page;
|
|
|
|
|
|
|
|
// In case we are already on the first or the last page there is no need
|
|
|
|
// to do anything.
|
|
|
|
if ((currentPage == 1 && pageFlipDirection == PageFlipDirection.UP) ||
|
|
|
|
(currentPage == this.pages.length &&
|
|
|
|
pageFlipDirection == PageFlipDirection.DOWN))
|
|
|
|
return;
|
|
|
|
|
|
|
|
this.page += pageFlipDirection;
|
|
|
|
this.mouseScrollTimeStamp = currentTime;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This function clears the member attributes used with mouse scrolling in
|
|
|
|
* presentation mode.
|
|
|
|
*
|
|
|
|
* @this {PDFView}
|
|
|
|
*/
|
|
|
|
clearMouseScrollState: function pdfViewClearMouseScrollState() {
|
|
|
|
this.mouseScrollTimeStamp = 0;
|
|
|
|
this.mouseScrollDelta = 0;
|
2011-08-09 05:13:32 +09:00
|
|
|
}
|
2011-07-29 02:48:05 +09:00
|
|
|
};
|
|
|
|
|
2013-09-20 16:25:41 +09:00
|
|
|
//#include page_view.js
|
2013-08-07 05:19:03 +09:00
|
|
|
//#include thumbnail_view.js
|
2013-06-19 01:05:55 +09:00
|
|
|
//#include text_layer_builder.js
|
|
|
|
|
2011-10-05 04:21:40 +09:00
|
|
|
var DocumentOutlineView = function documentOutlineView(outline) {
|
2011-08-22 11:05:10 +09:00
|
|
|
var outlineView = document.getElementById('outlineView');
|
2013-04-06 23:01:44 +09:00
|
|
|
var outlineButton = document.getElementById('viewOutline');
|
2012-04-27 01:17:29 +09:00
|
|
|
while (outlineView.firstChild)
|
|
|
|
outlineView.removeChild(outlineView.firstChild);
|
2011-08-22 11:05:10 +09:00
|
|
|
|
2013-04-06 23:01:44 +09:00
|
|
|
if (!outline) {
|
|
|
|
if (!outlineView.classList.contains('hidden'))
|
|
|
|
PDFView.switchSidebarView('thumbs');
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2011-08-22 11:05:10 +09:00
|
|
|
function bindItemLink(domObj, item) {
|
2011-10-02 03:54:37 +09:00
|
|
|
domObj.href = PDFView.getDestinationHash(item.dest);
|
2011-10-05 04:21:40 +09:00
|
|
|
domObj.onclick = function documentOutlineViewOnclick(e) {
|
2011-08-22 11:05:10 +09:00
|
|
|
PDFView.navigateTo(item.dest);
|
|
|
|
return false;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2012-04-26 08:38:36 +09:00
|
|
|
|
2011-08-22 11:05:10 +09:00
|
|
|
var queue = [{parent: outlineView, items: outline}];
|
|
|
|
while (queue.length > 0) {
|
|
|
|
var levelData = queue.shift();
|
|
|
|
var i, n = levelData.items.length;
|
|
|
|
for (i = 0; i < n; i++) {
|
|
|
|
var item = levelData.items[i];
|
|
|
|
var div = document.createElement('div');
|
|
|
|
div.className = 'outlineItem';
|
|
|
|
var a = document.createElement('a');
|
|
|
|
bindItemLink(a, item);
|
|
|
|
a.textContent = item.title;
|
|
|
|
div.appendChild(a);
|
|
|
|
|
|
|
|
if (item.items.length > 0) {
|
|
|
|
var itemsDiv = document.createElement('div');
|
|
|
|
itemsDiv.className = 'outlineItems';
|
|
|
|
div.appendChild(itemsDiv);
|
|
|
|
queue.push({parent: itemsDiv, items: item.items});
|
|
|
|
}
|
|
|
|
|
|
|
|
levelData.parent.appendChild(div);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2012-08-01 02:21:07 +09:00
|
|
|
document.addEventListener('DOMContentLoaded', function webViewerLoad(evt) {
|
2012-05-01 05:05:32 +09:00
|
|
|
PDFView.initialize();
|
2011-06-14 02:16:03 +09:00
|
|
|
|
2013-08-15 06:36:40 +09:00
|
|
|
//#if !(FIREFOX || MOZCENTRAL)
|
2013-07-27 19:31:51 +09:00
|
|
|
var params = PDFView.parseQueryString(document.location.search.substring(1));
|
2012-11-10 06:34:11 +09:00
|
|
|
var file = params.file || DEFAULT_URL;
|
2012-08-02 03:29:13 +09:00
|
|
|
//#else
|
2013-07-27 19:31:51 +09:00
|
|
|
//var file = window.location.href.split('#')[0];
|
2012-08-02 03:29:13 +09:00
|
|
|
//#endif
|
2011-07-29 02:48:05 +09:00
|
|
|
|
2013-08-15 06:36:40 +09:00
|
|
|
//#if CHROME
|
|
|
|
//if (location.protocol !== 'chrome-extension:') {
|
|
|
|
// file = location.href.split('#')[0];
|
|
|
|
//}
|
|
|
|
//#endif
|
|
|
|
|
2013-07-31 06:36:45 +09:00
|
|
|
//#if !(FIREFOX || MOZCENTRAL || CHROME)
|
|
|
|
var fileInput = document.createElement('input');
|
|
|
|
fileInput.id = 'fileInput';
|
|
|
|
fileInput.className = 'fileInput';
|
|
|
|
fileInput.setAttribute('type', 'file');
|
|
|
|
fileInput.setAttribute('style',
|
|
|
|
'visibility: hidden; position: fixed; right: 0; top: 0');
|
|
|
|
fileInput.oncontextmenu = noContextMenuHandler;
|
|
|
|
document.body.appendChild(fileInput);
|
|
|
|
|
2012-08-02 03:29:13 +09:00
|
|
|
if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {
|
2012-05-21 07:12:58 +09:00
|
|
|
document.getElementById('openFile').setAttribute('hidden', 'true');
|
2013-09-05 06:48:31 +09:00
|
|
|
document.getElementById('secondaryOpenFile').setAttribute('hidden', 'true');
|
2012-01-25 08:13:50 +09:00
|
|
|
} else {
|
2011-07-29 02:48:05 +09:00
|
|
|
document.getElementById('fileInput').value = null;
|
2012-01-25 08:13:50 +09:00
|
|
|
}
|
2012-08-02 03:29:13 +09:00
|
|
|
//#else
|
|
|
|
//document.getElementById('openFile').setAttribute('hidden', 'true');
|
2013-09-05 06:48:31 +09:00
|
|
|
//document.getElementById('secondaryOpenFile').setAttribute('hidden', 'true');
|
2012-08-02 03:29:13 +09:00
|
|
|
//#endif
|
2011-12-10 03:17:48 +09:00
|
|
|
|
2012-02-16 09:03:04 +09:00
|
|
|
// Special debugging flags in the hash section of the URL.
|
|
|
|
var hash = document.location.hash.substring(1);
|
|
|
|
var hashParams = PDFView.parseQueryString(hash);
|
2011-12-10 05:38:08 +09:00
|
|
|
|
2013-02-07 08:19:29 +09:00
|
|
|
if ('disableWorker' in hashParams) {
|
2012-02-16 09:03:04 +09:00
|
|
|
PDFJS.disableWorker = (hashParams['disableWorker'] === 'true');
|
2013-02-07 08:19:29 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
if ('disableRange' in hashParams) {
|
|
|
|
PDFJS.disableRange = (hashParams['disableRange'] === 'true');
|
|
|
|
}
|
2011-12-10 05:38:08 +09:00
|
|
|
|
2013-04-13 03:37:49 +09:00
|
|
|
if ('disableAutoFetch' in hashParams) {
|
|
|
|
PDFJS.disableAutoFetch = (hashParams['disableAutoFetch'] === 'true');
|
|
|
|
}
|
|
|
|
|
2013-05-16 05:57:27 +09:00
|
|
|
if ('disableFontFace' in hashParams) {
|
|
|
|
PDFJS.disableFontFace = (hashParams['disableFontFace'] === 'true');
|
|
|
|
}
|
|
|
|
|
2013-06-25 03:46:13 +09:00
|
|
|
if ('disableHistory' in hashParams) {
|
|
|
|
PDFJS.disableHistory = (hashParams['disableHistory'] === 'true');
|
|
|
|
}
|
|
|
|
|
2013-10-03 01:05:46 +09:00
|
|
|
if ('useOnlyCssZoom' in hashParams) {
|
|
|
|
USE_ONLY_CSS_ZOOM = (hashParams['useOnlyCssZoom'] === 'true');
|
|
|
|
}
|
|
|
|
|
2012-08-02 03:29:13 +09:00
|
|
|
//#if !(FIREFOX || MOZCENTRAL)
|
|
|
|
var locale = navigator.language;
|
|
|
|
if ('locale' in hashParams)
|
|
|
|
locale = hashParams['locale'];
|
2012-11-30 05:02:33 +09:00
|
|
|
mozL10n.setLanguage(locale);
|
2013-05-16 05:57:27 +09:00
|
|
|
//#endif
|
|
|
|
//#if (FIREFOX || MOZCENTRAL)
|
|
|
|
//if (!PDFView.supportsDocumentFonts) {
|
|
|
|
// PDFJS.disableFontFace = true;
|
|
|
|
//}
|
2012-08-02 03:29:13 +09:00
|
|
|
//#endif
|
2012-05-01 05:29:05 +09:00
|
|
|
|
2012-08-20 10:02:12 +09:00
|
|
|
if ('textLayer' in hashParams) {
|
|
|
|
switch (hashParams['textLayer']) {
|
|
|
|
case 'off':
|
|
|
|
PDFJS.disableTextLayer = true;
|
|
|
|
break;
|
|
|
|
case 'visible':
|
|
|
|
case 'shadow':
|
|
|
|
case 'hover':
|
|
|
|
var viewer = document.getElementById('viewer');
|
|
|
|
viewer.classList.add('textLayer-' + hashParams['textLayer']);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2012-01-05 01:20:19 +09:00
|
|
|
|
2012-08-02 03:29:13 +09:00
|
|
|
//#if !(FIREFOX || MOZCENTRAL)
|
|
|
|
if ('pdfBug' in hashParams) {
|
|
|
|
//#else
|
|
|
|
//if ('pdfBug' in hashParams && FirefoxCom.requestSync('pdfBugEnabled')) {
|
|
|
|
//#endif
|
2012-02-16 06:13:07 +09:00
|
|
|
PDFJS.pdfBug = true;
|
2012-02-16 09:03:04 +09:00
|
|
|
var pdfBug = hashParams['pdfBug'];
|
2012-02-22 02:52:09 +09:00
|
|
|
var enabled = pdfBug.split(',');
|
|
|
|
PDFBug.enable(enabled);
|
2012-02-14 10:35:58 +09:00
|
|
|
PDFBug.init();
|
|
|
|
}
|
2012-01-05 01:20:19 +09:00
|
|
|
|
2012-07-10 08:04:55 +09:00
|
|
|
if (!PDFView.supportsPrinting) {
|
|
|
|
document.getElementById('print').classList.add('hidden');
|
2013-09-05 06:48:31 +09:00
|
|
|
document.getElementById('secondaryPrint').classList.add('hidden');
|
2012-07-10 08:04:55 +09:00
|
|
|
}
|
|
|
|
|
2012-07-31 00:12:49 +09:00
|
|
|
if (!PDFView.supportsFullscreen) {
|
2013-03-02 05:54:02 +09:00
|
|
|
document.getElementById('presentationMode').classList.add('hidden');
|
2013-09-05 06:48:31 +09:00
|
|
|
document.getElementById('secondaryPresentationMode').
|
|
|
|
classList.add('hidden');
|
2012-07-31 00:12:49 +09:00
|
|
|
}
|
|
|
|
|
2012-10-06 05:59:13 +09:00
|
|
|
if (PDFView.supportsIntegratedFind) {
|
2013-05-01 04:14:18 +09:00
|
|
|
document.getElementById('viewFind').classList.add('hidden');
|
2012-10-06 05:59:13 +09:00
|
|
|
}
|
|
|
|
|
2012-05-15 09:19:09 +09:00
|
|
|
// Listen for warnings to trigger the fallback UI. Errors should be caught
|
|
|
|
// and call PDFView.error() so we don't need to listen for those.
|
|
|
|
PDFJS.LogManager.addLogger({
|
|
|
|
warn: function() {
|
|
|
|
PDFView.fallback();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2013-07-31 06:36:45 +09:00
|
|
|
// Suppress context menus for some controls
|
|
|
|
document.getElementById('scaleSelect').oncontextmenu = noContextMenuHandler;
|
|
|
|
|
2012-04-26 03:34:28 +09:00
|
|
|
var mainContainer = document.getElementById('mainContainer');
|
2012-05-02 03:31:23 +09:00
|
|
|
var outerContainer = document.getElementById('outerContainer');
|
2012-04-26 03:34:28 +09:00
|
|
|
mainContainer.addEventListener('transitionend', function(e) {
|
|
|
|
if (e.target == mainContainer) {
|
2012-05-01 05:11:31 +09:00
|
|
|
var event = document.createEvent('UIEvents');
|
|
|
|
event.initUIEvent('resize', false, false, window, 0);
|
|
|
|
window.dispatchEvent(event);
|
2012-05-02 03:31:23 +09:00
|
|
|
outerContainer.classList.remove('sidebarMoving');
|
2012-04-26 03:34:28 +09:00
|
|
|
}
|
|
|
|
}, true);
|
|
|
|
|
2012-04-13 07:08:07 +09:00
|
|
|
document.getElementById('sidebarToggle').addEventListener('click',
|
|
|
|
function() {
|
2012-04-14 06:14:05 +09:00
|
|
|
this.classList.toggle('toggled');
|
2012-05-02 03:31:23 +09:00
|
|
|
outerContainer.classList.add('sidebarMoving');
|
|
|
|
outerContainer.classList.toggle('sidebarOpen');
|
2012-06-19 01:48:47 +09:00
|
|
|
PDFView.sidebarOpen = outerContainer.classList.contains('sidebarOpen');
|
|
|
|
PDFView.renderHighestPriority();
|
2012-04-13 07:08:07 +09:00
|
|
|
});
|
2012-04-19 04:02:49 +09:00
|
|
|
|
2012-09-07 00:33:07 +09:00
|
|
|
document.getElementById('viewThumbnail').addEventListener('click',
|
|
|
|
function() {
|
|
|
|
PDFView.switchSidebarView('thumbs');
|
|
|
|
});
|
|
|
|
|
|
|
|
document.getElementById('viewOutline').addEventListener('click',
|
|
|
|
function() {
|
|
|
|
PDFView.switchSidebarView('outline');
|
|
|
|
});
|
|
|
|
|
|
|
|
document.getElementById('previous').addEventListener('click',
|
|
|
|
function() {
|
|
|
|
PDFView.page--;
|
|
|
|
});
|
|
|
|
|
|
|
|
document.getElementById('next').addEventListener('click',
|
|
|
|
function() {
|
|
|
|
PDFView.page++;
|
|
|
|
});
|
|
|
|
|
2013-05-01 04:14:18 +09:00
|
|
|
document.getElementById('zoomIn').addEventListener('click',
|
2012-09-07 00:33:07 +09:00
|
|
|
function() {
|
|
|
|
PDFView.zoomIn();
|
|
|
|
});
|
|
|
|
|
2013-05-01 04:14:18 +09:00
|
|
|
document.getElementById('zoomOut').addEventListener('click',
|
2012-09-07 00:33:07 +09:00
|
|
|
function() {
|
|
|
|
PDFView.zoomOut();
|
|
|
|
});
|
|
|
|
|
2013-01-22 02:30:59 +09:00
|
|
|
document.getElementById('pageNumber').addEventListener('click',
|
|
|
|
function() {
|
|
|
|
this.select();
|
|
|
|
});
|
|
|
|
|
2012-09-07 00:33:07 +09:00
|
|
|
document.getElementById('pageNumber').addEventListener('change',
|
|
|
|
function() {
|
2013-01-22 02:30:59 +09:00
|
|
|
// Handle the user inputting a floating point number.
|
|
|
|
PDFView.page = (this.value | 0);
|
|
|
|
|
|
|
|
if (this.value !== (this.value | 0).toString()) {
|
|
|
|
this.value = PDFView.page;
|
|
|
|
}
|
2012-09-07 00:33:07 +09:00
|
|
|
});
|
|
|
|
|
|
|
|
document.getElementById('scaleSelect').addEventListener('change',
|
|
|
|
function() {
|
|
|
|
PDFView.parseScale(this.value);
|
|
|
|
});
|
|
|
|
|
2013-09-05 06:48:31 +09:00
|
|
|
document.getElementById('presentationMode').addEventListener('click',
|
|
|
|
SecondaryToolbar.presentationModeClick.bind(SecondaryToolbar));
|
2012-10-11 02:26:41 +09:00
|
|
|
|
2013-09-05 06:48:31 +09:00
|
|
|
document.getElementById('openFile').addEventListener('click',
|
|
|
|
SecondaryToolbar.openFileClick.bind(SecondaryToolbar));
|
2012-10-11 02:26:41 +09:00
|
|
|
|
2013-09-05 06:48:31 +09:00
|
|
|
document.getElementById('print').addEventListener('click',
|
|
|
|
SecondaryToolbar.printClick.bind(SecondaryToolbar));
|
2012-09-08 08:05:14 +09:00
|
|
|
|
2013-09-05 06:48:31 +09:00
|
|
|
document.getElementById('download').addEventListener('click',
|
|
|
|
SecondaryToolbar.downloadClick.bind(SecondaryToolbar));
|
|
|
|
|
2012-08-16 00:17:30 +09:00
|
|
|
//#if (FIREFOX || MOZCENTRAL)
|
2013-02-07 08:19:29 +09:00
|
|
|
//PDFView.setTitleUsingUrl(file);
|
|
|
|
//PDFView.initPassiveLoading();
|
|
|
|
//return;
|
2012-08-16 00:17:30 +09:00
|
|
|
//#endif
|
|
|
|
|
2012-07-28 07:19:43 +09:00
|
|
|
//#if !B2G
|
2012-04-14 01:33:36 +09:00
|
|
|
PDFView.open(file, 0);
|
2012-07-28 07:19:43 +09:00
|
|
|
//#endif
|
2011-07-29 02:48:05 +09:00
|
|
|
}, true);
|
|
|
|
|
2011-09-03 10:16:52 +09:00
|
|
|
function updateViewarea() {
|
2012-08-08 08:52:22 +09:00
|
|
|
|
2012-05-01 05:05:32 +09:00
|
|
|
if (!PDFView.initialized)
|
|
|
|
return;
|
2012-08-08 08:52:22 +09:00
|
|
|
var visible = PDFView.getVisiblePages();
|
|
|
|
var visiblePages = visible.views;
|
2012-10-15 21:40:05 +09:00
|
|
|
if (visiblePages.length === 0) {
|
|
|
|
return;
|
|
|
|
}
|
2011-12-19 06:36:36 +09:00
|
|
|
|
2012-06-19 01:48:47 +09:00
|
|
|
PDFView.renderHighestPriority();
|
2011-12-19 06:36:36 +09:00
|
|
|
|
2011-07-29 02:48:05 +09:00
|
|
|
var currentId = PDFView.page;
|
2012-08-08 08:52:22 +09:00
|
|
|
var firstPage = visible.first;
|
|
|
|
|
|
|
|
for (var i = 0, ii = visiblePages.length, stillFullyVisible = false;
|
|
|
|
i < ii; ++i) {
|
|
|
|
var page = visiblePages[i];
|
|
|
|
|
|
|
|
if (page.percent < 100)
|
|
|
|
break;
|
|
|
|
|
|
|
|
if (page.id === PDFView.page) {
|
|
|
|
stillFullyVisible = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!stillFullyVisible) {
|
|
|
|
currentId = visiblePages[0].id;
|
|
|
|
}
|
2012-07-31 00:12:49 +09:00
|
|
|
|
2013-09-05 07:42:36 +09:00
|
|
|
updateViewarea.inProgress = true; // used in "set page"
|
|
|
|
PDFView.page = currentId;
|
|
|
|
updateViewarea.inProgress = false;
|
2011-10-15 11:05:57 +09:00
|
|
|
|
2012-01-03 04:15:45 +09:00
|
|
|
var currentScale = PDFView.currentScale;
|
|
|
|
var currentScaleValue = PDFView.currentScaleValue;
|
|
|
|
var normalizedScaleValue = currentScaleValue == currentScale ?
|
|
|
|
currentScale * 100 : currentScaleValue;
|
|
|
|
|
2011-10-15 11:05:57 +09:00
|
|
|
var pageNumber = firstPage.id;
|
|
|
|
var pdfOpenParams = '#page=' + pageNumber;
|
2012-01-03 04:15:45 +09:00
|
|
|
pdfOpenParams += '&zoom=' + normalizedScaleValue;
|
2011-10-15 11:05:57 +09:00
|
|
|
var currentPage = PDFView.pages[pageNumber - 1];
|
2012-04-28 04:39:59 +09:00
|
|
|
var topLeft = currentPage.getPagePoint(PDFView.container.scrollLeft,
|
|
|
|
(PDFView.container.scrollTop - firstPage.y));
|
2012-04-12 00:29:44 +09:00
|
|
|
pdfOpenParams += ',' + Math.round(topLeft[0]) + ',' + Math.round(topLeft[1]);
|
2011-12-26 08:42:46 +09:00
|
|
|
|
2011-12-26 23:07:24 +09:00
|
|
|
var store = PDFView.store;
|
2012-10-03 08:16:42 +09:00
|
|
|
store.initializedPromise.then(function() {
|
|
|
|
store.set('exists', true);
|
|
|
|
store.set('page', pageNumber);
|
|
|
|
store.set('zoom', normalizedScaleValue);
|
|
|
|
store.set('scrollLeft', Math.round(topLeft[0]));
|
|
|
|
store.set('scrollTop', Math.round(topLeft[1]));
|
|
|
|
});
|
2012-01-25 08:46:53 +09:00
|
|
|
var href = PDFView.getAnchorUrl(pdfOpenParams);
|
|
|
|
document.getElementById('viewBookmark').href = href;
|
2013-09-27 18:44:45 +09:00
|
|
|
document.getElementById('secondaryViewBookmark').href = href;
|
2013-05-16 07:31:17 +09:00
|
|
|
|
2013-05-19 01:18:44 +09:00
|
|
|
// Update the current bookmark in the browsing history.
|
|
|
|
PDFHistory.updateCurrentBookmark(pdfOpenParams, pageNumber);
|
2011-09-03 10:16:52 +09:00
|
|
|
}
|
|
|
|
|
2011-10-05 04:21:40 +09:00
|
|
|
window.addEventListener('resize', function webViewerResize(evt) {
|
2012-05-01 05:35:26 +09:00
|
|
|
if (PDFView.initialized &&
|
|
|
|
(document.getElementById('pageWidthOption').selected ||
|
2013-08-01 02:43:03 +09:00
|
|
|
document.getElementById('pageFitOption').selected ||
|
|
|
|
document.getElementById('pageAutoOption').selected)) {
|
|
|
|
PDFView.parseScale(document.getElementById('scaleSelect').value);
|
|
|
|
}
|
2011-09-03 10:16:52 +09:00
|
|
|
updateViewarea();
|
2013-09-05 06:48:31 +09:00
|
|
|
|
|
|
|
// Set the 'max-height' CSS property of the secondary toolbar.
|
|
|
|
SecondaryToolbar.setMaxHeight(PDFView.container);
|
2011-09-03 10:16:52 +09:00
|
|
|
});
|
|
|
|
|
2011-10-05 04:21:40 +09:00
|
|
|
window.addEventListener('hashchange', function webViewerHashchange(evt) {
|
2013-05-16 07:31:17 +09:00
|
|
|
if (PDFHistory.isHashChangeUnlocked) {
|
|
|
|
PDFView.setHash(document.location.hash.substring(1));
|
|
|
|
}
|
2011-07-29 02:48:05 +09:00
|
|
|
});
|
|
|
|
|
2011-10-05 04:21:40 +09:00
|
|
|
window.addEventListener('change', function webViewerChange(evt) {
|
2011-07-29 02:48:05 +09:00
|
|
|
var files = evt.target.files;
|
2013-02-05 03:01:19 +09:00
|
|
|
if (!files || files.length === 0)
|
2011-07-29 02:48:05 +09:00
|
|
|
return;
|
|
|
|
|
|
|
|
// Read the local file into a Uint8Array.
|
|
|
|
var fileReader = new FileReader();
|
2011-10-05 04:21:40 +09:00
|
|
|
fileReader.onload = function webViewerChangeFileReaderOnload(evt) {
|
2012-08-07 02:50:47 +09:00
|
|
|
var buffer = evt.target.result;
|
2011-07-29 02:48:05 +09:00
|
|
|
var uint8Array = new Uint8Array(buffer);
|
2012-05-15 03:45:07 +09:00
|
|
|
PDFView.open(uint8Array, 0);
|
2011-07-06 15:06:45 +09:00
|
|
|
};
|
2011-05-26 23:02:52 +09:00
|
|
|
|
2011-07-29 02:48:05 +09:00
|
|
|
var file = files[0];
|
2012-08-07 02:50:47 +09:00
|
|
|
fileReader.readAsArrayBuffer(file);
|
2012-08-01 02:21:07 +09:00
|
|
|
PDFView.setTitleUsingUrl(file.name);
|
2011-10-15 11:05:57 +09:00
|
|
|
|
2011-10-19 10:20:50 +09:00
|
|
|
// URL does not reflect proper document location - hiding some icons.
|
2011-10-19 06:39:26 +09:00
|
|
|
document.getElementById('viewBookmark').setAttribute('hidden', 'true');
|
2013-09-27 18:44:45 +09:00
|
|
|
document.getElementById('secondaryViewBookmark').
|
|
|
|
setAttribute('hidden', 'true');
|
2011-10-19 10:20:50 +09:00
|
|
|
document.getElementById('download').setAttribute('hidden', 'true');
|
2013-09-05 06:48:31 +09:00
|
|
|
document.getElementById('secondaryDownload').setAttribute('hidden', 'true');
|
2011-07-29 02:48:05 +09:00
|
|
|
}, true);
|
|
|
|
|
2012-01-03 04:09:38 +09:00
|
|
|
function selectScaleOption(value) {
|
2011-07-30 01:17:04 +09:00
|
|
|
var options = document.getElementById('scaleSelect').options;
|
2011-09-03 10:16:52 +09:00
|
|
|
var predefinedValueFound = false;
|
2011-07-30 01:17:04 +09:00
|
|
|
for (var i = 0; i < options.length; i++) {
|
|
|
|
var option = options[i];
|
2011-09-05 23:07:18 +09:00
|
|
|
if (option.value != value) {
|
2011-09-03 10:16:52 +09:00
|
|
|
option.selected = false;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
option.selected = true;
|
|
|
|
predefinedValueFound = true;
|
2011-07-30 01:17:04 +09:00
|
|
|
}
|
2012-01-03 04:09:38 +09:00
|
|
|
return predefinedValueFound;
|
|
|
|
}
|
|
|
|
|
2012-05-02 07:08:30 +09:00
|
|
|
window.addEventListener('localized', function localized(evt) {
|
2012-11-30 05:02:33 +09:00
|
|
|
document.getElementsByTagName('html')[0].dir = mozL10n.getDirection();
|
2013-01-27 06:17:37 +09:00
|
|
|
|
2013-06-02 21:31:28 +09:00
|
|
|
PDFView.animationStartedPromise.then(function() {
|
2013-09-05 06:48:31 +09:00
|
|
|
// Adjust the width of the zoom box to fit the content.
|
|
|
|
// Note: This is only done if the zoom box is actually visible,
|
|
|
|
// since otherwise element.clientWidth will return 0.
|
2013-06-02 21:31:28 +09:00
|
|
|
var container = document.getElementById('scaleSelectContainer');
|
|
|
|
if (container.clientWidth > 0) {
|
2013-02-27 02:46:50 +09:00
|
|
|
var select = document.getElementById('scaleSelect');
|
|
|
|
select.setAttribute('style', 'min-width: inherit;');
|
2013-06-02 21:31:28 +09:00
|
|
|
var width = select.clientWidth + SCALE_SELECT_CONTAINER_PADDING;
|
|
|
|
select.setAttribute('style', 'min-width: ' +
|
|
|
|
(width + SCALE_SELECT_PADDING) + 'px;');
|
2013-02-27 02:46:50 +09:00
|
|
|
container.setAttribute('style', 'min-width: ' + width + 'px; ' +
|
|
|
|
'max-width: ' + width + 'px;');
|
2013-06-02 21:31:28 +09:00
|
|
|
}
|
2013-09-05 06:48:31 +09:00
|
|
|
|
|
|
|
// Set the 'max-height' CSS property of the secondary toolbar.
|
|
|
|
SecondaryToolbar.setMaxHeight(PDFView.container);
|
2013-02-27 02:46:50 +09:00
|
|
|
});
|
2012-05-02 07:08:30 +09:00
|
|
|
}, true);
|
|
|
|
|
2012-01-03 04:09:38 +09:00
|
|
|
window.addEventListener('scalechange', function scalechange(evt) {
|
2013-05-01 04:14:18 +09:00
|
|
|
document.getElementById('zoomOut').disabled = (evt.scale === MIN_SCALE);
|
|
|
|
document.getElementById('zoomIn').disabled = (evt.scale === MAX_SCALE);
|
|
|
|
|
2012-01-03 04:09:38 +09:00
|
|
|
var customScaleOption = document.getElementById('customScaleOption');
|
|
|
|
customScaleOption.selected = false;
|
|
|
|
|
|
|
|
if (!evt.resetAutoSettings &&
|
2013-08-01 02:43:03 +09:00
|
|
|
(document.getElementById('pageWidthOption').selected ||
|
|
|
|
document.getElementById('pageFitOption').selected ||
|
|
|
|
document.getElementById('pageAutoOption').selected)) {
|
|
|
|
updateViewarea();
|
|
|
|
return;
|
2012-01-03 04:09:38 +09:00
|
|
|
}
|
2011-09-03 10:16:52 +09:00
|
|
|
|
2012-01-04 06:48:32 +09:00
|
|
|
var predefinedValueFound = selectScaleOption('' + evt.scale);
|
2011-09-03 10:16:52 +09:00
|
|
|
if (!predefinedValueFound) {
|
|
|
|
customScaleOption.textContent = Math.round(evt.scale * 10000) / 100 + '%';
|
|
|
|
customScaleOption.selected = true;
|
|
|
|
}
|
|
|
|
updateViewarea();
|
2011-07-30 01:17:04 +09:00
|
|
|
}, true);
|
|
|
|
|
2011-08-31 07:37:39 +09:00
|
|
|
window.addEventListener('pagechange', function pagechange(evt) {
|
2011-10-15 11:05:57 +09:00
|
|
|
var page = evt.pageNumber;
|
2013-01-11 06:56:36 +09:00
|
|
|
if (PDFView.previousPageNumber !== page) {
|
2011-10-15 11:05:57 +09:00
|
|
|
document.getElementById('pageNumber').value = page;
|
2012-04-14 06:14:05 +09:00
|
|
|
var selected = document.querySelector('.thumbnail.selected');
|
|
|
|
if (selected)
|
|
|
|
selected.classList.remove('selected');
|
2012-04-26 10:39:30 +09:00
|
|
|
var thumbnail = document.getElementById('thumbnailContainer' + page);
|
|
|
|
thumbnail.classList.add('selected');
|
|
|
|
var visibleThumbs = PDFView.getVisibleThumbs();
|
2012-08-08 08:52:22 +09:00
|
|
|
var numVisibleThumbs = visibleThumbs.views.length;
|
2012-04-26 10:39:30 +09:00
|
|
|
// If the thumbnail isn't currently visible scroll it into view.
|
|
|
|
if (numVisibleThumbs > 0) {
|
2012-08-08 08:52:22 +09:00
|
|
|
var first = visibleThumbs.first.id;
|
2012-04-26 10:39:30 +09:00
|
|
|
// Account for only one thumbnail being visible.
|
|
|
|
var last = numVisibleThumbs > 1 ?
|
2012-08-08 08:52:22 +09:00
|
|
|
visibleThumbs.last.id : first;
|
2012-04-26 10:39:30 +09:00
|
|
|
if (page <= first || page >= last)
|
2012-08-25 00:12:03 +09:00
|
|
|
scrollIntoView(thumbnail);
|
2012-04-26 10:39:30 +09:00
|
|
|
}
|
|
|
|
|
2012-04-14 06:14:05 +09:00
|
|
|
}
|
2011-10-15 11:05:57 +09:00
|
|
|
document.getElementById('previous').disabled = (page <= 1);
|
|
|
|
document.getElementById('next').disabled = (page >= PDFView.pages.length);
|
2011-07-30 01:17:04 +09:00
|
|
|
}, true);
|
2011-09-03 10:16:52 +09:00
|
|
|
|
2012-06-08 04:27:26 +09:00
|
|
|
// Firefox specific event, so that we can prevent browser from zooming
|
|
|
|
window.addEventListener('DOMMouseScroll', function(evt) {
|
2012-06-08 04:39:18 +09:00
|
|
|
if (evt.ctrlKey) {
|
2012-06-08 04:27:26 +09:00
|
|
|
evt.preventDefault();
|
|
|
|
|
|
|
|
var ticks = evt.detail;
|
|
|
|
var direction = (ticks > 0) ? 'zoomOut' : 'zoomIn';
|
2013-08-27 04:00:35 +09:00
|
|
|
PDFView[direction](Math.abs(ticks));
|
2013-10-02 06:11:46 +09:00
|
|
|
} else if (PresentationMode.active) {
|
2012-09-14 05:23:44 +09:00
|
|
|
var FIREFOX_DELTA_FACTOR = -40;
|
|
|
|
PDFView.mouseScroll(evt.detail * FIREFOX_DELTA_FACTOR);
|
2012-06-08 04:27:26 +09:00
|
|
|
}
|
|
|
|
}, false);
|
|
|
|
|
2013-02-28 23:35:41 +09:00
|
|
|
window.addEventListener('click', function click(evt) {
|
2013-10-02 06:11:46 +09:00
|
|
|
if (!PresentationMode.active) {
|
2013-09-05 06:48:31 +09:00
|
|
|
if (SecondaryToolbar.isOpen && PDFView.container.contains(evt.target)) {
|
|
|
|
SecondaryToolbar.close();
|
|
|
|
}
|
|
|
|
} else if (evt.button === 0) {
|
2013-02-28 23:35:41 +09:00
|
|
|
// Necessary since preventDefault() in 'mousedown' won't stop
|
2013-09-05 06:48:31 +09:00
|
|
|
// the event propagation in all circumstances in presentation mode.
|
2013-02-28 23:35:41 +09:00
|
|
|
evt.preventDefault();
|
2012-10-06 11:55:47 +09:00
|
|
|
}
|
|
|
|
}, false);
|
|
|
|
|
2011-09-05 23:07:18 +09:00
|
|
|
window.addEventListener('keydown', function keydown(evt) {
|
2013-09-25 00:46:54 +09:00
|
|
|
if (PasswordPrompt.visible) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-04-12 07:47:11 +09:00
|
|
|
var handled = false;
|
2012-04-20 03:13:56 +09:00
|
|
|
var cmd = (evt.ctrlKey ? 1 : 0) |
|
|
|
|
(evt.altKey ? 2 : 0) |
|
|
|
|
(evt.shiftKey ? 4 : 0) |
|
|
|
|
(evt.metaKey ? 8 : 0);
|
2012-04-12 07:47:11 +09:00
|
|
|
|
|
|
|
// First, handle the key bindings that are independent whether an input
|
|
|
|
// control is selected or not.
|
2013-03-12 01:04:43 +09:00
|
|
|
if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) {
|
|
|
|
// either CTRL or META key with optional SHIFT.
|
2012-04-12 07:47:11 +09:00
|
|
|
switch (evt.keyCode) {
|
2013-07-18 20:37:55 +09:00
|
|
|
case 70: // f
|
2012-10-06 05:59:13 +09:00
|
|
|
if (!PDFView.supportsIntegratedFind) {
|
|
|
|
PDFFindBar.toggle();
|
|
|
|
handled = true;
|
|
|
|
}
|
2012-09-12 01:30:44 +09:00
|
|
|
break;
|
2013-07-18 20:37:55 +09:00
|
|
|
case 71: // g
|
|
|
|
if (!PDFView.supportsIntegratedFind) {
|
|
|
|
PDFFindBar.dispatchEvent('again', cmd === 5 || cmd === 12);
|
|
|
|
handled = true;
|
|
|
|
}
|
|
|
|
break;
|
2012-04-12 07:47:11 +09:00
|
|
|
case 61: // FF/Mac '='
|
|
|
|
case 107: // FF '+' and '='
|
|
|
|
case 187: // Chrome '+'
|
2012-12-11 06:39:35 +09:00
|
|
|
case 171: // FF with German keyboard
|
2012-04-12 07:47:11 +09:00
|
|
|
PDFView.zoomIn();
|
|
|
|
handled = true;
|
|
|
|
break;
|
2012-09-11 01:28:45 +09:00
|
|
|
case 173: // FF/Mac '-'
|
2012-04-12 07:47:11 +09:00
|
|
|
case 109: // FF '-'
|
|
|
|
case 189: // Chrome '-'
|
|
|
|
PDFView.zoomOut();
|
|
|
|
handled = true;
|
|
|
|
break;
|
|
|
|
case 48: // '0'
|
2012-12-12 07:59:33 +09:00
|
|
|
case 96: // '0' on Numpad of Swedish keyboard
|
2013-08-14 08:45:06 +09:00
|
|
|
// keeping it unhandled (to restore page zoom to 100%)
|
|
|
|
setTimeout(function () {
|
|
|
|
// ... and resetting the scale after browser adjusts its scale
|
|
|
|
PDFView.parseScale(DEFAULT_SCALE, true);
|
|
|
|
});
|
|
|
|
handled = false;
|
2012-04-12 07:47:11 +09:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-07-18 23:28:06 +09:00
|
|
|
// CTRL+ALT or Option+Command
|
|
|
|
if (cmd === 3 || cmd === 10) {
|
|
|
|
switch (evt.keyCode) {
|
|
|
|
case 80: // p
|
2013-10-02 06:11:46 +09:00
|
|
|
SecondaryToolbar.presentationModeClick();
|
2013-07-18 23:28:06 +09:00
|
|
|
handled = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-04-12 07:47:11 +09:00
|
|
|
if (handled) {
|
|
|
|
evt.preventDefault();
|
2011-12-26 06:18:52 +09:00
|
|
|
return;
|
2012-04-12 07:47:11 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
// Some shortcuts should not get handled if a control/input element
|
|
|
|
// is selected.
|
2013-03-31 02:12:32 +09:00
|
|
|
var curElement = document.activeElement || document.querySelector(':focus');
|
|
|
|
if (curElement && (curElement.tagName.toUpperCase() === 'INPUT' ||
|
2013-09-09 23:50:49 +09:00
|
|
|
curElement.tagName.toUpperCase() === 'TEXTAREA' ||
|
2013-03-31 02:12:32 +09:00
|
|
|
curElement.tagName.toUpperCase() === 'SELECT')) {
|
2013-09-05 06:48:31 +09:00
|
|
|
// Make sure that the secondary toolbar is closed when Escape is pressed.
|
|
|
|
if (evt.keyCode !== 27) { // 'Esc'
|
|
|
|
return;
|
|
|
|
}
|
2012-10-02 06:32:02 +09:00
|
|
|
}
|
|
|
|
var controlsElement = document.getElementById('toolbar');
|
2011-10-02 05:52:27 +09:00
|
|
|
while (curElement) {
|
2013-10-02 06:11:46 +09:00
|
|
|
if (curElement === controlsElement && !PresentationMode.active)
|
2012-10-02 06:32:02 +09:00
|
|
|
return; // ignoring if the 'toolbar' element is focused
|
2011-10-02 05:52:27 +09:00
|
|
|
curElement = curElement.parentNode;
|
|
|
|
}
|
2012-04-11 01:55:52 +09:00
|
|
|
|
2013-02-05 03:01:19 +09:00
|
|
|
if (cmd === 0) { // no control key pressed at all.
|
2012-04-11 01:55:52 +09:00
|
|
|
switch (evt.keyCode) {
|
2012-10-06 11:55:47 +09:00
|
|
|
case 38: // up arrow
|
|
|
|
case 33: // pg up
|
|
|
|
case 8: // backspace
|
2013-10-02 06:11:46 +09:00
|
|
|
if (!PresentationMode.active &&
|
2013-03-02 05:54:02 +09:00
|
|
|
PDFView.currentScaleValue !== 'page-fit') {
|
2012-10-06 11:55:47 +09:00
|
|
|
break;
|
|
|
|
}
|
2013-03-02 05:54:02 +09:00
|
|
|
/* in presentation mode */
|
2013-02-05 03:01:19 +09:00
|
|
|
/* falls through */
|
2012-04-11 01:55:52 +09:00
|
|
|
case 37: // left arrow
|
2012-12-14 05:10:21 +09:00
|
|
|
// horizontal scrolling using arrow keys
|
|
|
|
if (PDFView.isHorizontalScrollbarEnabled) {
|
|
|
|
break;
|
|
|
|
}
|
2013-02-05 03:01:19 +09:00
|
|
|
/* falls through */
|
2012-04-11 01:55:52 +09:00
|
|
|
case 75: // 'k'
|
|
|
|
case 80: // 'p'
|
|
|
|
PDFView.page--;
|
|
|
|
handled = true;
|
|
|
|
break;
|
2013-02-11 00:14:17 +09:00
|
|
|
case 27: // esc key
|
2013-09-05 06:48:31 +09:00
|
|
|
if (SecondaryToolbar.isOpen) {
|
|
|
|
SecondaryToolbar.close();
|
|
|
|
handled = true;
|
|
|
|
}
|
2013-02-11 00:14:17 +09:00
|
|
|
if (!PDFView.supportsIntegratedFind && PDFFindBar.opened) {
|
|
|
|
PDFFindBar.close();
|
|
|
|
handled = true;
|
|
|
|
}
|
|
|
|
break;
|
2012-10-06 11:55:47 +09:00
|
|
|
case 40: // down arrow
|
|
|
|
case 34: // pg down
|
|
|
|
case 32: // spacebar
|
2013-10-02 06:11:46 +09:00
|
|
|
if (!PresentationMode.active &&
|
2013-03-02 05:54:02 +09:00
|
|
|
PDFView.currentScaleValue !== 'page-fit') {
|
2012-10-06 11:55:47 +09:00
|
|
|
break;
|
|
|
|
}
|
2013-02-05 03:01:19 +09:00
|
|
|
/* falls through */
|
2012-04-11 01:55:52 +09:00
|
|
|
case 39: // right arrow
|
2012-12-14 05:10:21 +09:00
|
|
|
// horizontal scrolling using arrow keys
|
|
|
|
if (PDFView.isHorizontalScrollbarEnabled) {
|
|
|
|
break;
|
|
|
|
}
|
2013-02-05 03:01:19 +09:00
|
|
|
/* falls through */
|
2012-04-11 01:55:52 +09:00
|
|
|
case 74: // 'j'
|
|
|
|
case 78: // 'n'
|
|
|
|
PDFView.page++;
|
|
|
|
handled = true;
|
|
|
|
break;
|
2012-07-31 00:12:49 +09:00
|
|
|
|
2012-10-06 11:55:47 +09:00
|
|
|
case 36: // home
|
2013-10-02 06:11:46 +09:00
|
|
|
if (PresentationMode.active) {
|
2012-10-06 11:55:47 +09:00
|
|
|
PDFView.page = 1;
|
|
|
|
handled = true;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 35: // end
|
2013-10-02 06:11:46 +09:00
|
|
|
if (PresentationMode.active) {
|
2012-10-06 11:55:47 +09:00
|
|
|
PDFView.page = PDFView.pdfDocument.numPages;
|
2012-07-31 00:12:49 +09:00
|
|
|
handled = true;
|
|
|
|
}
|
|
|
|
break;
|
2012-09-08 08:05:14 +09:00
|
|
|
|
|
|
|
case 82: // 'r'
|
|
|
|
PDFView.rotatePages(90);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-05-16 07:31:17 +09:00
|
|
|
if (cmd === 4) { // shift-key
|
2012-09-08 08:05:14 +09:00
|
|
|
switch (evt.keyCode) {
|
2013-06-27 05:25:47 +09:00
|
|
|
case 32: // spacebar
|
2013-10-02 06:11:46 +09:00
|
|
|
if (!PresentationMode.active &&
|
2013-06-27 05:25:47 +09:00
|
|
|
PDFView.currentScaleValue !== 'page-fit') {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
PDFView.page--;
|
|
|
|
handled = true;
|
|
|
|
break;
|
|
|
|
|
2012-09-08 08:05:14 +09:00
|
|
|
case 82: // 'r'
|
|
|
|
PDFView.rotatePages(-90);
|
|
|
|
break;
|
2012-04-11 01:55:52 +09:00
|
|
|
}
|
2011-09-03 10:16:52 +09:00
|
|
|
}
|
2011-12-19 04:42:06 +09:00
|
|
|
|
2013-05-16 07:31:17 +09:00
|
|
|
if (cmd === 2) { // alt-key
|
|
|
|
switch (evt.keyCode) {
|
|
|
|
case 37: // left arrow
|
2013-10-02 06:11:46 +09:00
|
|
|
if (PresentationMode.active) {
|
2013-05-16 07:31:17 +09:00
|
|
|
PDFHistory.back();
|
|
|
|
handled = true;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 39: // right arrow
|
2013-10-02 06:11:46 +09:00
|
|
|
if (PresentationMode.active) {
|
2013-05-16 07:31:17 +09:00
|
|
|
PDFHistory.forward();
|
|
|
|
handled = true;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-12-19 04:42:06 +09:00
|
|
|
if (handled) {
|
|
|
|
evt.preventDefault();
|
2012-09-14 05:23:44 +09:00
|
|
|
PDFView.clearMouseScrollState();
|
2011-12-19 04:42:06 +09:00
|
|
|
}
|
2011-09-03 10:16:52 +09:00
|
|
|
});
|
2012-06-29 01:50:25 +09:00
|
|
|
|
|
|
|
window.addEventListener('beforeprint', function beforePrint(evt) {
|
|
|
|
PDFView.beforePrint();
|
|
|
|
});
|
|
|
|
|
|
|
|
window.addEventListener('afterprint', function afterPrint(evt) {
|
|
|
|
PDFView.afterPrint();
|
|
|
|
});
|
2012-07-31 00:12:49 +09:00
|
|
|
|
2013-01-26 04:58:49 +09:00
|
|
|
(function animationStartedClosure() {
|
|
|
|
// The offsetParent is not set until the pdf.js iframe or object is visible.
|
|
|
|
// Waiting for first animation.
|
|
|
|
var requestAnimationFrame = window.requestAnimationFrame ||
|
|
|
|
window.mozRequestAnimationFrame ||
|
|
|
|
window.webkitRequestAnimationFrame ||
|
|
|
|
window.oRequestAnimationFrame ||
|
|
|
|
window.msRequestAnimationFrame ||
|
|
|
|
function startAtOnce(callback) { callback(); };
|
|
|
|
PDFView.animationStartedPromise = new PDFJS.Promise();
|
|
|
|
requestAnimationFrame(function onAnimationFrame() {
|
|
|
|
PDFView.animationStartedPromise.resolve();
|
|
|
|
});
|
|
|
|
})();
|
|
|
|
|
2012-07-28 07:19:43 +09:00
|
|
|
//#if B2G
|
2012-08-02 03:29:13 +09:00
|
|
|
//window.navigator.mozSetMessageHandler('activity', function(activity) {
|
|
|
|
// var url = activity.source.data.url;
|
2013-07-11 01:52:37 +09:00
|
|
|
// PDFJS.maxImageSize = 1024 * 1024;
|
2012-11-29 04:02:56 +09:00
|
|
|
// PDFView.open(url);
|
|
|
|
// var cancelButton = document.getElementById('activityClose');
|
|
|
|
// cancelButton.addEventListener('click', function() {
|
|
|
|
// activity.postResult('close');
|
2012-08-02 03:29:13 +09:00
|
|
|
// });
|
|
|
|
//});
|
2012-07-28 07:19:43 +09:00
|
|
|
//#endif
|