Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(188)

Side by Side Diff: chrome/browser/ui/webui/print_preview/print_preview_handler.cc

Issue 10909124: Improves application state persistance. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Updates unit tests. Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/webui/print_preview/print_preview_handler.h" 5 #include "chrome/browser/ui/webui/print_preview/print_preview_handler.h"
6 6
7 #include <ctype.h> 7 #include <ctype.h>
8 8
9 #include <string> 9 #include <string>
10 10
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 UMA_HISTOGRAM_ENUMERATION("PrintPreview.PrintSettings", setting, 121 UMA_HISTOGRAM_ENUMERATION("PrintPreview.PrintSettings", setting,
122 PRINT_SETTINGS_BUCKET_BOUNDARY); 122 PRINT_SETTINGS_BUCKET_BOUNDARY);
123 } 123 }
124 124
125 void ReportPrintDestinationHistogram(enum PrintDestinationBuckets event) { 125 void ReportPrintDestinationHistogram(enum PrintDestinationBuckets event) {
126 UMA_HISTOGRAM_ENUMERATION("PrintPreview.DestinationAction", event, 126 UMA_HISTOGRAM_ENUMERATION("PrintPreview.DestinationAction", event,
127 PRINT_DESTINATION_BUCKET_BOUNDARY); 127 PRINT_DESTINATION_BUCKET_BOUNDARY);
128 } 128 }
129 129
130 // Name of a dictionary field holding cloud print related data; 130 // Name of a dictionary field holding cloud print related data;
131 const char kCloudPrintData[] = "cloudPrintData"; 131 const char kAppState[] = "appState";
132 // Name of a dictionary field holding the initiator tab title. 132 // Name of a dictionary field holding the initiator tab title.
133 const char kInitiatorTabTitle[] = "initiatorTabTitle"; 133 const char kInitiatorTabTitle[] = "initiatorTabTitle";
134 // Name of a dictionary field holding the measurement system according to the 134 // Name of a dictionary field holding the measurement system according to the
135 // locale. 135 // locale.
136 const char kMeasurementSystem[] = "measurementSystem"; 136 const char kMeasurementSystem[] = "measurementSystem";
137 // Name of a dictionary field holding the number format according to the locale. 137 // Name of a dictionary field holding the number format according to the locale.
138 const char kNumberFormat[] = "numberFormat"; 138 const char kNumberFormat[] = "numberFormat";
139 // Name of a dictionary field specifying whether to print automatically in 139 // Name of a dictionary field specifying whether to print automatically in
140 // kiosk mode. See http://crbug.com/31395. 140 // kiosk mode. See http://crbug.com/31395.
141 const char kPrintAutomaticallyInKioskMode[] = "printAutomaticallyInKioskMode"; 141 const char kPrintAutomaticallyInKioskMode[] = "printAutomaticallyInKioskMode";
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 } 229 }
230 // |metafile| must be deleted on the UI thread. 230 // |metafile| must be deleted on the UI thread.
231 BrowserThread::PostTask( 231 BrowserThread::PostTask(
232 BrowserThread::UI, FROM_HERE, 232 BrowserThread::UI, FROM_HERE,
233 base::Bind(&base::DeletePointer<Metafile>, metafile)); 233 base::Bind(&base::DeletePointer<Metafile>, metafile));
234 } 234 }
235 #endif 235 #endif
236 236
237 static base::LazyInstance<printing::StickySettings> sticky_settings = 237 static base::LazyInstance<printing::StickySettings> sticky_settings =
238 LAZY_INSTANCE_INITIALIZER; 238 LAZY_INSTANCE_INITIALIZER;
239
240 } // namespace 239 } // namespace
241 240
242 // static 241 // static
243 printing::StickySettings* PrintPreviewHandler::GetStickySettings() { 242 printing::StickySettings* PrintPreviewHandler::GetStickySettings() {
244 return sticky_settings.Pointer(); 243 return sticky_settings.Pointer();
245 } 244 }
246 245
247 PrintPreviewHandler::PrintPreviewHandler() 246 PrintPreviewHandler::PrintPreviewHandler()
248 : print_backend_(printing::PrintBackend::CreateInstance(NULL)), 247 : print_backend_(printing::PrintBackend::CreateInstance(NULL)),
249 regenerate_preview_request_count_(0), 248 regenerate_preview_request_count_(0),
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 base::Unretained(this))); 285 base::Unretained(this)));
287 web_ui()->RegisterMessageCallback("closePrintPreviewTab", 286 web_ui()->RegisterMessageCallback("closePrintPreviewTab",
288 base::Bind(&PrintPreviewHandler::HandleClosePreviewTab, 287 base::Bind(&PrintPreviewHandler::HandleClosePreviewTab,
289 base::Unretained(this))); 288 base::Unretained(this)));
290 web_ui()->RegisterMessageCallback("hidePreview", 289 web_ui()->RegisterMessageCallback("hidePreview",
291 base::Bind(&PrintPreviewHandler::HandleHidePreview, 290 base::Bind(&PrintPreviewHandler::HandleHidePreview,
292 base::Unretained(this))); 291 base::Unretained(this)));
293 web_ui()->RegisterMessageCallback("cancelPendingPrintRequest", 292 web_ui()->RegisterMessageCallback("cancelPendingPrintRequest",
294 base::Bind(&PrintPreviewHandler::HandleCancelPendingPrintRequest, 293 base::Bind(&PrintPreviewHandler::HandleCancelPendingPrintRequest,
295 base::Unretained(this))); 294 base::Unretained(this)));
296 web_ui()->RegisterMessageCallback("saveLastPrinter", 295 web_ui()->RegisterMessageCallback("saveAppState",
297 base::Bind(&PrintPreviewHandler::HandleSaveLastPrinter, 296 base::Bind(&PrintPreviewHandler::HandleSaveAppState,
298 base::Unretained(this))); 297 base::Unretained(this)));
299 web_ui()->RegisterMessageCallback("getInitialSettings", 298 web_ui()->RegisterMessageCallback("getInitialSettings",
300 base::Bind(&PrintPreviewHandler::HandleGetInitialSettings, 299 base::Bind(&PrintPreviewHandler::HandleGetInitialSettings,
301 base::Unretained(this))); 300 base::Unretained(this)));
302 web_ui()->RegisterMessageCallback("reportDestinationEvent", 301 web_ui()->RegisterMessageCallback("reportDestinationEvent",
303 base::Bind(&PrintPreviewHandler::HandleReportDestinationEvent, 302 base::Bind(&PrintPreviewHandler::HandleReportDestinationEvent,
304 base::Unretained(this))); 303 base::Unretained(this)));
305 web_ui()->RegisterMessageCallback("printWithCloudPrint", 304 web_ui()->RegisterMessageCallback("printWithCloudPrint",
306 base::Bind(&PrintPreviewHandler::HandlePrintWithCloudPrint, 305 base::Bind(&PrintPreviewHandler::HandlePrintWithCloudPrint,
307 base::Unretained(this))); 306 base::Unretained(this)));
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
410 TabContents* initiator_tab = GetInitiatorTab(); 409 TabContents* initiator_tab = GetInitiatorTab();
411 if (initiator_tab) { 410 if (initiator_tab) {
412 RenderViewHost* rvh = initiator_tab->web_contents()->GetRenderViewHost(); 411 RenderViewHost* rvh = initiator_tab->web_contents()->GetRenderViewHost();
413 rvh->Send(new PrintMsg_ResetScriptedPrintCount(rvh->GetRoutingID())); 412 rvh->Send(new PrintMsg_ResetScriptedPrintCount(rvh->GetRoutingID()));
414 } 413 }
415 414
416 scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args)); 415 scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args));
417 if (!settings.get()) 416 if (!settings.get())
418 return; 417 return;
419 418
420 // Storing last used settings.
421 printing::StickySettings* sticky_settings = GetStickySettings();
422 sticky_settings->Store(*settings);
423 sticky_settings->SaveInPrefs(Profile::FromBrowserContext(
424 preview_web_contents()->GetBrowserContext())->GetPrefs());
425 // Never try to add headers/footers here. It's already in the generated PDF. 419 // Never try to add headers/footers here. It's already in the generated PDF.
426 settings->SetBoolean(printing::kSettingHeaderFooterEnabled, false); 420 settings->SetBoolean(printing::kSettingHeaderFooterEnabled, false);
427 421
428 bool print_to_pdf = false; 422 bool print_to_pdf = false;
429 bool is_cloud_printer = false; 423 bool is_cloud_printer = false;
430 bool is_cloud_dialog = false; 424 bool is_cloud_dialog = false;
431 425
432 bool open_pdf_in_preview = false; 426 bool open_pdf_in_preview = false;
433 #if defined(OS_MACOSX) 427 #if defined(OS_MACOSX)
434 open_pdf_in_preview = settings->HasKey(printing::kSettingOpenPDFInPreview); 428 open_pdf_in_preview = settings->HasKey(printing::kSettingOpenPDFInPreview);
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
524 const ListValue* /*args*/) { 518 const ListValue* /*args*/) {
525 TabContents* initiator_tab = GetInitiatorTab(); 519 TabContents* initiator_tab = GetInitiatorTab();
526 if (initiator_tab) 520 if (initiator_tab)
527 ClearInitiatorTabDetails(); 521 ClearInitiatorTabDetails();
528 gfx::NativeWindow parent = initiator_tab ? 522 gfx::NativeWindow parent = initiator_tab ?
529 initiator_tab->web_contents()->GetView()->GetTopLevelNativeWindow() : 523 initiator_tab->web_contents()->GetView()->GetTopLevelNativeWindow() :
530 NULL; 524 NULL;
531 chrome::ShowPrintErrorDialog(parent); 525 chrome::ShowPrintErrorDialog(parent);
532 } 526 }
533 527
534 void PrintPreviewHandler::HandleSaveLastPrinter(const ListValue* args) { 528 void PrintPreviewHandler::HandleSaveAppState(const ListValue* args) {
535 std::string data_to_save; 529 std::string data_to_save;
530 printing::StickySettings* sticky_settings = GetStickySettings();
536 if (args->GetString(0, &data_to_save) && !data_to_save.empty()) 531 if (args->GetString(0, &data_to_save) && !data_to_save.empty())
537 GetStickySettings()->StorePrinterName(data_to_save); 532 sticky_settings->StoreAppState(data_to_save);
538 533 sticky_settings->SaveInPrefs(Profile::FromBrowserContext(
539 if (args->GetString(1, &data_to_save) && !data_to_save.empty()) 534 preview_web_contents()->GetBrowserContext())->GetPrefs());
540 GetStickySettings()->StoreCloudPrintData(data_to_save);
541 } 535 }
542 536
543 void PrintPreviewHandler::HandleGetPrinterCapabilities(const ListValue* args) { 537 void PrintPreviewHandler::HandleGetPrinterCapabilities(const ListValue* args) {
544 std::string printer_name; 538 std::string printer_name;
545 bool ret = args->GetString(0, &printer_name); 539 bool ret = args->GetString(0, &printer_name);
546 if (!ret || printer_name.empty()) 540 if (!ret || printer_name.empty())
547 return; 541 return;
548 542
549 scoped_refptr<PrintSystemTaskProxy> task = 543 scoped_refptr<PrintSystemTaskProxy> task =
550 new PrintSystemTaskProxy(AsWeakPtr(), 544 new PrintSystemTaskProxy(AsWeakPtr(),
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
673 if (errorCode > U_ZERO_ERROR || system == UMS_LIMIT) 667 if (errorCode > U_ZERO_ERROR || system == UMS_LIMIT)
674 system = UMS_SI; 668 system = UMS_SI;
675 669
676 // Getting the number formatting based on the locale and writing to 670 // Getting the number formatting based on the locale and writing to
677 // dictionary. 671 // dictionary.
678 settings->SetString(kNumberFormat, base::FormatDouble(123456.78, 2)); 672 settings->SetString(kNumberFormat, base::FormatDouble(123456.78, 2));
679 settings->SetInteger(kMeasurementSystem, system); 673 settings->SetInteger(kMeasurementSystem, system);
680 } 674 }
681 675
682 void PrintPreviewHandler::HandleGetInitialSettings(const ListValue* /*args*/) { 676 void PrintPreviewHandler::HandleGetInitialSettings(const ListValue* /*args*/) {
683 printing::StickySettings* sticky_settings = GetStickySettings(); 677 scoped_refptr<PrintSystemTaskProxy> task =
684 sticky_settings->RestoreFromPrefs(Profile::FromBrowserContext( 678 new PrintSystemTaskProxy(AsWeakPtr(),
685 preview_web_contents()->GetBrowserContext())->GetPrefs()); 679 print_backend_.get(),
686 if (sticky_settings->printer_name()) { 680 has_logged_printers_count_);
687 std::string cloud_print_data; 681 BrowserThread::PostTask(
688 if (sticky_settings->printer_cloud_print_data()) 682 BrowserThread::FILE, FROM_HERE,
689 cloud_print_data = *sticky_settings->printer_cloud_print_data(); 683 base::Bind(&PrintSystemTaskProxy::GetDefaultPrinter, task.get()));
690 SendInitialSettings(*sticky_settings->printer_name(), cloud_print_data);
691 } else {
692 scoped_refptr<PrintSystemTaskProxy> task =
693 new PrintSystemTaskProxy(AsWeakPtr(),
694 print_backend_.get(),
695 has_logged_printers_count_);
696 BrowserThread::PostTask(
697 BrowserThread::FILE, FROM_HERE,
698 base::Bind(&PrintSystemTaskProxy::GetDefaultPrinter, task.get()));
699 }
700 SendCloudPrintEnabled(); 684 SendCloudPrintEnabled();
701 } 685 }
702 686
703 void PrintPreviewHandler::HandleReportDestinationEvent(const ListValue* args) { 687 void PrintPreviewHandler::HandleReportDestinationEvent(const ListValue* args) {
704 int event_number; 688 int event_number;
705 bool ret = args->GetInteger(0, &event_number); 689 bool ret = args->GetInteger(0, &event_number);
706 if (!ret) 690 if (!ret)
707 return; 691 return;
708 enum PrintDestinationBuckets event = 692 enum PrintDestinationBuckets event =
709 static_cast<enum PrintDestinationBuckets>(event_number); 693 static_cast<enum PrintDestinationBuckets>(event_number);
710 if (event >= PRINT_DESTINATION_BUCKET_BOUNDARY) 694 if (event >= PRINT_DESTINATION_BUCKET_BOUNDARY)
711 return; 695 return;
712 ReportPrintDestinationHistogram(event); 696 ReportPrintDestinationHistogram(event);
713 } 697 }
714 698
715 void PrintPreviewHandler::SendInitialSettings( 699 void PrintPreviewHandler::SendInitialSettings(
716 const std::string& default_printer, 700 const std::string& default_printer,
717 const std::string& cloud_print_data) { 701 const std::string& cloud_print_data) {
718 PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>( 702 PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
719 web_ui()->GetController()); 703 web_ui()->GetController());
720 704
721 base::DictionaryValue initial_settings; 705 base::DictionaryValue initial_settings;
722 initial_settings.SetString(kInitiatorTabTitle, 706 initial_settings.SetString(kInitiatorTabTitle,
723 print_preview_ui->initiator_tab_title()); 707 print_preview_ui->initiator_tab_title());
724 initial_settings.SetBoolean(printing::kSettingPreviewModifiable, 708 initial_settings.SetBoolean(printing::kSettingPreviewModifiable,
725 print_preview_ui->source_is_modifiable()); 709 print_preview_ui->source_is_modifiable());
726 initial_settings.SetString(printing::kSettingPrinterName, 710 initial_settings.SetString(printing::kSettingPrinterName,
727 default_printer); 711 default_printer);
728 initial_settings.SetString(kCloudPrintData, cloud_print_data); 712 printing::StickySettings* sticky_settings = GetStickySettings();
729 initial_settings.SetBoolean(printing::kSettingHeaderFooterEnabled, 713 sticky_settings->RestoreFromPrefs(Profile::FromBrowserContext(
730 GetStickySettings()->headers_footers()); 714 preview_web_contents()->GetBrowserContext())->GetPrefs());
731 initial_settings.SetInteger(printing::kSettingDuplexMode, 715 if (sticky_settings->printer_app_state())
732 GetStickySettings()->duplex_mode()); 716 initial_settings.SetString(kAppState,
733 717 *sticky_settings->printer_app_state());
734 718
735 #if defined(OS_MACOSX) 719 #if defined(OS_MACOSX)
736 bool kiosk_mode = false; // No kiosk mode on Mac yet. 720 bool kiosk_mode = false; // No kiosk mode on Mac yet.
737 #else 721 #else
738 CommandLine* cmdline = CommandLine::ForCurrentProcess(); 722 CommandLine* cmdline = CommandLine::ForCurrentProcess();
739 bool kiosk_mode = (cmdline->HasSwitch(switches::kKioskMode) && 723 bool kiosk_mode = (cmdline->HasSwitch(switches::kKioskMode) &&
740 cmdline->HasSwitch(switches::kKioskModePrinting)); 724 cmdline->HasSwitch(switches::kKioskModePrinting));
741 #endif 725 #endif
742 initial_settings.SetBoolean(kPrintAutomaticallyInKioskMode, kiosk_mode); 726 initial_settings.SetBoolean(kPrintAutomaticallyInKioskMode, kiosk_mode);
743 727
744 if (print_preview_ui->source_is_modifiable()) { 728 if (print_preview_ui->source_is_modifiable()) {
745 GetStickySettings()->GetLastUsedMarginSettings(&initial_settings);
746 GetNumberFormatAndMeasurementSystem(&initial_settings); 729 GetNumberFormatAndMeasurementSystem(&initial_settings);
747 } 730 }
748 web_ui()->CallJavascriptFunction("setInitialSettings", initial_settings); 731 web_ui()->CallJavascriptFunction("setInitialSettings", initial_settings);
749 } 732 }
750 733
751 void PrintPreviewHandler::ActivateInitiatorTabAndClosePreviewTab() { 734 void PrintPreviewHandler::ActivateInitiatorTabAndClosePreviewTab() {
752 TabContents* initiator_tab = GetInitiatorTab(); 735 TabContents* initiator_tab = GetInitiatorTab();
753 if (initiator_tab) { 736 if (initiator_tab) {
754 WebContents* web_contents = initiator_tab->web_contents(); 737 WebContents* web_contents = initiator_tab->web_contents();
755 web_contents->GetDelegate()->ActivateContents(web_contents); 738 web_contents->GetDelegate()->ActivateContents(web_contents);
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
860 void PrintPreviewHandler::OnPrintDialogShown() { 843 void PrintPreviewHandler::OnPrintDialogShown() {
861 ActivateInitiatorTabAndClosePreviewTab(); 844 ActivateInitiatorTabAndClosePreviewTab();
862 } 845 }
863 846
864 void PrintPreviewHandler::SelectFile(const FilePath& default_filename) { 847 void PrintPreviewHandler::SelectFile(const FilePath& default_filename) {
865 ui::SelectFileDialog::FileTypeInfo file_type_info; 848 ui::SelectFileDialog::FileTypeInfo file_type_info;
866 file_type_info.extensions.resize(1); 849 file_type_info.extensions.resize(1);
867 file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("pdf")); 850 file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("pdf"));
868 851
869 // Initializing save_path_ if it is not already initialized. 852 // Initializing save_path_ if it is not already initialized.
870 if (!GetStickySettings()->save_path()) { 853 printing::StickySettings* sticky_settings = GetStickySettings();
854 if (!sticky_settings->save_path()) {
871 // Allowing IO operation temporarily. It is ok to do so here because 855 // Allowing IO operation temporarily. It is ok to do so here because
872 // the select file dialog performs IO anyway in order to display the 856 // the select file dialog performs IO anyway in order to display the
873 // folders and also it is modal. 857 // folders and also it is modal.
874 base::ThreadRestrictions::ScopedAllowIO allow_io; 858 base::ThreadRestrictions::ScopedAllowIO allow_io;
875 FilePath file_path; 859 FilePath file_path;
876 PathService::Get(chrome::DIR_USER_DOCUMENTS, &file_path); 860 PathService::Get(chrome::DIR_USER_DOCUMENTS, &file_path);
877 GetStickySettings()->StoreSavePath(file_path); 861 sticky_settings->StoreSavePath(file_path);
862 sticky_settings->SaveInPrefs(Profile::FromBrowserContext(
863 preview_web_contents()->GetBrowserContext())->GetPrefs());
878 } 864 }
879 865
880 select_file_dialog_ = ui::SelectFileDialog::Create( 866 select_file_dialog_ = ui::SelectFileDialog::Create(
881 this, new ChromeSelectFilePolicy(preview_web_contents())), 867 this, new ChromeSelectFilePolicy(preview_web_contents())),
882 select_file_dialog_->SelectFile( 868 select_file_dialog_->SelectFile(
883 ui::SelectFileDialog::SELECT_SAVEAS_FILE, 869 ui::SelectFileDialog::SELECT_SAVEAS_FILE,
884 string16(), 870 string16(),
885 GetStickySettings()->save_path()->Append(default_filename), 871 GetStickySettings()->save_path()->Append(default_filename),
886 &file_type_info, 872 &file_type_info,
887 0, 873 0,
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
960 return; 946 return;
961 947
962 // We no longer require the initiator tab details. Remove those details 948 // We no longer require the initiator tab details. Remove those details
963 // associated with the preview tab to allow the initiator tab to create 949 // associated with the preview tab to allow the initiator tab to create
964 // another preview tab. 950 // another preview tab.
965 printing::PrintPreviewTabController* tab_controller = 951 printing::PrintPreviewTabController* tab_controller =
966 printing::PrintPreviewTabController::GetInstance(); 952 printing::PrintPreviewTabController::GetInstance();
967 if (tab_controller) 953 if (tab_controller)
968 tab_controller->EraseInitiatorTabInfo(preview_tab_contents()); 954 tab_controller->EraseInitiatorTabInfo(preview_tab_contents());
969 } 955 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698