Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4568)

Unified Diff: chrome/renderer/print_web_view_helper.cc

Issue 8136027: Print Preview: Make print preview tab modal. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: address comments Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/renderer/print_web_view_helper.h ('k') | chrome/test/base/test_tab_strip_model_observer.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_;
« no previous file with comments | « chrome/renderer/print_web_view_helper.h ('k') | chrome/test/base/test_tab_strip_model_observer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698