| 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 "components/printing/renderer/print_web_view_helper.h" | 5 #include "components/printing/renderer/print_web_view_helper.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
| 10 #include "base/json/json_writer.h" | 10 #include "base/json/json_writer.h" |
| (...skipping 797 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 808 reset_prep_frame_view_(false), | 808 reset_prep_frame_view_(false), |
| 809 is_print_ready_metafile_sent_(false), | 809 is_print_ready_metafile_sent_(false), |
| 810 ignore_css_margins_(false), | 810 ignore_css_margins_(false), |
| 811 is_scripted_printing_blocked_(false), | 811 is_scripted_printing_blocked_(false), |
| 812 notify_browser_of_print_failure_(true), | 812 notify_browser_of_print_failure_(true), |
| 813 print_for_preview_(false), | 813 print_for_preview_(false), |
| 814 delegate_(delegate.Pass()), | 814 delegate_(delegate.Pass()), |
| 815 print_node_in_progress_(false), | 815 print_node_in_progress_(false), |
| 816 is_loading_(false), | 816 is_loading_(false), |
| 817 is_scripted_preview_delayed_(false), | 817 is_scripted_preview_delayed_(false), |
| 818 ipc_nesting_level_(0), |
| 818 weak_ptr_factory_(this) { | 819 weak_ptr_factory_(this) { |
| 819 if (!delegate_->IsPrintPreviewEnabled()) | 820 if (!delegate_->IsPrintPreviewEnabled()) |
| 820 DisablePreview(); | 821 DisablePreview(); |
| 821 } | 822 } |
| 822 | 823 |
| 823 PrintWebViewHelper::~PrintWebViewHelper() { | 824 PrintWebViewHelper::~PrintWebViewHelper() { |
| 824 } | 825 } |
| 825 | 826 |
| 826 // static | 827 // static |
| 827 void PrintWebViewHelper::DisablePreview() { | 828 void PrintWebViewHelper::DisablePreview() { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 871 | 872 |
| 872 if (!g_is_preview_enabled_) { | 873 if (!g_is_preview_enabled_) { |
| 873 Print(frame, blink::WebNode(), true); | 874 Print(frame, blink::WebNode(), true); |
| 874 } else { | 875 } else { |
| 875 print_preview_context_.InitWithFrame(frame); | 876 print_preview_context_.InitWithFrame(frame); |
| 876 RequestPrintPreview(PRINT_PREVIEW_SCRIPTED); | 877 RequestPrintPreview(PRINT_PREVIEW_SCRIPTED); |
| 877 } | 878 } |
| 878 } | 879 } |
| 879 | 880 |
| 880 bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) { | 881 bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) { |
| 882 // The class is not designed to handle recursive messages. This is not |
| 883 // expected during regular flow. However, during rendering of content for |
| 884 // printing, lower level code may run nested message loop. E.g. PDF may has |
| 885 // script to show message box http://crbug.com/502562. In that moment browser |
| 886 // may receive updated printer capabilities and decide to restart print |
| 887 // preview generation. When this happened message handling function may |
| 888 // choose to ignore message or safely crash process. |
| 889 ++ipc_nesting_level_; |
| 890 |
| 881 bool handled = true; | 891 bool handled = true; |
| 882 IPC_BEGIN_MESSAGE_MAP(PrintWebViewHelper, message) | 892 IPC_BEGIN_MESSAGE_MAP(PrintWebViewHelper, message) |
| 883 #if defined(ENABLE_BASIC_PRINTING) | 893 #if defined(ENABLE_BASIC_PRINTING) |
| 884 IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages) | 894 IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages) |
| 885 IPC_MESSAGE_HANDLER(PrintMsg_PrintForSystemDialog, OnPrintForSystemDialog) | 895 IPC_MESSAGE_HANDLER(PrintMsg_PrintForSystemDialog, OnPrintForSystemDialog) |
| 886 #endif // ENABLE_BASIC_PRINTING | 896 #endif // ENABLE_BASIC_PRINTING |
| 887 IPC_MESSAGE_HANDLER(PrintMsg_InitiatePrintPreview, OnInitiatePrintPreview) | 897 IPC_MESSAGE_HANDLER(PrintMsg_InitiatePrintPreview, OnInitiatePrintPreview) |
| 888 IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview) | 898 IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview) |
| 889 IPC_MESSAGE_HANDLER(PrintMsg_PrintForPrintPreview, OnPrintForPrintPreview) | 899 IPC_MESSAGE_HANDLER(PrintMsg_PrintForPrintPreview, OnPrintForPrintPreview) |
| 890 IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone) | 900 IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone) |
| 891 IPC_MESSAGE_HANDLER(PrintMsg_SetScriptedPrintingBlocked, | 901 IPC_MESSAGE_HANDLER(PrintMsg_SetScriptedPrintingBlocked, |
| 892 SetScriptedPrintBlocked) | 902 SetScriptedPrintBlocked) |
| 893 IPC_MESSAGE_UNHANDLED(handled = false) | 903 IPC_MESSAGE_UNHANDLED(handled = false) |
| 894 IPC_END_MESSAGE_MAP() | 904 IPC_END_MESSAGE_MAP() |
| 905 |
| 906 --ipc_nesting_level_; |
| 895 return handled; | 907 return handled; |
| 896 } | 908 } |
| 897 | 909 |
| 898 void PrintWebViewHelper::OnPrintForPrintPreview( | 910 void PrintWebViewHelper::OnPrintForPrintPreview( |
| 899 const base::DictionaryValue& job_settings) { | 911 const base::DictionaryValue& job_settings) { |
| 912 CHECK_LE(ipc_nesting_level_, 1); |
| 900 // If still not finished with earlier print request simply ignore. | 913 // If still not finished with earlier print request simply ignore. |
| 901 if (prep_frame_view_) | 914 if (prep_frame_view_) |
| 902 return; | 915 return; |
| 903 | 916 |
| 904 if (!render_view()->GetWebView()) | 917 if (!render_view()->GetWebView()) |
| 905 return; | 918 return; |
| 906 blink::WebFrame* main_frame = render_view()->GetWebView()->mainFrame(); | 919 blink::WebFrame* main_frame = render_view()->GetWebView()->mainFrame(); |
| 907 if (!main_frame) | 920 if (!main_frame) |
| 908 return; | 921 return; |
| 909 | 922 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 971 blink::WebLocalFrame* focusedFrame = | 984 blink::WebLocalFrame* focusedFrame = |
| 972 webView->focusedFrame()->toWebLocalFrame(); | 985 webView->focusedFrame()->toWebLocalFrame(); |
| 973 *frame = focusedFrame->hasSelection() | 986 *frame = focusedFrame->hasSelection() |
| 974 ? focusedFrame | 987 ? focusedFrame |
| 975 : webView->mainFrame()->toWebLocalFrame(); | 988 : webView->mainFrame()->toWebLocalFrame(); |
| 976 return true; | 989 return true; |
| 977 } | 990 } |
| 978 | 991 |
| 979 #if defined(ENABLE_BASIC_PRINTING) | 992 #if defined(ENABLE_BASIC_PRINTING) |
| 980 void PrintWebViewHelper::OnPrintPages() { | 993 void PrintWebViewHelper::OnPrintPages() { |
| 994 CHECK_LE(ipc_nesting_level_, 1); |
| 981 blink::WebLocalFrame* frame; | 995 blink::WebLocalFrame* frame; |
| 982 if (!GetPrintFrame(&frame)) | 996 if (!GetPrintFrame(&frame)) |
| 983 return; | 997 return; |
| 984 // If we are printing a PDF extension frame, find the plugin node and print | 998 // If we are printing a PDF extension frame, find the plugin node and print |
| 985 // that instead. | 999 // that instead. |
| 986 auto plugin = delegate_->GetPdfElement(frame); | 1000 auto plugin = delegate_->GetPdfElement(frame); |
| 987 Print(frame, plugin, false); | 1001 Print(frame, plugin, false); |
| 988 } | 1002 } |
| 989 | 1003 |
| 990 void PrintWebViewHelper::OnPrintForSystemDialog() { | 1004 void PrintWebViewHelper::OnPrintForSystemDialog() { |
| 1005 CHECK_LE(ipc_nesting_level_, 1); |
| 991 blink::WebLocalFrame* frame = print_preview_context_.source_frame(); | 1006 blink::WebLocalFrame* frame = print_preview_context_.source_frame(); |
| 992 if (!frame) { | 1007 if (!frame) { |
| 993 NOTREACHED(); | 1008 NOTREACHED(); |
| 994 return; | 1009 return; |
| 995 } | 1010 } |
| 996 Print(frame, print_preview_context_.source_node(), false); | 1011 Print(frame, print_preview_context_.source_node(), false); |
| 997 } | 1012 } |
| 998 #endif // ENABLE_BASIC_PRINTING | 1013 #endif // ENABLE_BASIC_PRINTING |
| 999 | 1014 |
| 1000 void PrintWebViewHelper::GetPageSizeAndContentAreaFromPageLayout( | 1015 void PrintWebViewHelper::GetPageSizeAndContentAreaFromPageLayout( |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1022 | 1037 |
| 1023 bool PrintWebViewHelper::IsPrintToPdfRequested( | 1038 bool PrintWebViewHelper::IsPrintToPdfRequested( |
| 1024 const base::DictionaryValue& job_settings) { | 1039 const base::DictionaryValue& job_settings) { |
| 1025 bool print_to_pdf = false; | 1040 bool print_to_pdf = false; |
| 1026 if (!job_settings.GetBoolean(kSettingPrintToPDF, &print_to_pdf)) | 1041 if (!job_settings.GetBoolean(kSettingPrintToPDF, &print_to_pdf)) |
| 1027 NOTREACHED(); | 1042 NOTREACHED(); |
| 1028 return print_to_pdf; | 1043 return print_to_pdf; |
| 1029 } | 1044 } |
| 1030 | 1045 |
| 1031 void PrintWebViewHelper::OnPrintPreview(const base::DictionaryValue& settings) { | 1046 void PrintWebViewHelper::OnPrintPreview(const base::DictionaryValue& settings) { |
| 1047 CHECK_LE(ipc_nesting_level_, 1); |
| 1048 |
| 1032 print_preview_context_.OnPrintPreview(); | 1049 print_preview_context_.OnPrintPreview(); |
| 1033 | 1050 |
| 1034 UMA_HISTOGRAM_ENUMERATION("PrintPreview.PreviewEvent", | 1051 UMA_HISTOGRAM_ENUMERATION("PrintPreview.PreviewEvent", |
| 1035 PREVIEW_EVENT_REQUESTED, PREVIEW_EVENT_MAX); | 1052 PREVIEW_EVENT_REQUESTED, PREVIEW_EVENT_MAX); |
| 1036 | 1053 |
| 1037 if (!print_preview_context_.source_frame()) { | 1054 if (!print_preview_context_.source_frame()) { |
| 1038 DidFinishPrinting(FAIL_PREVIEW); | 1055 DidFinishPrinting(FAIL_PREVIEW); |
| 1039 return; | 1056 return; |
| 1040 } | 1057 } |
| 1041 | 1058 |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1210 print_preview_context_.set_error(PREVIEW_ERROR_METAFILE_COPY_FAILED); | 1227 print_preview_context_.set_error(PREVIEW_ERROR_METAFILE_COPY_FAILED); |
| 1211 return false; | 1228 return false; |
| 1212 } | 1229 } |
| 1213 is_print_ready_metafile_sent_ = true; | 1230 is_print_ready_metafile_sent_ = true; |
| 1214 | 1231 |
| 1215 Send(new PrintHostMsg_MetafileReadyForPrinting(routing_id(), preview_params)); | 1232 Send(new PrintHostMsg_MetafileReadyForPrinting(routing_id(), preview_params)); |
| 1216 return true; | 1233 return true; |
| 1217 } | 1234 } |
| 1218 | 1235 |
| 1219 void PrintWebViewHelper::OnPrintingDone(bool success) { | 1236 void PrintWebViewHelper::OnPrintingDone(bool success) { |
| 1237 CHECK_LE(ipc_nesting_level_, 1); |
| 1220 notify_browser_of_print_failure_ = false; | 1238 notify_browser_of_print_failure_ = false; |
| 1221 if (!success) | 1239 if (!success) |
| 1222 LOG(ERROR) << "Failure in OnPrintingDone"; | 1240 LOG(ERROR) << "Failure in OnPrintingDone"; |
| 1223 DidFinishPrinting(success ? OK : FAIL_PRINT); | 1241 DidFinishPrinting(success ? OK : FAIL_PRINT); |
| 1224 } | 1242 } |
| 1225 | 1243 |
| 1226 void PrintWebViewHelper::SetScriptedPrintBlocked(bool blocked) { | 1244 void PrintWebViewHelper::SetScriptedPrintBlocked(bool blocked) { |
| 1227 is_scripted_printing_blocked_ = blocked; | 1245 is_scripted_printing_blocked_ = blocked; |
| 1228 } | 1246 } |
| 1229 | 1247 |
| 1230 void PrintWebViewHelper::OnInitiatePrintPreview(bool selection_only) { | 1248 void PrintWebViewHelper::OnInitiatePrintPreview(bool selection_only) { |
| 1249 CHECK_LE(ipc_nesting_level_, 1); |
| 1231 blink::WebLocalFrame* frame = NULL; | 1250 blink::WebLocalFrame* frame = NULL; |
| 1232 GetPrintFrame(&frame); | 1251 GetPrintFrame(&frame); |
| 1233 DCHECK(frame); | 1252 DCHECK(frame); |
| 1234 // If we are printing a PDF extension frame, find the plugin node and print | 1253 // If we are printing a PDF extension frame, find the plugin node and print |
| 1235 // that instead. | 1254 // that instead. |
| 1236 auto plugin = delegate_->GetPdfElement(frame); | 1255 auto plugin = delegate_->GetPdfElement(frame); |
| 1237 if (!plugin.isNull()) { | 1256 if (!plugin.isNull()) { |
| 1238 PrintNode(plugin); | 1257 PrintNode(plugin); |
| 1239 return; | 1258 return; |
| 1240 } | 1259 } |
| (...skipping 837 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2078 blink::WebConsoleMessage::LevelWarning, message)); | 2097 blink::WebConsoleMessage::LevelWarning, message)); |
| 2079 return false; | 2098 return false; |
| 2080 } | 2099 } |
| 2081 | 2100 |
| 2082 void PrintWebViewHelper::ScriptingThrottler::Reset() { | 2101 void PrintWebViewHelper::ScriptingThrottler::Reset() { |
| 2083 // Reset counter on successful print. | 2102 // Reset counter on successful print. |
| 2084 count_ = 0; | 2103 count_ = 0; |
| 2085 } | 2104 } |
| 2086 | 2105 |
| 2087 } // namespace printing | 2106 } // namespace printing |
| OLD | NEW |