diff options
19 files changed, 582 insertions, 170 deletions
diff --git a/chrome/browser/printing/print_preview_message_handler.cc b/chrome/browser/printing/print_preview_message_handler.cc index 802db6a..b4037fc 100644 --- a/chrome/browser/printing/print_preview_message_handler.cc +++ b/chrome/browser/printing/print_preview_message_handler.cc @@ -99,8 +99,16 @@ PrintPreviewUI* PrintPreviewMessageHandler::OnFailure(int document_cookie) { return static_cast<PrintPreviewUI*>(print_preview_tab->web_ui()); } -void PrintPreviewMessageHandler::OnRequestPrintPreview() { +void PrintPreviewMessageHandler::OnRequestPrintPreview( + bool source_is_modifiable) { PrintPreviewTabController::PrintPreview(tab_contents_wrapper()); + + TabContentsWrapper* print_preview_tab = GetPrintPreviewTab(); + if (!print_preview_tab || !print_preview_tab->web_ui()) + return; + PrintPreviewUI* print_preview_ui = + static_cast<PrintPreviewUI*>(print_preview_tab->web_ui()); + print_preview_ui->SetSourceIsModifiable(source_is_modifiable); } void PrintPreviewMessageHandler::OnDidGetPreviewPageCount( diff --git a/chrome/browser/printing/print_preview_message_handler.h b/chrome/browser/printing/print_preview_message_handler.h index d65d3d6..0f3d405 100644 --- a/chrome/browser/printing/print_preview_message_handler.h +++ b/chrome/browser/printing/print_preview_message_handler.h @@ -43,7 +43,7 @@ class PrintPreviewMessageHandler : public TabContentsObserver { PrintPreviewUI* OnFailure(int document_cookie); // Message handlers. - void OnRequestPrintPreview(); + void OnRequestPrintPreview(bool source_is_modifiable); void OnDidGetDefaultPageLayout( const printing::PageSizeMargins& page_layout_in_points); void OnDidGetPreviewPageCount( diff --git a/chrome/browser/printing/print_system_task_proxy.cc b/chrome/browser/printing/print_system_task_proxy.cc index c7787ce..289f993 100644 --- a/chrome/browser/printing/print_system_task_proxy.cc +++ b/chrome/browser/printing/print_system_task_proxy.cc @@ -316,25 +316,22 @@ PrintSystemTaskProxy::~PrintSystemTaskProxy() { void PrintSystemTaskProxy::GetDefaultPrinter() { VLOG(1) << "Get default printer start"; - StringValue* default_printer = NULL; + std::string* default_printer = NULL; if (PrintPreviewHandler::last_used_printer_name_ == NULL) { - default_printer = new StringValue( - print_backend_->GetDefaultPrinterName()); + default_printer = new std::string(print_backend_->GetDefaultPrinterName()); } else { - default_printer = new StringValue( + default_printer = new std::string( *PrintPreviewHandler::last_used_printer_name_); } - std::string default_printer_string; - default_printer->GetAsString(&default_printer_string); VLOG(1) << "Get default printer finished, found: " - << default_printer_string; + << default_printer; - StringValue* cloud_print_data = NULL; + std::string* cloud_print_data = NULL; if (PrintPreviewHandler::last_used_printer_cloud_print_data_ != NULL) { - cloud_print_data = new StringValue( + cloud_print_data = new std::string( *PrintPreviewHandler::last_used_printer_cloud_print_data_); } else { - cloud_print_data = new StringValue(""); + cloud_print_data = new std::string; } BrowserThread::PostTask( @@ -344,9 +341,9 @@ void PrintSystemTaskProxy::GetDefaultPrinter() { } void PrintSystemTaskProxy::SendDefaultPrinter( - const StringValue* default_printer, const StringValue* cloud_print_data) { + const std::string* default_printer, const std::string* cloud_print_data) { if (handler_) - handler_->SendDefaultPrinter(*default_printer, *cloud_print_data); + handler_->SendInitialSettings(*default_printer, *cloud_print_data); delete default_printer; } diff --git a/chrome/browser/printing/print_system_task_proxy.h b/chrome/browser/printing/print_system_task_proxy.h index 512a7bb..efcaa26 100644 --- a/chrome/browser/printing/print_system_task_proxy.h +++ b/chrome/browser/printing/print_system_task_proxy.h @@ -55,8 +55,8 @@ class PrintSystemTaskProxy content::BrowserThread::UI>; friend class DeleteTask<PrintSystemTaskProxy>; - void SendDefaultPrinter(const base::StringValue* default_printer, - const base::StringValue* cloud_print_data); + void SendDefaultPrinter(const std::string* default_printer, + const std::string* cloud_print_data); void SetupPrinterList(base::ListValue* printers); void SendPrinterCapabilities(base::DictionaryValue* settings_info); diff --git a/chrome/browser/resources/print_preview/margin_settings.js b/chrome/browser/resources/print_preview/margin_settings.js index 28092a3..8d8e67c 100644 --- a/chrome/browser/resources/print_preview/margin_settings.js +++ b/chrome/browser/resources/print_preview/margin_settings.js @@ -40,6 +40,8 @@ cr.define('print_preview', function() { * @return {boolean} true if they are equal. */ isEqual: function(rhs) { + if (!rhs) + return false; return this[MarginSettings.TOP_GROUP] === rhs[MarginSettings.TOP_GROUP] && this[MarginSettings.LEFT_GROUP] === rhs[MarginSettings.LEFT_GROUP] && this[MarginSettings.RIGHT_GROUP] === @@ -48,15 +50,11 @@ cr.define('print_preview', function() { rhs[MarginSettings.BOTTOM_GROUP]; }, - /** - * Copies the four margin values from |rhs|. - * @param {Margins} rhs The Margins object values to be used. - */ - copy: function(rhs) { - this[MarginSettings.TOP_GROUP] = rhs[MarginSettings.TOP_GROUP]; - this[MarginSettings.LEFT_GROUP] = rhs[MarginSettings.LEFT_GROUP]; - this[MarginSettings.RIGHT_GROUP] = rhs[MarginSettings.RIGHT_GROUP]; - this[MarginSettings.BOTTOM_GROUP] = rhs[MarginSettings.BOTTOM_GROUP]; + clone: function() { + return new Margins(this[MarginSettings.TOP_GROUP], + this[MarginSettings.LEFT_GROUP], + this[MarginSettings.RIGHT_GROUP], + this[MarginSettings.BOTTOM_GROUP]); }, /** @@ -93,6 +91,7 @@ cr.define('print_preview', function() { this.contentWidth_ = width; this.contentHeight_ = height; this.margins_ = new Margins(left, top, right, bottom); + this.margins_.roundToLocaleUnits(); } PageLayout.prototype = { @@ -122,21 +121,18 @@ cr.define('print_preview', function() { this.marginsUI_ = null; // Holds the custom margin values in points (if set). - this.customMargins_ = new Margins(-1, -1, -1, -1); + this.customMargins_ = null; // Holds the previous custom margin values in points. - this.previousCustomMargins_ = new Margins(-1, -1, -1, -1); + this.previousCustomMargins_ = null; // Holds the width of the page in points. this.pageWidth_ = -1; // Holds the height of the page in points. this.pageHeight_ = -1; - // The last selected margin option. - this.lastSelectedOption_ = MarginSettings.MARGINS_VALUE_DEFAULT; - + // @type {boolean} True if the margins UI should be diplayed when the next + // |customEvents.PDF_LOADED| event occurs. + this.forceMarginsUIOnPDFLoad_ = false; // Holds the currently updated default page layout values. this.currentDefaultPageLayout = null; - // Holds the default page layout values when the custom margins was last - // selected. - this.previousDefaultPageLayout_ = null; // True if the margins UI should be shown regardless of mouse position. this.forceDisplayingMarginLines_ = true; @@ -203,6 +199,19 @@ cr.define('print_preview', function() { }, /** + * Sets |this.customMargins_| according to |margins|. + * @param {{marginLeft: number, marginTop: number, marginRight: number, + * marginBottom: number}} margins An object holding the four margin + * values. + */ + set customMargins(margins) { + this.customMargins_.left = margins.marginLeft; + this.customMargins_.top = margins.marginTop; + this.customMargins_.right = margins.marginRight; + this.customMargins_.bottom = margins.marginBottom; + }, + + /** * @return {number} The value of the selected margin option. */ get selectedMarginsValue() { @@ -211,13 +220,26 @@ cr.define('print_preview', function() { }, /** - * Sets the current margin selection to |lastUsedMarginsType|. - * @param {number} lastUsedMarginsType An integer value identifying a margin + * Sets the current margin selection to |lastUsedMarginType|. + * @param {number} lastUsedMarginType An integer value identifying a margin * type according to MarginType enum in printing/print_job_constants.h. - */ - setLastUsedMarginsType: function(lastUsedMarginsType) { + * @param {Object} lastUsedCustomMargins The last used custom margins. If + * custom margins have not been used before + * |margin{Top|Bottom|Left|Right}| attributes are missing. + */ + setLastUsedMargins: function(lastUsedMarginsSettings) { + var lastUsedMarginsType = lastUsedMarginsSettings['marginsType'] + this.forceMarginsUIOnPDFLoad_ = + lastUsedMarginsType == MarginSettings.MARGINS_VALUE_CUSTOM; this.marginList_.selectedIndex = this.getMarginOptionIndexByValue_(lastUsedMarginsType); + if (lastUsedMarginsSettings.hasOwnProperty('marginTop') && + lastUsedMarginsSettings.hasOwnProperty('marginBottom') && + lastUsedMarginsSettings.hasOwnProperty('marginRight') && + lastUsedMarginsSettings.hasOwnProperty('marginLeft')) { + this.customMargins_ = new Margins(-1, -1, -1 , -1); + this.customMargins = lastUsedMarginsSettings; + } }, /** @@ -290,9 +312,11 @@ cr.define('print_preview', function() { requestPreviewIfNeeded_: function() { if (!this.areMarginSettingsValid()) return; + if (this.customMargins_.isEqual(this.previousCustomMargins_)) return; - this.previousCustomMargins_.copy(this.customMargins_); + + this.previousCustomMargins_ = this.customMargins_.clone(); setDefaultValuesAndRegeneratePreview(false); }, @@ -302,6 +326,8 @@ cr.define('print_preview', function() { * @private */ onSidebarMouseOver_: function(e) { + $('mainview').onmouseover = this.onMainviewMouseOver_.bind(this); + $('navbar-container').onmouseover = null; if (!this.forceDisplayingMarginLines_) this.marginsUI.hide(false); }, @@ -312,6 +338,8 @@ cr.define('print_preview', function() { * @private */ onMainviewMouseOver_: function() { + $('mainview').onmouseover = null; + $('navbar-container').onmouseover = this.onSidebarMouseOver_.bind(this); this.forceDisplayingMarginLines_ = false; this.marginsUI.show(); }, @@ -368,7 +396,7 @@ cr.define('print_preview', function() { * @return {boolean} True if the margin settings are valid. */ areMarginSettingsValid: function() { - if (this.marginsUI_ == null) + if (!this.isCustomMarginsSelected() || !this.marginsUI_) return true; var pairs = this.marginsUI.pairsAsList; @@ -474,6 +502,8 @@ cr.define('print_preview', function() { * @private */ removeCustomMarginEventListeners_: function() { + if (!this.marginsUI_) + return; $('mainview').onmouseover = null; $('navbar-container').onmouseover = null; this.eventTracker_.remove(this.marginsUI, customEvents.MARGIN_LINE_DRAG); @@ -532,8 +562,6 @@ cr.define('print_preview', function() { this.onDefaultMinimumNoMarginsSelected_(); else if (this.isCustomMarginsSelected()) this.onCustomMarginsSelected_(); - - this.lastSelectedOption_ = this.selectedMarginsValue; }, /** @@ -543,6 +571,7 @@ cr.define('print_preview', function() { onDefaultMinimumNoMarginsSelected_: function() { this.removeCustomMarginEventListeners_(); this.forceDisplayingMarginLines_ = true; + this.previousCustomMargins_ = null; setDefaultValuesAndRegeneratePreview(false); }, @@ -551,20 +580,18 @@ cr.define('print_preview', function() { * @private */ onCustomMarginsSelected_: function() { - this.addCustomMarginEventListeners_(); + var customMarginsNotSpecified = !this.customMargins_; + this.updatePageData_(); - this.customMargins_ = this.currentDefaultPageLayout.margins_; - this.customMargins_.roundToLocaleUnits(); - this.previousCustomMargins_.copy(this.customMargins_); - - if (this.previousDefaultPageLayout_ != this.currentDefaultPageLayout) { - this.pageWidth_ = this.currentDefaultPageLayout.pageWidth; - this.pageHeight_ = this.currentDefaultPageLayout.pageHeight; + if (customMarginsNotSpecified) { + this.previousCustomMargins_ = this.customMargins_.clone(); + this.drawCustomMarginsUI_(); + this.addCustomMarginEventListeners_(); + this.marginsUI.show(); + } else { + this.forceMarginsUIOnPDFLoad_ = true; + this.requestPreviewIfNeeded_(); } - - this.previousDefaultPageLayout_ = this.currentDefaultPageLayout; - this.drawCustomMarginsUI_(); - this.marginsUI.show(); }, /** @@ -627,7 +654,8 @@ cr.define('print_preview', function() { MarginSettings.OPTION_INDEX_DEFAULT].selected = true; this.removeCustomMarginEventListeners_(); this.forceDisplayingMarginLines_ = true; - this.lastSelectedOption_ = MarginSettings.MARGINS_VALUE_DEFAULT; + this.customMargins_ = null; + this.previousCustomMargins_ = null; } }, @@ -636,15 +664,35 @@ cr.define('print_preview', function() { * @private */ onPDFLoaded_: function() { - if (!previewModifiable) + if (!previewModifiable) { fadeOutOption(this.marginsOption_); + return; + } + + if (this.forceMarginsUIOnPDFLoad_) { + this.updatePageData_(); + this.drawCustomMarginsUI_(); + this.addCustomMarginEventListeners_(); + this.marginsUI.show(); + this.forceMarginsUIOnPDFLoad_ = false; + } + }, + + /** + * Updates |this.customMargins_|, |this.pageWidth_|, |this.pageHeight_|. + * @private + */ + updatePageData_: function() { + if (!this.customMargins_) + this.customMargins_ = this.currentDefaultPageLayout.margins_.clone(); + + this.pageWidth_ = this.currentDefaultPageLayout.pageWidth; + this.pageHeight_ = this.currentDefaultPageLayout.pageHeight; } }; return { MarginSettings: MarginSettings, PageLayout: PageLayout, - setNumberFormatAndMeasurementSystem: - MarginSettings.setNumberFormatAndMeasurementSystem, }; }); diff --git a/chrome/browser/resources/print_preview/print_preview.js b/chrome/browser/resources/print_preview/print_preview.js index 2491944..036f549 100644 --- a/chrome/browser/resources/print_preview/print_preview.js +++ b/chrome/browser/resources/print_preview/print_preview.js @@ -164,9 +164,25 @@ function onLoad() { $('printer-list').onchange = updateControlsWithSelectedPrinterCapabilities; previewArea.showLoadingAnimation(); - chrome.send('getInitiatorTabTitle'); - chrome.send('getDefaultPrinter'); - chrome.send('getNumberFormatAndMeasurementSystem'); + chrome.send('getInitialSettings'); +} + +/** + * @param {string} initiatorTabTitle The title of the initiator tab. + * @param {object} initialSettings An object containing all the initial + * settings. + */ +function setInitialSettings(initialSettings) { + setInitiatorTabTitle(initialSettings['initiatorTabTitle']); + previewModifiable = initialSettings['previewModifiable']; + if (previewModifiable) { + print_preview.MarginSettings.setNumberFormatAndMeasurementSystem( + initialSettings['numberFormat'], + initialSettings['measurementSystem']); + marginSettings.setLastUsedMargins(initialSettings); + } + setDefaultPrinter(initialSettings['printerName'], + initialSettings['cloudPrintData']); } /** @@ -284,7 +300,9 @@ function updateControlsWithSelectedPrinterCapabilities() { lastSelectedPrinterIndex = selectedIndex; // Regenerate the preview data based on selected printer settings. - setDefaultValuesAndRegeneratePreview(true); + // Do not reset the margins if no preview request has been made. + var resetMargins = lastPreviewRequestID != initialPreviewRequestID; + setDefaultValuesAndRegeneratePreview(resetMargins); } } @@ -304,7 +322,9 @@ function doUpdateCloudPrinterCapabilities(printer) { lastSelectedPrinterIndex = selectedIndex; // Regenerate the preview data based on selected printer settings. - setDefaultValuesAndRegeneratePreview(true); + // Do not reset the margins if no preview request has been made. + var resetMargins = lastPreviewRequestID != initialPreviewRequestID; + setDefaultValuesAndRegeneratePreview(resetMargins); } /** @@ -578,18 +598,14 @@ function fileSelectionCompleted() { * @param {string} printer Name of the default printer. Empty if none. * @param {string} cloudPrintData Cloud print related data to restore if * the default printer is a cloud printer. - * @param {number} lastUsedMarginsType Indicates the last used margins type - * (matches enum MarginType in printing/print_job_constants.h. */ -function setDefaultPrinter(printer_name, cloudPrintData, lastUsedMarginsType) { - // Setting the margin selection to the last used one. - marginSettings.setLastUsedMarginsType(lastUsedMarginsType); +function setDefaultPrinter(printerName, cloudPrintData) { // Add a placeholder value so the printer list looks valid. addDestinationListOption('', '', true, true, true); - if (printer_name) { - defaultOrLastUsedPrinterName = printer_name; + if (printerName) { + defaultOrLastUsedPrinterName = printerName; if (cloudPrintData) { - cloudprint.setDefaultPrinter(printer_name, + cloudprint.setDefaultPrinter(printerName, cloudPrintData, addDestinationListOptionAtPosition, doUpdateCloudPrinterCapabilities); @@ -779,16 +795,13 @@ function setPluginPreviewPageCount() { * Update the page count and check the page range. * Called from PrintPreviewUI::OnDidGetPreviewPageCount(). * @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, previewResponseId) { +function onDidGetPreviewPageCount(pageCount, previewResponseId) { if (!isExpectedPreviewResponse(previewResponseId)) return; pageSettings.updateState(pageCount); - previewModifiable = isModifiable; if (!previewModifiable && pageSettings.requestPrintPreviewIfNeeded()) return; @@ -1058,8 +1071,6 @@ PrintSettings.prototype.save = function() { /** * Updates the title of the print preview tab according to |initiatorTabTitle|. - * Called from PrintPreviewUI::OnGetInitiatorTabTitle as a result of sending a - * 'getInitiatorTabTitle' message. * @param {string} initiatorTabTitle The title of the initiator tab. */ function setInitiatorTabTitle(initiatorTabTitle) { diff --git a/chrome/browser/ui/webui/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview_handler.cc index 66e4aa3..ba09a0b 100644 --- a/chrome/browser/ui/webui/print_preview_handler.cc +++ b/chrome/browser/ui/webui/print_preview_handler.cc @@ -50,6 +50,7 @@ #include "printing/metafile.h" #include "printing/metafile_impl.h" #include "printing/page_range.h" +#include "printing/page_size_margins.h" #include "printing/print_settings.h" #include "unicode/ulocdata.h" @@ -96,6 +97,17 @@ void ReportPrintSettingHistogram(enum PrintSettingsBuckets setting) { PRINT_SETTINGS_BUCKET_BOUNDARY); } +// Name of a dictionary fielad holdong cloud print related data; +const char kCloudPrintData[] = "cloudPrintData"; +// Name of a dictionary field holding the initiator tab title. +const char kInitiatorTabTitle[] = "initiatorTabTitle"; +// Name of a dictionary field holding the measurement system according to the +// locale. +const char kMeasurementSystem[] = "measurementSystem"; +// Name of a dictionary field holding the number format according to the locale. +const char kNumberFormat[] = "numberFormat"; + + // Get the print job settings dictionary from |args|. The caller takes // ownership of the returned DictionaryValue. Returns NULL on failure. DictionaryValue* GetSettingsDictionary(const ListValue* args) { @@ -206,6 +218,8 @@ printing::ColorModels PrintPreviewHandler::last_used_color_model_ = printing::UNKNOWN_COLOR_MODEL; printing::MarginType PrintPreviewHandler::last_used_margins_type_ = printing::DEFAULT_MARGINS; +printing::PageSizeMargins* + PrintPreviewHandler::last_used_page_size_margins_ = NULL; PrintPreviewHandler::PrintPreviewHandler() : print_backend_(printing::PrintBackend::CreateInstance(NULL)), @@ -222,9 +236,6 @@ PrintPreviewHandler::~PrintPreviewHandler() { } void PrintPreviewHandler::RegisterMessages() { - web_ui_->RegisterMessageCallback("getDefaultPrinter", - base::Bind(&PrintPreviewHandler::HandleGetDefaultPrinter, - base::Unretained(this))); web_ui_->RegisterMessageCallback("getPrinters", base::Bind(&PrintPreviewHandler::HandleGetPrinters, base::Unretained(this))); @@ -264,13 +275,9 @@ void PrintPreviewHandler::RegisterMessages() { web_ui_->RegisterMessageCallback("saveLastPrinter", base::Bind(&PrintPreviewHandler::HandleSaveLastPrinter, base::Unretained(this))); - web_ui_->RegisterMessageCallback("getInitiatorTabTitle", - base::Bind(&PrintPreviewHandler::HandleGetInitiatorTabTitle, + web_ui_->RegisterMessageCallback("getInitialSettings", + base::Bind(&PrintPreviewHandler::HandleGetInitialSettings, base::Unretained(this))); - web_ui_->RegisterMessageCallback("getNumberFormatAndMeasurementSystem", - base::Bind( - &PrintPreviewHandler::HandleGetNumberFormatAndMeasurementSystem, - base::Unretained(this))); } TabContentsWrapper* PrintPreviewHandler::preview_tab_wrapper() const { @@ -280,16 +287,6 @@ TabContents* PrintPreviewHandler::preview_tab() const { return web_ui_->tab_contents(); } -void PrintPreviewHandler::HandleGetDefaultPrinter(const ListValue* /*args*/) { - scoped_refptr<PrintSystemTaskProxy> task = - new PrintSystemTaskProxy(AsWeakPtr(), - print_backend_.get(), - has_logged_printers_count_); - BrowserThread::PostTask( - BrowserThread::FILE, FROM_HERE, - base::Bind(&PrintSystemTaskProxy::GetDefaultPrinter, task.get())); -} - void PrintPreviewHandler::HandleGetPrinters(const ListValue* /*args*/) { scoped_refptr<PrintSystemTaskProxy> task = new PrintSystemTaskProxy(AsWeakPtr(), @@ -397,10 +394,19 @@ void PrintPreviewHandler::HandlePrint(const ListValue* args) { last_used_color_model_ = static_cast<printing::ColorModels>(color_model); // Storing last used margin settings. - int margin_type; - if (!settings->GetInteger(printing::kSettingMarginsType, &margin_type)) - margin_type = printing::DEFAULT_MARGINS; - last_used_margins_type_ = static_cast<printing::MarginType>(margin_type); + bool is_modifiable; + settings->GetBoolean(printing::kSettingPreviewModifiable, &is_modifiable); + if (is_modifiable) { + int margin_type; + if (!settings->GetInteger(printing::kSettingMarginsType, &margin_type)) + margin_type = printing::DEFAULT_MARGINS; + last_used_margins_type_ = static_cast<printing::MarginType>(margin_type); + if (last_used_margins_type_ == printing::CUSTOM_MARGINS) { + if (!last_used_page_size_margins_) + last_used_page_size_margins_ = new printing::PageSizeMargins(); + getCustomMarginsFromJobSettings(*settings, last_used_page_size_margins_); + } + } bool print_to_pdf = false; settings->GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf); @@ -613,32 +619,67 @@ void PrintPreviewHandler::ReportStats() { manage_printers_dialog_request_count_); } -void PrintPreviewHandler::HandleGetInitiatorTabTitle( - const ListValue* /*args*/) { - PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(web_ui_); - base::StringValue tab_title(print_preview_ui->initiator_tab_title()); - web_ui_->CallJavascriptFunction("setInitiatorTabTitle", tab_title); -} - -void PrintPreviewHandler::HandleGetNumberFormatAndMeasurementSystem( - const ListValue* /*args*/) { +void PrintPreviewHandler::GetNumberFormatAndMeasurementSystem( + base::DictionaryValue* settings) { // Getting the measurement system based on the locale. UErrorCode errorCode = U_ZERO_ERROR; const char* locale = g_browser_process->GetApplicationLocale().c_str(); - UMeasurementSystem measurement_system = - ulocdata_getMeasurementSystem(locale, &errorCode); - if (errorCode > U_ZERO_ERROR || measurement_system == UMS_LIMIT) - measurement_system = UMS_SI; + UMeasurementSystem system = ulocdata_getMeasurementSystem(locale, &errorCode); + if (errorCode > U_ZERO_ERROR || system == UMS_LIMIT) + system = UMS_SI; + + // Getting the number formatting based on the locale and writing to + // dictionary. + settings->SetString(kNumberFormat, base::FormatDouble(123456.78, 2)); + settings->SetInteger(kMeasurementSystem, system); +} + +void PrintPreviewHandler::GetLastUsedMarginSettings( + base::DictionaryValue* custom_margins) { + custom_margins->SetInteger(printing::kSettingMarginsType, + PrintPreviewHandler::last_used_margins_type_); + if (last_used_page_size_margins_) { + custom_margins->SetDouble(printing::kSettingMarginTop, + last_used_page_size_margins_->margin_top); + custom_margins->SetDouble(printing::kSettingMarginBottom, + last_used_page_size_margins_->margin_bottom); + custom_margins->SetDouble(printing::kSettingMarginLeft, + last_used_page_size_margins_->margin_left); + custom_margins->SetDouble(printing::kSettingMarginRight, + last_used_page_size_margins_->margin_right); + } +} - // Getting the number formatting based on the locale. - StringValue number_format(base::FormatDouble(123456.78, 2)); - base::FundamentalValue system(measurement_system); +void PrintPreviewHandler::HandleGetInitialSettings(const ListValue* /*args*/) { + scoped_refptr<PrintSystemTaskProxy> task = + new PrintSystemTaskProxy(AsWeakPtr(), + print_backend_.get(), + has_logged_printers_count_); + BrowserThread::PostTask( + BrowserThread::FILE, FROM_HERE, + base::Bind(&PrintSystemTaskProxy::GetDefaultPrinter, task.get())); +} + +void PrintPreviewHandler::SendInitialSettings( + const std::string& default_printer, + const std::string& cloud_print_data) { + PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(web_ui_); - web_ui_->CallJavascriptFunction( - "print_preview.setNumberFormatAndMeasurementSystem", - number_format, - system); + base::DictionaryValue initial_settings; + initial_settings.SetString(kInitiatorTabTitle, + print_preview_ui->initiator_tab_title()); + initial_settings.SetBoolean(printing::kSettingPreviewModifiable, + print_preview_ui->source_is_modifiable()); + initial_settings.SetString(printing::kSettingPrinterName, + default_printer); + initial_settings.SetString(kCloudPrintData, cloud_print_data); + + if (print_preview_ui->source_is_modifiable()) { + GetLastUsedMarginSettings(&initial_settings); + GetNumberFormatAndMeasurementSystem(&initial_settings); + } + web_ui_->CallJavascriptFunction("setInitialSettings", initial_settings); } void PrintPreviewHandler::ActivateInitiatorTabAndClosePreviewTab() { @@ -657,17 +698,6 @@ void PrintPreviewHandler::SendPrinterCapabilities( settings_info); } -void PrintPreviewHandler::SendDefaultPrinter( - const StringValue& default_printer, - const StringValue& cloud_print_data) { - base::FundamentalValue margins_type( - PrintPreviewHandler::last_used_margins_type_); - web_ui_->CallJavascriptFunction("setDefaultPrinter", - default_printer, - cloud_print_data, - margins_type); -} - void PrintPreviewHandler::SetupPrinterList(const ListValue& printers) { SendCloudPrintEnabled(); web_ui_->CallJavascriptFunction("setPrinters", printers); diff --git a/chrome/browser/ui/webui/print_preview_handler.h b/chrome/browser/ui/webui/print_preview_handler.h index cda79c8..20ea1c7 100644 --- a/chrome/browser/ui/webui/print_preview_handler.h +++ b/chrome/browser/ui/webui/print_preview_handler.h @@ -27,6 +27,7 @@ class StringValue; } namespace printing { +struct PageSizeMargins; class PrintBackend; } @@ -67,14 +68,20 @@ class PrintPreviewHandler : public WebUIMessageHandler, void ShowSystemDialog(); private: + friend class PrintPreviewHandlerTest; friend class PrintSystemTaskProxy; + FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, StickyMarginsCustom); + FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, StickyMarginsDefault); + FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, + StickyMarginsCustomThenDefault); + FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, + GetLastUsedMarginSettingsCustom); + FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, + GetLastUsedMarginSettingsDefault); TabContentsWrapper* preview_tab_wrapper() const; TabContents* preview_tab() const; - // Gets the default printer. |args| is unused. - void HandleGetDefaultPrinter(const base::ListValue* args); - // Gets the list of printers. |args| is unused. void HandleGetPrinters(const base::ListValue* args); @@ -131,22 +138,18 @@ class PrintPreviewHandler : public WebUIMessageHandler, // Asks the browser to close the preview tab. |args| is unused. void HandleClosePreviewTab(const base::ListValue* args); - // Asks the browser for the title of the initiator tab. - // |args| is unused. - void HandleGetInitiatorTabTitle(const base::ListValue* args); + // Asks the browser for several settings that are needed before the first + // preview is displayed. + void HandleGetInitialSettings(const base::ListValue* args); - // Asks the browser for the number formatting and measurement system according - // to the current locale. - void HandleGetNumberFormatAndMeasurementSystem(const base::ListValue* args); + void SendInitialSettings( + const std::string& default_printer, + const std::string& cloud_print_data); // Sends the printer capabilities to the Web UI. |settings_info| contains // printer capabilities information. void SendPrinterCapabilities(const base::DictionaryValue& settings_info); - // Sends the default printer to the Web UI. - void SendDefaultPrinter(const base::StringValue& default_printer, - const base::StringValue& cloud_print_data); - // Send the list of printers to the Web UI. void SetupPrinterList(const base::ListValue& printers); @@ -178,6 +181,14 @@ class PrintPreviewHandler : public WebUIMessageHandler, // Posts a task to save to pdf at |print_to_pdf_path_|. void PostPrintToPdfTask(); + // Populates |settings| according to the current locale. + void GetNumberFormatAndMeasurementSystem(base::DictionaryValue* settings); + + // Populates |last_used_custom_margins| according to the last used margin + // settings. + void GetLastUsedMarginSettings( + base::DictionaryValue* last_used_custom_margins); + // Pointer to current print system. scoped_refptr<printing::PrintBackend> print_backend_; @@ -189,6 +200,7 @@ class PrintPreviewHandler : public WebUIMessageHandler, static std::string* last_used_printer_name_; static printing::ColorModels last_used_color_model_; static printing::MarginType last_used_margins_type_; + static printing::PageSizeMargins* last_used_page_size_margins_; // A count of how many requests received to regenerate preview data. // Initialized to 0 then incremented and emitted to a histogram. diff --git a/chrome/browser/ui/webui/print_preview_handler_unittest.cc b/chrome/browser/ui/webui/print_preview_handler_unittest.cc new file mode 100644 index 0000000..d44ce53 --- /dev/null +++ b/chrome/browser/ui/webui/print_preview_handler_unittest.cc @@ -0,0 +1,261 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/command_line.h" +#include "base/json/json_writer.h" +#include "base/values.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/printing/background_printing_manager.h" +#include "chrome/browser/printing/print_preview_tab_controller.h" +#include "chrome/browser/ui/browser_list.h" +#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" +#include "chrome/browser/ui/webui/print_preview_handler.h" +#include "chrome/browser/ui/webui/print_preview_ui.h" +#include "chrome/common/chrome_switches.h" +#include "chrome/test/base/browser_with_test_window_test.h" +#include "printing/page_size_margins.h" +#include "printing/print_job_constants.h" + +namespace { + +DictionaryValue* GetCustomMarginsDictionary( + const double margin_top, const double margin_right, + const double margin_bottom,const double margin_left) { + base::DictionaryValue* custom_settings = new base::DictionaryValue(); + custom_settings->SetDouble(printing::kSettingMarginTop, margin_top); + custom_settings->SetDouble(printing::kSettingMarginRight, margin_right); + custom_settings->SetDouble(printing::kSettingMarginBottom, margin_bottom); + custom_settings->SetDouble(printing::kSettingMarginLeft, margin_left); + return custom_settings; +} + +} + +class PrintPreviewHandlerTest : public BrowserWithTestWindowTest { + protected: + void SetUp() { + BrowserWithTestWindowTest::SetUp(); +#if !defined(GOOGLE_CHROME_BUILD) || defined(OS_CHROMEOS) + CommandLine::ForCurrentProcess()->AppendSwitch( + switches::kEnablePrintPreview); +#endif + ASSERT_TRUE(browser()); + BrowserList::SetLastActive(browser()); + ASSERT_TRUE(BrowserList::GetLastActive()); + + browser()->NewTab(); + EXPECT_EQ(1, browser()->tab_count()); + OpenPrintPreviewTab(); + } + + virtual void TearDown() { + DeletePrintPreviewTab(); + ClearStickySettings(); + } + + void OpenPrintPreviewTab() { + TabContentsWrapper* initiator_tab = + browser()->GetSelectedTabContentsWrapper(); + ASSERT_TRUE(initiator_tab); + + scoped_refptr<printing::PrintPreviewTabController> + controller(new printing::PrintPreviewTabController()); + ASSERT_TRUE(controller.get()); + + preview_tab_ = controller->GetOrCreatePreviewTab(initiator_tab); + ASSERT_TRUE(preview_tab_); + EXPECT_EQ(2, browser()->tab_count()); + + preview_ui_ = static_cast<PrintPreviewUI*>(preview_tab_->web_ui()); + ASSERT_TRUE(preview_ui_); + } + + void DeletePrintPreviewTab() { + printing::BackgroundPrintingManager* bg_printing_manager = + g_browser_process->background_printing_manager(); + ASSERT_TRUE(bg_printing_manager->HasPrintPreviewTab(preview_tab_)); + + // Deleting TabContentsWrapper* to avoid warings from pref_notifier_impl.cc + // after the test ends. + delete preview_tab_; + } + + void CheckCustomMargins(const double margin_top, + const double margin_right, + const double margin_bottom, + const double margin_left) { + EXPECT_EQ(PrintPreviewHandler::last_used_page_size_margins_->margin_top, + margin_top); + EXPECT_EQ(PrintPreviewHandler::last_used_page_size_margins_->margin_right, + margin_right); + EXPECT_EQ(PrintPreviewHandler::last_used_page_size_margins_->margin_bottom, + margin_bottom); + EXPECT_EQ(PrintPreviewHandler::last_used_page_size_margins_->margin_left, + margin_left); + } + + void RequestPrintWithDefaultMargins() { + // Set the minimal dummy settings to make the HandlePrint() code happy. + DictionaryValue settings; + settings.SetBoolean(printing::kSettingPreviewModifiable, true); + settings.SetInteger(printing::kSettingColor, printing::COLOR); + settings.SetBoolean(printing::kSettingPrintToPDF, false); + settings.SetInteger(printing::kSettingMarginsType, + printing::DEFAULT_MARGINS); + + // Put |settings| in to |args| as a JSON string. + std::string json_string; + base::JSONWriter::Write(&settings, false, &json_string); + ListValue args; + args.Append(new base::StringValue(json_string)); // |args| takes ownership. + preview_ui_->handler_->HandlePrint(&args); + } + + void RequestPrintWithCustomMargins( + const double margin_top, const double margin_right, + const double margin_bottom,const double margin_left) { + // Set the minimal dummy settings to make the HandlePrint() code happy. + DictionaryValue settings; + settings.SetBoolean(printing::kSettingPreviewModifiable, true); + settings.SetInteger(printing::kSettingColor, printing::COLOR); + settings.SetBoolean(printing::kSettingPrintToPDF, false); + settings.SetInteger(printing::kSettingMarginsType, + printing::CUSTOM_MARGINS); + + // Creating custom margins dictionary and nesting it in |settings|. + DictionaryValue* custom_settings = GetCustomMarginsDictionary( + margin_top, margin_right, margin_bottom, margin_left); + // |settings| takes ownership. + settings.Set(printing::kSettingMarginsCustom, custom_settings); + + // Put |settings| in to |args| as a JSON string. + std::string json_string; + base::JSONWriter::Write(&settings, false, &json_string); + ListValue args; + args.Append(new base::StringValue(json_string)); // |args| takes ownership. + preview_ui_->handler_->HandlePrint(&args); + } + + TabContentsWrapper* preview_tab_; + PrintPreviewUI* preview_ui_; + + private: + void ClearStickySettings() { + PrintPreviewHandler::last_used_margins_type_ = printing::DEFAULT_MARGINS; + delete PrintPreviewHandler::last_used_page_size_margins_; + PrintPreviewHandler::last_used_page_size_margins_ = NULL; + } + +}; + +// Tests that margin settings are saved correctly when printing with custom +// margins selected. +TEST_F(PrintPreviewHandlerTest, StickyMarginsCustom) { + const double kMarginTop = 25.5; + const double kMarginRight = 26.5; + const double kMarginBottom = 27.5; + const double kMarginLeft = 28.5; + RequestPrintWithCustomMargins( + kMarginTop, kMarginRight, kMarginBottom, kMarginLeft); + EXPECT_EQ(1, browser()->tab_count()); + + // Checking that sticky settings were saved correctly. + EXPECT_EQ(PrintPreviewHandler::last_used_color_model_, printing::COLOR); + EXPECT_EQ(PrintPreviewHandler::last_used_margins_type_, + printing::CUSTOM_MARGINS); + ASSERT_TRUE(PrintPreviewHandler::last_used_page_size_margins_); + CheckCustomMargins(kMarginTop, kMarginRight, kMarginBottom, kMarginLeft); +} + +// Tests that margin settings are saved correctly when printing with default +// margins selected. +TEST_F(PrintPreviewHandlerTest, StickyMarginsDefault) { + RequestPrintWithDefaultMargins(); + EXPECT_EQ(1, browser()->tab_count()); + + // Checking that sticky settings were saved correctly. + EXPECT_EQ(PrintPreviewHandler::last_used_color_model_, printing::COLOR); + EXPECT_EQ(PrintPreviewHandler::last_used_margins_type_, + printing::DEFAULT_MARGINS); + ASSERT_FALSE(PrintPreviewHandler::last_used_page_size_margins_); +} + +// Tests that margin settings are saved correctly when printing with custom +// margins selected and then again with default margins selected. +TEST_F(PrintPreviewHandlerTest, StickyMarginsCustomThenDefault) { + const double kMarginTop = 125.5; + const double kMarginRight = 126.5; + const double kMarginBottom = 127.5; + const double kMarginLeft = 128.5; + RequestPrintWithCustomMargins( + kMarginTop, kMarginRight, kMarginBottom, kMarginLeft); + EXPECT_EQ(1, browser()->tab_count()); + DeletePrintPreviewTab(); + EXPECT_EQ(PrintPreviewHandler::last_used_margins_type_, + printing::CUSTOM_MARGINS); + ASSERT_TRUE(PrintPreviewHandler::last_used_page_size_margins_); + CheckCustomMargins(kMarginTop, kMarginRight, kMarginBottom, kMarginLeft); + + OpenPrintPreviewTab(); + EXPECT_EQ(2, browser()->tab_count()); + RequestPrintWithDefaultMargins(); + + // Checking that sticky settings were saved correctly. + EXPECT_EQ(PrintPreviewHandler::last_used_color_model_, printing::COLOR); + EXPECT_EQ(PrintPreviewHandler::last_used_margins_type_, + printing::DEFAULT_MARGINS); + ASSERT_TRUE(PrintPreviewHandler::last_used_page_size_margins_); + CheckCustomMargins(kMarginTop, kMarginRight, kMarginBottom, kMarginLeft); +} + +// Tests that margin settings are retrieved correctly after printing with custom +// margins. +TEST_F(PrintPreviewHandlerTest, GetLastUsedMarginSettingsCustom) { + const double kMarginTop = 125.5; + const double kMarginRight = 126.5; + const double kMarginBottom = 127.5; + const double kMarginLeft = 128.5; + RequestPrintWithCustomMargins( + kMarginTop, kMarginRight, kMarginBottom, kMarginLeft); + base::DictionaryValue initial_settings; + preview_ui_->handler_->GetLastUsedMarginSettings(&initial_settings); + int margins_type; + EXPECT_TRUE(initial_settings.GetInteger(printing::kSettingMarginsType, + &margins_type)); + EXPECT_EQ(margins_type, printing::CUSTOM_MARGINS); + double margin_value; + EXPECT_TRUE(initial_settings.GetDouble(printing::kSettingMarginTop, + &margin_value)); + EXPECT_EQ(kMarginTop, margin_value); + EXPECT_TRUE(initial_settings.GetDouble(printing::kSettingMarginRight, + &margin_value)); + EXPECT_EQ(kMarginRight, margin_value); + EXPECT_TRUE(initial_settings.GetDouble(printing::kSettingMarginBottom, + &margin_value)); + EXPECT_EQ(kMarginBottom, margin_value); + EXPECT_TRUE(initial_settings.GetDouble(printing::kSettingMarginLeft, + &margin_value)); + EXPECT_EQ(kMarginLeft, margin_value); +} + +// Tests that margin settings are retrieved correctly after printing with +// default margins. +TEST_F(PrintPreviewHandlerTest, GetLastUsedMarginSettingsDefault) { + RequestPrintWithDefaultMargins(); + base::DictionaryValue initial_settings; + preview_ui_->handler_->GetLastUsedMarginSettings(&initial_settings); + int margins_type; + EXPECT_TRUE(initial_settings.GetInteger(printing::kSettingMarginsType, + &margins_type)); + EXPECT_EQ(margins_type, printing::DEFAULT_MARGINS); + double margin_value; + EXPECT_FALSE(initial_settings.GetDouble(printing::kSettingMarginTop, + &margin_value)); + EXPECT_FALSE(initial_settings.GetDouble(printing::kSettingMarginRight, + &margin_value)); + EXPECT_FALSE(initial_settings.GetDouble(printing::kSettingMarginBottom, + &margin_value)); + EXPECT_FALSE(initial_settings.GetDouble(printing::kSettingMarginLeft, + &margin_value)); +} diff --git a/chrome/browser/ui/webui/print_preview_ui.cc b/chrome/browser/ui/webui/print_preview_ui.cc index 0891cf9..fc7684e4 100644 --- a/chrome/browser/ui/webui/print_preview_ui.cc +++ b/chrome/browser/ui/webui/print_preview_ui.cc @@ -116,6 +116,10 @@ void PrintPreviewUI::SetInitiatorTabURLAndTitle( initiator_tab_title_ = job_title; } +void PrintPreviewUI::SetSourceIsModifiable(bool source_is_modifiable) { + source_is_modifiable_ = source_is_modifiable; +} + // static void PrintPreviewUI::GetCurrentPrintPreviewStatus( const std::string& preview_ui_addr, @@ -159,10 +163,8 @@ void PrintPreviewUI::OnDidGetPreviewPageCount( const PrintHostMsg_DidGetPreviewPageCount_Params& params) { DCHECK_GT(params.page_count, 0); 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); + CallJavascriptFunction("onDidGetPreviewPageCount", count,request_id); } void PrintPreviewUI::OnDidGetDefaultPageLayout( diff --git a/chrome/browser/ui/webui/print_preview_ui.h b/chrome/browser/ui/webui/print_preview_ui.h index f4521c7..0625ef0 100644 --- a/chrome/browser/ui/webui/print_preview_ui.h +++ b/chrome/browser/ui/webui/print_preview_ui.h @@ -50,6 +50,10 @@ class PrintPreviewUI : public ChromeWebUI { string16 initiator_tab_title() { return initiator_tab_title_; } + bool source_is_modifiable() { return source_is_modifiable_; } + + void SetSourceIsModifiable(bool source_is_modifiable); + // Determines whether to cancel a print preview request based on // |preview_ui_addr| and |request_id|. // Can be called from any thread. @@ -114,6 +118,15 @@ class PrintPreviewUI : public ChromeWebUI { void OnCancelPendingPreviewRequest(); private: + friend class PrintPreviewHandlerTest; + FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, StickyMarginsCustom); + FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, StickyMarginsDefault); + FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, + StickyMarginsCustomThenDefault); + FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, + GetLastUsedMarginSettingsCustom); + FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, + GetLastUsedMarginSettingsDefault); FRIEND_TEST_ALL_PREFIXES(PrintPreviewTabControllerUnitTest, TitleAfterReload); @@ -132,6 +145,9 @@ class PrintPreviewUI : public ChromeWebUI { // when the initiator tab is closed/crashed. std::string initiator_url_; + // Indicates whether the source document can be modified. + bool source_is_modifiable_; + // Store the initiator tab title, used for populating the print preview tab // title. string16 initiator_tab_title_; diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index 440708b..2993299 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -1864,6 +1864,7 @@ 'browser/ui/webui/html_dialog_tab_contents_delegate_unittest.cc', 'browser/ui/webui/options/chromeos/virtual_keyboard_manager_handler_unittest.cc', 'browser/ui/webui/options/language_options_handler_unittest.cc', + 'browser/ui/webui/print_preview_handler_unittest.cc', 'browser/ui/webui/print_preview_ui_unittest.cc', 'browser/ui/webui/sync_internals_ui_unittest.cc', 'browser/ui/webui/theme_source_unittest.cc', diff --git a/chrome/common/print_messages.h b/chrome/common/print_messages.h index a12b38f..2b11636 100644 --- a/chrome/common/print_messages.h +++ b/chrome/common/print_messages.h @@ -343,7 +343,7 @@ IPC_MESSAGE_CONTROL1(PrintHostMsg_TempFileForPrintingWritten, #endif // Asks the browser to do print preview. -IPC_MESSAGE_ROUTED0(PrintHostMsg_RequestPrintPreview) +IPC_MESSAGE_ROUTED1(PrintHostMsg_RequestPrintPreview, bool /* is_modifiable */) // Notify the browser the number of pages in the print preview document. IPC_MESSAGE_ROUTED1(PrintHostMsg_DidGetPreviewPageCount, diff --git a/chrome/renderer/print_web_view_helper.cc b/chrome/renderer/print_web_view_helper.cc index 1b4008a..72c7f10b 100644 --- a/chrome/renderer/print_web_view_helper.cc +++ b/chrome/renderer/print_web_view_helper.cc @@ -1282,7 +1282,8 @@ void PrintWebViewHelper::DisplayPrintJobError() { void PrintWebViewHelper::RequestPrintPreview() { old_print_pages_params_.reset(); - Send(new PrintHostMsg_RequestPrintPreview(routing_id())); + Send(new PrintHostMsg_RequestPrintPreview( + routing_id(), print_preview_context_.IsModifiable())); } bool PrintWebViewHelper::CheckForCancel() { diff --git a/chrome/test/data/webui/print_preview.js b/chrome/test/data/webui/print_preview.js index 596e8f0..530211e 100644 --- a/chrome/test/data/webui/print_preview.js +++ b/chrome/test/data/webui/print_preview.js @@ -26,7 +26,7 @@ PrintPreviewWebUITest.prototype = { * @override */ preLoad: function() { - this.makeAndRegisterMockHandler(['getDefaultPrinter', + this.makeAndRegisterMockHandler(['getInitialSettings', 'getPrinters', 'getPreview', 'print', @@ -45,7 +45,7 @@ PrintPreviewWebUITest.prototype = { // Register stubs for methods expected to be called before tests // run. Specific expectations can be made in the tests themselves. - this.mockHandler.stubs().getDefaultPrinter(). + this.mockHandler.stubs().getInitialSettings(). will(callFunction(function() { setDefaultPrinter('FooDevice'); })); diff --git a/printing/page_size_margins.cc b/printing/page_size_margins.cc new file mode 100644 index 0000000..05193909 --- /dev/null +++ b/printing/page_size_margins.cc @@ -0,0 +1,29 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "printing/page_size_margins.h" + +#include "base/logging.h" +#include "base/values.h" +#include "printing/print_job_constants.h" + +namespace printing { + +void getCustomMarginsFromJobSettings(const base::DictionaryValue& settings, + PageSizeMargins* page_size_margins) { + DictionaryValue* custom_margins; + if (!settings.GetDictionary(kSettingMarginsCustom, &custom_margins) || + !custom_margins->GetDouble(kSettingMarginTop, + &page_size_margins->margin_top) || + !custom_margins->GetDouble(kSettingMarginBottom, + &page_size_margins->margin_bottom) || + !custom_margins->GetDouble(kSettingMarginLeft, + &page_size_margins->margin_left) || + !custom_margins->GetDouble(kSettingMarginRight, + &page_size_margins->margin_right)) { + NOTREACHED(); + } +} + +} // namespace printing diff --git a/printing/page_size_margins.h b/printing/page_size_margins.h index 4f74c297..c1109ab 100644 --- a/printing/page_size_margins.h +++ b/printing/page_size_margins.h @@ -5,6 +5,10 @@ #ifndef PRINTING_PAGE_SIZE_MARGINS_H_ #define PRINTING_PAGE_SIZE_MARGINS_H_ +namespace base { +class DictionaryValue; +} + namespace printing { // Struct that holds margin and content area sizes of a page. Units are @@ -18,7 +22,9 @@ struct PageSizeMargins { double margin_left; }; +void getCustomMarginsFromJobSettings(const base::DictionaryValue& settings, + PageSizeMargins* page_size_margins); + } // namespace printing #endif // PRINTING_PAGE_SIZE_MARGINS_H_ - diff --git a/printing/printing.gyp b/printing/printing.gyp index 0cb2c06..34e3b4e 100644 --- a/printing/printing.gyp +++ b/printing/printing.gyp @@ -50,6 +50,7 @@ 'page_range.h', 'page_setup.cc', 'page_setup.h', + 'page_size_margins.cc', 'page_size_margins.h', 'pdf_metafile_cg_mac.cc', 'pdf_metafile_cg_mac.h', diff --git a/printing/printing_context.cc b/printing/printing_context.cc index cc39e6c..b94e7a8 100644 --- a/printing/printing_context.cc +++ b/printing/printing_context.cc @@ -7,6 +7,7 @@ #include "base/logging.h" #include "base/values.h" #include "printing/page_setup.h" +#include "printing/page_size_margins.h" #include "printing/print_settings_initializer.h" namespace printing { @@ -62,27 +63,15 @@ PrintingContext::Result PrintingContext::UpdatePrintSettings( settings_.margin_type = static_cast<MarginType>(margin_type); if (margin_type == CUSTOM_MARGINS) { - double top_margin_in_points = 0; - double bottom_margin_in_points = 0; - double left_margin_in_points = 0; - double right_margin_in_points = 0; - DictionaryValue* custom_margins; - if (!job_settings.GetDictionary(kSettingMarginsCustom, &custom_margins) || - !custom_margins->GetDouble(kSettingMarginTop, &top_margin_in_points) || - !custom_margins->GetDouble(kSettingMarginBottom, - &bottom_margin_in_points) || - !custom_margins->GetDouble(kSettingMarginLeft, - &left_margin_in_points) || - !custom_margins->GetDouble(kSettingMarginRight, - &right_margin_in_points)) { - NOTREACHED(); - } + printing::PageSizeMargins page_size_margins; + getCustomMarginsFromJobSettings(job_settings, &page_size_margins); + PageMargins margins_in_points; margins_in_points.Clear(); - margins_in_points.top = top_margin_in_points; - margins_in_points.bottom = bottom_margin_in_points; - margins_in_points.left = left_margin_in_points; - margins_in_points.right = right_margin_in_points; + margins_in_points.top = page_size_margins.margin_top; + margins_in_points.bottom = page_size_margins.margin_bottom; + margins_in_points.left = page_size_margins.margin_left; + margins_in_points.right = page_size_margins.margin_right; settings_.SetCustomMargins(margins_in_points); } |