| 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/renderer/printing/print_web_view_helper.h" | 5 #include "chrome/renderer/printing/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/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 393 } | 393 } |
| 394 | 394 |
| 395 if (fit_to_page) { | 395 if (fit_to_page) { |
| 396 double factor = FitPrintParamsToPage(params, &result_params); | 396 double factor = FitPrintParamsToPage(params, &result_params); |
| 397 if (scale_factor) | 397 if (scale_factor) |
| 398 *scale_factor = factor; | 398 *scale_factor = factor; |
| 399 } | 399 } |
| 400 return result_params; | 400 return result_params; |
| 401 } | 401 } |
| 402 | 402 |
| 403 bool IsPrintPreviewEnabled() { | |
| 404 return CommandLine::ForCurrentProcess()->HasSwitch( | |
| 405 switches::kRendererPrintPreview); | |
| 406 } | |
| 407 | |
| 408 bool IsPrintThrottlingDisabled() { | |
| 409 return CommandLine::ForCurrentProcess()->HasSwitch( | |
| 410 switches::kDisableScriptedPrintThrottling); | |
| 411 } | |
| 412 | |
| 413 } // namespace | 403 } // namespace |
| 414 | 404 |
| 415 FrameReference::FrameReference(blink::WebLocalFrame* frame) { | 405 FrameReference::FrameReference(blink::WebLocalFrame* frame) { |
| 416 Reset(frame); | 406 Reset(frame); |
| 417 } | 407 } |
| 418 | 408 |
| 419 FrameReference::FrameReference() { | 409 FrameReference::FrameReference() { |
| 420 Reset(NULL); | 410 Reset(NULL); |
| 421 } | 411 } |
| 422 | 412 |
| (...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 774 } | 764 } |
| 775 } | 765 } |
| 776 frame_.Reset(NULL); | 766 frame_.Reset(NULL); |
| 777 on_ready_.Reset(); | 767 on_ready_.Reset(); |
| 778 } | 768 } |
| 779 | 769 |
| 780 PrintWebViewHelper::PrintWebViewHelper(content::RenderView* render_view) | 770 PrintWebViewHelper::PrintWebViewHelper(content::RenderView* render_view) |
| 781 : content::RenderViewObserver(render_view), | 771 : content::RenderViewObserver(render_view), |
| 782 content::RenderViewObserverTracker<PrintWebViewHelper>(render_view), | 772 content::RenderViewObserverTracker<PrintWebViewHelper>(render_view), |
| 783 reset_prep_frame_view_(false), | 773 reset_prep_frame_view_(false), |
| 784 is_preview_enabled_(IsPrintPreviewEnabled()), | |
| 785 is_scripted_print_throttling_disabled_(IsPrintThrottlingDisabled()), | |
| 786 is_print_ready_metafile_sent_(false), | 774 is_print_ready_metafile_sent_(false), |
| 787 ignore_css_margins_(false), | 775 ignore_css_margins_(false), |
| 788 user_cancelled_scripted_print_count_(0), | |
| 789 is_scripted_printing_blocked_(false), | 776 is_scripted_printing_blocked_(false), |
| 790 notify_browser_of_print_failure_(true), | 777 notify_browser_of_print_failure_(true), |
| 791 print_for_preview_(false), | 778 print_for_preview_(false), |
| 792 print_node_in_progress_(false), | 779 print_node_in_progress_(false), |
| 793 is_loading_(false), | 780 is_loading_(false), |
| 794 is_scripted_preview_delayed_(false), | 781 is_scripted_preview_delayed_(false), |
| 795 weak_ptr_factory_(this) { | 782 weak_ptr_factory_(this) { |
| 796 } | 783 } |
| 797 | 784 |
| 798 PrintWebViewHelper::~PrintWebViewHelper() {} | 785 PrintWebViewHelper::~PrintWebViewHelper() {} |
| 799 | 786 |
| 800 bool PrintWebViewHelper::IsScriptInitiatedPrintAllowed( | 787 bool PrintWebViewHelper::IsScriptInitiatedPrintAllowed( |
| 801 blink::WebFrame* frame, bool user_initiated) { | 788 blink::WebFrame* frame, bool user_initiated) { |
| 802 #if defined(OS_ANDROID) | 789 #if defined(OS_ANDROID) |
| 803 return false; | 790 return false; |
| 804 #endif // defined(OS_ANDROID) | 791 #endif // defined(OS_ANDROID) |
| 805 if (is_scripted_printing_blocked_) | 792 if (is_scripted_printing_blocked_) |
| 806 return false; | 793 return false; |
| 807 // If preview is enabled, then the print dialog is tab modal, and the user | |
| 808 // can always close the tab on a mis-behaving page (the system print dialog | |
| 809 // is app modal). If the print was initiated through user action, don't | |
| 810 // throttle. Or, if the command line flag to skip throttling has been set. | |
| 811 if (!is_scripted_print_throttling_disabled_ && | |
| 812 !is_preview_enabled_ && | |
| 813 !user_initiated) | |
| 814 return !IsScriptInitiatedPrintTooFrequent(frame); | |
| 815 return true; | 794 return true; |
| 816 } | 795 } |
| 817 | 796 |
| 818 void PrintWebViewHelper::DidStartLoading() { | 797 void PrintWebViewHelper::DidStartLoading() { |
| 819 is_loading_ = true; | 798 is_loading_ = true; |
| 820 } | 799 } |
| 821 | 800 |
| 822 void PrintWebViewHelper::DidStopLoading() { | 801 void PrintWebViewHelper::DidStopLoading() { |
| 823 is_loading_ = false; | 802 is_loading_ = false; |
| 824 if (!on_stop_loading_closure_.is_null()) { | 803 if (!on_stop_loading_closure_.is_null()) { |
| 825 on_stop_loading_closure_.Run(); | 804 on_stop_loading_closure_.Run(); |
| 826 on_stop_loading_closure_.Reset(); | 805 on_stop_loading_closure_.Reset(); |
| 827 } | 806 } |
| 828 } | 807 } |
| 829 | 808 |
| 830 // Prints |frame| which called window.print(). | 809 // Prints |frame| which called window.print(). |
| 831 void PrintWebViewHelper::PrintPage(blink::WebLocalFrame* frame, | 810 void PrintWebViewHelper::PrintPage(blink::WebLocalFrame* frame, |
| 832 bool user_initiated) { | 811 bool user_initiated) { |
| 833 DCHECK(frame); | 812 DCHECK(frame); |
| 834 | 813 |
| 835 // Allow Prerendering to cancel this print request if necessary. | 814 // Allow Prerendering to cancel this print request if necessary. |
| 836 if (prerender::PrerenderHelper::IsPrerendering( | 815 if (prerender::PrerenderHelper::IsPrerendering( |
| 837 render_view()->GetMainRenderFrame())) { | 816 render_view()->GetMainRenderFrame())) { |
| 838 Send(new ChromeViewHostMsg_CancelPrerenderForPrinting(routing_id())); | 817 Send(new ChromeViewHostMsg_CancelPrerenderForPrinting(routing_id())); |
| 839 return; | 818 return; |
| 840 } | 819 } |
| 841 | 820 |
| 842 if (!IsScriptInitiatedPrintAllowed(frame, user_initiated)) | 821 if (!IsScriptInitiatedPrintAllowed(frame, user_initiated)) |
| 843 return; | 822 return; |
| 844 IncrementScriptedPrintCount(); | 823 print_preview_context_.InitWithFrame(frame); |
| 845 | 824 RequestPrintPreview(PRINT_PREVIEW_SCRIPTED); |
| 846 if (is_preview_enabled_) { | |
| 847 print_preview_context_.InitWithFrame(frame); | |
| 848 RequestPrintPreview(PRINT_PREVIEW_SCRIPTED); | |
| 849 } else { | |
| 850 Print(frame, blink::WebNode()); | |
| 851 } | |
| 852 } | 825 } |
| 853 | 826 |
| 854 bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) { | 827 bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) { |
| 855 bool handled = true; | 828 bool handled = true; |
| 856 IPC_BEGIN_MESSAGE_MAP(PrintWebViewHelper, message) | 829 IPC_BEGIN_MESSAGE_MAP(PrintWebViewHelper, message) |
| 857 IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages) | 830 IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages) |
| 858 IPC_MESSAGE_HANDLER(PrintMsg_PrintForSystemDialog, OnPrintForSystemDialog) | 831 IPC_MESSAGE_HANDLER(PrintMsg_PrintForSystemDialog, OnPrintForSystemDialog) |
| 859 IPC_MESSAGE_HANDLER(PrintMsg_InitiatePrintPreview, OnInitiatePrintPreview) | 832 IPC_MESSAGE_HANDLER(PrintMsg_InitiatePrintPreview, OnInitiatePrintPreview) |
| 860 IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview) | 833 IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview) |
| 861 IPC_MESSAGE_HANDLER(PrintMsg_PrintForPrintPreview, OnPrintForPrintPreview) | 834 IPC_MESSAGE_HANDLER(PrintMsg_PrintForPrintPreview, OnPrintForPrintPreview) |
| 862 IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone) | 835 IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone) |
| 863 IPC_MESSAGE_HANDLER(PrintMsg_ResetScriptedPrintCount, | |
| 864 ResetScriptedPrintCount) | |
| 865 IPC_MESSAGE_HANDLER(PrintMsg_SetScriptedPrintingBlocked, | 836 IPC_MESSAGE_HANDLER(PrintMsg_SetScriptedPrintingBlocked, |
| 866 SetScriptedPrintBlocked) | 837 SetScriptedPrintBlocked) |
| 867 IPC_MESSAGE_UNHANDLED(handled = false) | 838 IPC_MESSAGE_UNHANDLED(handled = false) |
| 868 IPC_END_MESSAGE_MAP() | 839 IPC_END_MESSAGE_MAP() |
| 869 return handled; | 840 return handled; |
| 870 } | 841 } |
| 871 | 842 |
| 872 void PrintWebViewHelper::OnPrintForPrintPreview( | 843 void PrintWebViewHelper::OnPrintForPrintPreview( |
| 873 const base::DictionaryValue& job_settings) { | 844 const base::DictionaryValue& job_settings) { |
| 874 DCHECK(is_preview_enabled_); | |
| 875 // If still not finished with earlier print request simply ignore. | 845 // If still not finished with earlier print request simply ignore. |
| 876 if (prep_frame_view_) | 846 if (prep_frame_view_) |
| 877 return; | 847 return; |
| 878 | 848 |
| 879 if (!render_view()->GetWebView()) | 849 if (!render_view()->GetWebView()) |
| 880 return; | 850 return; |
| 881 blink::WebFrame* main_frame = render_view()->GetWebView()->mainFrame(); | 851 blink::WebFrame* main_frame = render_view()->GetWebView()->mainFrame(); |
| 882 if (!main_frame) | 852 if (!main_frame) |
| 883 return; | 853 return; |
| 884 | 854 |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 998 | 968 |
| 999 bool PrintWebViewHelper::IsPrintToPdfRequested( | 969 bool PrintWebViewHelper::IsPrintToPdfRequested( |
| 1000 const base::DictionaryValue& job_settings) { | 970 const base::DictionaryValue& job_settings) { |
| 1001 bool print_to_pdf = false; | 971 bool print_to_pdf = false; |
| 1002 if (!job_settings.GetBoolean(kSettingPrintToPDF, &print_to_pdf)) | 972 if (!job_settings.GetBoolean(kSettingPrintToPDF, &print_to_pdf)) |
| 1003 NOTREACHED(); | 973 NOTREACHED(); |
| 1004 return print_to_pdf; | 974 return print_to_pdf; |
| 1005 } | 975 } |
| 1006 | 976 |
| 1007 void PrintWebViewHelper::OnPrintPreview(const base::DictionaryValue& settings) { | 977 void PrintWebViewHelper::OnPrintPreview(const base::DictionaryValue& settings) { |
| 1008 DCHECK(is_preview_enabled_); | |
| 1009 print_preview_context_.OnPrintPreview(); | 978 print_preview_context_.OnPrintPreview(); |
| 1010 | 979 |
| 1011 UMA_HISTOGRAM_ENUMERATION("PrintPreview.PreviewEvent", | 980 UMA_HISTOGRAM_ENUMERATION("PrintPreview.PreviewEvent", |
| 1012 PREVIEW_EVENT_REQUESTED, PREVIEW_EVENT_MAX); | 981 PREVIEW_EVENT_REQUESTED, PREVIEW_EVENT_MAX); |
| 1013 | 982 |
| 1014 if (!print_preview_context_.source_frame()) { | 983 if (!print_preview_context_.source_frame()) { |
| 1015 DidFinishPrinting(FAIL_PREVIEW); | 984 DidFinishPrinting(FAIL_PREVIEW); |
| 1016 return; | 985 return; |
| 1017 } | 986 } |
| 1018 | 987 |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1201 if (!success) | 1170 if (!success) |
| 1202 LOG(ERROR) << "Failure in OnPrintingDone"; | 1171 LOG(ERROR) << "Failure in OnPrintingDone"; |
| 1203 DidFinishPrinting(success ? OK : FAIL_PRINT); | 1172 DidFinishPrinting(success ? OK : FAIL_PRINT); |
| 1204 } | 1173 } |
| 1205 | 1174 |
| 1206 void PrintWebViewHelper::SetScriptedPrintBlocked(bool blocked) { | 1175 void PrintWebViewHelper::SetScriptedPrintBlocked(bool blocked) { |
| 1207 is_scripted_printing_blocked_ = blocked; | 1176 is_scripted_printing_blocked_ = blocked; |
| 1208 } | 1177 } |
| 1209 | 1178 |
| 1210 void PrintWebViewHelper::OnInitiatePrintPreview(bool selection_only) { | 1179 void PrintWebViewHelper::OnInitiatePrintPreview(bool selection_only) { |
| 1211 DCHECK(is_preview_enabled_); | |
| 1212 blink::WebLocalFrame* frame = NULL; | 1180 blink::WebLocalFrame* frame = NULL; |
| 1213 GetPrintFrame(&frame); | 1181 GetPrintFrame(&frame); |
| 1214 DCHECK(frame); | 1182 DCHECK(frame); |
| 1215 print_preview_context_.InitWithFrame(frame); | 1183 print_preview_context_.InitWithFrame(frame); |
| 1216 RequestPrintPreview(selection_only ? | 1184 RequestPrintPreview(selection_only ? |
| 1217 PRINT_PREVIEW_USER_INITIATED_SELECTION : | 1185 PRINT_PREVIEW_USER_INITIATED_SELECTION : |
| 1218 PRINT_PREVIEW_USER_INITIATED_ENTIRE_FRAME); | 1186 PRINT_PREVIEW_USER_INITIATED_ENTIRE_FRAME); |
| 1219 } | 1187 } |
| 1220 | 1188 |
| 1221 bool PrintWebViewHelper::IsPrintingEnabled() { | 1189 bool PrintWebViewHelper::IsPrintingEnabled() { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1235 // This can happen as a result of processing sync messages when printing | 1203 // This can happen as a result of processing sync messages when printing |
| 1236 // from ppapi plugins. It's a rare case, so its OK to just fail here. | 1204 // from ppapi plugins. It's a rare case, so its OK to just fail here. |
| 1237 // See http://crbug.com/159165. | 1205 // See http://crbug.com/159165. |
| 1238 return; | 1206 return; |
| 1239 } | 1207 } |
| 1240 | 1208 |
| 1241 print_node_in_progress_ = true; | 1209 print_node_in_progress_ = true; |
| 1242 | 1210 |
| 1243 // Make a copy of the node, in case RenderView::OnContextMenuClosed resets | 1211 // Make a copy of the node, in case RenderView::OnContextMenuClosed resets |
| 1244 // its |context_menu_node_|. | 1212 // its |context_menu_node_|. |
| 1245 if (is_preview_enabled_) { | 1213 print_preview_context_.InitWithNode(node); |
| 1246 print_preview_context_.InitWithNode(node); | 1214 RequestPrintPreview(PRINT_PREVIEW_USER_INITIATED_CONTEXT_NODE); |
| 1247 RequestPrintPreview(PRINT_PREVIEW_USER_INITIATED_CONTEXT_NODE); | |
| 1248 } else { | |
| 1249 blink::WebNode duplicate_node(node); | |
| 1250 Print(duplicate_node.document().frame(), duplicate_node); | |
| 1251 } | |
| 1252 | 1215 |
| 1253 print_node_in_progress_ = false; | 1216 print_node_in_progress_ = false; |
| 1254 } | 1217 } |
| 1255 | 1218 |
| 1256 void PrintWebViewHelper::Print(blink::WebLocalFrame* frame, | 1219 void PrintWebViewHelper::Print(blink::WebLocalFrame* frame, |
| 1257 const blink::WebNode& node) { | 1220 const blink::WebNode& node) { |
| 1258 // If still not finished with earlier print request simply ignore. | 1221 // If still not finished with earlier print request simply ignore. |
| 1259 if (prep_frame_view_) | 1222 if (prep_frame_view_) |
| 1260 return; | 1223 return; |
| 1261 | 1224 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1278 expected_page_count)) { | 1241 expected_page_count)) { |
| 1279 DidFinishPrinting(OK); // Release resources and fail silently. | 1242 DidFinishPrinting(OK); // Release resources and fail silently. |
| 1280 return; | 1243 return; |
| 1281 } | 1244 } |
| 1282 | 1245 |
| 1283 // Render Pages for printing. | 1246 // Render Pages for printing. |
| 1284 if (!RenderPagesForPrint(frame_ref.GetFrame(), node)) { | 1247 if (!RenderPagesForPrint(frame_ref.GetFrame(), node)) { |
| 1285 LOG(ERROR) << "RenderPagesForPrint failed"; | 1248 LOG(ERROR) << "RenderPagesForPrint failed"; |
| 1286 DidFinishPrinting(FAIL_PRINT); | 1249 DidFinishPrinting(FAIL_PRINT); |
| 1287 } | 1250 } |
| 1288 ResetScriptedPrintCount(); | |
| 1289 } | 1251 } |
| 1290 | 1252 |
| 1291 void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) { | 1253 void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) { |
| 1292 switch (result) { | 1254 switch (result) { |
| 1293 case OK: | 1255 case OK: |
| 1294 break; | 1256 break; |
| 1295 | 1257 |
| 1296 case FAIL_PRINT_INIT: | 1258 case FAIL_PRINT_INIT: |
| 1297 DCHECK(!notify_browser_of_print_failure_); | 1259 DCHECK(!notify_browser_of_print_failure_); |
| 1298 break; | 1260 break; |
| 1299 | 1261 |
| 1300 case FAIL_PRINT: | 1262 case FAIL_PRINT: |
| 1301 if (notify_browser_of_print_failure_ && print_pages_params_) { | 1263 if (notify_browser_of_print_failure_ && print_pages_params_) { |
| 1302 int cookie = print_pages_params_->params.document_cookie; | 1264 int cookie = print_pages_params_->params.document_cookie; |
| 1303 Send(new PrintHostMsg_PrintingFailed(routing_id(), cookie)); | 1265 Send(new PrintHostMsg_PrintingFailed(routing_id(), cookie)); |
| 1304 } | 1266 } |
| 1305 break; | 1267 break; |
| 1306 | 1268 |
| 1307 case FAIL_PREVIEW: | 1269 case FAIL_PREVIEW: |
| 1308 DCHECK(is_preview_enabled_); | |
| 1309 int cookie = print_pages_params_ ? | 1270 int cookie = print_pages_params_ ? |
| 1310 print_pages_params_->params.document_cookie : 0; | 1271 print_pages_params_->params.document_cookie : 0; |
| 1311 if (notify_browser_of_print_failure_) { | 1272 if (notify_browser_of_print_failure_) { |
| 1312 LOG(ERROR) << "CreatePreviewDocument failed"; | 1273 LOG(ERROR) << "CreatePreviewDocument failed"; |
| 1313 Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie)); | 1274 Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie)); |
| 1314 } else { | 1275 } else { |
| 1315 Send(new PrintHostMsg_PrintPreviewCancelled(routing_id(), cookie)); | 1276 Send(new PrintHostMsg_PrintPreviewCancelled(routing_id(), cookie)); |
| 1316 } | 1277 } |
| 1317 print_preview_context_.Failed(notify_browser_of_print_failure_); | 1278 print_preview_context_.Failed(notify_browser_of_print_failure_); |
| 1318 break; | 1279 break; |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1467 const blink::WebNode& source_node = print_preview_context_.source_node(); | 1428 const blink::WebNode& source_node = print_preview_context_.source_node(); |
| 1468 | 1429 |
| 1469 params.is_scaling_disabled = | 1430 params.is_scaling_disabled = |
| 1470 source_frame->isPrintScalingDisabledForPlugin(source_node); | 1431 source_frame->isPrintScalingDisabledForPlugin(source_node); |
| 1471 } | 1432 } |
| 1472 | 1433 |
| 1473 bool PrintWebViewHelper::UpdatePrintSettings( | 1434 bool PrintWebViewHelper::UpdatePrintSettings( |
| 1474 blink::WebLocalFrame* frame, | 1435 blink::WebLocalFrame* frame, |
| 1475 const blink::WebNode& node, | 1436 const blink::WebNode& node, |
| 1476 const base::DictionaryValue& passed_job_settings) { | 1437 const base::DictionaryValue& passed_job_settings) { |
| 1477 DCHECK(is_preview_enabled_); | |
| 1478 const base::DictionaryValue* job_settings = &passed_job_settings; | 1438 const base::DictionaryValue* job_settings = &passed_job_settings; |
| 1479 base::DictionaryValue modified_job_settings; | 1439 base::DictionaryValue modified_job_settings; |
| 1480 if (job_settings->empty()) { | 1440 if (job_settings->empty()) { |
| 1481 if (!print_for_preview_) | 1441 if (!print_for_preview_) |
| 1482 print_preview_context_.set_error(PREVIEW_ERROR_BAD_SETTING); | 1442 print_preview_context_.set_error(PREVIEW_ERROR_BAD_SETTING); |
| 1483 return false; | 1443 return false; |
| 1484 } | 1444 } |
| 1485 | 1445 |
| 1486 bool source_is_html = true; | 1446 bool source_is_html = true; |
| 1487 if (print_for_preview_) { | 1447 if (print_for_preview_) { |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1616 if (shared_buf->Map(buf_size)) { | 1576 if (shared_buf->Map(buf_size)) { |
| 1617 metafile->GetData(shared_buf->memory(), buf_size); | 1577 metafile->GetData(shared_buf->memory(), buf_size); |
| 1618 return shared_buf->GiveToProcess(base::GetCurrentProcessHandle(), | 1578 return shared_buf->GiveToProcess(base::GetCurrentProcessHandle(), |
| 1619 shared_mem_handle); | 1579 shared_mem_handle); |
| 1620 } | 1580 } |
| 1621 } | 1581 } |
| 1622 return false; | 1582 return false; |
| 1623 } | 1583 } |
| 1624 #endif // defined(OS_POSIX) | 1584 #endif // defined(OS_POSIX) |
| 1625 | 1585 |
| 1626 bool PrintWebViewHelper::IsScriptInitiatedPrintTooFrequent( | |
| 1627 blink::WebFrame* frame) { | |
| 1628 const int kMinSecondsToIgnoreJavascriptInitiatedPrint = 2; | |
| 1629 const int kMaxSecondsToIgnoreJavascriptInitiatedPrint = 32; | |
| 1630 bool too_frequent = false; | |
| 1631 | |
| 1632 // Check if there is script repeatedly trying to print and ignore it if too | |
| 1633 // frequent. The first 3 times, we use a constant wait time, but if this | |
| 1634 // gets excessive, we switch to exponential wait time. So for a page that | |
| 1635 // calls print() in a loop the user will need to cancel the print dialog | |
| 1636 // after: [2, 2, 2, 4, 8, 16, 32, 32, ...] seconds. | |
| 1637 // This gives the user time to navigate from the page. | |
| 1638 if (user_cancelled_scripted_print_count_ > 0) { | |
| 1639 base::TimeDelta diff = base::Time::Now() - last_cancelled_script_print_; | |
| 1640 int min_wait_seconds = kMinSecondsToIgnoreJavascriptInitiatedPrint; | |
| 1641 if (user_cancelled_scripted_print_count_ > 3) { | |
| 1642 min_wait_seconds = std::min( | |
| 1643 kMinSecondsToIgnoreJavascriptInitiatedPrint << | |
| 1644 (user_cancelled_scripted_print_count_ - 3), | |
| 1645 kMaxSecondsToIgnoreJavascriptInitiatedPrint); | |
| 1646 } | |
| 1647 if (diff.InSeconds() < min_wait_seconds) { | |
| 1648 too_frequent = true; | |
| 1649 } | |
| 1650 } | |
| 1651 | |
| 1652 if (!too_frequent) | |
| 1653 return false; | |
| 1654 | |
| 1655 blink::WebString message( | |
| 1656 blink::WebString::fromUTF8("Ignoring too frequent calls to print().")); | |
| 1657 frame->addMessageToConsole( | |
| 1658 blink::WebConsoleMessage( | |
| 1659 blink::WebConsoleMessage::LevelWarning, message)); | |
| 1660 return true; | |
| 1661 } | |
| 1662 | |
| 1663 void PrintWebViewHelper::ResetScriptedPrintCount() { | |
| 1664 // Reset cancel counter on successful print. | |
| 1665 user_cancelled_scripted_print_count_ = 0; | |
| 1666 } | |
| 1667 | |
| 1668 void PrintWebViewHelper::IncrementScriptedPrintCount() { | |
| 1669 ++user_cancelled_scripted_print_count_; | |
| 1670 last_cancelled_script_print_ = base::Time::Now(); | |
| 1671 } | |
| 1672 | |
| 1673 | |
| 1674 void PrintWebViewHelper::ShowScriptedPrintPreview() { | 1586 void PrintWebViewHelper::ShowScriptedPrintPreview() { |
| 1675 if (is_scripted_preview_delayed_) { | 1587 if (is_scripted_preview_delayed_) { |
| 1676 is_scripted_preview_delayed_ = false; | 1588 is_scripted_preview_delayed_ = false; |
| 1677 Send(new PrintHostMsg_ShowScriptedPrintPreview(routing_id(), | 1589 Send(new PrintHostMsg_ShowScriptedPrintPreview(routing_id(), |
| 1678 print_preview_context_.IsModifiable())); | 1590 print_preview_context_.IsModifiable())); |
| 1679 } | 1591 } |
| 1680 } | 1592 } |
| 1681 | 1593 |
| 1682 void PrintWebViewHelper::RequestPrintPreview(PrintPreviewRequestType type) { | 1594 void PrintWebViewHelper::RequestPrintPreview(PrintPreviewRequestType type) { |
| 1683 const bool is_modifiable = print_preview_context_.IsModifiable(); | 1595 const bool is_modifiable = print_preview_context_.IsModifiable(); |
| (...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2047 } | 1959 } |
| 2048 | 1960 |
| 2049 void PrintWebViewHelper::SetPrintPagesParams( | 1961 void PrintWebViewHelper::SetPrintPagesParams( |
| 2050 const PrintMsg_PrintPages_Params& settings) { | 1962 const PrintMsg_PrintPages_Params& settings) { |
| 2051 print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings)); | 1963 print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings)); |
| 2052 Send(new PrintHostMsg_DidGetDocumentCookie(routing_id(), | 1964 Send(new PrintHostMsg_DidGetDocumentCookie(routing_id(), |
| 2053 settings.params.document_cookie)); | 1965 settings.params.document_cookie)); |
| 2054 } | 1966 } |
| 2055 | 1967 |
| 2056 } // namespace printing | 1968 } // namespace printing |
| OLD | NEW |