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

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: rebase, more fixes 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
Index: chrome/renderer/print_web_view_helper.cc
===================================================================
--- chrome/renderer/print_web_view_helper.cc (revision 105275)
+++ 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"
@@ -534,8 +535,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());
}
@@ -556,6 +570,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;
@@ -1322,6 +1338,15 @@
l10n_util::GetStringUTF16(IDS_PRINT_SPOOL_FAILED_ERROR_TEXT));
}
+void PrintWebViewHelper::OnPrintPreviewDone() {
+ MessageLoop* message_loop = print_preview_context_.message_loop();
+ 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()));
@@ -1380,6 +1405,7 @@
PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext()
: frame_(NULL),
+ message_loop_(NULL),
total_page_count_(0),
current_page_index_(0),
generate_draft_pages_(true),
@@ -1553,6 +1579,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_;
}
@@ -1561,6 +1593,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_;

Powered by Google App Engine
This is Rietveld 408576698