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" | |
11 #include "base/json/json_writer.h" | 10 #include "base/json/json_writer.h" |
12 #include "base/logging.h" | 11 #include "base/logging.h" |
13 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
14 #include "base/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
15 #include "base/process/process_handle.h" | 14 #include "base/process/process_handle.h" |
16 #include "base/strings/string_number_conversions.h" | 15 #include "base/strings/string_number_conversions.h" |
17 #include "base/strings/stringprintf.h" | 16 #include "base/strings/stringprintf.h" |
18 #include "base/strings/utf_string_conversions.h" | 17 #include "base/strings/utf_string_conversions.h" |
19 #include "chrome/common/chrome_switches.h" | |
20 #include "chrome/common/print_messages.h" | 18 #include "chrome/common/print_messages.h" |
dgn
2015/01/05 22:45:48
Will move to //components/printing/common/print_me
| |
21 #include "chrome/common/render_messages.h" | |
22 #include "chrome/grit/browser_resources.h" | 19 #include "chrome/grit/browser_resources.h" |
dgn
2015/01/05 22:45:48
The used variable will be moved to //components/pr
| |
23 #include "chrome/renderer/prerender/prerender_helper.h" | |
24 #include "content/public/common/web_preferences.h" | 20 #include "content/public/common/web_preferences.h" |
25 #include "content/public/renderer/render_frame.h" | 21 #include "content/public/renderer/render_frame.h" |
26 #include "content/public/renderer/render_thread.h" | 22 #include "content/public/renderer/render_thread.h" |
27 #include "content/public/renderer/render_view.h" | 23 #include "content/public/renderer/render_view.h" |
28 #include "net/base/escape.h" | 24 #include "net/base/escape.h" |
29 #include "printing/pdf_metafile_skia.h" | 25 #include "printing/pdf_metafile_skia.h" |
30 #include "printing/units.h" | 26 #include "printing/units.h" |
31 #include "third_party/WebKit/public/platform/WebSize.h" | 27 #include "third_party/WebKit/public/platform/WebSize.h" |
32 #include "third_party/WebKit/public/platform/WebURLRequest.h" | 28 #include "third_party/WebKit/public/platform/WebURLRequest.h" |
33 #include "third_party/WebKit/public/web/WebConsoleMessage.h" | 29 #include "third_party/WebKit/public/web/WebConsoleMessage.h" |
34 #include "third_party/WebKit/public/web/WebDocument.h" | 30 #include "third_party/WebKit/public/web/WebDocument.h" |
35 #include "third_party/WebKit/public/web/WebElement.h" | 31 #include "third_party/WebKit/public/web/WebElement.h" |
36 #include "third_party/WebKit/public/web/WebFrameClient.h" | 32 #include "third_party/WebKit/public/web/WebFrameClient.h" |
37 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 33 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
38 #include "third_party/WebKit/public/web/WebPlugin.h" | 34 #include "third_party/WebKit/public/web/WebPlugin.h" |
39 #include "third_party/WebKit/public/web/WebPluginDocument.h" | 35 #include "third_party/WebKit/public/web/WebPluginDocument.h" |
40 #include "third_party/WebKit/public/web/WebPrintParams.h" | 36 #include "third_party/WebKit/public/web/WebPrintParams.h" |
41 #include "third_party/WebKit/public/web/WebPrintPresetOptions.h" | 37 #include "third_party/WebKit/public/web/WebPrintPresetOptions.h" |
42 #include "third_party/WebKit/public/web/WebPrintScalingOption.h" | 38 #include "third_party/WebKit/public/web/WebPrintScalingOption.h" |
43 #include "third_party/WebKit/public/web/WebScriptSource.h" | 39 #include "third_party/WebKit/public/web/WebScriptSource.h" |
44 #include "third_party/WebKit/public/web/WebSettings.h" | 40 #include "third_party/WebKit/public/web/WebSettings.h" |
45 #include "third_party/WebKit/public/web/WebView.h" | 41 #include "third_party/WebKit/public/web/WebView.h" |
46 #include "third_party/WebKit/public/web/WebViewClient.h" | 42 #include "third_party/WebKit/public/web/WebViewClient.h" |
47 #include "ui/base/resource/resource_bundle.h" | 43 #include "ui/base/resource/resource_bundle.h" |
48 | 44 |
49 #if defined(ENABLE_EXTENSIONS) | 45 #if defined(ENABLE_EXTENSIONS) |
50 #include "chrome/common/extensions/extension_constants.h" | |
51 #include "extensions/common/constants.h" | 46 #include "extensions/common/constants.h" |
52 #endif // defined(ENABLE_EXTENSIONS) | 47 #endif // defined(ENABLE_EXTENSIONS) |
53 | 48 |
54 using content::WebPreferences; | 49 using content::WebPreferences; |
55 | 50 |
56 namespace printing { | 51 namespace printing { |
57 | 52 |
53 static const char kPdfExtensionId[] = "mhjfbmdgcfjbbpaeojofohoefgiehjai"; | |
Lei Zhang
2015/01/06 04:11:32
Can we pass this in, instead of duplicating the va
dgn
2015/01/06 16:35:31
Done.
| |
54 | |
58 namespace { | 55 namespace { |
59 | 56 |
60 enum PrintPreviewHelperEvents { | 57 enum PrintPreviewHelperEvents { |
61 PREVIEW_EVENT_REQUESTED, | 58 PREVIEW_EVENT_REQUESTED, |
62 PREVIEW_EVENT_CACHE_HIT, // Unused | 59 PREVIEW_EVENT_CACHE_HIT, // Unused |
63 PREVIEW_EVENT_CREATE_DOCUMENT, | 60 PREVIEW_EVENT_CREATE_DOCUMENT, |
64 PREVIEW_EVENT_NEW_SETTINGS, // Unused | 61 PREVIEW_EVENT_NEW_SETTINGS, // Unused |
65 PREVIEW_EVENT_MAX, | 62 PREVIEW_EVENT_MAX, |
66 }; | 63 }; |
67 | 64 |
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
408 *scale_factor = factor; | 405 *scale_factor = factor; |
409 } | 406 } |
410 return result_params; | 407 return result_params; |
411 } | 408 } |
412 | 409 |
413 // Return the PDF object element if |frame| is the out of process PDF extension. | 410 // Return the PDF object element if |frame| is the out of process PDF extension. |
414 blink::WebElement GetPdfElement(blink::WebLocalFrame* frame) { | 411 blink::WebElement GetPdfElement(blink::WebLocalFrame* frame) { |
415 #if defined(ENABLE_EXTENSIONS) | 412 #if defined(ENABLE_EXTENSIONS) |
416 GURL url = frame->document().url(); | 413 GURL url = frame->document().url(); |
417 if (url.SchemeIs(extensions::kExtensionScheme) && | 414 if (url.SchemeIs(extensions::kExtensionScheme) && |
418 url.host() == extension_misc::kPdfExtensionId) { | 415 url.host() == kPdfExtensionId) { |
419 // <object> with id="plugin" is created in | 416 // <object> with id="plugin" is created in |
420 // chrome/browser/resources/pdf/pdf.js. | 417 // chrome/browser/resources/pdf/pdf.js. |
421 auto plugin_element = frame->document().getElementById("plugin"); | 418 auto plugin_element = frame->document().getElementById("plugin"); |
422 if (!plugin_element.isNull()) { | 419 if (!plugin_element.isNull()) { |
423 return plugin_element; | 420 return plugin_element; |
424 } | 421 } |
425 NOTREACHED(); | 422 NOTREACHED(); |
426 } | 423 } |
427 #endif // defined(ENABLE_EXTENSIONS) | 424 #endif // defined(ENABLE_EXTENSIONS) |
428 return blink::WebElement(); | 425 return blink::WebElement(); |
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
783 if (owns_web_view_) { | 780 if (owns_web_view_) { |
784 DCHECK(!frame->isLoading()); | 781 DCHECK(!frame->isLoading()); |
785 owns_web_view_ = false; | 782 owns_web_view_ = false; |
786 web_view->close(); | 783 web_view->close(); |
787 } | 784 } |
788 } | 785 } |
789 frame_.Reset(NULL); | 786 frame_.Reset(NULL); |
790 on_ready_.Reset(); | 787 on_ready_.Reset(); |
791 } | 788 } |
792 | 789 |
793 PrintWebViewHelper::PrintWebViewHelper(content::RenderView* render_view) | 790 PrintWebViewHelper::PrintWebViewHelper( |
791 content::RenderView* render_view, | |
792 const bool out_of_process_pdf_enabled, | |
793 const bool print_preview_disabled, | |
794 Delegate* delegate) | |
794 : content::RenderViewObserver(render_view), | 795 : content::RenderViewObserver(render_view), |
795 content::RenderViewObserverTracker<PrintWebViewHelper>(render_view), | 796 content::RenderViewObserverTracker<PrintWebViewHelper>(render_view), |
796 reset_prep_frame_view_(false), | 797 reset_prep_frame_view_(false), |
797 is_print_ready_metafile_sent_(false), | 798 is_print_ready_metafile_sent_(false), |
798 ignore_css_margins_(false), | 799 ignore_css_margins_(false), |
799 is_scripted_printing_blocked_(false), | 800 is_scripted_printing_blocked_(false), |
800 notify_browser_of_print_failure_(true), | 801 notify_browser_of_print_failure_(true), |
801 print_for_preview_(false), | 802 print_for_preview_(false), |
803 out_of_process_pdf_enabled_(out_of_process_pdf_enabled), | |
804 delegate_(delegate), | |
802 print_node_in_progress_(false), | 805 print_node_in_progress_(false), |
803 is_loading_(false), | 806 is_loading_(false), |
804 is_scripted_preview_delayed_(false), | 807 is_scripted_preview_delayed_(false), |
805 weak_ptr_factory_(this) { | 808 weak_ptr_factory_(this) { |
806 if (CommandLine::ForCurrentProcess()->HasSwitch( | 809 if (print_preview_disabled) { |
807 switches::kDisablePrintPreview)) { | |
808 DisablePreview(); | 810 DisablePreview(); |
809 } | 811 } |
810 } | 812 } |
811 | 813 |
812 PrintWebViewHelper::~PrintWebViewHelper() {} | 814 PrintWebViewHelper::~PrintWebViewHelper() {} |
813 | 815 |
814 // static | 816 // static |
815 void PrintWebViewHelper::DisablePreview() { | 817 void PrintWebViewHelper::DisablePreview() { |
816 g_is_preview_enabled_ = false; | 818 g_is_preview_enabled_ = false; |
817 } | 819 } |
(...skipping 20 matching lines...) Expand all Loading... | |
838 on_stop_loading_closure_.Reset(); | 840 on_stop_loading_closure_.Reset(); |
839 } | 841 } |
840 } | 842 } |
841 | 843 |
842 // Prints |frame| which called window.print(). | 844 // Prints |frame| which called window.print(). |
843 void PrintWebViewHelper::PrintPage(blink::WebLocalFrame* frame, | 845 void PrintWebViewHelper::PrintPage(blink::WebLocalFrame* frame, |
844 bool user_initiated) { | 846 bool user_initiated) { |
845 DCHECK(frame); | 847 DCHECK(frame); |
846 | 848 |
847 // Allow Prerendering to cancel this print request if necessary. | 849 // Allow Prerendering to cancel this print request if necessary. |
848 if (prerender::PrerenderHelper::IsPrerendering( | 850 if (delegate_->CancelPrerender(render_view(), routing_id())) |
849 render_view()->GetMainRenderFrame())) { | |
850 Send(new ChromeViewHostMsg_CancelPrerenderForPrinting(routing_id())); | |
851 return; | 851 return; |
852 } | |
853 | 852 |
854 if (!IsScriptInitiatedPrintAllowed(frame, user_initiated)) | 853 if (!IsScriptInitiatedPrintAllowed(frame, user_initiated)) |
855 return; | 854 return; |
856 | 855 |
857 if (!g_is_preview_enabled_) { | 856 if (!g_is_preview_enabled_) { |
858 Print(frame, blink::WebNode(), true); | 857 Print(frame, blink::WebNode(), true); |
859 } else { | 858 } else { |
860 print_preview_context_.InitWithFrame(frame); | 859 print_preview_context_.InitWithFrame(frame); |
861 RequestPrintPreview(PRINT_PREVIEW_SCRIPTED); | 860 RequestPrintPreview(PRINT_PREVIEW_SCRIPTED); |
862 } | 861 } |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
899 if (pdf_element.isNull()) { | 898 if (pdf_element.isNull()) { |
900 NOTREACHED(); | 899 NOTREACHED(); |
901 return; | 900 return; |
902 } | 901 } |
903 | 902 |
904 // The out-of-process plugin element is nested within a frame. In tests, there | 903 // The out-of-process plugin element is nested within a frame. In tests, there |
905 // may not be an iframe containing the out-of-process plugin, so continue with | 904 // may not be an iframe containing the out-of-process plugin, so continue with |
906 // the element with ID "pdf-viewer" if it isn't an iframe. | 905 // the element with ID "pdf-viewer" if it isn't an iframe. |
907 blink::WebLocalFrame* plugin_frame = pdf_element.document().frame(); | 906 blink::WebLocalFrame* plugin_frame = pdf_element.document().frame(); |
908 blink::WebElement plugin_element = pdf_element; | 907 blink::WebElement plugin_element = pdf_element; |
909 if (switches::OutOfProcessPdfEnabled() && | 908 if (out_of_process_pdf_enabled_ && pdf_element.hasHTMLTagName("iframe")) { |
910 pdf_element.hasHTMLTagName("iframe")) { | |
911 plugin_frame = blink::WebLocalFrame::fromFrameOwnerElement(pdf_element); | 909 plugin_frame = blink::WebLocalFrame::fromFrameOwnerElement(pdf_element); |
912 plugin_element = GetPdfElement(plugin_frame); | 910 plugin_element = GetPdfElement(plugin_frame); |
913 if (plugin_element.isNull()) { | 911 if (plugin_element.isNull()) { |
914 NOTREACHED(); | 912 NOTREACHED(); |
915 return; | 913 return; |
916 } | 914 } |
917 } | 915 } |
918 | 916 |
919 // Set |print_for_preview_| flag and autoreset it to back to original | 917 // Set |print_for_preview_| flag and autoreset it to back to original |
920 // on return. | 918 // on return. |
(...skipping 1134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2055 blink::WebConsoleMessage::LevelWarning, message)); | 2053 blink::WebConsoleMessage::LevelWarning, message)); |
2056 return false; | 2054 return false; |
2057 } | 2055 } |
2058 | 2056 |
2059 void PrintWebViewHelper::ScriptingThrottler::Reset() { | 2057 void PrintWebViewHelper::ScriptingThrottler::Reset() { |
2060 // Reset counter on successful print. | 2058 // Reset counter on successful print. |
2061 count_ = 0; | 2059 count_ = 0; |
2062 } | 2060 } |
2063 | 2061 |
2064 } // namespace printing | 2062 } // namespace printing |
OLD | NEW |