Index: chrome/renderer/print_web_view_helper.cc |
=================================================================== |
--- chrome/renderer/print_web_view_helper.cc (revision 105826) |
+++ chrome/renderer/print_web_view_helper.cc (working copy) |
@@ -8,6 +8,7 @@ |
#include "base/command_line.h" |
#include "base/logging.h" |
+#include "base/message_loop.h" |
#include "base/metrics/histogram.h" |
#include "base/string_number_conversions.h" |
#include "base/utf_string_conversions.h" |
@@ -467,8 +468,21 @@ |
IncrementScriptedPrintCount(); |
if (is_preview_) { |
+ // Ignore window.print() if this view is already doing window.print(). |
+ if (print_preview_context_.in_nested_message_loop()) |
+ return; |
+ |
print_preview_context_.InitWithFrame(frame); |
RequestPrintPreview(); |
+ |
+ WebView::willEnterModalLoop(); |
+ MessageLoop* message_loop = MessageLoop::current(); |
+ print_preview_context_.set_in_nested_message_loop(true); |
+ bool old_state = message_loop->NestableTasksAllowed(); |
+ message_loop->SetNestableTasksAllowed(true); |
+ message_loop->Run(); |
+ message_loop->SetNestableTasksAllowed(old_state); |
+ WebView::didExitModalLoop(); |
} else { |
Print(frame, WebNode()); |
} |
@@ -489,6 +503,8 @@ |
ResetScriptedPrintCount) |
IPC_MESSAGE_HANDLER(PrintMsg_PreviewPrintingRequestCancelled, |
DisplayPrintJobError) |
+ IPC_MESSAGE_HANDLER(PrintMsg_PrintPreviewDone, |
+ OnPrintPreviewDone) |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
return handled; |
@@ -1259,6 +1275,13 @@ |
l10n_util::GetStringUTF16(IDS_PRINT_SPOOL_FAILED_ERROR_TEXT)); |
} |
+void PrintWebViewHelper::OnPrintPreviewDone() { |
+ if (print_preview_context_.in_nested_message_loop()) { |
+ print_preview_context_.set_in_nested_message_loop(false); |
+ MessageLoop::current()->QuitNow(); |
+ } |
+} |
+ |
void PrintWebViewHelper::RequestPrintPreview() { |
old_print_pages_params_.reset(); |
Send(new PrintHostMsg_RequestPrintPreview(routing_id())); |
@@ -1317,6 +1340,7 @@ |
PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() |
: frame_(NULL), |
+ in_nested_message_loop_(false), |
total_page_count_(0), |
current_page_index_(0), |
generate_draft_pages_(true), |
@@ -1490,6 +1514,12 @@ |
error_ = error; |
} |
+void PrintWebViewHelper::PrintPreviewContext::set_in_nested_message_loop( |
+ bool nested) { |
+ CHECK(!nested || !in_nested_message_loop_); |
+ in_nested_message_loop_ = nested; |
+} |
+ |
WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const { |
return frame_; |
} |
@@ -1498,6 +1528,10 @@ |
return node_; |
} |
+bool PrintWebViewHelper::PrintPreviewContext::in_nested_message_loop() const { |
+ return in_nested_message_loop_; |
darin (slow to review)
2011/10/17 22:16:33
can you explain why you need this member variable?
Lei Zhang
2011/10/17 22:26:05
Yes, it is possible to receive spurious calls to O
|
+} |
+ |
int PrintWebViewHelper::PrintPreviewContext::total_page_count() const { |
DCHECK(IsReadyToRender()); |
return total_page_count_; |