diff options
author | dpapad@chromium.org <dpapad@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-12 22:11:33 +0000 |
---|---|---|
committer | dpapad@chromium.org <dpapad@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-12 22:11:33 +0000 |
commit | 718af82b9cda848d115dc731634ed9378640ace3 (patch) | |
tree | 698bc53413f96071231cad40b1f61ab41bb5fb00 /chrome | |
parent | 5a363f218b70bc0f9f5db1ae2fb9e6b1fdcb1978 (diff) | |
download | chromium_src-718af82b9cda848d115dc731634ed9378640ace3.zip chromium_src-718af82b9cda848d115dc731634ed9378640ace3.tar.gz chromium_src-718af82b9cda848d115dc731634ed9378640ace3.tar.bz2 |
Print Preview: Fixing behavior of event listeners.
Now that pending preview requests are being canceled when a new request is issued, the event listeners of the printing controls should not check for |hasPendingPreviewRequest| before issuing new requests, instead they should immediately request a new preview so that the previous one is canceled.
Also all functions that are associated with a specific print request should get the requestID as a parameter, in order to ignore obsolete responses.
I found out that when the print preview tab is reloaded, responses from requests before the reload are reaching the ui code. If reloading the preview tab repeatedly all these request have id=0 and are not being ignored as they should. Therefore I changed the id of the initial request to have a random variable.
BUG=91556, 91769
TEST=See bug description
Review URL: http://codereview.chromium.org/7550022
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@96634 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/printing/print_dialog_cloud.cc | 2 | ||||
-rw-r--r-- | chrome/browser/printing/print_preview_message_handler.cc | 22 | ||||
-rw-r--r-- | chrome/browser/printing/print_preview_message_handler.h | 6 | ||||
-rw-r--r-- | chrome/browser/resources/print_preview/color_settings.js | 6 | ||||
-rw-r--r-- | chrome/browser/resources/print_preview/layout_settings.js | 35 | ||||
-rw-r--r-- | chrome/browser/resources/print_preview/page_settings.js | 41 | ||||
-rw-r--r-- | chrome/browser/resources/print_preview/print_preview.js | 137 | ||||
-rw-r--r-- | chrome/browser/resources/print_preview/print_preview_utils.js | 14 | ||||
-rw-r--r-- | chrome/browser/ui/webui/print_preview_ui.cc | 26 | ||||
-rw-r--r-- | chrome/browser/ui/webui/print_preview_ui.h | 13 | ||||
-rw-r--r-- | chrome/common/print_messages.h | 28 | ||||
-rw-r--r-- | chrome/renderer/mock_printer.cc | 8 | ||||
-rw-r--r-- | chrome/renderer/mock_printer.h | 5 | ||||
-rw-r--r-- | chrome/renderer/mock_render_thread.cc | 11 | ||||
-rw-r--r-- | chrome/renderer/mock_render_thread.h | 9 | ||||
-rw-r--r-- | chrome/renderer/print_web_view_helper.cc | 20 | ||||
-rw-r--r-- | chrome/renderer/print_web_view_helper_browsertest.cc | 1 |
17 files changed, 203 insertions, 181 deletions
diff --git a/chrome/browser/printing/print_dialog_cloud.cc b/chrome/browser/printing/print_dialog_cloud.cc index fa20ad7..fe2e255 100644 --- a/chrome/browser/printing/print_dialog_cloud.cc +++ b/chrome/browser/printing/print_dialog_cloud.cc @@ -377,6 +377,8 @@ void CloudPrintFlowHandler::HandleSetPageParameters(const ListValue* args) { default_settings.desired_dpi = kDPI; default_settings.document_cookie = 0; default_settings.selection_only = false; + default_settings.preview_request_id = 0; + default_settings.is_first_request = true; if (!GetPageSetupParameters(json, default_settings)) { NOTREACHED(); diff --git a/chrome/browser/printing/print_preview_message_handler.cc b/chrome/browser/printing/print_preview_message_handler.cc index 11be054..6cc707a 100644 --- a/chrome/browser/printing/print_preview_message_handler.cc +++ b/chrome/browser/printing/print_preview_message_handler.cc @@ -82,10 +82,9 @@ void PrintPreviewMessageHandler::OnRequestPrintPreview() { PrintPreviewTabController::PrintPreview(tab_contents()); } -void PrintPreviewMessageHandler::OnDidGetPreviewPageCount(int document_cookie, - int page_count, - bool is_modifiable) { - if (page_count <= 0) +void PrintPreviewMessageHandler::OnDidGetPreviewPageCount( + const PrintHostMsg_DidGetPreviewPageCount_Params& params) { + if (params.page_count <= 0) return; TabContents* print_preview_tab = GetPrintPreviewTab(); @@ -94,8 +93,7 @@ void PrintPreviewMessageHandler::OnDidGetPreviewPageCount(int document_cookie, PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(print_preview_tab->web_ui()); - print_preview_ui->OnDidGetPreviewPageCount( - document_cookie, page_count, is_modifiable); + print_preview_ui->OnDidGetPreviewPageCount(params); } void PrintPreviewMessageHandler::OnDidPreviewPage( @@ -131,7 +129,7 @@ void PrintPreviewMessageHandler::OnDidPreviewPage( DCHECK(data_bytes); print_preview_ui->SetPrintPreviewDataForIndex(page_number, data_bytes); - print_preview_ui->OnDidPreviewPage(page_number); + print_preview_ui->OnDidPreviewPage(page_number, params.preview_request_id); // TODO(kmadhusu): Query |PrintPreviewUI| and update // |requested_preview_page_index| accordingly. } @@ -158,10 +156,12 @@ void PrintPreviewMessageHandler::OnPagesReadyForPreview( if (params.reuse_existing_data) { // Need to match normal rendering where we are expected to send this. - print_preview_ui->OnDidGetPreviewPageCount(params.document_cookie, - params.expected_pages_count, - params.modifiable); - + PrintHostMsg_DidGetPreviewPageCount_Params temp_params; + temp_params.page_count = params.expected_pages_count; + temp_params.document_cookie = params.document_cookie; + temp_params.is_modifiable = params.modifiable; + temp_params.preview_request_id = params.preview_request_id; + print_preview_ui->OnDidGetPreviewPageCount(temp_params); print_preview_ui->OnReusePreviewData(params.preview_request_id); return; } diff --git a/chrome/browser/printing/print_preview_message_handler.h b/chrome/browser/printing/print_preview_message_handler.h index ff56b01..11bc8a0 100644 --- a/chrome/browser/printing/print_preview_message_handler.h +++ b/chrome/browser/printing/print_preview_message_handler.h @@ -8,6 +8,7 @@ #include "content/browser/tab_contents/tab_contents_observer.h" +struct PrintHostMsg_DidGetPreviewPageCount_Params; struct PrintHostMsg_DidPreviewDocument_Params; struct PrintHostMsg_DidPreviewPage_Params; @@ -31,9 +32,8 @@ class PrintPreviewMessageHandler : public TabContentsObserver { // Message handlers. void OnRequestPrintPreview(); - void OnDidGetPreviewPageCount(int document_cookie, - int page_count, - bool is_modifiable); + void OnDidGetPreviewPageCount( + const PrintHostMsg_DidGetPreviewPageCount_Params& params); // |page_number| is 0-based. void OnDidPreviewPage(const PrintHostMsg_DidPreviewPage_Params& params); void OnPagesReadyForPreview( diff --git a/chrome/browser/resources/print_preview/color_settings.js b/chrome/browser/resources/print_preview/color_settings.js index bb0198c..c0547e9 100644 --- a/chrome/browser/resources/print_preview/color_settings.js +++ b/chrome/browser/resources/print_preview/color_settings.js @@ -49,12 +49,10 @@ cr.define('print_preview', function() { */ addEventListeners: function() { this.colorRadioButton_.onclick = function() { - if (!hasPendingPreviewRequest) - setColor(true); + setColor(true); }; this.bwRadioButton_.onclick = function() { - if (!hasPendingPreviewRequest) - setColor(false); + setColor(false); }; document.addEventListener('PDFLoaded', this.onPDFLoaded_.bind(this)); document.addEventListener('printerCapabilitiesUpdated', diff --git a/chrome/browser/resources/print_preview/layout_settings.js b/chrome/browser/resources/print_preview/layout_settings.js index 0932e21..d6894e6 100644 --- a/chrome/browser/resources/print_preview/layout_settings.js +++ b/chrome/browser/resources/print_preview/layout_settings.js @@ -14,6 +14,8 @@ cr.define('print_preview', function() { this.layoutOption_ = $('layout-option'); this.portraitRadioButton_ = $('portrait'); this.landscapeRadioButton_ = $('landscape'); + this.wasLandscape_ = false; + this.updateState(); } cr.addSingletonGetter(LayoutSettings); @@ -44,18 +46,27 @@ cr.define('print_preview', function() { }, /** + * @return {boolean} true if the chosen layout mode has changed since last + * time the state was updated. + */ + hasChanged_ : function() { + return this.isLandscape() != this.wasLandscape_; + }, + + /** + * Saves the currently selected layout mode. Used in |this.hasChanged_|. + */ + updateState : function() { + this.wasLandscape_ = this.isLandscape(); + }, + + /** * Adding listeners to all layout related controls. The listeners take care * of altering their behavior depending on |hasPendingPreviewRequest|. */ addEventListeners: function() { - this.landscapeRadioButton_.onclick = function() { - if (!hasPendingPreviewRequest) - this.onLayoutButtonClick_(); - }.bind(this); - this.portraitRadioButton_.onclick = function() { - if (!hasPendingPreviewRequest) - this.onLayoutButtonClick_(); - }.bind(this); + this.landscapeRadioButton_.onclick = this.onLayoutButtonClick_.bind(this); + this.portraitRadioButton_.onclick = this.onLayoutButtonClick_.bind(this); document.addEventListener('PDFLoaded', this.onPDFLoaded_.bind(this)); document.addEventListener('printerCapabilitiesUpdated', this.onPrinterCapabilitiesUpdated_.bind(this)); @@ -77,9 +88,8 @@ cr.define('print_preview', function() { */ onLayoutButtonClick_: function() { // If the chosen layout is same as before, nothing needs to be done. - if (printSettings.isLandscape == this.isLandscape()) - return; - setDefaultValuesAndRegeneratePreview(); + if (this.hasChanged_()) + setDefaultValuesAndRegeneratePreview(); }, /** @@ -87,8 +97,7 @@ cr.define('print_preview', function() { * @private */ onPDFLoaded_: function() { - if (!previewModifiable) - fadeOutElement(this.layoutOption_); + this.fadeInOut_(!previewModifiable); }, /** diff --git a/chrome/browser/resources/print_preview/page_settings.js b/chrome/browser/resources/print_preview/page_settings.js index 48210c6..a0c36d0 100644 --- a/chrome/browser/resources/print_preview/page_settings.js +++ b/chrome/browser/resources/print_preview/page_settings.js @@ -322,13 +322,12 @@ cr.define('print_preview', function() { * |this.selectedPagesTextfield|. Ensures that * |this.selectedPagesTextfield| is non-empty before checking * |this.selectedPagesRadioButton|. + * @private */ - onSelectedPagesTextfieldInput: function() { + onSelectedPagesTextfieldInput_: function() { if (this.selectedPagesText.length) this.selectedPagesRadioButton.checked = true; - if (!hasPendingPreviewRequest) { - this.resetSelectedPagesTextfieldTimer_(); - } + this.resetSelectedPagesTextfieldTimer_(); }, /** @@ -336,25 +335,14 @@ cr.define('print_preview', function() { * of altering their behavior depending on |hasPendingPreviewRequest|. */ addEventListeners: function() { - this.allPagesRadioButton.onclick = function() { - if (hasPendingPreviewRequest) - cr.dispatchSimpleEvent(document, 'updatePrintButton'); - else - this.onSelectedPagesMayHaveChanged_(); - }.bind(this); - - this.selectedPagesRadioButton.onclick = function() { - if (!hasPendingPreviewRequest) - this.onSelectedPagesMayHaveChanged_(); - }.bind(this); - + this.allPagesRadioButton.onclick = + this.onSelectedPagesMayHaveChanged_.bind(this); + this.selectedPagesRadioButton.onclick = + this.onSelectedPagesMayHaveChanged_.bind(this); this.selectedPagesTextfield.oninput = - this.onSelectedPagesTextfieldInput.bind(this); - - this.selectedPagesTextfield.onfocus = function() { - if (!hasPendingPreviewRequest) - this.addTimerToSelectedPagesTextfield_(); - }.bind(this); + this.onSelectedPagesTextfieldInput_.bind(this); + this.selectedPagesTextfield.onfocus = + this.addTimerToSelectedPagesTextfield_.bind(this); // Handler for the blur event on |this.selectedPagesTextfield|. Un-checks // |this.selectedPagesRadioButton| if the input field is empty. @@ -362,13 +350,8 @@ cr.define('print_preview', function() { if (!this.selectedPagesText.length) this.allPagesRadioButton_.checked = true; - if (hasPendingPreviewRequest) { - this.validateSelectedPages_(); - cr.dispatchSimpleEvent(document, 'updatePrintButton'); - } else { - clearTimeout(this.timerId_); - this.onSelectedPagesMayHaveChanged_(); - } + clearTimeout(this.timerId_); + this.onSelectedPagesMayHaveChanged_(); }.bind(this); } }; diff --git a/chrome/browser/resources/print_preview/print_preview.js b/chrome/browser/resources/print_preview/print_preview.js index 47c455d..e6dfa33 100644 --- a/chrome/browser/resources/print_preview/print_preview.js +++ b/chrome/browser/resources/print_preview/print_preview.js @@ -24,9 +24,6 @@ const MORE_PRINTERS = 'morePrinters'; const SIGN_IN = 'signIn'; const PRINT_TO_PDF = 'Print to PDF'; -// State of the print preview settings. -var printSettings = new PrintSettings(); - // The name of the default or last used printer. var defaultOrLastUsedPrinterName = ''; @@ -36,6 +33,9 @@ var hasPendingPreviewRequest = false; // The ID of the last preview request. var lastPreviewRequestID = -1; +// The ID of the initial preview request. +var initialPreviewRequestID = -1; + // True when a pending print file request exists. var hasPendingPrintDocumentRequest = false; @@ -74,12 +74,17 @@ var addedCloudPrinters = {}; // The maximum number of cloud printers to allow in the dropdown. const maxCloudPrinters = 10; +const MIN_REQUEST_ID = 0; +const MAX_REQUEST_ID = 32000; + /** * Window onload handler, sets up the page and starts print preview by getting * the printer list. */ function onLoad() { cr.enablePlatformSpecificCSSRules(); + initialPreviewRequestID = randomInteger(MIN_REQUEST_ID, MAX_REQUEST_ID); + lastPreviewRequestID = initialPreviewRequestID; if (!checkCompatiblePluginExists()) { disableInputElementsInSidebar(); @@ -105,31 +110,13 @@ function onLoad() { copiesSettings.addEventListeners(); layoutSettings.addEventListeners(); colorSettings.addEventListeners(); + $('printer-list').onchange = updateControlsWithSelectedPrinterCapabilities; showLoadingAnimation(); chrome.send('getDefaultPrinter'); } /** - * Adds event listeners to the settings controls. - */ -function addEventListeners() { - // Controls that require preview rendering. - $('printer-list').onchange = updateControlsWithSelectedPrinterCapabilities; -} - -/** - * Removes event listeners from the settings controls. - */ -function removeEventListeners() { - if (pageSettings) - clearTimeout(pageSettings.timerId_); - - // Controls that require preview rendering - $('printer-list').onchange = null; -} - -/** * Disables the input elements in the sidebar. */ function disableInputElementsInSidebar() { @@ -304,14 +291,14 @@ function getSettings() { var settings = {'deviceName': deviceName, 'pageRange': pageSettings.selectedPageRanges, - 'printAll': pageSettings.allPagesRadioButton.checked, 'duplex': copiesSettings.duplexMode, 'copies': copiesSettings.numberOfCopies, 'collate': copiesSettings.isCollated(), 'landscape': layoutSettings.isLandscape(), 'color': colorSettings.isColor(), 'printToPDF': printToPDF, - 'requestID': 0}; + 'isFirstRequest' : false, + 'requestID': -1}; var printerList = $('printer-list'); var selectedPrinter = printerList.selectedIndex; @@ -323,6 +310,21 @@ function getSettings() { } /** + * Creates an object based on the values in the printer settings. + * Note: |lastPreviewRequestID| is being modified every time this function is + * called. Only call this function when a preview request is actually sent, + * otherwise (for example when debugging) call getSettings(). + * + * @return {Object} Object containing print job settings. + */ +function getSettingsWithRequestID() { + var settings = getSettings(); + settings.requestID = generatePreviewRequestID(); + settings.isFirstRequest = isFirstPreviewRequest(); + return settings; +} + +/** * @return {number} The next unused preview request id. */ function generatePreviewRequestID() { @@ -333,7 +335,15 @@ function generatePreviewRequestID() { * @return {boolean} True iff a preview has been requested. */ function hasRequestedPreview() { - return lastPreviewRequestID > -1; + return lastPreviewRequestID != initialPreviewRequestID; +} + +/** + * @return {boolean} True if |lastPreviewRequestID| corresponds to the initial + * preview request. + */ +function isFirstPreviewRequest() { + return lastPreviewRequestID == initialPreviewRequestID + 1; } /** @@ -381,7 +391,6 @@ function requestToPrintDocument() { if (printToPDF) { sendPrintDocumentRequest(); } else { - removeEventListeners(); window.setTimeout(function() { sendPrintDocumentRequest(); }, 1000); } } @@ -425,14 +434,11 @@ function sendPrintDocumentRequest() { */ function requestPrintPreview() { hasPendingPreviewRequest = true; - removeEventListeners(); - printSettings.save(); + layoutSettings.updateState(); if (!isTabHidden) showLoadingAnimation(); - var settings = getSettings(); - settings.requestID = generatePreviewRequestID(); - chrome.send('getPreview', [JSON.stringify(settings)]); + chrome.send('getPreview', [JSON.stringify(getSettingsWithRequestID())]); } /** @@ -731,7 +737,6 @@ function displayErrorMessage(errorMessage) { $('dancing-dots-text').classList.add('hidden'); $('error-text').innerHTML = errorMessage; $('error-text').classList.remove('hidden'); - removeEventListeners(); var pdfViewer = $('pdf-viewer'); if (pdfViewer) $('mainview').removeChild(pdfViewer); @@ -774,7 +779,6 @@ function printPreviewFailed() { function onPDFLoad() { if (previewModifiable) { setPluginPreviewPageCount(); - cr.dispatchSimpleEvent(document, 'updateSummary'); } $('pdf-viewer').fitToHeight(); cr.dispatchSimpleEvent(document, 'PDFLoaded'); @@ -792,25 +796,29 @@ function setPluginPreviewPageCount() { * @param {number} pageCount The number of pages. * @param {boolean} isModifiable Indicates whether the previewed document can be * modified. + * @param {number} previewResponseId The preview request id that resulted in + * this response. */ -function onDidGetPreviewPageCount(pageCount, isModifiable) { +function onDidGetPreviewPageCount(pageCount, isModifiable, previewResponseId) { + if (!isExpectedPreviewResponse(previewResponseId)) + return; pageSettings.updateState(pageCount); previewModifiable = isModifiable; + cr.dispatchSimpleEvent(document, 'updateSummary'); } /** * Called when no pipelining previewed pages. + * @param {string} previewUid Preview unique identifier. + * @param {number} previewResponseId The preview request id that resulted in + * this response. */ function reloadPreviewPages(previewUid, previewResponseId) { if (!isExpectedPreviewResponse(previewResponseId)) return; hasPendingPreviewRequest = false; - if (checkIfSettingsChangedAndRegeneratePreview()) - return; - cr.dispatchSimpleEvent(document, 'updateSummary'); cr.dispatchSimpleEvent(document, 'updatePrintButton'); - addEventListeners(); hideLoadingAnimation(); var pageSet = pageSettings.previouslySelectedPages; for (var i = 0; i < pageSet.length; i++) @@ -823,15 +831,21 @@ function reloadPreviewPages(previewUid, previewResponseId) { * Check if the settings have changed and request a regeneration if needed. * Called from PrintPreviewUI::OnDidPreviewPage(). * @param {number} pageNumber The page number, 0-based. + * @param {string} previewUid Preview unique identifier. + * @param {number} previewResponseId The preview request id that resulted in + * this response. */ -function onDidPreviewPage(pageNumber, previewUid) { +function onDidPreviewPage(pageNumber, previewUid, previewResponseId) { + if (!isExpectedPreviewResponse(previewResponseId)) + return; + // Refactor if (!previewModifiable) return; var pageIndex = pageSettings.previouslySelectedPages.indexOf(pageNumber + 1); - if (checkIfSettingsChangedAndRegeneratePreview()) + if (pageSettings.requestPrintPreviewIfNeeded()) return; if (pageIndex == 0) createPDFPlugin(previewUid); @@ -857,9 +871,6 @@ function updatePrintPreview(jobTitle, return; hasPendingPreviewRequest = false; - if (checkIfSettingsChangedAndRegeneratePreview()) - return; - document.title = localStrings.getStringF('printPreviewTitleFormat', jobTitle); if (!previewModifiable) { @@ -867,37 +878,13 @@ function updatePrintPreview(jobTitle, createPDFPlugin(previewUid); } - cr.dispatchSimpleEvent(document, 'updateSummary'); cr.dispatchSimpleEvent(document, 'updatePrintButton'); - addEventListeners(); if (hasPendingPrintDocumentRequest) requestToPrintPendingDocument(); } /** - * Check if any print settings changed and regenerate the preview if needed. - * @return {boolean} true if a new preview is required. - */ -function checkIfSettingsChangedAndRegeneratePreview() { - var tempPrintSettings = new PrintSettings(); - tempPrintSettings.save(); - - if (printSettings.deviceName != tempPrintSettings.deviceName) { - updateControlsWithSelectedPrinterCapabilities(); - return true; - } - if (printSettings.isLandscape != tempPrintSettings.isLandscape) { - setDefaultValuesAndRegeneratePreview(); - return true; - } - if (pageSettings.requestPrintPreviewIfNeeded()) - return true; - - return false; -} - -/** * Create the PDF plugin or reload the existing one. * @param {string} previewUid Preview unique identifier. */ @@ -950,22 +937,6 @@ function setDefaultValuesAndRegeneratePreview() { requestPrintPreview(); } -/** - * Class that represents the state of the print settings. - */ -function PrintSettings() { - this.deviceName = ''; - this.isLandscape = ''; -} - -/** - * Takes a snapshot of the print settings. - */ -PrintSettings.prototype.save = function() { - this.deviceName = getSelectedPrinterName(); - this.isLandscape = layoutSettings.isLandscape(); -} - /// Pull in all other scripts in a single shot. <include src="print_preview_animations.js"/> <include src="print_preview_cloud.js"/> diff --git a/chrome/browser/resources/print_preview/print_preview_utils.js b/chrome/browser/resources/print_preview/print_preview_utils.js index 68e5224..594769e 100644 --- a/chrome/browser/resources/print_preview/print_preview_utils.js +++ b/chrome/browser/resources/print_preview/print_preview_utils.js @@ -189,3 +189,17 @@ function pageSetToPageRanges(pageSet) { function getPageSrcURL(id, pageNumber) { return 'chrome://print/' + id + '/' + pageNumber + '/print.pdf'; } + + +/** + * Returns a random integer within the specified range, |endPointA| and + * |endPointB| are included. + * @param {number} endPointA One end of the desired range. + * @param {number} endPointB The other end of the desired range. + * @return {number} The random integer. + */ +function randomInteger(endPointA, endPointB) { + from = Math.min(endPointA, endPointB); + to = Math.max(endPointA, endPointB); + return Math.floor(Math.random() * (to - from + 1) + from); +} diff --git a/chrome/browser/ui/webui/print_preview_ui.cc b/chrome/browser/ui/webui/print_preview_ui.cc index d61baea..58d5a29 100644 --- a/chrome/browser/ui/webui/print_preview_ui.cc +++ b/chrome/browser/ui/webui/print_preview_ui.cc @@ -11,6 +11,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/webui/print_preview_data_source.h" #include "chrome/browser/ui/webui/print_preview_handler.h" +#include "chrome/common/print_messages.h" #include "content/browser/tab_contents/tab_contents.h" PrintPreviewUI::PrintPreviewUI(TabContents* contents) @@ -63,21 +64,24 @@ void PrintPreviewUI::OnPrintPreviewRequest() { request_count_++; } -void PrintPreviewUI::OnDidGetPreviewPageCount(int document_cookie, - int page_count, - bool is_modifiable) { - DCHECK_GT(page_count, 0); - document_cookie_ = document_cookie; - base::FundamentalValue count(page_count); - base::FundamentalValue modifiable(is_modifiable); - CallJavascriptFunction("onDidGetPreviewPageCount", count, modifiable); +void PrintPreviewUI::OnDidGetPreviewPageCount( + const PrintHostMsg_DidGetPreviewPageCount_Params& params) { + DCHECK_GT(params.page_count, 0); + document_cookie_ = params.document_cookie; + base::FundamentalValue count(params.page_count); + base::FundamentalValue modifiable(params.is_modifiable); + base::FundamentalValue request_id(params.preview_request_id); + CallJavascriptFunction("onDidGetPreviewPageCount", count, modifiable, + request_id); } -void PrintPreviewUI::OnDidPreviewPage(int page_number) { +void PrintPreviewUI::OnDidPreviewPage(int page_number, + int preview_request_id) { DCHECK_GE(page_number, 0); base::FundamentalValue number(page_number); - base::StringValue ui_identifier(preview_ui_addr_str_); - CallJavascriptFunction("onDidPreviewPage", number, ui_identifier); + StringValue ui_identifier(preview_ui_addr_str_); + base::FundamentalValue request_id(preview_request_id); + CallJavascriptFunction("onDidPreviewPage", number, ui_identifier, request_id); } void PrintPreviewUI::OnReusePreviewData(int preview_request_id) { diff --git a/chrome/browser/ui/webui/print_preview_ui.h b/chrome/browser/ui/webui/print_preview_ui.h index 368a3fa..8492e85 100644 --- a/chrome/browser/ui/webui/print_preview_ui.h +++ b/chrome/browser/ui/webui/print_preview_ui.h @@ -16,6 +16,7 @@ class PrintPreviewDataService; class PrintPreviewHandler; +struct PrintHostMsg_DidGetPreviewPageCount_Params; class PrintPreviewUI : public ChromeWebUI { public: @@ -40,15 +41,13 @@ class PrintPreviewUI : public ChromeWebUI { // a matching call to OnPreviewDataIsAvailable() or OnPrintPreviewFailed(). void OnPrintPreviewRequest(); - // Notifies the Web UI that the print preview will have |page_count| pages. - // |is_modifiable| indicates if the preview can be rerendered with different - // print settings. - void OnDidGetPreviewPageCount(int document_cookie_, - int page_count, - bool is_modifiable); + // Notifies the Web UI about the page count of the request preview. + void OnDidGetPreviewPageCount( + const PrintHostMsg_DidGetPreviewPageCount_Params& params); // Notifies the Web UI that the 0-based page |page_number| has been rendered. - void OnDidPreviewPage(int page_number); + // |preview_request_id| indicates wich request resulted in this response. + void OnDidPreviewPage(int page_number, int preview_request_id); // Notifies the Web UI renderer that preview data is available. // |expected_pages_count| specifies the total number of pages. |job_title| is diff --git a/chrome/common/print_messages.h b/chrome/common/print_messages.h index 618ece5..3644428 100644 --- a/chrome/common/print_messages.h +++ b/chrome/common/print_messages.h @@ -49,7 +49,11 @@ IPC_STRUCT_BEGIN(PrintMsg_Print_Params) // Does the printer support alpha blending? IPC_STRUCT_MEMBER(bool, supports_alpha_blend) + // The id of the preview request, used only for print preview. IPC_STRUCT_MEMBER(int, preview_request_id) + + // True if this is the first preview request, used only for print preview. + IPC_STRUCT_MEMBER(bool, is_first_request) IPC_STRUCT_END() IPC_STRUCT_BEGIN(PrintMsg_PrintPage_Params) @@ -107,6 +111,24 @@ IPC_STRUCT_BEGIN(PrintHostMsg_DidPreviewPage_Params) // |page_number| is zero-based and can be |printing::INVALID_PAGE_INDEX| if it // is just a check. IPC_STRUCT_MEMBER(int, page_number) + + // The id of the preview request. + IPC_STRUCT_MEMBER(int, preview_request_id) +IPC_STRUCT_END() + +// Parameters sent along with the page count. +IPC_STRUCT_BEGIN(PrintHostMsg_DidGetPreviewPageCount_Params) + // Cookie for the document to ensure correctness. + IPC_STRUCT_MEMBER(int, document_cookie) + + // Total page count. + IPC_STRUCT_MEMBER(int, page_count) + + // Indicates whether the previewed document is modifiable. + IPC_STRUCT_MEMBER(bool, is_modifiable) + + // The id of the preview request. + IPC_STRUCT_MEMBER(int, preview_request_id) IPC_STRUCT_END() // Parameters to describe a rendered page. @@ -259,10 +281,8 @@ IPC_MESSAGE_CONTROL1(PrintHostMsg_TempFileForPrintingWritten, IPC_MESSAGE_ROUTED0(PrintHostMsg_RequestPrintPreview) // Notify the browser the number of pages in the print preview document. -IPC_MESSAGE_ROUTED3(PrintHostMsg_DidGetPreviewPageCount, - int /* document cookie */, - int /* page count */, - bool /* is modifiable */) +IPC_MESSAGE_ROUTED1(PrintHostMsg_DidGetPreviewPageCount, + PrintHostMsg_DidGetPreviewPageCount_Params /* params */) // Notify the browser a print preview page has been rendered. IPC_MESSAGE_ROUTED1(PrintHostMsg_DidPreviewPage, diff --git a/chrome/renderer/mock_printer.cc b/chrome/renderer/mock_printer.cc index 6fa65cc..ac2c779 100644 --- a/chrome/renderer/mock_printer.cc +++ b/chrome/renderer/mock_printer.cc @@ -35,7 +35,9 @@ MockPrinter::MockPrinter() current_document_cookie_(0), printer_status_(PRINTER_READY), number_pages_(0), - page_number_(0) { + page_number_(0), + is_first_request_(true), + preview_request_id_(0) { page_size_.SetSize(static_cast<int>(8.5 * dpi_), static_cast<int>(11.0 * dpi_)); printable_size_.SetSize(static_cast<int>((7.5 * dpi_)), @@ -90,6 +92,8 @@ void MockPrinter::ScriptedPrint(int cookie, settings->params.document_cookie = document_cookie_; settings->params.page_size = page_size_; settings->params.printable_size = printable_size_; + settings->params.is_first_request = is_first_request_; + settings->params.preview_request_id = preview_request_id_; printer_status_ = PRINTER_PRINTING; } @@ -230,4 +234,6 @@ void MockPrinter::SetPrintParams(PrintMsg_Print_Params* params) { params->printable_size = printable_size_; params->margin_left = margin_left_; params->margin_top = margin_top_; + params->is_first_request = is_first_request_; + params->preview_request_id = preview_request_id_; } diff --git a/chrome/renderer/mock_printer.h b/chrome/renderer/mock_printer.h index 1c2994c..0ae5687 100644 --- a/chrome/renderer/mock_printer.h +++ b/chrome/renderer/mock_printer.h @@ -129,6 +129,11 @@ class MockPrinter { // The output of a printing job. int number_pages_; int page_number_; + + // Used only in the preview sequence. + bool is_first_request_; + int preview_request_id_; + std::vector<scoped_refptr<MockPrinterPage> > pages_; DISALLOW_COPY_AND_ASSIGN(MockPrinter); diff --git a/chrome/renderer/mock_render_thread.cc b/chrome/renderer/mock_render_thread.cc index aac7156..b443559 100644 --- a/chrome/renderer/mock_render_thread.cc +++ b/chrome/renderer/mock_render_thread.cc @@ -211,10 +211,9 @@ void MockRenderThread::OnDidPrintPage( printer_->PrintPage(params); } -void MockRenderThread::OnDidGetPreviewPageCount(int document_cookie, - int number_pages, - bool is_modifiable) { - print_preview_pages_remaining_ = number_pages; +void MockRenderThread::OnDidGetPreviewPageCount( + const PrintHostMsg_DidGetPreviewPageCount_Params& params) { + print_preview_pages_remaining_ = params.page_count; } void MockRenderThread::OnDidPreviewPage( @@ -235,9 +234,11 @@ void MockRenderThread::OnUpdatePrintSettings( !job_settings.GetBoolean(printing::kSettingCollate, NULL) || !job_settings.GetBoolean(printing::kSettingColor, NULL) || !job_settings.GetBoolean(printing::kSettingPrintToPDF, NULL) || + !job_settings.GetBoolean(printing::kIsFirstRequest, NULL) || !job_settings.GetString(printing::kSettingDeviceName, &dummy_string) || !job_settings.GetInteger(printing::kSettingDuplexMode, NULL) || - !job_settings.GetInteger(printing::kSettingCopies, NULL)) { + !job_settings.GetInteger(printing::kSettingCopies, NULL) || + !job_settings.GetInteger(printing::kPreviewRequestID, NULL)) { return; } diff --git a/chrome/renderer/mock_render_thread.h b/chrome/renderer/mock_render_thread.h index 5eb7ad3..c510d91 100644 --- a/chrome/renderer/mock_render_thread.h +++ b/chrome/renderer/mock_render_thread.h @@ -18,10 +18,11 @@ namespace IPC { class MessageReplyDeserializer; } -struct PrintMsg_Print_Params; -struct PrintMsg_PrintPages_Params; +struct PrintHostMsg_DidGetPreviewPageCount_Params; struct PrintHostMsg_DidPreviewPage_Params; struct PrintHostMsg_ScriptedPrint_Params; +struct PrintMsg_PrintPages_Params; +struct PrintMsg_Print_Params; // This class is very simple mock of RenderThread. It simulates an IPC channel // which supports only two messages: @@ -125,8 +126,8 @@ class MockRenderThread : public RenderThreadBase { void OnDidGetPrintedPagesCount(int cookie, int number_pages); void OnDidPrintPage(const PrintHostMsg_DidPrintPage_Params& params); - void OnDidGetPreviewPageCount(int document_cookie, int number_pages, - bool is_modifiable); + void OnDidGetPreviewPageCount( + const PrintHostMsg_DidGetPreviewPageCount_Params& params); void OnDidPreviewPage(const PrintHostMsg_DidPreviewPage_Params& params); // For print preview, PrintWebViewHelper will update settings. diff --git a/chrome/renderer/print_web_view_helper.cc b/chrome/renderer/print_web_view_helper.cc index b065f31..dbf1ca5 100644 --- a/chrome/renderer/print_web_view_helper.cc +++ b/chrome/renderer/print_web_view_helper.cc @@ -319,7 +319,7 @@ void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) { return; } - if (print_pages_params_->params.preview_request_id != 0 && + if (!print_pages_params_->params.is_first_request && old_print_pages_params_.get() && PrintMsg_Print_Params_IsEqual(*old_print_pages_params_, *print_pages_params_)) { @@ -351,11 +351,12 @@ bool PrintWebViewHelper::CreatePreviewDocument() { const std::vector<int>& pages = print_pages_params_->pages; if (!print_preview_context_.CreatePreviewDocument(&print_params, pages)) return false; - int page_count = print_preview_context_.total_page_count(); - bool is_modifiable = print_preview_context_.IsModifiable(); - int document_cookie = print_pages_params_->params.document_cookie; - Send(new PrintHostMsg_DidGetPreviewPageCount(routing_id(), document_cookie, - page_count, is_modifiable)); + PrintHostMsg_DidGetPreviewPageCount_Params params; + params.page_count = print_preview_context_.total_page_count(); + params.is_modifiable = print_preview_context_.IsModifiable(); + params.document_cookie = print_pages_params_->params.document_cookie; + params.preview_request_id = print_pages_params_->params.preview_request_id; + Send(new PrintHostMsg_DidGetPreviewPageCount(routing_id(), params)); PreviewPageRendered(printing::INVALID_PAGE_INDEX, NULL); return true; } @@ -773,6 +774,11 @@ bool PrintWebViewHelper::UpdatePrintSettings( if (!UpdatePrintSettingsRequestId(job_settings, &(settings.params))) return false; + if (!job_settings.GetBoolean(printing::kIsFirstRequest, + &(settings.params.is_first_request))) { + NOTREACHED(); + } + print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings)); Send(new PrintHostMsg_DidGetDocumentCookie(routing_id(), settings.params.document_cookie)); @@ -931,6 +937,8 @@ void PrintWebViewHelper::PreviewPageRendered(int page_number, } preview_page_params.data_size = buf_size; preview_page_params.page_number = page_number; + preview_page_params.preview_request_id = + print_pages_params_->params.preview_request_id; Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params)); } diff --git a/chrome/renderer/print_web_view_helper_browsertest.cc b/chrome/renderer/print_web_view_helper_browsertest.cc index d897736..a4e9a59 100644 --- a/chrome/renderer/print_web_view_helper_browsertest.cc +++ b/chrome/renderer/print_web_view_helper_browsertest.cc @@ -42,6 +42,7 @@ void CreatePrintSettingsDictionary(DictionaryValue* dict) { dict->SetInteger(printing::kSettingCopies, 1); dict->SetString(printing::kSettingDeviceName, "dummy"); dict->SetInteger(printing::kPreviewRequestID, 12345); + dict->SetBoolean(printing::kIsFirstRequest, true); } } // namespace |