summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/printing/print_preview_message_handler.cc10
-rw-r--r--chrome/browser/printing/print_preview_message_handler.h2
-rw-r--r--chrome/browser/printing/print_system_task_proxy.cc21
-rw-r--r--chrome/browser/printing/print_system_task_proxy.h4
-rw-r--r--chrome/browser/resources/print_preview/margin_settings.js130
-rw-r--r--chrome/browser/resources/print_preview/print_preview.js49
-rw-r--r--chrome/browser/ui/webui/print_preview_handler.cc138
-rw-r--r--chrome/browser/ui/webui/print_preview_handler.h38
-rw-r--r--chrome/browser/ui/webui/print_preview_handler_unittest.cc261
-rw-r--r--chrome/browser/ui/webui/print_preview_ui.cc8
-rw-r--r--chrome/browser/ui/webui/print_preview_ui.h16
-rw-r--r--chrome/chrome_tests.gypi1
-rw-r--r--chrome/common/print_messages.h2
-rw-r--r--chrome/renderer/print_web_view_helper.cc3
-rw-r--r--chrome/test/data/webui/print_preview.js4
-rw-r--r--printing/page_size_margins.cc29
-rw-r--r--printing/page_size_margins.h8
-rw-r--r--printing/printing.gyp1
-rw-r--r--printing/printing_context.cc27
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);
}