| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 'use strict'; | 5 'use strict'; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * @return {number} Width of a scrollbar in pixels | 8 * @return {number} Width of a scrollbar in pixels |
| 9 */ | 9 */ |
| 10 function getScrollbarWidth() { | 10 function getScrollbarWidth() { |
| (...skipping 30 matching lines...) Expand all Loading... |
| 41 * document. | 41 * document. |
| 42 * @constructor | 42 * @constructor |
| 43 * @param {Object} streamDetails The stream object which points to the data | 43 * @param {Object} streamDetails The stream object which points to the data |
| 44 * contained in the PDF. | 44 * contained in the PDF. |
| 45 */ | 45 */ |
| 46 function PDFViewer(streamDetails) { | 46 function PDFViewer(streamDetails) { |
| 47 this.streamDetails_ = streamDetails; | 47 this.streamDetails_ = streamDetails; |
| 48 this.loaded_ = false; | 48 this.loaded_ = false; |
| 49 this.parentWindow_ = null; | 49 this.parentWindow_ = null; |
| 50 | 50 |
| 51 this.delayedScriptingMessages_ = []; |
| 52 |
| 51 this.isPrintPreview_ = | 53 this.isPrintPreview_ = |
| 52 this.streamDetails_.originalUrl.indexOf('chrome://print') == 0; | 54 this.streamDetails_.originalUrl.indexOf('chrome://print') == 0; |
| 53 this.isMaterial_ = location.pathname.substring(1) == 'index-material.html'; | 55 this.isMaterial_ = location.pathname.substring(1) == 'index-material.html'; |
| 54 | 56 |
| 55 // The sizer element is placed behind the plugin element to cause scrollbars | 57 // The sizer element is placed behind the plugin element to cause scrollbars |
| 56 // to be displayed in the window. It is sized according to the document size | 58 // to be displayed in the window. It is sized according to the document size |
| 57 // of the pdf and zoom level. | 59 // of the pdf and zoom level. |
| 58 this.sizer_ = $('sizer'); | 60 this.sizer_ = $('sizer'); |
| 59 this.toolbar_ = $('toolbar'); | 61 this.toolbar_ = $('toolbar'); |
| 60 this.pageIndicator_ = $('page-indicator'); | 62 this.pageIndicator_ = $('page-indicator'); |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 333 if (this.passwordScreen_.active) { | 335 if (this.passwordScreen_.active) { |
| 334 this.passwordScreen_.deny(); | 336 this.passwordScreen_.deny(); |
| 335 this.passwordScreen_.active = false; | 337 this.passwordScreen_.active = false; |
| 336 } | 338 } |
| 337 } else if (progress == 100) { | 339 } else if (progress == 100) { |
| 338 // Document load complete. | 340 // Document load complete. |
| 339 if (this.lastViewportPosition_) | 341 if (this.lastViewportPosition_) |
| 340 this.viewport_.position = this.lastViewportPosition_; | 342 this.viewport_.position = this.lastViewportPosition_; |
| 341 this.handleURLParams_(); | 343 this.handleURLParams_(); |
| 342 this.loaded_ = true; | 344 this.loaded_ = true; |
| 343 this.sendScriptingMessage_({ | 345 while (this.delayedScriptingMessages_.length > 0) |
| 344 type: 'documentLoaded' | 346 this.handleScriptingMessage(this.delayedScriptingMessages_.shift()); |
| 345 }); | |
| 346 } | 347 } |
| 347 }, | 348 }, |
| 348 | 349 |
| 349 /** | 350 /** |
| 350 * @private | 351 * @private |
| 351 * An event handler for handling password-submitted events. These are fired | 352 * An event handler for handling password-submitted events. These are fired |
| 352 * when an event is entered into the password screen. | 353 * when an event is entered into the password screen. |
| 353 * @param {Object} event a password-submitted event. | 354 * @param {Object} event a password-submitted event. |
| 354 */ | 355 */ |
| 355 onPasswordSubmitted_: function(event) { | 356 onPasswordSubmitted_: function(event) { |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 606 type: 'viewport', | 607 type: 'viewport', |
| 607 pageX: visiblePageDimensions.x, | 608 pageX: visiblePageDimensions.x, |
| 608 pageY: visiblePageDimensions.y, | 609 pageY: visiblePageDimensions.y, |
| 609 pageWidth: visiblePageDimensions.width, | 610 pageWidth: visiblePageDimensions.width, |
| 610 viewportWidth: size.width, | 611 viewportWidth: size.width, |
| 611 viewportHeight: size.height | 612 viewportHeight: size.height |
| 612 }); | 613 }); |
| 613 }, | 614 }, |
| 614 | 615 |
| 615 /** | 616 /** |
| 616 * @private | |
| 617 * Handle a scripting message from outside the extension (typically sent by | 617 * Handle a scripting message from outside the extension (typically sent by |
| 618 * PDFScriptingAPI in a page containing the extension) to interact with the | 618 * PDFScriptingAPI in a page containing the extension) to interact with the |
| 619 * plugin. | 619 * plugin. |
| 620 * @param {MessageObject} message the message to handle. | 620 * @param {MessageObject} message the message to handle. |
| 621 */ | 621 */ |
| 622 handleScriptingMessage: function(message) { | 622 handleScriptingMessage: function(message) { |
| 623 if (this.parentWindow_ != message.source) |
| 624 this.parentWindow_ = message.source; |
| 625 |
| 626 if (this.handlePrintPreviewScriptingMessage_(message)) |
| 627 return; |
| 628 |
| 629 // Delay scripting messages from users of the scripting API until the |
| 630 // document is loaded. This simplifies use of the APIs. |
| 631 if (!this.loaded_) { |
| 632 this.delayedScriptingMessages_.push(message); |
| 633 return; |
| 634 } |
| 635 |
| 623 switch (message.data.type.toString()) { | 636 switch (message.data.type.toString()) { |
| 624 case 'getAccessibilityJSON': | 637 case 'getAccessibilityJSON': |
| 625 case 'getSelectedText': | 638 case 'getSelectedText': |
| 626 case 'loadPreviewPage': | |
| 627 case 'print': | 639 case 'print': |
| 628 case 'selectAll': | 640 case 'selectAll': |
| 629 this.plugin_.postMessage(message.data); | 641 this.plugin_.postMessage(message.data); |
| 630 break; | 642 break; |
| 643 case 'isDocumentLoaded': |
| 644 // Since this is only hit after the document has been loaded, we can |
| 645 // send a reply immediately. |
| 646 this.sendScriptingMessage_({ |
| 647 type: 'documentLoaded' |
| 648 }); |
| 649 break; |
| 650 } |
| 651 }, |
| 652 |
| 653 /** |
| 654 * @private |
| 655 * Handle scripting messages specific to print preview. |
| 656 * @param {MessageObject} message the message to handle. |
| 657 * @return {boolean} true if the message was handled, false otherwise. |
| 658 */ |
| 659 handlePrintPreviewScriptingMessage_: function(message) { |
| 660 if (!this.isPrintPreview_) |
| 661 return false; |
| 662 |
| 663 switch (message.data.type.toString()) { |
| 664 case 'loadPreviewPage': |
| 665 this.plugin_.postMessage(message.data); |
| 666 return true; |
| 631 case 'resetPrintPreviewMode': | 667 case 'resetPrintPreviewMode': |
| 632 if (!this.isPrintPreview_) | |
| 633 break; | |
| 634 | |
| 635 if (!this.inPrintPreviewMode_) { | 668 if (!this.inPrintPreviewMode_) { |
| 636 this.inPrintPreviewMode_ = true; | 669 this.inPrintPreviewMode_ = true; |
| 637 this.viewport_.fitToPage(); | 670 this.viewport_.fitToPage(); |
| 638 } | 671 } |
| 639 | 672 |
| 640 // Stash the scroll location so that it can be restored when the new | 673 // Stash the scroll location so that it can be restored when the new |
| 641 // document is loaded. | 674 // document is loaded. |
| 642 this.lastViewportPosition_ = this.viewport_.position; | 675 this.lastViewportPosition_ = this.viewport_.position; |
| 643 | 676 |
| 644 // TODO(raymes): Disable these properly in the plugin. | 677 // TODO(raymes): Disable these properly in the plugin. |
| 645 var printButton = $('print-button'); | 678 var printButton = $('print-button'); |
| 646 if (printButton) | 679 if (printButton) |
| 647 printButton.parentNode.removeChild(printButton); | 680 printButton.parentNode.removeChild(printButton); |
| 648 var saveButton = $('save-button'); | 681 var saveButton = $('save-button'); |
| 649 if (saveButton) | 682 if (saveButton) |
| 650 saveButton.parentNode.removeChild(saveButton); | 683 saveButton.parentNode.removeChild(saveButton); |
| 651 | 684 |
| 652 this.pageIndicator_.pageLabels = message.data.pageNumbers; | 685 this.pageIndicator_.pageLabels = message.data.pageNumbers; |
| 653 | 686 |
| 654 this.plugin_.postMessage({ | 687 this.plugin_.postMessage({ |
| 655 type: 'resetPrintPreviewMode', | 688 type: 'resetPrintPreviewMode', |
| 656 url: message.data.url, | 689 url: message.data.url, |
| 657 grayscale: message.data.grayscale, | 690 grayscale: message.data.grayscale, |
| 658 // If the PDF isn't modifiable we send 0 as the page count so that no | 691 // If the PDF isn't modifiable we send 0 as the page count so that no |
| 659 // blank placeholder pages get appended to the PDF. | 692 // blank placeholder pages get appended to the PDF. |
| 660 pageCount: (message.data.modifiable ? | 693 pageCount: (message.data.modifiable ? |
| 661 message.data.pageNumbers.length : 0) | 694 message.data.pageNumbers.length : 0) |
| 662 }); | 695 }); |
| 663 break; | 696 return true; |
| 664 case 'sendKeyEvent': | 697 case 'sendKeyEvent': |
| 665 var e = document.createEvent('Event'); | 698 var e = document.createEvent('Event'); |
| 666 e.initEvent('scriptingKeypress'); | 699 e.initEvent('scriptingKeypress'); |
| 667 e.keyCode = message.data.keyCode; | 700 e.keyCode = message.data.keyCode; |
| 668 this.handleKeyEvent_(e); | 701 this.handleKeyEvent_(e); |
| 669 break; | 702 return true; |
| 670 case 'setParentWindow': | |
| 671 if (this.parentWindow_ != message.source) { | |
| 672 this.parentWindow_ = message.source; | |
| 673 // If the document has already loaded, we always send a message that | |
| 674 // indicates that so that the embedder is aware. | |
| 675 if (this.loaded_) { | |
| 676 this.sendScriptingMessage_({ | |
| 677 type: 'documentLoaded' | |
| 678 }); | |
| 679 } | |
| 680 } | |
| 681 break; | |
| 682 } | 703 } |
| 704 |
| 705 return false; |
| 683 }, | 706 }, |
| 684 | 707 |
| 685 /** | 708 /** |
| 686 * @private | 709 * @private |
| 687 * Send a scripting message outside the extension (typically to | 710 * Send a scripting message outside the extension (typically to |
| 688 * PDFScriptingAPI in a page containing the extension). | 711 * PDFScriptingAPI in a page containing the extension). |
| 689 * @param {Object} message the message to send. | 712 * @param {Object} message the message to send. |
| 690 */ | 713 */ |
| 691 sendScriptingMessage_: function(message) { | 714 sendScriptingMessage_: function(message) { |
| 692 if (this.parentWindow_) | 715 if (this.parentWindow_) |
| (...skipping 11 matching lines...) Expand all Loading... |
| 704 this.streamDetails_.tabId != -1); | 727 this.streamDetails_.tabId != -1); |
| 705 }, | 728 }, |
| 706 | 729 |
| 707 /** | 730 /** |
| 708 * @type {Viewport} the viewport of the PDF viewer. | 731 * @type {Viewport} the viewport of the PDF viewer. |
| 709 */ | 732 */ |
| 710 get viewport() { | 733 get viewport() { |
| 711 return this.viewport_; | 734 return this.viewport_; |
| 712 } | 735 } |
| 713 }; | 736 }; |
| OLD | NEW |