summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordpapad@chromium.org <dpapad@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-15 03:45:36 +0000
committerdpapad@chromium.org <dpapad@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-15 03:45:36 +0000
commit1943d11ae0a8a306aa0da1920283c559a18b67ed (patch)
treef0b174dadec3a65b2158d2ae6445901423cebd40
parenta4a092b1dc2a8f967a6bc2c5566b7f8b7cb6b6fa (diff)
downloadchromium_src-1943d11ae0a8a306aa0da1920283c559a18b67ed.zip
chromium_src-1943d11ae0a8a306aa0da1920283c559a18b67ed.tar.gz
chromium_src-1943d11ae0a8a306aa0da1920283c559a18b67ed.tar.bz2
Print Preview: Making margin selection sticky (part 2/2)
This CL makes "Custom" margins sticky across different preview sessions but also within the same preview session. Here is a summary of all changes. - Within same preview session: So far selecting "Custom" was picking up from whatever the previous selected option was. Now, "Custom" remembers the specified margins. To test this select "Custom", do some dragging, then change to another option and back to "Custom". - Across preview sessions: Select "Custom", do some dragging, then print. Open print preview again, the last used custom margins are remembered. - There was a bunch of messages sent from JS to get various info/settings (initiator tab title, measurement system and number format, last used margin settings, default printer). I created a single message "getInitialSettings" to get all at once (they are needed before the 1st preview is is requested). BUG=102446 TEST=See bug description. Review URL: http://codereview.chromium.org/8351048 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@110035 0039d316-1c4b-4281-b951-d872f2087c98
-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);
}