| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | |
| 10 #include <algorithm> | |
| 11 #include <string> | 9 #include <string> |
| 12 #include <utility> | 10 #include <utility> |
| 13 | 11 |
| 14 #include "base/auto_reset.h" | 12 #include "base/auto_reset.h" |
| 15 #include "base/json/json_writer.h" | 13 #include "base/json/json_writer.h" |
| 16 #include "base/location.h" | 14 #include "base/location.h" |
| 17 #include "base/logging.h" | 15 #include "base/logging.h" |
| 18 #include "base/macros.h" | 16 #include "base/macros.h" |
| 19 #include "base/metrics/histogram_macros.h" | 17 #include "base/metrics/histogram_macros.h" |
| 20 #include "base/process/process_handle.h" | 18 #include "base/process/process_handle.h" |
| (...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 501 result_params.page_size.height() - result_params.margin_top - | 499 result_params.page_size.height() - result_params.margin_top - |
| 502 default_margin_bottom); | 500 default_margin_bottom); |
| 503 } else { | 501 } else { |
| 504 // Using the CSS parameters. Scale CSS content size. | 502 // Using the CSS parameters. Scale CSS content size. |
| 505 result_params.content_size = | 503 result_params.content_size = |
| 506 ScaleAndRoundSize(result_params.content_size, *scale_factor); | 504 ScaleAndRoundSize(result_params.content_size, *scale_factor); |
| 507 if (fit_to_page) { | 505 if (fit_to_page) { |
| 508 double factor = FitPrintParamsToPage(params, &result_params); | 506 double factor = FitPrintParamsToPage(params, &result_params); |
| 509 if (scale_factor) | 507 if (scale_factor) |
| 510 *scale_factor = (*scale_factor) * factor; | 508 *scale_factor = (*scale_factor) * factor; |
| 511 } else { | 509 } else { // !fit_to_page |
| 512 // Already scaled the page, need to also scale the CSS margins since they | 510 // Already scaled the page, need to also scale the CSS margins since they |
| 513 // are begin applied | 511 // are begin applied |
| 514 result_params.margin_left = | 512 result_params.margin_left = |
| 515 ScaleAndRound(result_params.margin_left, page_scaling); | 513 ScaleAndRound(result_params.margin_left, page_scaling); |
| 516 result_params.margin_top = | 514 result_params.margin_top = |
| 517 ScaleAndRound(result_params.margin_top, page_scaling); | 515 ScaleAndRound(result_params.margin_top, page_scaling); |
| 518 } | 516 } |
| 519 } | 517 } |
| 520 | 518 |
| 521 return result_params; | 519 return result_params; |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 748 // the number that produces output with the correct physical size for elements | 746 // the number that produces output with the correct physical size for elements |
| 749 // that are specified in cm, mm, pt etc. | 747 // that are specified in cm, mm, pt etc. |
| 750 // This is important for sites that try to fill the page. | 748 // This is important for sites that try to fill the page. |
| 751 gfx::Size print_layout_size(web_print_params_.printContentArea.width, | 749 gfx::Size print_layout_size(web_print_params_.printContentArea.width, |
| 752 web_print_params_.printContentArea.height); | 750 web_print_params_.printContentArea.height); |
| 753 print_layout_size.set_height( | 751 print_layout_size.set_height( |
| 754 ScaleAndRound(print_layout_size.height(), kPrintingMinimumShrinkFactor)); | 752 ScaleAndRound(print_layout_size.height(), kPrintingMinimumShrinkFactor)); |
| 755 | 753 |
| 756 if (!frame()) | 754 if (!frame()) |
| 757 return; | 755 return; |
| 758 | |
| 759 // Backup size and offset if it's a local frame. | |
| 760 blink::WebView* web_view = frame_.view(); | 756 blink::WebView* web_view = frame_.view(); |
| 761 if (blink::WebFrame* web_frame = web_view->mainFrame()) { | 757 // Backup size and offset. |
| 762 if (web_frame->isWebLocalFrame()) | 758 if (blink::WebFrame* web_frame = web_view->mainFrame()) |
| 763 prev_scroll_offset_ = web_frame->scrollOffset(); | 759 prev_scroll_offset_ = web_frame->scrollOffset(); |
| 764 } | |
| 765 prev_view_size_ = web_view->size(); | 760 prev_view_size_ = web_view->size(); |
| 766 | 761 |
| 767 web_view->resize(print_layout_size); | 762 web_view->resize(print_layout_size); |
| 768 } | 763 } |
| 769 | 764 |
| 770 void PrepareFrameAndViewForPrint::StartPrinting() { | 765 void PrepareFrameAndViewForPrint::StartPrinting() { |
| 771 blink::WebView* web_view = frame_.view(); | 766 blink::WebView* web_view = frame_.view(); |
| 772 web_view->settings()->setShouldPrintBackgrounds(should_print_backgrounds_); | 767 web_view->settings()->setShouldPrintBackgrounds(should_print_backgrounds_); |
| 773 expected_pages_count_ = | 768 expected_pages_count_ = |
| 774 frame()->printBegin(web_print_params_, node_to_print_); | 769 frame()->printBegin(web_print_params_, node_to_print_); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 841 blink::WebLocalFrame* frame = blink::WebLocalFrame::create(scope, this); | 836 blink::WebLocalFrame* frame = blink::WebLocalFrame::create(scope, this); |
| 842 parent->appendChild(frame); | 837 parent->appendChild(frame); |
| 843 return frame; | 838 return frame; |
| 844 } | 839 } |
| 845 | 840 |
| 846 void PrepareFrameAndViewForPrint::CallOnReady() { | 841 void PrepareFrameAndViewForPrint::CallOnReady() { |
| 847 return on_ready_.Run(); // Can delete |this|. | 842 return on_ready_.Run(); // Can delete |this|. |
| 848 } | 843 } |
| 849 | 844 |
| 850 void PrepareFrameAndViewForPrint::RestoreSize() { | 845 void PrepareFrameAndViewForPrint::RestoreSize() { |
| 851 if (!frame()) | 846 if (frame()) { |
| 852 return; | 847 blink::WebView* web_view = frame_.GetFrame()->view(); |
| 853 | 848 web_view->resize(prev_view_size_); |
| 854 blink::WebView* web_view = frame_.GetFrame()->view(); | 849 if (blink::WebFrame* web_frame = web_view->mainFrame()) |
| 855 web_view->resize(prev_view_size_); | |
| 856 if (blink::WebFrame* web_frame = web_view->mainFrame()) { | |
| 857 if (web_frame->isWebLocalFrame()) | |
| 858 web_frame->setScrollOffset(prev_scroll_offset_); | 850 web_frame->setScrollOffset(prev_scroll_offset_); |
| 859 } | 851 } |
| 860 } | 852 } |
| 861 | 853 |
| 862 void PrepareFrameAndViewForPrint::FinishPrinting() { | 854 void PrepareFrameAndViewForPrint::FinishPrinting() { |
| 863 blink::WebLocalFrame* frame = frame_.GetFrame(); | 855 blink::WebLocalFrame* frame = frame_.GetFrame(); |
| 864 if (frame) { | 856 if (frame) { |
| 865 blink::WebView* web_view = frame->view(); | 857 blink::WebView* web_view = frame->view(); |
| 866 if (is_printing_started_) { | 858 if (is_printing_started_) { |
| 867 is_printing_started_ = false; | 859 is_printing_started_ = false; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 883 } | 875 } |
| 884 | 876 |
| 885 bool PrintWebViewHelper::Delegate::IsAskPrintSettingsEnabled() { | 877 bool PrintWebViewHelper::Delegate::IsAskPrintSettingsEnabled() { |
| 886 return true; | 878 return true; |
| 887 } | 879 } |
| 888 | 880 |
| 889 bool PrintWebViewHelper::Delegate::IsScriptedPrintEnabled() { | 881 bool PrintWebViewHelper::Delegate::IsScriptedPrintEnabled() { |
| 890 return true; | 882 return true; |
| 891 } | 883 } |
| 892 | 884 |
| 893 PrintWebViewHelper::PrintWebViewHelper(content::RenderFrame* render_frame, | 885 PrintWebViewHelper::PrintWebViewHelper(content::RenderView* render_view, |
| 894 std::unique_ptr<Delegate> delegate) | 886 std::unique_ptr<Delegate> delegate) |
| 895 : content::RenderFrameObserver(render_frame), | 887 : content::RenderViewObserver(render_view), |
| 896 content::RenderFrameObserverTracker<PrintWebViewHelper>(render_frame), | 888 content::RenderViewObserverTracker<PrintWebViewHelper>(render_view), |
| 897 reset_prep_frame_view_(false), | 889 reset_prep_frame_view_(false), |
| 898 is_print_ready_metafile_sent_(false), | 890 is_print_ready_metafile_sent_(false), |
| 899 ignore_css_margins_(false), | 891 ignore_css_margins_(false), |
| 900 is_printing_enabled_(true), | 892 is_scripted_printing_blocked_(false), |
| 901 notify_browser_of_print_failure_(true), | 893 notify_browser_of_print_failure_(true), |
| 902 print_for_preview_(false), | 894 print_for_preview_(false), |
| 903 delegate_(std::move(delegate)), | 895 delegate_(std::move(delegate)), |
| 904 print_node_in_progress_(false), | 896 print_node_in_progress_(false), |
| 905 is_loading_(false), | 897 is_loading_(false), |
| 906 is_scripted_preview_delayed_(false), | 898 is_scripted_preview_delayed_(false), |
| 907 ipc_nesting_level_(0), | 899 ipc_nesting_level_(0), |
| 908 weak_ptr_factory_(this) { | 900 weak_ptr_factory_(this) { |
| 909 if (!delegate_->IsPrintPreviewEnabled()) | 901 if (!delegate_->IsPrintPreviewEnabled()) |
| 910 DisablePreview(); | 902 DisablePreview(); |
| 911 } | 903 } |
| 912 | 904 |
| 913 PrintWebViewHelper::~PrintWebViewHelper() { | 905 PrintWebViewHelper::~PrintWebViewHelper() { |
| 914 } | 906 } |
| 915 | 907 |
| 916 // static | 908 // static |
| 917 void PrintWebViewHelper::DisablePreview() { | 909 void PrintWebViewHelper::DisablePreview() { |
| 918 g_is_preview_enabled = false; | 910 g_is_preview_enabled = false; |
| 919 } | 911 } |
| 920 | 912 |
| 921 bool PrintWebViewHelper::IsScriptInitiatedPrintAllowed(blink::WebFrame* frame, | 913 bool PrintWebViewHelper::IsScriptInitiatedPrintAllowed(blink::WebFrame* frame, |
| 922 bool user_initiated) { | 914 bool user_initiated) { |
| 923 if (!is_printing_enabled_ || !delegate_->IsScriptedPrintEnabled()) | 915 if (!delegate_->IsScriptedPrintEnabled()) |
| 924 return false; | 916 return false; |
| 925 | 917 |
| 926 // If preview is enabled, then the print dialog is tab modal, and the user | 918 // If preview is enabled, then the print dialog is tab modal, and the user |
| 927 // can always close the tab on a mis-behaving page (the system print dialog | 919 // can always close the tab on a mis-behaving page (the system print dialog |
| 928 // is app modal). If the print was initiated through user action, don't | 920 // is app modal). If the print was initiated through user action, don't |
| 929 // throttle. Or, if the command line flag to skip throttling has been set. | 921 // throttle. Or, if the command line flag to skip throttling has been set. |
| 930 return user_initiated || g_is_preview_enabled || | 922 return !is_scripted_printing_blocked_ && |
| 931 scripting_throttler_.IsAllowed(frame); | 923 (user_initiated || g_is_preview_enabled || |
| 924 scripting_throttler_.IsAllowed(frame)); |
| 932 } | 925 } |
| 933 | 926 |
| 934 void PrintWebViewHelper::DidStartProvisionalLoad() { | 927 void PrintWebViewHelper::DidStartLoading() { |
| 935 is_loading_ = true; | 928 is_loading_ = true; |
| 936 } | 929 } |
| 937 | 930 |
| 938 void PrintWebViewHelper::DidFailProvisionalLoad( | 931 void PrintWebViewHelper::DidStopLoading() { |
| 939 const blink::WebURLError& error) { | |
| 940 DidFinishLoad(); | |
| 941 } | |
| 942 | |
| 943 void PrintWebViewHelper::DidFinishLoad() { | |
| 944 is_loading_ = false; | 932 is_loading_ = false; |
| 945 if (!on_stop_loading_closure_.is_null()) { | 933 if (!on_stop_loading_closure_.is_null()) { |
| 946 on_stop_loading_closure_.Run(); | 934 on_stop_loading_closure_.Run(); |
| 947 on_stop_loading_closure_.Reset(); | 935 on_stop_loading_closure_.Reset(); |
| 948 } | 936 } |
| 949 } | 937 } |
| 950 | 938 |
| 951 void PrintWebViewHelper::ScriptedPrint(bool user_initiated) { | 939 // Prints |frame| which called window.print(). |
| 940 void PrintWebViewHelper::PrintPage(blink::WebLocalFrame* frame, |
| 941 bool user_initiated) { |
| 942 DCHECK(frame); |
| 943 |
| 952 // Allow Prerendering to cancel this print request if necessary. | 944 // Allow Prerendering to cancel this print request if necessary. |
| 953 if (delegate_->CancelPrerender(render_frame())) | 945 if (delegate_->CancelPrerender(render_view(), routing_id())) |
| 954 return; | 946 return; |
| 955 | 947 |
| 956 blink::WebLocalFrame* web_frame = render_frame()->GetWebFrame(); | 948 if (!IsScriptInitiatedPrintAllowed(frame, user_initiated)) |
| 957 if (!IsScriptInitiatedPrintAllowed(web_frame, user_initiated)) | |
| 958 return; | 949 return; |
| 959 | 950 |
| 960 if (delegate_->OverridePrint(web_frame)) | 951 if (delegate_->OverridePrint(frame)) |
| 961 return; | 952 return; |
| 962 | 953 |
| 963 if (g_is_preview_enabled) { | 954 if (g_is_preview_enabled) { |
| 964 #if BUILDFLAG(ENABLE_PRINT_PREVIEW) | 955 #if BUILDFLAG(ENABLE_PRINT_PREVIEW) |
| 965 print_preview_context_.InitWithFrame(web_frame); | 956 print_preview_context_.InitWithFrame(frame); |
| 966 RequestPrintPreview(PRINT_PREVIEW_SCRIPTED); | 957 RequestPrintPreview(PRINT_PREVIEW_SCRIPTED); |
| 967 #endif | 958 #endif |
| 968 } else { | 959 } else { |
| 969 #if BUILDFLAG(ENABLE_BASIC_PRINTING) | 960 #if BUILDFLAG(ENABLE_BASIC_PRINTING) |
| 970 Print(web_frame, blink::WebNode(), true /* is_scripted? */); | 961 Print(frame, blink::WebNode(), true); |
| 971 #endif | 962 #endif |
| 972 } | 963 } |
| 973 } | 964 } |
| 974 | 965 |
| 975 bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) { | 966 bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) { |
| 976 // The class is not designed to handle recursive messages. This is not | 967 // The class is not designed to handle recursive messages. This is not |
| 977 // expected during regular flow. However, during rendering of content for | 968 // expected during regular flow. However, during rendering of content for |
| 978 // printing, lower level code may run nested message loop. E.g. PDF may has | 969 // printing, lower level code may run nested message loop. E.g. PDF may has |
| 979 // script to show message box http://crbug.com/502562. In that moment browser | 970 // script to show message box http://crbug.com/502562. In that moment browser |
| 980 // may receive updated printer capabilities and decide to restart print | 971 // may receive updated printer capabilities and decide to restart print |
| 981 // preview generation. When this happened message handling function may | 972 // preview generation. When this happened message handling function may |
| 982 // choose to ignore message or safely crash process. | 973 // choose to ignore message or safely crash process. |
| 983 ++ipc_nesting_level_; | 974 ++ipc_nesting_level_; |
| 984 | 975 |
| 985 bool handled = true; | 976 bool handled = true; |
| 986 IPC_BEGIN_MESSAGE_MAP(PrintWebViewHelper, message) | 977 IPC_BEGIN_MESSAGE_MAP(PrintWebViewHelper, message) |
| 987 #if BUILDFLAG(ENABLE_BASIC_PRINTING) | 978 #if BUILDFLAG(ENABLE_BASIC_PRINTING) |
| 988 IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages) | 979 IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages) |
| 989 IPC_MESSAGE_HANDLER(PrintMsg_PrintForSystemDialog, OnPrintForSystemDialog) | 980 IPC_MESSAGE_HANDLER(PrintMsg_PrintForSystemDialog, OnPrintForSystemDialog) |
| 990 #endif // BUILDFLAG(ENABLE_BASIC_PRINTING) | 981 #endif // BUILDFLAG(ENABLE_BASIC_PRINTING) |
| 991 #if BUILDFLAG(ENABLE_BASIC_PRINTING) && BUILDFLAG(ENABLE_PRINT_PREVIEW) | 982 #if BUILDFLAG(ENABLE_BASIC_PRINTING) && BUILDFLAG(ENABLE_PRINT_PREVIEW) |
| 992 IPC_MESSAGE_HANDLER(PrintMsg_PrintForPrintPreview, OnPrintForPrintPreview) | 983 IPC_MESSAGE_HANDLER(PrintMsg_PrintForPrintPreview, OnPrintForPrintPreview) |
| 993 #endif | 984 #endif |
| 994 #if BUILDFLAG(ENABLE_PRINT_PREVIEW) | 985 #if BUILDFLAG(ENABLE_PRINT_PREVIEW) |
| 995 IPC_MESSAGE_HANDLER(PrintMsg_InitiatePrintPreview, OnInitiatePrintPreview) | 986 IPC_MESSAGE_HANDLER(PrintMsg_InitiatePrintPreview, OnInitiatePrintPreview) |
| 996 IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview) | 987 IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview) |
| 997 IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone) | 988 IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone) |
| 998 #endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) | 989 #endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) |
| 999 IPC_MESSAGE_HANDLER(PrintMsg_SetPrintingEnabled, OnSetPrintingEnabled) | 990 IPC_MESSAGE_HANDLER(PrintMsg_SetScriptedPrintingBlocked, |
| 991 SetScriptedPrintBlocked) |
| 1000 IPC_MESSAGE_UNHANDLED(handled = false) | 992 IPC_MESSAGE_UNHANDLED(handled = false) |
| 1001 IPC_END_MESSAGE_MAP() | 993 IPC_END_MESSAGE_MAP() |
| 1002 | 994 |
| 1003 --ipc_nesting_level_; | 995 --ipc_nesting_level_; |
| 1004 return handled; | 996 return handled; |
| 1005 } | 997 } |
| 1006 | 998 |
| 1007 void PrintWebViewHelper::OnDestruct() { | 999 void PrintWebViewHelper::OnDestruct() { |
| 1008 delete this; | 1000 delete this; |
| 1009 } | 1001 } |
| 1010 | 1002 |
| 1003 bool PrintWebViewHelper::GetPrintFrame(blink::WebLocalFrame** frame) { |
| 1004 DCHECK(frame); |
| 1005 blink::WebView* webView = render_view()->GetWebView(); |
| 1006 DCHECK(webView); |
| 1007 if (!webView) |
| 1008 return false; |
| 1009 |
| 1010 // If the user has selected text in the currently focused frame we print |
| 1011 // only that frame (this makes print selection work for multiple frames). |
| 1012 blink::WebLocalFrame* focusedFrame = webView->focusedFrame(); |
| 1013 *frame = focusedFrame->hasSelection() |
| 1014 ? focusedFrame |
| 1015 : webView->mainFrame()->toWebLocalFrame(); |
| 1016 return true; |
| 1017 } |
| 1018 |
| 1011 #if BUILDFLAG(ENABLE_BASIC_PRINTING) | 1019 #if BUILDFLAG(ENABLE_BASIC_PRINTING) |
| 1012 void PrintWebViewHelper::OnPrintPages() { | 1020 void PrintWebViewHelper::OnPrintPages() { |
| 1013 if (ipc_nesting_level_> 1) | 1021 if (ipc_nesting_level_> 1) |
| 1014 return; | 1022 return; |
| 1015 | 1023 blink::WebLocalFrame* frame; |
| 1016 blink::WebLocalFrame* frame = render_frame()->GetWebFrame(); | 1024 if (!GetPrintFrame(&frame)) |
| 1017 | 1025 return; |
| 1018 // If we are printing a PDF extension frame, find the plugin node and print | 1026 // If we are printing a PDF extension frame, find the plugin node and print |
| 1019 // that instead. | 1027 // that instead. |
| 1020 auto plugin = delegate_->GetPdfElement(frame); | 1028 auto plugin = delegate_->GetPdfElement(frame); |
| 1021 Print(frame, plugin, false /* is_scripted? */); | 1029 Print(frame, plugin, false); |
| 1022 } | 1030 } |
| 1023 | 1031 |
| 1024 void PrintWebViewHelper::OnPrintForSystemDialog() { | 1032 void PrintWebViewHelper::OnPrintForSystemDialog() { |
| 1025 if (ipc_nesting_level_> 1) | 1033 if (ipc_nesting_level_> 1) |
| 1026 return; | 1034 return; |
| 1027 blink::WebLocalFrame* frame = print_preview_context_.source_frame(); | 1035 blink::WebLocalFrame* frame = print_preview_context_.source_frame(); |
| 1028 if (!frame) { | 1036 if (!frame) { |
| 1029 NOTREACHED(); | 1037 NOTREACHED(); |
| 1030 return; | 1038 return; |
| 1031 } | 1039 } |
| 1032 Print(frame, print_preview_context_.source_node(), false); | 1040 Print(frame, print_preview_context_.source_node(), false); |
| 1033 } | 1041 } |
| 1034 #endif // BUILDFLAG(ENABLE_BASIC_PRINTING) | 1042 #endif // BUILDFLAG(ENABLE_BASIC_PRINTING) |
| 1035 | 1043 |
| 1036 #if BUILDFLAG(ENABLE_BASIC_PRINTING) && BUILDFLAG(ENABLE_PRINT_PREVIEW) | 1044 #if BUILDFLAG(ENABLE_BASIC_PRINTING) && BUILDFLAG(ENABLE_PRINT_PREVIEW) |
| 1037 void PrintWebViewHelper::OnPrintForPrintPreview( | 1045 void PrintWebViewHelper::OnPrintForPrintPreview( |
| 1038 const base::DictionaryValue& job_settings) { | 1046 const base::DictionaryValue& job_settings) { |
| 1039 CHECK_LE(ipc_nesting_level_, 1); | 1047 CHECK_LE(ipc_nesting_level_, 1); |
| 1040 // If still not finished with earlier print request simply ignore. | 1048 // If still not finished with earlier print request simply ignore. |
| 1041 if (prep_frame_view_) | 1049 if (prep_frame_view_) |
| 1042 return; | 1050 return; |
| 1043 | 1051 |
| 1044 blink::WebDocument document = render_frame()->GetWebFrame()->document(); | 1052 if (!render_view()->GetWebView()) |
| 1053 return; |
| 1054 blink::WebFrame* main_frame = render_view()->GetWebView()->mainFrame(); |
| 1055 if (!main_frame) |
| 1056 return; |
| 1057 |
| 1058 blink::WebDocument document = main_frame->document(); |
| 1045 // <object>/<iframe> with id="pdf-viewer" is created in | 1059 // <object>/<iframe> with id="pdf-viewer" is created in |
| 1046 // chrome/browser/resources/print_preview/print_preview.js | 1060 // chrome/browser/resources/print_preview/print_preview.js |
| 1047 blink::WebElement pdf_element = document.getElementById("pdf-viewer"); | 1061 blink::WebElement pdf_element = document.getElementById("pdf-viewer"); |
| 1048 if (pdf_element.isNull()) { | 1062 if (pdf_element.isNull()) { |
| 1049 NOTREACHED(); | 1063 NOTREACHED(); |
| 1050 return; | 1064 return; |
| 1051 } | 1065 } |
| 1052 | 1066 |
| 1053 // The out-of-process plugin element is nested within a frame. In tests, there | 1067 // The out-of-process plugin element is nested within a frame. In tests, there |
| 1054 // may not be an iframe containing the out-of-process plugin, so continue with | 1068 // may not be an iframe containing the out-of-process plugin, so continue with |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1181 if (prep_frame_view_ && prep_frame_view_->IsLoadingSelection()) { | 1195 if (prep_frame_view_ && prep_frame_view_->IsLoadingSelection()) { |
| 1182 reset_prep_frame_view_ = true; | 1196 reset_prep_frame_view_ = true; |
| 1183 return; | 1197 return; |
| 1184 } | 1198 } |
| 1185 | 1199 |
| 1186 const PrintMsg_Print_Params& print_params = print_pages_params_->params; | 1200 const PrintMsg_Print_Params& print_params = print_pages_params_->params; |
| 1187 prep_frame_view_.reset(new PrepareFrameAndViewForPrint( | 1201 prep_frame_view_.reset(new PrepareFrameAndViewForPrint( |
| 1188 print_params, print_preview_context_.source_frame(), | 1202 print_params, print_preview_context_.source_frame(), |
| 1189 print_preview_context_.source_node(), ignore_css_margins_)); | 1203 print_preview_context_.source_node(), ignore_css_margins_)); |
| 1190 prep_frame_view_->CopySelectionIfNeeded( | 1204 prep_frame_view_->CopySelectionIfNeeded( |
| 1191 render_frame()->GetWebkitPreferences(), | 1205 render_view()->GetWebkitPreferences(), |
| 1192 base::Bind(&PrintWebViewHelper::OnFramePreparedForPreviewDocument, | 1206 base::Bind(&PrintWebViewHelper::OnFramePreparedForPreviewDocument, |
| 1193 base::Unretained(this))); | 1207 base::Unretained(this))); |
| 1194 } | 1208 } |
| 1195 | 1209 |
| 1196 void PrintWebViewHelper::OnFramePreparedForPreviewDocument() { | 1210 void PrintWebViewHelper::OnFramePreparedForPreviewDocument() { |
| 1197 if (reset_prep_frame_view_) { | 1211 if (reset_prep_frame_view_) { |
| 1198 PrepareFrameForPreviewDocument(); | 1212 PrepareFrameForPreviewDocument(); |
| 1199 return; | 1213 return; |
| 1200 } | 1214 } |
| 1201 DidFinishPrinting(CreatePreviewDocument() ? OK : FAIL_PREVIEW); | 1215 DidFinishPrinting(CreatePreviewDocument() ? OK : FAIL_PREVIEW); |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1366 | 1380 |
| 1367 void PrintWebViewHelper::OnPrintingDone(bool success) { | 1381 void PrintWebViewHelper::OnPrintingDone(bool success) { |
| 1368 if (ipc_nesting_level_ > 1) | 1382 if (ipc_nesting_level_ > 1) |
| 1369 return; | 1383 return; |
| 1370 notify_browser_of_print_failure_ = false; | 1384 notify_browser_of_print_failure_ = false; |
| 1371 if (!success) | 1385 if (!success) |
| 1372 LOG(ERROR) << "Failure in OnPrintingDone"; | 1386 LOG(ERROR) << "Failure in OnPrintingDone"; |
| 1373 DidFinishPrinting(success ? OK : FAIL_PRINT); | 1387 DidFinishPrinting(success ? OK : FAIL_PRINT); |
| 1374 } | 1388 } |
| 1375 | 1389 |
| 1376 void PrintWebViewHelper::OnSetPrintingEnabled(bool enabled) { | 1390 void PrintWebViewHelper::SetScriptedPrintBlocked(bool blocked) { |
| 1377 is_printing_enabled_ = enabled; | 1391 is_scripted_printing_blocked_ = blocked; |
| 1378 } | 1392 } |
| 1379 | 1393 |
| 1380 #if BUILDFLAG(ENABLE_PRINT_PREVIEW) | 1394 #if BUILDFLAG(ENABLE_PRINT_PREVIEW) |
| 1381 void PrintWebViewHelper::OnInitiatePrintPreview(bool has_selection) { | 1395 void PrintWebViewHelper::OnInitiatePrintPreview(bool selection_only) { |
| 1382 if (ipc_nesting_level_ > 1) | 1396 if (ipc_nesting_level_ > 1) |
| 1383 return; | 1397 return; |
| 1384 | 1398 blink::WebLocalFrame* frame = NULL; |
| 1385 blink::WebLocalFrame* frame = render_frame()->GetWebFrame(); | 1399 GetPrintFrame(&frame); |
| 1386 | 1400 DCHECK(frame); |
| 1387 // If we are printing a PDF extension frame, find the plugin node and print | 1401 // If we are printing a PDF extension frame, find the plugin node and print |
| 1388 // that instead. | 1402 // that instead. |
| 1389 auto plugin = delegate_->GetPdfElement(frame); | 1403 auto plugin = delegate_->GetPdfElement(frame); |
| 1390 if (!plugin.isNull()) { | 1404 if (!plugin.isNull()) { |
| 1391 PrintNode(plugin); | 1405 PrintNode(plugin); |
| 1392 return; | 1406 return; |
| 1393 } | 1407 } |
| 1394 print_preview_context_.InitWithFrame(frame); | 1408 print_preview_context_.InitWithFrame(frame); |
| 1395 RequestPrintPreview(has_selection | 1409 RequestPrintPreview(selection_only |
| 1396 ? PRINT_PREVIEW_USER_INITIATED_SELECTION | 1410 ? PRINT_PREVIEW_USER_INITIATED_SELECTION |
| 1397 : PRINT_PREVIEW_USER_INITIATED_ENTIRE_FRAME); | 1411 : PRINT_PREVIEW_USER_INITIATED_ENTIRE_FRAME); |
| 1398 } | 1412 } |
| 1399 #endif | 1413 #endif |
| 1400 | 1414 |
| 1401 bool PrintWebViewHelper::IsPrintingEnabled() const { | 1415 bool PrintWebViewHelper::IsPrintingEnabled() { |
| 1402 return is_printing_enabled_; | 1416 bool result = false; |
| 1417 Send(new PrintHostMsg_IsPrintingEnabled(routing_id(), &result)); |
| 1418 return result; |
| 1403 } | 1419 } |
| 1404 | 1420 |
| 1405 void PrintWebViewHelper::PrintNode(const blink::WebNode& node) { | 1421 void PrintWebViewHelper::PrintNode(const blink::WebNode& node) { |
| 1406 if (node.isNull() || !node.document().frame()) { | 1422 if (node.isNull() || !node.document().frame()) { |
| 1407 // This can occur when the context menu refers to an invalid WebNode. | 1423 // This can occur when the context menu refers to an invalid WebNode. |
| 1408 // See http://crbug.com/100890#c17 for a repro case. | 1424 // See http://crbug.com/100890#c17 for a repro case. |
| 1409 return; | 1425 return; |
| 1410 } | 1426 } |
| 1411 | 1427 |
| 1412 if (print_node_in_progress_) { | 1428 if (print_node_in_progress_) { |
| (...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1787 if (!frame || prep_frame_view_) | 1803 if (!frame || prep_frame_view_) |
| 1788 return false; | 1804 return false; |
| 1789 | 1805 |
| 1790 const PrintMsg_PrintPages_Params& params = *print_pages_params_; | 1806 const PrintMsg_PrintPages_Params& params = *print_pages_params_; |
| 1791 const PrintMsg_Print_Params& print_params = params.params; | 1807 const PrintMsg_Print_Params& print_params = params.params; |
| 1792 prep_frame_view_.reset(new PrepareFrameAndViewForPrint( | 1808 prep_frame_view_.reset(new PrepareFrameAndViewForPrint( |
| 1793 print_params, frame, node, ignore_css_margins_)); | 1809 print_params, frame, node, ignore_css_margins_)); |
| 1794 DCHECK(!print_pages_params_->params.selection_only || | 1810 DCHECK(!print_pages_params_->params.selection_only || |
| 1795 print_pages_params_->pages.empty()); | 1811 print_pages_params_->pages.empty()); |
| 1796 prep_frame_view_->CopySelectionIfNeeded( | 1812 prep_frame_view_->CopySelectionIfNeeded( |
| 1797 render_frame()->GetWebkitPreferences(), | 1813 render_view()->GetWebkitPreferences(), |
| 1798 base::Bind(&PrintWebViewHelper::OnFramePreparedForPrintPages, | 1814 base::Bind(&PrintWebViewHelper::OnFramePreparedForPrintPages, |
| 1799 base::Unretained(this))); | 1815 base::Unretained(this))); |
| 1800 return true; | 1816 return true; |
| 1801 } | 1817 } |
| 1802 #endif // BUILDFLAG(ENABLE_BASIC_PRINTING) | 1818 #endif // BUILDFLAG(ENABLE_BASIC_PRINTING) |
| 1803 | 1819 |
| 1804 #if !defined(OS_MACOSX) | 1820 #if !defined(OS_MACOSX) |
| 1805 void PrintWebViewHelper::PrintPageInternal( | 1821 void PrintWebViewHelper::PrintPageInternal( |
| 1806 const PrintMsg_PrintPage_Params& params, | 1822 const PrintMsg_PrintPage_Params& params, |
| 1807 blink::WebLocalFrame* frame, | 1823 blink::WebLocalFrame* frame, |
| (...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2317 blink::WebConsoleMessage::LevelWarning, message)); | 2333 blink::WebConsoleMessage::LevelWarning, message)); |
| 2318 return false; | 2334 return false; |
| 2319 } | 2335 } |
| 2320 | 2336 |
| 2321 void PrintWebViewHelper::ScriptingThrottler::Reset() { | 2337 void PrintWebViewHelper::ScriptingThrottler::Reset() { |
| 2322 // Reset counter on successful print. | 2338 // Reset counter on successful print. |
| 2323 count_ = 0; | 2339 count_ = 0; |
| 2324 } | 2340 } |
| 2325 | 2341 |
| 2326 } // namespace printing | 2342 } // namespace printing |
| OLD | NEW |