Chromium Code Reviews| 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_; |