summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordpapad@chromium.org <dpapad@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-10 18:38:30 +0000
committerdpapad@chromium.org <dpapad@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-10 18:38:30 +0000
commitb2d78470385b9131dd387183ce300fdaeb303cb5 (patch)
tree1bfca4014504a8767293632ad3120962e8eab5a8
parent78cfe42bd82ac58273e059087f210dbbfa011b98 (diff)
downloadchromium_src-b2d78470385b9131dd387183ce300fdaeb303cb5.zip
chromium_src-b2d78470385b9131dd387183ce300fdaeb303cb5.tar.gz
chromium_src-b2d78470385b9131dd387183ce300fdaeb303cb5.tar.bz2
Print Preview: Refactoring sticky settings code.
Placing all stored settings in a separate class (and also moving some logic). BUG=NONE TEST=Sticky settings behavior should be unaffected. Review URL: http://codereview.chromium.org/9347008 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@121479 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--base/gtest_prod_util.h46
-rw-r--r--chrome/browser/printing/print_system_task_proxy.cc28
-rw-r--r--chrome/browser/ui/webui/print_preview/print_preview_handler.cc86
-rw-r--r--chrome/browser/ui/webui/print_preview/print_preview_handler.h14
-rw-r--r--chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc75
-rw-r--r--chrome/browser/ui/webui/print_preview/sticky_settings.cc96
-rw-r--r--chrome/browser/ui/webui/print_preview/sticky_settings.h87
-rw-r--r--chrome/chrome_browser.gypi2
8 files changed, 318 insertions, 116 deletions
diff --git a/base/gtest_prod_util.h b/base/gtest_prod_util.h
index a54235a..2db5853 100644
--- a/base/gtest_prod_util.h
+++ b/base/gtest_prod_util.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 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.
@@ -25,4 +25,48 @@
FRIEND_TEST(test_case_name, FLAKY_##test_name); \
FRIEND_TEST(test_case_name, FAILS_##test_name)
+// C++ compilers will refuse to compile the following code:
+//
+// namespace foo {
+// class MyClass {
+// private:
+// FRIEND_TEST_ALL_PREFIXES(MyClassTest, TestMethod);
+// bool private_var;
+// };
+// } // namespace foo
+//
+// class MyClassTest::TestMethod() {
+// foo::MyClass foo_class;
+// foo_class.private_var = true;
+// }
+//
+// Unless you forward declare MyClassTest::TestMethod outside of namespace foo.
+// Use FORWARD_DECLARE_TEST_ALL_PREFIXES to do so for all possible prefixes.
+//
+// Example usage:
+//
+// FORWARD_DECLARE_TEST_ALL_PREFIXES(MyClassTest, TestMethod);
+//
+// namespace foo {
+// class MyClass {
+// private:
+// FRIEND_TEST_ALL_PREFIXES(::MyClassTest, TestMethod); // NOTE use of ::
+// bool private_var;
+// };
+// } // namespace foo
+//
+// class MyClassTest::TestMethod() {
+// foo::MyClass foo_class;
+// foo_class.private_var = true;
+// }
+
+#define FORWARD_DECLARE_TEST(test_case_name, test_name) \
+class test_case_name##_##test_name##_Test\
+
+#define FORWARD_DECLARE_TEST_ALL_PREFIXES(test_case_name, test_name) \
+ FORWARD_DECLARE_TEST(test_case_name, test_name); \
+ FORWARD_DECLARE_TEST(test_case_name, DISABLED_##test_name); \
+ FORWARD_DECLARE_TEST(test_case_name, FLAKY_##test_name); \
+ FORWARD_DECLARE_TEST(test_case_name, FAILS_##test_name)
+
#endif // BASE_GTEST_PROD_UTIL_H_
diff --git a/chrome/browser/printing/print_system_task_proxy.cc b/chrome/browser/printing/print_system_task_proxy.cc
index 99baaf8..7386a6c 100644
--- a/chrome/browser/printing/print_system_task_proxy.cc
+++ b/chrome/browser/printing/print_system_task_proxy.cc
@@ -15,6 +15,7 @@
#include "base/string_util.h"
#include "base/values.h"
#include "chrome/browser/ui/webui/print_preview/print_preview_handler.h"
+#include "chrome/browser/ui/webui/print_preview/sticky_settings.h"
#include "printing/backend/print_backend.h"
#include "printing/print_job_constants.h"
#include "printing/print_settings.h"
@@ -323,20 +324,22 @@ PrintSystemTaskProxy::~PrintSystemTaskProxy() {
void PrintSystemTaskProxy::GetDefaultPrinter() {
VLOG(1) << "Get default printer start";
+ printing::StickySettings* sticky_settings =
+ PrintPreviewHandler::GetStickySettings();
+
std::string* default_printer = NULL;
- if (PrintPreviewHandler::last_used_printer_name_ == NULL) {
+ if (sticky_settings->printer_name() == NULL)
default_printer = new std::string(print_backend_->GetDefaultPrinterName());
- } else {
- default_printer = new std::string(
- *PrintPreviewHandler::last_used_printer_name_);
- }
+ else
+ default_printer = new std::string(*sticky_settings->printer_name());
+
VLOG(1) << "Get default printer finished, found: "
<< *default_printer;
std::string* cloud_print_data = NULL;
- if (PrintPreviewHandler::last_used_printer_cloud_print_data_ != NULL) {
- cloud_print_data = new std::string(
- *PrintPreviewHandler::last_used_printer_cloud_print_data_);
+ if (sticky_settings->printer_cloud_print_data() != NULL) {
+ cloud_print_data =
+ new std::string(*sticky_settings->printer_cloud_print_data());
} else {
cloud_print_data = new std::string;
}
@@ -561,13 +564,14 @@ void PrintSystemTaskProxy::GetPrinterCapabilities(
printer_color_space_for_black = printing::GRAY;
if (disable_color_options ||
- PrintPreviewHandler::last_used_color_model_ ==
+ PrintPreviewHandler::GetStickySettings()->color_model() ==
printing::UNKNOWN_COLOR_MODEL) {
settings_info.SetBoolean(kSetColorAsDefault, set_color_as_default);
} else {
- settings_info.SetBoolean(kSetColorAsDefault,
- printing::isColorModelSelected(
- PrintPreviewHandler::last_used_color_model_));
+ settings_info.SetBoolean(
+ kSetColorAsDefault,
+ printing::isColorModelSelected(
+ PrintPreviewHandler::GetStickySettings()->color_model()));
}
settings_info.SetBoolean(kSetDuplexAsDefault, set_duplex_as_default);
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
index 9b287f5..afa934f 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
@@ -15,6 +15,7 @@
#include "base/i18n/file_util_icu.h"
#include "base/i18n/number_formatting.h"
#include "base/json/json_reader.h"
+#include "base/lazy_instance.h"
#include "base/memory/ref_counted_memory.h"
#include "base/metrics/histogram.h"
#include "base/path_service.h"
@@ -36,6 +37,7 @@
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
#include "chrome/browser/ui/webui/print_preview/print_preview_ui.h"
+#include "chrome/browser/ui/webui/print_preview/sticky_settings.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/print_messages.h"
@@ -193,19 +195,15 @@ void PrintToPdfCallback(Metafile* metafile, const FilePath& path) {
base::Bind(&base::DeletePointer<Metafile>, metafile));
}
+static base::LazyInstance<printing::StickySettings> sticky_settings =
+ LAZY_INSTANCE_INITIALIZER;
+
} // namespace
// static
-FilePath* PrintPreviewHandler::last_saved_path_ = NULL;
-std::string* PrintPreviewHandler::last_used_printer_cloud_print_data_ = NULL;
-std::string* PrintPreviewHandler::last_used_printer_name_ = NULL;
-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;
-bool PrintPreviewHandler::last_used_headers_footers_ = true;
+printing::StickySettings* PrintPreviewHandler::GetStickySettings() {
+ return sticky_settings.Pointer();
+}
PrintPreviewHandler::PrintPreviewHandler()
: print_backend_(printing::PrintBackend::CreateInstance(NULL)),
@@ -374,27 +372,15 @@ void PrintPreviewHandler::HandlePrint(const ListValue* args) {
return;
// Storing last used color model.
- int color_model;
- if (!settings->GetInteger(printing::kSettingColor, &color_model))
- color_model = printing::GRAY;
- last_used_color_model_ = static_cast<printing::ColorModels>(color_model);
+ GetStickySettings()->StoreColorModel(*settings);
bool is_modifiable;
settings->GetBoolean(printing::kSettingPreviewModifiable, &is_modifiable);
if (is_modifiable) {
// 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);
- 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_);
- }
+ GetStickySettings()->StoreMarginSettings(*settings);
// Storing last used header and footer setting.
- settings->GetBoolean(
- printing::kSettingHeaderFooterEnabled, &last_used_headers_footers_);
+ GetStickySettings()->StoreHeadersFooters(*settings);
}
// Never try to add headers/footers here. It's already in the generated PDF.
@@ -513,16 +499,11 @@ void PrintPreviewHandler::HandleCancelPendingPrintRequest(
void PrintPreviewHandler::HandleSaveLastPrinter(const ListValue* args) {
std::string data_to_save;
- if (args->GetString(0, &data_to_save) && !data_to_save.empty()) {
- if (last_used_printer_name_ == NULL)
- last_used_printer_name_ = new std::string();
- *last_used_printer_name_ = data_to_save;
- }
- if (args->GetString(1, &data_to_save) && !data_to_save.empty()) {
- if (last_used_printer_cloud_print_data_ == NULL)
- last_used_printer_cloud_print_data_ = new std::string();
- *last_used_printer_cloud_print_data_ = data_to_save;
- }
+ if (args->GetString(0, &data_to_save) && !data_to_save.empty())
+ GetStickySettings()->StorePrinterName(data_to_save);
+
+ if (args->GetString(1, &data_to_save) && !data_to_save.empty())
+ GetStickySettings()->StoreCloudPrintData(data_to_save);
}
void PrintPreviewHandler::HandleGetPrinterCapabilities(const ListValue* args) {
@@ -649,22 +630,6 @@ void PrintPreviewHandler::GetNumberFormatAndMeasurementSystem(
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);
- }
-}
-
void PrintPreviewHandler::HandleGetInitialSettings(const ListValue* /*args*/) {
scoped_refptr<PrintSystemTaskProxy> task =
new PrintSystemTaskProxy(AsWeakPtr(),
@@ -690,7 +655,7 @@ void PrintPreviewHandler::SendInitialSettings(
default_printer);
initial_settings.SetString(kCloudPrintData, cloud_print_data);
initial_settings.SetBoolean(printing::kSettingHeaderFooterEnabled,
- last_used_headers_footers_);
+ GetStickySettings()->headers_footers());
#if defined(OS_MACOSX)
@@ -703,7 +668,7 @@ void PrintPreviewHandler::SendInitialSettings(
initial_settings.SetBoolean(kPrintAutomaticallyInKioskMode, kiosk_mode);
if (print_preview_ui->source_is_modifiable()) {
- GetLastUsedMarginSettings(&initial_settings);
+ GetStickySettings()->GetLastUsedMarginSettings(&initial_settings);
GetNumberFormatAndMeasurementSystem(&initial_settings);
}
web_ui()->CallJavascriptFunction("setInitialSettings", initial_settings);
@@ -817,14 +782,15 @@ void PrintPreviewHandler::SelectFile(const FilePath& default_filename) {
file_type_info.extensions.resize(1);
file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("pdf"));
- // Initializing last_saved_path_ if it is not already initialized.
- if (!last_saved_path_) {
- last_saved_path_ = new FilePath();
+ // Initializing save_path_ if it is not already initialized.
+ if (!GetStickySettings()->save_path()) {
// Allowing IO operation temporarily. It is ok to do so here because
// the select file dialog performs IO anyway in order to display the
// folders and also it is modal.
base::ThreadRestrictions::ScopedAllowIO allow_io;
- PathService::Get(chrome::DIR_USER_DOCUMENTS, last_saved_path_);
+ FilePath file_path;
+ PathService::Get(chrome::DIR_USER_DOCUMENTS, &file_path);
+ GetStickySettings()->StoreSavePath(file_path);
}
if (!select_file_dialog_.get())
@@ -833,7 +799,7 @@ void PrintPreviewHandler::SelectFile(const FilePath& default_filename) {
select_file_dialog_->SelectFile(
SelectFileDialog::SELECT_SAVEAS_FILE,
string16(),
- last_saved_path_->Append(default_filename),
+ GetStickySettings()->save_path()->Append(default_filename),
&file_type_info,
0,
FILE_PATH_LITERAL(""),
@@ -863,8 +829,8 @@ void PrintPreviewHandler::ShowSystemDialog() {
void PrintPreviewHandler::FileSelected(const FilePath& path,
int index, void* params) {
- // Updating |last_saved_path_| to the newly selected folder.
- *last_saved_path_ = path.DirName();
+ // Updating |save_path_| to the newly selected folder.
+ GetStickySettings()->StoreSavePath(path.DirName());
PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
web_ui()->GetController());
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.h b/chrome/browser/ui/webui/print_preview/print_preview_handler.h
index fcdcbc4..7c41519 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler.h
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.h
@@ -31,6 +31,7 @@ class StringValue;
namespace printing {
struct PageSizeMargins;
class PrintBackend;
+class StickySettings;
}
// The handler for Javascript messages related to the print preview dialog.
@@ -181,10 +182,7 @@ class PrintPreviewHandler : public content::WebUIMessageHandler,
// 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);
+ static printing::StickySettings* GetStickySettings();
// Pointer to current print system.
scoped_refptr<printing::PrintBackend> print_backend_;
@@ -192,14 +190,6 @@ class PrintPreviewHandler : public content::WebUIMessageHandler,
// The underlying dialog object.
scoped_refptr<SelectFileDialog> select_file_dialog_;
- static FilePath* last_saved_path_;
- static std::string* last_used_printer_cloud_print_data_;
- 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_;
- static bool last_used_headers_footers_;
-
// A count of how many requests received to regenerate preview data.
// Initialized to 0 then incremented and emitted to a histogram.
int regenerate_preview_request_count_;
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
index e3ebaf3..e300d45 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
@@ -13,6 +13,7 @@
#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
#include "chrome/browser/ui/webui/print_preview/print_preview_handler.h"
#include "chrome/browser/ui/webui/print_preview/print_preview_ui.h"
+#include "chrome/browser/ui/webui/print_preview/sticky_settings.h"
#include "content/public/browser/web_contents.h"
#include "printing/page_size_margins.h"
#include "printing/print_job_constants.h"
@@ -88,14 +89,34 @@ class PrintPreviewHandlerTest : public PrintPreviewUnitTestBase {
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);
+ printing::PageSizeMargins* margins =
+ PrintPreviewHandler::GetStickySettings()->
+ page_size_margins_.get();
+ EXPECT_EQ(margin_top, margins->margin_top);
+ EXPECT_EQ(margin_right, margins->margin_right);
+ EXPECT_EQ(margin_bottom, margins->margin_bottom);
+ EXPECT_EQ(margin_left, margins->margin_left);
+ }
+
+ // Checking that sticky settings were saved according to expectations.
+ void CheckStickySettings(printing::ColorModels color_model,
+ printing::MarginType margin_type,
+ bool margins_saved,
+ const double margin_top,
+ const double margin_right,
+ const double margin_bottom,
+ const double margin_left) {
+ printing::StickySettings* sticky_settings =
+ PrintPreviewHandler::GetStickySettings();
+ EXPECT_EQ(color_model, sticky_settings->color_model());
+ EXPECT_EQ(margin_type, sticky_settings->margins_type_);
+
+ if (margins_saved) {
+ ASSERT_TRUE(sticky_settings->page_size_margins_.get());
+ CheckCustomMargins(margin_top, margin_right, margin_bottom, margin_left);
+ } else {
+ ASSERT_FALSE(sticky_settings->page_size_margins_.get());
+ }
}
void RequestPrintWithDefaultMargins() {
@@ -144,9 +165,9 @@ class PrintPreviewHandlerTest : public PrintPreviewUnitTestBase {
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;
+ PrintPreviewHandler::GetStickySettings()->margins_type_ =
+ printing::DEFAULT_MARGINS;
+ PrintPreviewHandler::GetStickySettings()->page_size_margins_.reset();
}
TabContentsWrapper* preview_tab_;
@@ -164,11 +185,8 @@ TEST_F(PrintPreviewHandlerTest, StickyMarginsCustom) {
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);
+ CheckStickySettings(printing::COLOR, printing::CUSTOM_MARGINS, true,
+ kMarginTop, kMarginRight, kMarginBottom, kMarginLeft);
}
// Tests that margin settings are saved correctly when printing with default
@@ -178,10 +196,8 @@ TEST_F(PrintPreviewHandlerTest, StickyMarginsDefault) {
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_);
+ CheckStickySettings(
+ printing::COLOR, printing::DEFAULT_MARGINS, false, 0, 0, 0, 0);
}
// Tests that margin settings are saved correctly when printing with custom
@@ -195,20 +211,15 @@ TEST_F(PrintPreviewHandlerTest, StickyMarginsCustomThenDefault) {
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);
+ CheckStickySettings(printing::COLOR, printing::CUSTOM_MARGINS, true,
+ kMarginTop, kMarginRight, kMarginBottom, kMarginLeft);
OpenPrintPreviewTab();
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);
+ CheckStickySettings(printing::COLOR, printing::DEFAULT_MARGINS, true,
+ kMarginTop, kMarginRight, kMarginBottom, kMarginLeft);
}
// Tests that margin settings are retrieved correctly after printing with custom
@@ -221,7 +232,8 @@ TEST_F(PrintPreviewHandlerTest, GetLastUsedMarginSettingsCustom) {
RequestPrintWithCustomMargins(
kMarginTop, kMarginRight, kMarginBottom, kMarginLeft);
base::DictionaryValue initial_settings;
- preview_ui_->handler_->GetLastUsedMarginSettings(&initial_settings);
+ PrintPreviewHandler::GetStickySettings()->
+ GetLastUsedMarginSettings(&initial_settings);
int margins_type;
EXPECT_TRUE(initial_settings.GetInteger(printing::kSettingMarginsType,
&margins_type));
@@ -246,7 +258,8 @@ TEST_F(PrintPreviewHandlerTest, GetLastUsedMarginSettingsCustom) {
TEST_F(PrintPreviewHandlerTest, GetLastUsedMarginSettingsDefault) {
RequestPrintWithDefaultMargins();
base::DictionaryValue initial_settings;
- preview_ui_->handler_->GetLastUsedMarginSettings(&initial_settings);
+ PrintPreviewHandler::GetStickySettings()->
+ GetLastUsedMarginSettings(&initial_settings);
int margins_type;
EXPECT_TRUE(initial_settings.GetInteger(printing::kSettingMarginsType,
&margins_type));
diff --git a/chrome/browser/ui/webui/print_preview/sticky_settings.cc b/chrome/browser/ui/webui/print_preview/sticky_settings.cc
new file mode 100644
index 0000000..4a4a3a0
--- /dev/null
+++ b/chrome/browser/ui/webui/print_preview/sticky_settings.cc
@@ -0,0 +1,96 @@
+// Copyright (c) 2012 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 "chrome/browser/ui/webui/print_preview/sticky_settings.h"
+
+#include "base/file_path.h"
+#include "base/values.h"
+#include "printing/page_size_margins.h"
+
+namespace printing {
+
+StickySettings::StickySettings()
+ : color_model_(printing::UNKNOWN_COLOR_MODEL),
+ margins_type_(printing::DEFAULT_MARGINS),
+ headers_footers_(true) {}
+
+StickySettings::~StickySettings() {}
+
+void StickySettings::GetLastUsedMarginSettings(
+ base::DictionaryValue* custom_margins) const {
+ custom_margins->SetInteger(printing::kSettingMarginsType,
+ margins_type_);
+ if (page_size_margins_.get()) {
+ custom_margins->SetDouble(printing::kSettingMarginTop,
+ page_size_margins_->margin_top);
+ custom_margins->SetDouble(printing::kSettingMarginBottom,
+ page_size_margins_->margin_bottom);
+ custom_margins->SetDouble(printing::kSettingMarginLeft,
+ page_size_margins_->margin_left);
+ custom_margins->SetDouble(printing::kSettingMarginRight,
+ page_size_margins_->margin_right);
+ }
+}
+
+void StickySettings::StoreColorModel(
+ const base::DictionaryValue& settings) {
+ int color_model;
+ if (!settings.GetInteger(printing::kSettingColor, &color_model))
+ color_model = printing::GRAY;
+ color_model_ = static_cast<printing::ColorModels>(color_model);
+}
+
+void StickySettings::StoreMarginSettings(
+ const base::DictionaryValue& settings) {
+ int margin_type;
+ if (!settings.GetInteger(printing::kSettingMarginsType, &margin_type))
+ margin_type = printing::DEFAULT_MARGINS;
+ margins_type_ = static_cast<printing::MarginType>(margin_type);
+ if (margins_type_ == printing::CUSTOM_MARGINS) {
+ if (!page_size_margins_.get())
+ page_size_margins_.reset(new printing::PageSizeMargins());
+ GetCustomMarginsFromJobSettings(
+ settings, page_size_margins_.get());
+ }
+}
+
+void StickySettings::StoreHeadersFooters(
+ const base::DictionaryValue& settings) {
+ settings.GetBoolean(
+ printing::kSettingHeaderFooterEnabled, &headers_footers_);
+}
+
+void StickySettings::StorePrinterName(const std::string& printer_name) {
+ printer_name_.reset(new std::string(printer_name));
+}
+
+void StickySettings::StoreCloudPrintData(const std::string& data) {
+ printer_cloud_print_data_.reset(new std::string(data));
+}
+
+void StickySettings::StoreSavePath(const FilePath& path) {
+ save_path_.reset(new FilePath(path));
+}
+
+std::string* StickySettings::printer_name() {
+ return printer_name_.get();
+}
+
+std::string* StickySettings::printer_cloud_print_data() {
+ return printer_cloud_print_data_.get();
+}
+
+printing::ColorModels StickySettings::color_model() const {
+ return color_model_;
+}
+
+bool StickySettings::headers_footers() const {
+ return headers_footers_;
+}
+
+FilePath* StickySettings::save_path() {
+ return save_path_.get();
+}
+
+} // namespace printing
diff --git a/chrome/browser/ui/webui/print_preview/sticky_settings.h b/chrome/browser/ui/webui/print_preview/sticky_settings.h
new file mode 100644
index 0000000..4e9c44b
--- /dev/null
+++ b/chrome/browser/ui/webui/print_preview/sticky_settings.h
@@ -0,0 +1,87 @@
+// Copyright (c) 2012 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.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_PRINT_PREVIEW_STICKY_SETTINGS_H_
+#define CHROME_BROWSER_UI_WEBUI_PRINT_PREVIEW_STICKY_SETTINGS_H_
+
+#include "printing/print_job_constants.h"
+
+#include <string>
+
+#include "base/gtest_prod_util.h"
+#include "base/memory/scoped_ptr.h"
+
+class FilePath;
+class PrintPreviewHandlerTest;
+
+namespace base {
+class DictionaryValue;
+}
+
+namespace printing {
+struct PageSizeMargins;
+}
+
+FORWARD_DECLARE_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, StickyMarginsCustom);
+FORWARD_DECLARE_TEST_ALL_PREFIXES(PrintPreviewHandlerTest,
+ StickyMarginsDefault);
+FORWARD_DECLARE_TEST_ALL_PREFIXES(PrintPreviewHandlerTest,
+ StickyMarginsCustomThenDefault);
+FORWARD_DECLARE_TEST_ALL_PREFIXES(PrintPreviewHandlerTest,
+ GetLastUsedMarginSettingsCustom);
+FORWARD_DECLARE_TEST_ALL_PREFIXES(PrintPreviewHandlerTest,
+ GetLastUsedMarginSettingsDefault);
+
+namespace printing {
+
+// Holds all the settings that should be remembered (sticky) in print preview.
+// A sticky setting will be restored next time the user launches print preview.
+// Only one instance of this class is instantiated.
+class StickySettings {
+ public:
+ StickySettings();
+ ~StickySettings();
+
+ // Populates |last_used_custom_margins| according to the last used margin
+ // settings.
+ void GetLastUsedMarginSettings(
+ base::DictionaryValue* last_used_custom_margins) const;
+
+ std::string* printer_name();
+ std::string* printer_cloud_print_data();
+ printing::ColorModels color_model() const;
+ bool headers_footers() const;
+ FilePath* save_path();
+
+ // Methods for storing settings.
+ void StoreColorModel(const base::DictionaryValue& settings);
+ void StoreMarginSettings(const base::DictionaryValue& settings);
+ void StoreHeadersFooters(const base::DictionaryValue& settings);
+ void StorePrinterName(const std::string& printer_name);
+ void StoreCloudPrintData(const std::string& cloud_print_data);
+ void StoreSavePath(const FilePath& path);
+
+ private:
+ scoped_ptr<FilePath> save_path_;
+ scoped_ptr<std::string> printer_name_;
+ scoped_ptr<std::string> printer_cloud_print_data_;
+ printing::ColorModels color_model_;
+ printing::MarginType margins_type_;
+ scoped_ptr<printing::PageSizeMargins> page_size_margins_;
+ bool headers_footers_;
+
+ 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);
+};
+
+} // namespace printing
+
+#endif // CHROME_BROWSER_UI_WEBUI_PRINT_PREVIEW_STICKY_SETTINGS_H_
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index fb11f29..4818167 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -4129,6 +4129,8 @@
'browser/ui/webui/print_preview/print_preview_handler.h',
'browser/ui/webui/print_preview/print_preview_ui.cc',
'browser/ui/webui/print_preview/print_preview_ui.h',
+ 'browser/ui/webui/print_preview/sticky_settings.cc',
+ 'browser/ui/webui/print_preview/sticky_settings.h',
'browser/ui/webui/profiler_ui.cc',
'browser/ui/webui/profiler_ui.h',
'browser/ui/webui/quota_internals_handler.cc',