Index: chrome/renderer/printing/print_web_view_helper.cc |
diff --git a/chrome/renderer/printing/print_web_view_helper.cc b/chrome/renderer/printing/print_web_view_helper.cc |
index d3023418b8496de4de01a2449f3235c660421b3d..330040f0605f86655ee4ec35465e9240164873ed 100644 |
--- a/chrome/renderer/printing/print_web_view_helper.cc |
+++ b/chrome/renderer/printing/print_web_view_helper.cc |
@@ -304,14 +304,16 @@ void ComputeWebKitPrintParamsInDesiredDpi( |
print_params.desired_dpi); |
} |
+WebKit::WebPlugin* GetPlugin(const WebKit::WebFrame* frame) { |
+ return frame->document().isPluginDocument() ? |
+ frame->document().to<WebKit::WebPluginDocument>().plugin() : NULL; |
+} |
+ |
bool PrintingNodeOrPdfFrame(const WebKit::WebFrame* frame, |
const WebKit::WebNode& node) { |
if (!node.isNull()) |
return true; |
- if (!frame->document().isPluginDocument()) |
- return false; |
- WebKit::WebPlugin* plugin = |
- frame->document().to<WebKit::WebPluginDocument>().plugin(); |
+ WebKit::WebPlugin* plugin = GetPlugin(frame); |
return plugin && plugin->supportsPaginatedPrint(); |
} |
@@ -741,7 +743,10 @@ PrintWebViewHelper::PrintWebViewHelper(content::RenderView* render_view) |
is_scripted_printing_blocked_(false), |
notify_browser_of_print_failure_(true), |
print_for_preview_(false), |
- print_node_in_progress_(false) { |
+ print_node_in_progress_(false), |
+ is_loading_(false), |
+ is_scripted_preview_delayed_(false), |
+ weak_ptr_factory_(this) { |
} |
PrintWebViewHelper::~PrintWebViewHelper() {} |
@@ -761,6 +766,15 @@ bool PrintWebViewHelper::IsScriptInitiatedPrintAllowed( |
return true; |
} |
+void PrintWebViewHelper::DidStartLoading() { |
+ is_loading_ = true; |
+} |
+ |
+void PrintWebViewHelper::DidStopLoading() { |
+ is_loading_ = false; |
+ ShowScriptedPrintPreview(); |
+} |
+ |
// Prints |frame| which called window.print(). |
void PrintWebViewHelper::PrintPage(WebKit::WebFrame* frame, |
bool user_initiated) { |
@@ -1658,6 +1672,15 @@ void PrintWebViewHelper::IncrementScriptedPrintCount() { |
last_cancelled_script_print_ = base::Time::Now(); |
} |
+ |
+void PrintWebViewHelper::ShowScriptedPrintPreview() { |
+ if (is_scripted_preview_delayed_) { |
+ is_scripted_preview_delayed_ = false; |
+ Send(new PrintHostMsg_ShowScriptedPrintPreview(routing_id(), |
+ print_preview_context_.IsModifiable())); |
+ } |
+} |
+ |
void PrintWebViewHelper::RequestPrintPreview(PrintPreviewRequestType type) { |
const bool is_modifiable = print_preview_context_.IsModifiable(); |
const bool has_selection = print_preview_context_.HasSelection(); |
@@ -1667,10 +1690,27 @@ void PrintWebViewHelper::RequestPrintPreview(PrintPreviewRequestType type) { |
params.has_selection = has_selection; |
switch (type) { |
case PRINT_PREVIEW_SCRIPTED: { |
+ // Shows scripted print preview in two stages. |
+ // 1. PrintHostMsg_SetupScriptedPrintPreview blocks this call and JS by |
+ // pumping messages here. |
+ // 2. PrintHostMsg_ShowScriptedPrintPreview shows preview once the |
+ // document has been loaded. |
+ is_scripted_preview_delayed_ = true; |
+ if (is_loading_ && GetPlugin(print_preview_context_.source_frame())) { |
+ // Wait for DidStopLoading. Plugins may not know the correct |
+ // |is_modifiable| value until they are fully loaded, which occurs when |
+ // DidStopLoading() is called. Defer showing the preview until then. |
+ } else { |
+ base::MessageLoop::current()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&PrintWebViewHelper::ShowScriptedPrintPreview, |
+ weak_ptr_factory_.GetWeakPtr())); |
+ } |
IPC::SyncMessage* msg = |
- new PrintHostMsg_ScriptedPrintPreview(routing_id(), is_modifiable); |
+ new PrintHostMsg_SetupScriptedPrintPreview(routing_id()); |
msg->EnableMessagePumping(); |
Send(msg); |
+ is_scripted_preview_delayed_ = false; |
return; |
} |
case PRINT_PREVIEW_USER_INITIATED_ENTIRE_FRAME: { |