OLD | NEW |
---|---|
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 #include <stddef.h> | 8 #include <stddef.h> |
9 | 9 |
10 #include <map> | 10 #include <map> |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
198 | 198 |
199 // Id of the predefined PDF printer. | 199 // Id of the predefined PDF printer. |
200 const char kLocalPdfPrinterId[] = "Save as PDF"; | 200 const char kLocalPdfPrinterId[] = "Save as PDF"; |
201 | 201 |
202 // Timeout for searching for privet printers, in seconds. | 202 // Timeout for searching for privet printers, in seconds. |
203 const int kPrivetTimeoutSec = 5; | 203 const int kPrivetTimeoutSec = 5; |
204 | 204 |
205 // Get the print job settings dictionary from |args|. The caller takes | 205 // Get the print job settings dictionary from |args|. The caller takes |
206 // ownership of the returned DictionaryValue. Returns NULL on failure. | 206 // ownership of the returned DictionaryValue. Returns NULL on failure. |
207 std::unique_ptr<base::DictionaryValue> GetSettingsDictionary( | 207 std::unique_ptr<base::DictionaryValue> GetSettingsDictionary( |
208 const base::ListValue* args) { | 208 std::string json_str) { |
209 std::string json_str; | |
210 if (!args->GetString(0, &json_str)) { | |
211 NOTREACHED() << "Could not read JSON argument"; | |
212 return NULL; | |
213 } | |
214 if (json_str.empty()) { | 209 if (json_str.empty()) { |
215 NOTREACHED() << "Empty print job settings"; | 210 NOTREACHED() << "Empty print job settings"; |
216 return NULL; | 211 return NULL; |
217 } | 212 } |
218 std::unique_ptr<base::DictionaryValue> settings = | 213 std::unique_ptr<base::DictionaryValue> settings = |
219 base::DictionaryValue::From(base::JSONReader::Read(json_str)); | 214 base::DictionaryValue::From(base::JSONReader::Read(json_str)); |
220 if (!settings) { | 215 if (!settings) { |
221 NOTREACHED() << "Print job settings must be a dictionary."; | 216 NOTREACHED() << "Print job settings must be a dictionary."; |
222 return NULL; | 217 return NULL; |
223 } | 218 } |
(...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
681 | 676 |
682 AllowJavascript(); | 677 AllowJavascript(); |
683 | 678 |
684 if (!PrivetPrintingEnabled()) { | 679 if (!PrivetPrintingEnabled()) { |
685 RejectJavascriptCallback(base::Value(callback_id), base::Value()); | 680 RejectJavascriptCallback(base::Value(callback_id), base::Value()); |
686 } | 681 } |
687 #if BUILDFLAG(ENABLE_SERVICE_DISCOVERY) | 682 #if BUILDFLAG(ENABLE_SERVICE_DISCOVERY) |
688 using local_discovery::ServiceDiscoverySharedClient; | 683 using local_discovery::ServiceDiscoverySharedClient; |
689 scoped_refptr<ServiceDiscoverySharedClient> service_discovery = | 684 scoped_refptr<ServiceDiscoverySharedClient> service_discovery = |
690 ServiceDiscoverySharedClient::GetInstance(); | 685 ServiceDiscoverySharedClient::GetInstance(); |
691 DCHECK(privet_callback_id_.empty()); | 686 DCHECK(privet_search_callback_id_.empty()); |
692 privet_callback_id_ = callback_id; | 687 privet_search_callback_id_ = callback_id; |
693 StartPrivetLister(service_discovery); | 688 StartPrivetLister(service_discovery); |
694 #endif | 689 #endif |
695 } | 690 } |
696 | 691 |
697 void PrintPreviewHandler::StopPrivetLister() { | 692 void PrintPreviewHandler::StopPrivetLister() { |
698 #if BUILDFLAG(ENABLE_SERVICE_DISCOVERY) | 693 #if BUILDFLAG(ENABLE_SERVICE_DISCOVERY) |
699 privet_lister_timer_.reset(); | 694 privet_lister_timer_.reset(); |
700 if (PrivetPrintingEnabled() && printer_lister_) { | 695 if (PrivetPrintingEnabled() && printer_lister_) { |
701 printer_lister_->Stop(); | 696 printer_lister_->Stop(); |
702 } | 697 } |
703 ResolveJavascriptCallback(base::Value(privet_callback_id_), base::Value()); | 698 ResolveJavascriptCallback(base::Value(privet_search_callback_id_), |
704 privet_callback_id_ = ""; | 699 base::Value()); |
700 privet_search_callback_id_.clear(); | |
705 #endif | 701 #endif |
706 } | 702 } |
707 | 703 |
708 void PrintPreviewHandler::HandleGetPrivetPrinterCapabilities( | 704 void PrintPreviewHandler::HandleGetPrivetPrinterCapabilities( |
709 const base::ListValue* args) { | 705 const base::ListValue* args) { |
710 AllowJavascript(); | 706 AllowJavascript(); |
711 | 707 |
712 std::string callback_id; | 708 std::string callback_id; |
713 std::string printer_name; | 709 std::string printer_name; |
714 if (!args->GetString(0, &callback_id) || !args->GetString(1, &printer_name) || | 710 if (!args->GetString(0, &callback_id) || !args->GetString(1, &printer_name) || |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
769 | 765 |
770 EnsureExtensionPrinterHandlerSet(); | 766 EnsureExtensionPrinterHandlerSet(); |
771 extension_printer_handler_->StartGetCapability( | 767 extension_printer_handler_->StartGetCapability( |
772 printer_name, | 768 printer_name, |
773 base::Bind(&PrintPreviewHandler::OnGotExtensionPrinterCapabilities, | 769 base::Bind(&PrintPreviewHandler::OnGotExtensionPrinterCapabilities, |
774 weak_factory_.GetWeakPtr(), callback_id)); | 770 weak_factory_.GetWeakPtr(), callback_id)); |
775 } | 771 } |
776 | 772 |
777 void PrintPreviewHandler::HandleGetPreview(const base::ListValue* args) { | 773 void PrintPreviewHandler::HandleGetPreview(const base::ListValue* args) { |
778 DCHECK_EQ(2U, args->GetSize()); | 774 DCHECK_EQ(2U, args->GetSize()); |
779 std::unique_ptr<base::DictionaryValue> settings = GetSettingsDictionary(args); | 775 std::string json_str; |
776 if (!args->GetString(0, &json_str)) | |
777 return; | |
778 std::unique_ptr<base::DictionaryValue> settings = | |
779 GetSettingsDictionary(json_str); | |
780 if (!settings) | 780 if (!settings) |
781 return; | 781 return; |
782 int request_id = -1; | 782 int request_id = -1; |
783 if (!settings->GetInteger(printing::kPreviewRequestID, &request_id)) | 783 if (!settings->GetInteger(printing::kPreviewRequestID, &request_id)) |
784 return; | 784 return; |
785 | 785 |
786 print_preview_ui()->OnPrintPreviewRequest(request_id); | 786 print_preview_ui()->OnPrintPreviewRequest(request_id); |
787 // Add an additional key in order to identify |print_preview_ui| later on | 787 // Add an additional key in order to identify |print_preview_ui| later on |
788 // when calling PrintPreviewUI::GetCurrentPrintPreviewStatus() on the IO | 788 // when calling PrintPreviewUI::GetCurrentPrintPreviewStatus() on the IO |
789 // thread. | 789 // thread. |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
855 } | 855 } |
856 | 856 |
857 void PrintPreviewHandler::HandlePrint(const base::ListValue* args) { | 857 void PrintPreviewHandler::HandlePrint(const base::ListValue* args) { |
858 ReportStats(); | 858 ReportStats(); |
859 | 859 |
860 // Record the number of times the user requests to regenerate preview data | 860 // Record the number of times the user requests to regenerate preview data |
861 // before printing. | 861 // before printing. |
862 UMA_HISTOGRAM_COUNTS("PrintPreview.RegeneratePreviewRequest.BeforePrint", | 862 UMA_HISTOGRAM_COUNTS("PrintPreview.RegeneratePreviewRequest.BeforePrint", |
863 regenerate_preview_request_count_); | 863 regenerate_preview_request_count_); |
864 | 864 |
865 std::unique_ptr<base::DictionaryValue> settings = GetSettingsDictionary(args); | 865 AllowJavascript(); |
866 | |
867 std::string callback_id; | |
868 CHECK(args->GetString(0, &callback_id) && !callback_id.empty()); | |
869 std::string json_str; | |
870 if (!args->GetString(1, &json_str)) | |
871 RejectJavascriptCallback(base::Value(callback_id), base::Value(-1)); | |
872 | |
873 std::unique_ptr<base::DictionaryValue> settings = | |
874 GetSettingsDictionary(json_str); | |
866 if (!settings) | 875 if (!settings) |
867 return; | 876 RejectJavascriptCallback(base::Value(callback_id), base::Value(-1)); |
868 | 877 |
869 ReportPrintSettingsStats(*settings); | 878 ReportPrintSettingsStats(*settings); |
870 | 879 |
871 // Report whether the user printed a PDF or an HTML document. | 880 // Report whether the user printed a PDF or an HTML document. |
872 ReportPrintDocumentTypeHistogram(print_preview_ui()->source_is_modifiable() ? | 881 ReportPrintDocumentTypeHistogram(print_preview_ui()->source_is_modifiable() ? |
873 HTML_DOCUMENT : PDF_DOCUMENT); | 882 HTML_DOCUMENT : PDF_DOCUMENT); |
874 | 883 |
875 bool print_to_pdf = false; | 884 bool print_to_pdf = false; |
876 bool is_cloud_printer = false; | 885 bool is_cloud_printer = false; |
877 bool print_with_privet = false; | 886 bool print_with_privet = false; |
(...skipping 11 matching lines...) Expand all Loading... | |
889 &print_with_extension); | 898 &print_with_extension); |
890 is_cloud_printer = settings->HasKey(printing::kSettingCloudPrintId); | 899 is_cloud_printer = settings->HasKey(printing::kSettingCloudPrintId); |
891 } | 900 } |
892 | 901 |
893 int page_count = 0; | 902 int page_count = 0; |
894 settings->GetInteger(printing::kSettingPreviewPageCount, &page_count); | 903 settings->GetInteger(printing::kSettingPreviewPageCount, &page_count); |
895 | 904 |
896 if (print_to_pdf) { | 905 if (print_to_pdf) { |
897 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToPDF", page_count); | 906 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToPDF", page_count); |
898 ReportUserActionHistogram(PRINT_TO_PDF); | 907 ReportUserActionHistogram(PRINT_TO_PDF); |
908 DCHECK(pdf_callback_id_.empty()); | |
909 pdf_callback_id_ = callback_id; | |
899 PrintToPdf(); | 910 PrintToPdf(); |
900 return; | 911 return; |
901 } | 912 } |
902 | 913 |
903 #if BUILDFLAG(ENABLE_SERVICE_DISCOVERY) | 914 #if BUILDFLAG(ENABLE_SERVICE_DISCOVERY) |
904 if (print_with_privet && PrivetPrintingEnabled()) { | 915 if (print_with_privet && PrivetPrintingEnabled()) { |
905 std::string printer_name; | 916 std::string printer_name; |
906 std::string print_ticket; | 917 std::string print_ticket; |
907 std::string capabilities; | 918 std::string capabilities; |
908 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintWithPrivet", page_count); | 919 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintWithPrivet", page_count); |
909 ReportUserActionHistogram(PRINT_WITH_PRIVET); | 920 ReportUserActionHistogram(PRINT_WITH_PRIVET); |
910 | 921 |
911 int width = 0; | 922 int width = 0; |
912 int height = 0; | 923 int height = 0; |
913 if (!settings->GetString(printing::kSettingDeviceName, &printer_name) || | 924 if (!settings->GetString(printing::kSettingDeviceName, &printer_name) || |
914 !settings->GetString(printing::kSettingTicket, &print_ticket) || | 925 !settings->GetString(printing::kSettingTicket, &print_ticket) || |
915 !settings->GetString(printing::kSettingCapabilities, &capabilities) || | 926 !settings->GetString(printing::kSettingCapabilities, &capabilities) || |
916 !settings->GetInteger(printing::kSettingPageWidth, &width) || | 927 !settings->GetInteger(printing::kSettingPageWidth, &width) || |
917 !settings->GetInteger(printing::kSettingPageHeight, &height) || | 928 !settings->GetInteger(printing::kSettingPageHeight, &height) || |
918 width <= 0 || height <= 0) { | 929 width <= 0 || height <= 0) { |
919 NOTREACHED(); | 930 NOTREACHED(); |
920 FireWebUIListener("print-failed", base::Value(-1)); | 931 RejectJavascriptCallback(base::Value(callback_id), base::Value(-1)); |
921 return; | 932 return; |
922 } | 933 } |
923 | 934 |
924 PrintToPrivetPrinter( | 935 DCHECK(privet_print_callback_id_.empty()); |
925 printer_name, print_ticket, capabilities, gfx::Size(width, height)); | 936 privet_print_callback_id_ = callback_id; |
937 PrintToPrivetPrinter(callback_id, printer_name, print_ticket, capabilities, | |
938 gfx::Size(width, height)); | |
926 return; | 939 return; |
927 } | 940 } |
928 #endif | 941 #endif |
929 | 942 |
930 if (print_with_extension) { | 943 if (print_with_extension) { |
931 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintWithExtension", | 944 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintWithExtension", |
932 page_count); | 945 page_count); |
933 ReportUserActionHistogram(PRINT_WITH_EXTENSION); | 946 ReportUserActionHistogram(PRINT_WITH_EXTENSION); |
934 | 947 |
935 std::string destination_id; | 948 std::string destination_id; |
936 std::string print_ticket; | 949 std::string print_ticket; |
937 std::string capabilities; | 950 std::string capabilities; |
938 int width = 0; | 951 int width = 0; |
939 int height = 0; | 952 int height = 0; |
940 if (!settings->GetString(printing::kSettingDeviceName, &destination_id) || | 953 if (!settings->GetString(printing::kSettingDeviceName, &destination_id) || |
941 !settings->GetString(printing::kSettingTicket, &print_ticket) || | 954 !settings->GetString(printing::kSettingTicket, &print_ticket) || |
942 !settings->GetString(printing::kSettingCapabilities, &capabilities) || | 955 !settings->GetString(printing::kSettingCapabilities, &capabilities) || |
943 !settings->GetInteger(printing::kSettingPageWidth, &width) || | 956 !settings->GetInteger(printing::kSettingPageWidth, &width) || |
944 !settings->GetInteger(printing::kSettingPageHeight, &height) || | 957 !settings->GetInteger(printing::kSettingPageHeight, &height) || |
945 width <= 0 || height <= 0) { | 958 width <= 0 || height <= 0) { |
946 NOTREACHED(); | 959 NOTREACHED(); |
947 OnExtensionPrintResult(false, "FAILED"); | 960 RejectJavascriptCallback(base::Value(callback_id), base::Value("FAILED")); |
948 return; | 961 return; |
949 } | 962 } |
950 | 963 |
951 base::string16 title; | 964 base::string16 title; |
952 scoped_refptr<base::RefCountedBytes> data; | 965 scoped_refptr<base::RefCountedBytes> data; |
953 if (!GetPreviewDataAndTitle(&data, &title)) { | 966 if (!GetPreviewDataAndTitle(&data, &title)) { |
954 LOG(ERROR) << "Nothing to print; no preview available."; | 967 LOG(ERROR) << "Nothing to print; no preview available."; |
955 OnExtensionPrintResult(false, "NO_DATA"); | 968 RejectJavascriptCallback(base::Value(callback_id), |
969 base::Value("NO_DATA")); | |
956 return; | 970 return; |
957 } | 971 } |
958 | 972 |
959 EnsureExtensionPrinterHandlerSet(); | 973 EnsureExtensionPrinterHandlerSet(); |
960 extension_printer_handler_->StartPrint( | 974 extension_printer_handler_->StartPrint( |
961 destination_id, capabilities, title, print_ticket, | 975 destination_id, capabilities, title, print_ticket, |
962 gfx::Size(width, height), data, | 976 gfx::Size(width, height), data, |
963 base::Bind(&PrintPreviewHandler::OnExtensionPrintResult, | 977 base::Bind(&PrintPreviewHandler::OnExtensionPrintResult, |
964 weak_factory_.GetWeakPtr())); | 978 weak_factory_.GetWeakPtr(), callback_id)); |
965 return; | 979 return; |
966 } | 980 } |
967 | 981 |
968 scoped_refptr<base::RefCountedBytes> data; | 982 scoped_refptr<base::RefCountedBytes> data; |
969 base::string16 title; | 983 base::string16 title; |
970 if (!GetPreviewDataAndTitle(&data, &title)) { | 984 if (!GetPreviewDataAndTitle(&data, &title)) { |
971 // Nothing to print, no preview available. | 985 // Nothing to print, no preview available. |
972 return; | 986 RejectJavascriptCallback(base::Value(callback_id), base::Value()); |
973 } | 987 } |
974 | 988 |
975 if (is_cloud_printer) { | 989 if (is_cloud_printer) { |
976 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToCloudPrint", | 990 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToCloudPrint", |
977 page_count); | 991 page_count); |
978 ReportUserActionHistogram(PRINT_WITH_CLOUD_PRINT); | 992 ReportUserActionHistogram(PRINT_WITH_CLOUD_PRINT); |
979 SendCloudPrintJob(data.get()); | 993 SendCloudPrintJob(callback_id, data.get()); |
980 return; | 994 return; |
981 } | 995 } |
982 | 996 |
983 #if BUILDFLAG(ENABLE_BASIC_PRINTING) | 997 #if BUILDFLAG(ENABLE_BASIC_PRINTING) |
984 bool system_dialog = false; | 998 bool system_dialog = false; |
985 settings->GetBoolean(printing::kSettingShowSystemDialog, &system_dialog); | 999 settings->GetBoolean(printing::kSettingShowSystemDialog, &system_dialog); |
986 if (system_dialog) { | 1000 if (system_dialog) { |
987 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.SystemDialog", page_count); | 1001 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.SystemDialog", page_count); |
988 ReportUserActionHistogram(FALLBACK_TO_ADVANCED_SETTINGS_DIALOG); | 1002 ReportUserActionHistogram(FALLBACK_TO_ADVANCED_SETTINGS_DIALOG); |
989 } else { | 1003 } else { |
990 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToPrinter", page_count); | 1004 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToPrinter", page_count); |
991 ReportUserActionHistogram(PRINT_TO_PRINTER); | 1005 ReportUserActionHistogram(PRINT_TO_PRINTER); |
992 } | 1006 } |
993 | 1007 |
994 // This tries to activate the initiator as well, so do not clear the | 1008 // This tries to activate the initiator as well, so do not clear the |
995 // association with the initiator yet. | 1009 // association with the initiator yet. |
996 print_preview_ui()->OnHidePreviewDialog(); | 1010 ResolveJavascriptCallback(base::Value(callback_id), base::Value()); |
rbpotter
2017/06/20 20:46:07
Moved this to JS side - hide will be called from t
| |
997 | 1011 |
998 // Grab the current initiator before calling ClearInitiatorDetails() below. | 1012 // Grab the current initiator before calling ClearInitiatorDetails() below. |
999 // Otherwise calling GetInitiator() later will return the wrong WebContents. | 1013 // Otherwise calling GetInitiator() later will return the wrong WebContents. |
1000 // https://crbug.com/407080 | 1014 // https://crbug.com/407080 |
1001 WebContents* initiator = GetInitiator(); | 1015 WebContents* initiator = GetInitiator(); |
1002 if (initiator) { | 1016 if (initiator) { |
1003 // Save initiator IDs. PrintMsg_PrintForPrintPreview below should cause | 1017 // Save initiator IDs. PrintMsg_PrintForPrintPreview below should cause |
1004 // the renderer to send PrintHostMsg_UpdatePrintSettings and trigger | 1018 // the renderer to send PrintHostMsg_UpdatePrintSettings and trigger |
1005 // PrintingMessageFilter::OnUpdatePrintSettings(), which needs this info. | 1019 // PrintingMessageFilter::OnUpdatePrintSettings(), which needs this info. |
1006 auto* main_render_frame = initiator->GetMainFrame(); | 1020 auto* main_render_frame = initiator->GetMainFrame(); |
(...skipping 22 matching lines...) Expand all Loading... | |
1029 print_view_manager->PrintPreviewDone(); | 1043 print_view_manager->PrintPreviewDone(); |
1030 } | 1044 } |
1031 #else | 1045 #else |
1032 NOTREACHED(); | 1046 NOTREACHED(); |
1033 #endif // BUILDFLAG(ENABLE_BASIC_PRINTING) | 1047 #endif // BUILDFLAG(ENABLE_BASIC_PRINTING) |
1034 } | 1048 } |
1035 | 1049 |
1036 void PrintPreviewHandler::PrintToPdf() { | 1050 void PrintPreviewHandler::PrintToPdf() { |
1037 if (!print_to_pdf_path_.empty()) { | 1051 if (!print_to_pdf_path_.empty()) { |
1038 // User has already selected a path, no need to show the dialog again. | 1052 // User has already selected a path, no need to show the dialog again. |
1053 ResolveJavascriptCallback(base::Value(pdf_callback_id_), base::Value()); | |
1054 pdf_callback_id_.clear(); | |
1039 PostPrintToPdfTask(); | 1055 PostPrintToPdfTask(); |
1040 } else if (!select_file_dialog_.get() || | 1056 } else if (!select_file_dialog_.get() || |
1041 !select_file_dialog_->IsRunning(platform_util::GetTopLevel( | 1057 !select_file_dialog_->IsRunning(platform_util::GetTopLevel( |
1042 preview_web_contents()->GetNativeView()))) { | 1058 preview_web_contents()->GetNativeView()))) { |
1043 // Pre-populating select file dialog with print job title. | 1059 // Pre-populating select file dialog with print job title. |
1044 const base::string16& print_job_title_utf16 = | 1060 const base::string16& print_job_title_utf16 = |
1045 print_preview_ui()->initiator_title(); | 1061 print_preview_ui()->initiator_title(); |
1046 | 1062 |
1047 #if defined(OS_WIN) | 1063 #if defined(OS_WIN) |
1048 base::FilePath::StringType print_job_title(print_job_title_utf16); | 1064 base::FilePath::StringType print_job_title(print_job_title_utf16); |
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1387 PrefService* prefs = profile->GetPrefs(); | 1403 PrefService* prefs = profile->GetPrefs(); |
1388 if (prefs->GetBoolean(prefs::kCloudPrintSubmitEnabled)) { | 1404 if (prefs->GetBoolean(prefs::kCloudPrintSubmitEnabled)) { |
1389 base::DictionaryValue settings; | 1405 base::DictionaryValue settings; |
1390 settings.SetString(kCloudPrintUrl, | 1406 settings.SetString(kCloudPrintUrl, |
1391 GURL(cloud_devices::GetCloudPrintURL()).spec()); | 1407 GURL(cloud_devices::GetCloudPrintURL()).spec()); |
1392 settings.SetBoolean(kAppKioskMode, chrome::IsRunningInForcedAppMode()); | 1408 settings.SetBoolean(kAppKioskMode, chrome::IsRunningInForcedAppMode()); |
1393 web_ui()->CallJavascriptFunctionUnsafe("setUseCloudPrint", settings); | 1409 web_ui()->CallJavascriptFunctionUnsafe("setUseCloudPrint", settings); |
1394 } | 1410 } |
1395 } | 1411 } |
1396 | 1412 |
1397 void PrintPreviewHandler::SendCloudPrintJob(const base::RefCountedBytes* data) { | 1413 void PrintPreviewHandler::SendCloudPrintJob(const std::string& callback_id, |
1414 const base::RefCountedBytes* data) { | |
1398 // BASE64 encode the job data. | 1415 // BASE64 encode the job data. |
1399 const base::StringPiece raw_data(reinterpret_cast<const char*>(data->front()), | 1416 const base::StringPiece raw_data(reinterpret_cast<const char*>(data->front()), |
1400 data->size()); | 1417 data->size()); |
1401 std::string base64_data; | 1418 std::string base64_data; |
1402 base::Base64Encode(raw_data, &base64_data); | 1419 base::Base64Encode(raw_data, &base64_data); |
1403 base::Value data_value(base64_data); | |
1404 | 1420 |
1405 web_ui()->CallJavascriptFunctionUnsafe("printToCloud", data_value); | 1421 ResolveJavascriptCallback(base::Value(callback_id), base::Value(base64_data)); |
1406 } | 1422 } |
1407 | 1423 |
1408 WebContents* PrintPreviewHandler::GetInitiator() const { | 1424 WebContents* PrintPreviewHandler::GetInitiator() const { |
1409 printing::PrintPreviewDialogController* dialog_controller = | 1425 printing::PrintPreviewDialogController* dialog_controller = |
1410 printing::PrintPreviewDialogController::GetInstance(); | 1426 printing::PrintPreviewDialogController::GetInstance(); |
1411 if (!dialog_controller) | 1427 if (!dialog_controller) |
1412 return NULL; | 1428 return NULL; |
1413 return dialog_controller->GetInitiator(preview_web_contents()); | 1429 return dialog_controller->GetInitiator(preview_web_contents()); |
1414 } | 1430 } |
1415 | 1431 |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1487 int /* index */, | 1503 int /* index */, |
1488 void* /* params */) { | 1504 void* /* params */) { |
1489 // Update downloads location and save sticky settings. | 1505 // Update downloads location and save sticky settings. |
1490 DownloadPrefs* download_prefs = DownloadPrefs::FromBrowserContext( | 1506 DownloadPrefs* download_prefs = DownloadPrefs::FromBrowserContext( |
1491 preview_web_contents()->GetBrowserContext()); | 1507 preview_web_contents()->GetBrowserContext()); |
1492 download_prefs->SetSaveFilePath(path.DirName()); | 1508 download_prefs->SetSaveFilePath(path.DirName()); |
1493 printing::StickySettings* sticky_settings = GetStickySettings(); | 1509 printing::StickySettings* sticky_settings = GetStickySettings(); |
1494 sticky_settings->SaveInPrefs( | 1510 sticky_settings->SaveInPrefs( |
1495 Profile::FromBrowserContext(preview_web_contents()->GetBrowserContext()) | 1511 Profile::FromBrowserContext(preview_web_contents()->GetBrowserContext()) |
1496 ->GetPrefs()); | 1512 ->GetPrefs()); |
1497 web_ui()->CallJavascriptFunctionUnsafe("fileSelectionCompleted"); | 1513 ResolveJavascriptCallback(base::Value(pdf_callback_id_), base::Value()); |
1514 pdf_callback_id_.clear(); | |
1498 print_to_pdf_path_ = path; | 1515 print_to_pdf_path_ = path; |
1499 PostPrintToPdfTask(); | 1516 PostPrintToPdfTask(); |
1500 } | 1517 } |
1501 | 1518 |
1502 void PrintPreviewHandler::PostPrintToPdfTask() { | 1519 void PrintPreviewHandler::PostPrintToPdfTask() { |
1503 scoped_refptr<base::RefCountedBytes> data; | 1520 scoped_refptr<base::RefCountedBytes> data; |
1504 base::string16 title; | 1521 base::string16 title; |
1505 if (!GetPreviewDataAndTitle(&data, &title)) { | 1522 if (!GetPreviewDataAndTitle(&data, &title)) { |
1506 NOTREACHED() << "Preview data was checked before file dialog."; | 1523 NOTREACHED() << "Preview data was checked before file dialog."; |
1507 return; | 1524 return; |
1508 } | 1525 } |
1509 | 1526 |
1510 base::PostTaskWithTraits( | 1527 base::PostTaskWithTraits( |
1511 FROM_HERE, {base::MayBlock(), base::TaskPriority::BACKGROUND}, | 1528 FROM_HERE, {base::MayBlock(), base::TaskPriority::BACKGROUND}, |
1512 base::BindOnce(&PrintToPdfCallback, data, print_to_pdf_path_, | 1529 base::BindOnce(&PrintToPdfCallback, data, print_to_pdf_path_, |
1513 pdf_file_saved_closure_)); | 1530 pdf_file_saved_closure_)); |
1514 print_to_pdf_path_.clear(); | 1531 print_to_pdf_path_.clear(); |
1515 ClosePreviewDialog(); | 1532 ClosePreviewDialog(); |
1516 } | 1533 } |
1517 | 1534 |
1518 void PrintPreviewHandler::FileSelectionCanceled(void* params) { | 1535 void PrintPreviewHandler::FileSelectionCanceled(void* params) { |
1519 print_preview_ui()->OnFileSelectionCancelled(); | 1536 RejectJavascriptCallback(base::Value(pdf_callback_id_), base::Value()); |
1537 pdf_callback_id_.clear(); | |
1520 } | 1538 } |
1521 | 1539 |
1522 void PrintPreviewHandler::ClearInitiatorDetails() { | 1540 void PrintPreviewHandler::ClearInitiatorDetails() { |
1523 WebContents* initiator = GetInitiator(); | 1541 WebContents* initiator = GetInitiator(); |
1524 if (!initiator) | 1542 if (!initiator) |
1525 return; | 1543 return; |
1526 | 1544 |
1527 // We no longer require the initiator details. Remove those details associated | 1545 // We no longer require the initiator details. Remove those details associated |
1528 // with the preview dialog to allow the initiator to create another preview | 1546 // with the preview dialog to allow the initiator to create another preview |
1529 // dialog. | 1547 // dialog. |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1597 privet_http_client_->CreateCapabilitiesOperation( | 1615 privet_http_client_->CreateCapabilitiesOperation( |
1598 base::Bind(&PrintPreviewHandler::OnPrivetCapabilities, | 1616 base::Bind(&PrintPreviewHandler::OnPrivetCapabilities, |
1599 weak_factory_.GetWeakPtr(), callback_id)); | 1617 weak_factory_.GetWeakPtr(), callback_id)); |
1600 privet_capabilities_operation_->Start(); | 1618 privet_capabilities_operation_->Start(); |
1601 } | 1619 } |
1602 | 1620 |
1603 bool PrintPreviewHandler::PrivetUpdateClient( | 1621 bool PrintPreviewHandler::PrivetUpdateClient( |
1604 const std::string& callback_id, | 1622 const std::string& callback_id, |
1605 std::unique_ptr<cloud_print::PrivetHTTPClient> http_client) { | 1623 std::unique_ptr<cloud_print::PrivetHTTPClient> http_client) { |
1606 if (!http_client) { | 1624 if (!http_client) { |
1607 if (callback_id.empty()) { | 1625 RejectJavascriptCallback(base::Value(callback_id), base::Value()); |
1608 // This was an attempt to print to a privet printer and has failed. | |
1609 FireWebUIListener("print-failed", base::Value(-1)); | |
1610 } else { // Capabilities update failed | |
1611 RejectJavascriptCallback(base::Value(callback_id), base::Value()); | |
1612 } | |
1613 privet_http_resolution_.reset(); | 1626 privet_http_resolution_.reset(); |
1627 if (callback_id == privet_print_callback_id_) | |
1628 privet_print_callback_id_.clear(); | |
1614 return false; | 1629 return false; |
1615 } | 1630 } |
1616 | 1631 |
1617 privet_local_print_operation_.reset(); | 1632 privet_local_print_operation_.reset(); |
1618 privet_capabilities_operation_.reset(); | 1633 privet_capabilities_operation_.reset(); |
1619 privet_http_client_ = cloud_print::PrivetV1HTTPClient::CreateDefault( | 1634 privet_http_client_ = cloud_print::PrivetV1HTTPClient::CreateDefault( |
1620 std::move(http_client)); | 1635 std::move(http_client)); |
1621 | 1636 |
1622 privet_http_resolution_.reset(); | 1637 privet_http_resolution_.reset(); |
1623 | 1638 |
1624 return true; | 1639 return true; |
1625 } | 1640 } |
1626 | 1641 |
1627 void PrintPreviewHandler::PrivetLocalPrintUpdateClient( | 1642 void PrintPreviewHandler::PrivetLocalPrintUpdateClient( |
1643 const std::string& callback_id, | |
1628 std::string print_ticket, | 1644 std::string print_ticket, |
1629 std::string capabilities, | 1645 std::string capabilities, |
1630 gfx::Size page_size, | 1646 gfx::Size page_size, |
1631 std::unique_ptr<cloud_print::PrivetHTTPClient> http_client) { | 1647 std::unique_ptr<cloud_print::PrivetHTTPClient> http_client) { |
1632 if (!PrivetUpdateClient("", std::move(http_client))) | 1648 if (!PrivetUpdateClient(callback_id, std::move(http_client))) |
1633 return; | 1649 return; |
1634 | 1650 |
1635 StartPrivetLocalPrint(print_ticket, capabilities, page_size); | 1651 StartPrivetLocalPrint(print_ticket, capabilities, page_size); |
1636 } | 1652 } |
1637 | 1653 |
1638 void PrintPreviewHandler::StartPrivetLocalPrint(const std::string& print_ticket, | 1654 void PrintPreviewHandler::StartPrivetLocalPrint(const std::string& print_ticket, |
1639 const std::string& capabilities, | 1655 const std::string& capabilities, |
1640 const gfx::Size& page_size) { | 1656 const gfx::Size& page_size) { |
1641 privet_local_print_operation_ = | 1657 privet_local_print_operation_ = |
1642 privet_http_client_->CreateLocalPrintOperation(this); | 1658 privet_http_client_->CreateLocalPrintOperation(this); |
1643 | 1659 |
1644 privet_local_print_operation_->SetTicket(print_ticket); | 1660 privet_local_print_operation_->SetTicket(print_ticket); |
1645 privet_local_print_operation_->SetCapabilities(capabilities); | 1661 privet_local_print_operation_->SetCapabilities(capabilities); |
1646 | 1662 |
1647 scoped_refptr<base::RefCountedBytes> data; | 1663 scoped_refptr<base::RefCountedBytes> data; |
1648 base::string16 title; | 1664 base::string16 title; |
1649 | 1665 |
1650 if (!GetPreviewDataAndTitle(&data, &title)) { | 1666 if (!GetPreviewDataAndTitle(&data, &title)) { |
1651 FireWebUIListener("print-failed", base::Value(-1)); | 1667 RejectJavascriptCallback(base::Value(privet_print_callback_id_), |
1668 base::Value(-1)); | |
1669 privet_print_callback_id_.clear(); | |
1652 return; | 1670 return; |
1653 } | 1671 } |
1654 | 1672 |
1655 privet_local_print_operation_->SetJobname(base::UTF16ToUTF8(title)); | 1673 privet_local_print_operation_->SetJobname(base::UTF16ToUTF8(title)); |
1656 privet_local_print_operation_->SetPageSize(page_size); | 1674 privet_local_print_operation_->SetPageSize(page_size); |
1657 privet_local_print_operation_->SetData(data.get()); | 1675 privet_local_print_operation_->SetData(data.get()); |
1658 | 1676 |
1659 Profile* profile = Profile::FromWebUI(web_ui()); | 1677 Profile* profile = Profile::FromWebUI(web_ui()); |
1660 SigninManagerBase* signin_manager = | 1678 SigninManagerBase* signin_manager = |
1661 SigninManagerFactory::GetForProfileIfExists(profile); | 1679 SigninManagerFactory::GetForProfileIfExists(profile); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1694 printer_info_and_caps.SetDictionary("printer", std::move(printer_info)); | 1712 printer_info_and_caps.SetDictionary("printer", std::move(printer_info)); |
1695 std::unique_ptr<base::DictionaryValue> capabilities_copy = | 1713 std::unique_ptr<base::DictionaryValue> capabilities_copy = |
1696 capabilities->CreateDeepCopy(); | 1714 capabilities->CreateDeepCopy(); |
1697 printer_info_and_caps.SetDictionary("capabilities", | 1715 printer_info_and_caps.SetDictionary("capabilities", |
1698 std::move(capabilities_copy)); | 1716 std::move(capabilities_copy)); |
1699 ResolveJavascriptCallback(base::Value(callback_id), printer_info_and_caps); | 1717 ResolveJavascriptCallback(base::Value(callback_id), printer_info_and_caps); |
1700 | 1718 |
1701 privet_capabilities_operation_.reset(); | 1719 privet_capabilities_operation_.reset(); |
1702 } | 1720 } |
1703 | 1721 |
1704 void PrintPreviewHandler::PrintToPrivetPrinter(const std::string& device_name, | 1722 void PrintPreviewHandler::PrintToPrivetPrinter(const std::string& callback_id, |
1723 const std::string& device_name, | |
1705 const std::string& ticket, | 1724 const std::string& ticket, |
1706 const std::string& capabilities, | 1725 const std::string& capabilities, |
1707 const gfx::Size& page_size) { | 1726 const gfx::Size& page_size) { |
1708 if (!CreatePrivetHTTP( | 1727 if (!CreatePrivetHTTP( |
1709 device_name, | 1728 device_name, |
1710 base::Bind(&PrintPreviewHandler::PrivetLocalPrintUpdateClient, | 1729 base::Bind(&PrintPreviewHandler::PrivetLocalPrintUpdateClient, |
1711 weak_factory_.GetWeakPtr(), ticket, capabilities, | 1730 weak_factory_.GetWeakPtr(), callback_id, ticket, |
1712 page_size))) { | 1731 capabilities, page_size))) { |
1713 FireWebUIListener("print-failed", base::Value(-1)); | 1732 RejectJavascriptCallback(base::Value(privet_print_callback_id_), |
1733 base::Value(-1)); | |
1734 privet_print_callback_id_.clear(); | |
1714 } | 1735 } |
1715 } | 1736 } |
1716 | 1737 |
1717 bool PrintPreviewHandler::CreatePrivetHTTP( | 1738 bool PrintPreviewHandler::CreatePrivetHTTP( |
1718 const std::string& name, | 1739 const std::string& name, |
1719 const cloud_print::PrivetHTTPAsynchronousFactory::ResultCallback& | 1740 const cloud_print::PrivetHTTPAsynchronousFactory::ResultCallback& |
1720 callback) { | 1741 callback) { |
1721 const cloud_print::DeviceDescription* device_description = | 1742 const cloud_print::DeviceDescription* device_description = |
1722 printer_lister_ ? printer_lister_->GetDeviceDescription(name) : NULL; | 1743 printer_lister_ ? printer_lister_->GetDeviceDescription(name) : NULL; |
1723 | 1744 |
1724 if (!device_description) | 1745 if (!device_description) |
1725 return false; | 1746 return false; |
1726 | 1747 |
1727 privet_http_factory_ = | 1748 privet_http_factory_ = |
1728 cloud_print::PrivetHTTPAsynchronousFactory::CreateInstance( | 1749 cloud_print::PrivetHTTPAsynchronousFactory::CreateInstance( |
1729 Profile::FromWebUI(web_ui())->GetRequestContext()); | 1750 Profile::FromWebUI(web_ui())->GetRequestContext()); |
1730 privet_http_resolution_ = privet_http_factory_->CreatePrivetHTTP(name); | 1751 privet_http_resolution_ = privet_http_factory_->CreatePrivetHTTP(name); |
1731 privet_http_resolution_->Start(device_description->address, callback); | 1752 privet_http_resolution_->Start(device_description->address, callback); |
1732 | 1753 |
1733 return true; | 1754 return true; |
1734 } | 1755 } |
1735 | 1756 |
1736 void PrintPreviewHandler::OnPrivetPrintingDone( | 1757 void PrintPreviewHandler::OnPrivetPrintingDone( |
1737 const cloud_print::PrivetLocalPrintOperation* print_operation) { | 1758 const cloud_print::PrivetLocalPrintOperation* print_operation) { |
1738 ClosePreviewDialog(); | 1759 ResolveJavascriptCallback(base::Value(privet_print_callback_id_), |
rbpotter
2017/06/20 20:46:07
Now done from JS
| |
1760 base::Value()); | |
1761 privet_print_callback_id_.clear(); | |
1739 } | 1762 } |
1740 | 1763 |
1741 void PrintPreviewHandler::OnPrivetPrintingError( | 1764 void PrintPreviewHandler::OnPrivetPrintingError( |
1742 const cloud_print::PrivetLocalPrintOperation* print_operation, | 1765 const cloud_print::PrivetLocalPrintOperation* print_operation, |
1743 int http_code) { | 1766 int http_code) { |
1744 FireWebUIListener("print-failed", base::Value(http_code)); | 1767 RejectJavascriptCallback(base::Value(privet_print_callback_id_), |
1768 base::Value(http_code)); | |
1769 privet_print_callback_id_.clear(); | |
1745 } | 1770 } |
1746 | 1771 |
1747 void PrintPreviewHandler::FillPrinterDescription( | 1772 void PrintPreviewHandler::FillPrinterDescription( |
1748 const std::string& name, | 1773 const std::string& name, |
1749 const cloud_print::DeviceDescription& description, | 1774 const cloud_print::DeviceDescription& description, |
1750 bool has_local_printing, | 1775 bool has_local_printing, |
1751 base::DictionaryValue* printer_value) { | 1776 base::DictionaryValue* printer_value) { |
1752 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); | 1777 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
1753 | 1778 |
1754 printer_value->SetString("serviceName", name); | 1779 printer_value->SetString("serviceName", name); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1798 void PrintPreviewHandler::OnGotExtensionPrinterCapabilities( | 1823 void PrintPreviewHandler::OnGotExtensionPrinterCapabilities( |
1799 const std::string& callback_id, | 1824 const std::string& callback_id, |
1800 const base::DictionaryValue& capabilities) { | 1825 const base::DictionaryValue& capabilities) { |
1801 if (capabilities.empty()) { | 1826 if (capabilities.empty()) { |
1802 RejectJavascriptCallback(base::Value(callback_id), base::Value()); | 1827 RejectJavascriptCallback(base::Value(callback_id), base::Value()); |
1803 return; | 1828 return; |
1804 } | 1829 } |
1805 ResolveJavascriptCallback(base::Value(callback_id), capabilities); | 1830 ResolveJavascriptCallback(base::Value(callback_id), capabilities); |
1806 } | 1831 } |
1807 | 1832 |
1808 void PrintPreviewHandler::OnExtensionPrintResult(bool success, | 1833 void PrintPreviewHandler::OnExtensionPrintResult(const std::string& callback_id, |
1834 bool success, | |
1809 const std::string& status) { | 1835 const std::string& status) { |
1810 if (success) { | 1836 if (success) { |
1811 ClosePreviewDialog(); | 1837 ResolveJavascriptCallback(base::Value(callback_id), base::Value()); |
rbpotter
2017/06/20 20:46:07
Now done from JS
| |
1812 return; | 1838 return; |
1813 } | 1839 } |
1814 FireWebUIListener("print-failed", base::Value(status)); | 1840 RejectJavascriptCallback(base::Value(callback_id), base::Value(status)); |
1815 } | 1841 } |
1816 | 1842 |
1817 void PrintPreviewHandler::RegisterForGaiaCookieChanges() { | 1843 void PrintPreviewHandler::RegisterForGaiaCookieChanges() { |
1818 DCHECK(!gaia_cookie_manager_service_); | 1844 DCHECK(!gaia_cookie_manager_service_); |
1819 Profile* profile = Profile::FromWebUI(web_ui()); | 1845 Profile* profile = Profile::FromWebUI(web_ui()); |
1820 if (switches::IsAccountConsistencyMirrorEnabled() && | 1846 if (switches::IsAccountConsistencyMirrorEnabled() && |
1821 !profile->IsOffTheRecord()) { | 1847 !profile->IsOffTheRecord()) { |
1822 gaia_cookie_manager_service_ = | 1848 gaia_cookie_manager_service_ = |
1823 GaiaCookieManagerServiceFactory::GetForProfile(profile); | 1849 GaiaCookieManagerServiceFactory::GetForProfile(profile); |
1824 if (gaia_cookie_manager_service_) | 1850 if (gaia_cookie_manager_service_) |
1825 gaia_cookie_manager_service_->AddObserver(this); | 1851 gaia_cookie_manager_service_->AddObserver(this); |
1826 } | 1852 } |
1827 } | 1853 } |
1828 | 1854 |
1829 void PrintPreviewHandler::UnregisterForGaiaCookieChanges() { | 1855 void PrintPreviewHandler::UnregisterForGaiaCookieChanges() { |
1830 if (gaia_cookie_manager_service_) | 1856 if (gaia_cookie_manager_service_) |
1831 gaia_cookie_manager_service_->RemoveObserver(this); | 1857 gaia_cookie_manager_service_->RemoveObserver(this); |
1832 } | 1858 } |
1833 | 1859 |
1834 void PrintPreviewHandler::SetPdfSavedClosureForTesting( | 1860 void PrintPreviewHandler::SetPdfSavedClosureForTesting( |
1835 const base::Closure& closure) { | 1861 const base::Closure& closure) { |
1836 pdf_file_saved_closure_ = closure; | 1862 pdf_file_saved_closure_ = closure; |
1837 } | 1863 } |
OLD | NEW |