| Index: chrome/browser/resources/pdf/pdf.js
|
| diff --git a/chrome/browser/resources/pdf/pdf.js b/chrome/browser/resources/pdf/pdf.js
|
| index c9b50d9d9c72eda9eee4a42f1cf9e631ee3c64a1..3883709bb3df6dc21f96d51f319698aa2119dc36 100644
|
| --- a/chrome/browser/resources/pdf/pdf.js
|
| +++ b/chrome/browser/resources/pdf/pdf.js
|
| @@ -48,6 +48,8 @@ function PDFViewer(streamDetails) {
|
| this.loaded_ = false;
|
| this.parentWindow_ = null;
|
|
|
| + this.delayedScriptingMessages_ = [];
|
| +
|
| this.isPrintPreview_ =
|
| this.streamDetails_.originalUrl.indexOf('chrome://print') == 0;
|
| this.isMaterial_ = location.pathname.substring(1) == 'index-material.html';
|
| @@ -340,9 +342,8 @@ PDFViewer.prototype = {
|
| this.viewport_.position = this.lastViewportPosition_;
|
| this.handleURLParams_();
|
| this.loaded_ = true;
|
| - this.sendScriptingMessage_({
|
| - type: 'documentLoaded'
|
| - });
|
| + while (this.delayedScriptingMessages_.length > 0)
|
| + this.handleScriptingMessage(this.delayedScriptingMessages_.shift());
|
| }
|
| },
|
|
|
| @@ -613,25 +614,57 @@ PDFViewer.prototype = {
|
| },
|
|
|
| /**
|
| - * @private
|
| * Handle a scripting message from outside the extension (typically sent by
|
| * PDFScriptingAPI in a page containing the extension) to interact with the
|
| * plugin.
|
| * @param {MessageObject} message the message to handle.
|
| */
|
| handleScriptingMessage: function(message) {
|
| + if (this.parentWindow_ != message.source)
|
| + this.parentWindow_ = message.source;
|
| +
|
| + if (this.handlePrintPreviewScriptingMessage_(message))
|
| + return;
|
| +
|
| + // Delay scripting messages from users of the scripting API until the
|
| + // document is loaded. This simplifies use of the APIs.
|
| + if (!this.loaded_) {
|
| + this.delayedScriptingMessages_.push(message);
|
| + return;
|
| + }
|
| +
|
| switch (message.data.type.toString()) {
|
| case 'getAccessibilityJSON':
|
| case 'getSelectedText':
|
| - case 'loadPreviewPage':
|
| case 'print':
|
| case 'selectAll':
|
| this.plugin_.postMessage(message.data);
|
| break;
|
| - case 'resetPrintPreviewMode':
|
| - if (!this.isPrintPreview_)
|
| - break;
|
| + case 'isDocumentLoaded':
|
| + // Since this is only hit after the document has been loaded, we can
|
| + // send a reply immediately.
|
| + this.sendScriptingMessage_({
|
| + type: 'documentLoaded'
|
| + });
|
| + break;
|
| + }
|
| + },
|
|
|
| + /**
|
| + * @private
|
| + * Handle scripting messages specific to print preview.
|
| + * @param {MessageObject} message the message to handle.
|
| + * @return {boolean} true if the message was handled, false otherwise.
|
| + */
|
| + handlePrintPreviewScriptingMessage_: function(message) {
|
| + if (!this.isPrintPreview_)
|
| + return false;
|
| +
|
| + switch (message.data.type.toString()) {
|
| + case 'loadPreviewPage':
|
| + this.plugin_.postMessage(message.data);
|
| + return true;
|
| + case 'resetPrintPreviewMode':
|
| if (!this.inPrintPreviewMode_) {
|
| this.inPrintPreviewMode_ = true;
|
| this.viewport_.fitToPage();
|
| @@ -660,26 +693,16 @@ PDFViewer.prototype = {
|
| pageCount: (message.data.modifiable ?
|
| message.data.pageNumbers.length : 0)
|
| });
|
| - break;
|
| + return true;
|
| case 'sendKeyEvent':
|
| var e = document.createEvent('Event');
|
| e.initEvent('scriptingKeypress');
|
| e.keyCode = message.data.keyCode;
|
| this.handleKeyEvent_(e);
|
| - break;
|
| - case 'setParentWindow':
|
| - if (this.parentWindow_ != message.source) {
|
| - this.parentWindow_ = message.source;
|
| - // If the document has already loaded, we always send a message that
|
| - // indicates that so that the embedder is aware.
|
| - if (this.loaded_) {
|
| - this.sendScriptingMessage_({
|
| - type: 'documentLoaded'
|
| - });
|
| - }
|
| - }
|
| - break;
|
| + return true;
|
| }
|
| +
|
| + return false;
|
| },
|
|
|
| /**
|
|
|