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_.message_loop()) |
+ return; |
+ |
print_preview_context_.InitWithFrame(frame); |
RequestPrintPreview(); |
+ |
+ WebView::willEnterModalLoop(); |
+ MessageLoop* message_loop = MessageLoop::current(); |
+ print_preview_context_.set_message_loop(message_loop); |
+ 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,15 @@ |
l10n_util::GetStringUTF16(IDS_PRINT_SPOOL_FAILED_ERROR_TEXT)); |
} |
+void PrintWebViewHelper::OnPrintPreviewDone() { |
+ MessageLoop* message_loop = print_preview_context_.message_loop(); |
darin (slow to review)
2011/10/17 19:41:39
why do you need the MessageLoop member here? just
Lei Zhang
2011/10/17 20:07:06
Done.
|
+ if (message_loop) { |
+ MessageLoop* message_loop = print_preview_context_.message_loop(); |
+ print_preview_context_.set_message_loop(NULL); |
+ message_loop->QuitNow(); |
+ } |
+} |
+ |
void PrintWebViewHelper::RequestPrintPreview() { |
old_print_pages_params_.reset(); |
Send(new PrintHostMsg_RequestPrintPreview(routing_id())); |
@@ -1317,6 +1342,7 @@ |
PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() |
: frame_(NULL), |
+ message_loop_(NULL), |
total_page_count_(0), |
current_page_index_(0), |
generate_draft_pages_(true), |
@@ -1490,6 +1516,12 @@ |
error_ = error; |
} |
+void PrintWebViewHelper::PrintPreviewContext::set_message_loop( |
+ MessageLoop* message_loop) { |
+ CHECK(!message_loop || !message_loop_); |
+ message_loop_ = message_loop; |
+} |
+ |
WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const { |
return frame_; |
} |
@@ -1498,6 +1530,10 @@ |
return node_; |
} |
+MessageLoop* PrintWebViewHelper::PrintPreviewContext::message_loop() const { |
+ return message_loop_; |
+} |
+ |
int PrintWebViewHelper::PrintPreviewContext::total_page_count() const { |
DCHECK(IsReadyToRender()); |
return total_page_count_; |