summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorthestig@chromium.org <thestig@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-23 08:55:24 +0000
committerthestig@chromium.org <thestig@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-23 08:55:24 +0000
commita9c36832d49e1fe97cfb378b474e047955917c40 (patch)
treef9b67f10f9c5341a43d3fdea471774b4e54eb166
parentb0dafaf9f930b128ef43d752c15a1bdb7620062b (diff)
downloadchromium_src-a9c36832d49e1fe97cfb378b474e047955917c40.zip
chromium_src-a9c36832d49e1fe97cfb378b474e047955917c40.tar.gz
chromium_src-a9c36832d49e1fe97cfb378b474e047955917c40.tar.bz2
Print Preview: Properly handle window.print().
BUG=92107 TEST=see bug Review URL: http://codereview.chromium.org/8515017 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@111332 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/printing/print_preview_message_handler.cc6
-rw-r--r--chrome/browser/printing/print_preview_tab_controller.cc17
-rw-r--r--chrome/browser/printing/print_preview_tab_controller.h3
-rw-r--r--chrome/browser/printing/print_preview_tab_controller_browsertest.cc5
-rw-r--r--chrome/browser/printing/print_preview_tab_controller_unittest.cc5
-rw-r--r--chrome/browser/printing/print_view_manager.cc78
-rw-r--r--chrome/browser/printing/print_view_manager.h23
-rw-r--r--chrome/browser/printing/printing_message_filter.cc3
-rw-r--r--chrome/browser/printing/printing_message_filter.h1
-rw-r--r--chrome/browser/ui/webui/print_preview_handler.cc9
-rw-r--r--chrome/browser/ui/webui/print_preview_handler_unittest.cc2
-rw-r--r--chrome/browser/ui/webui/print_preview_ui_unittest.cc12
-rw-r--r--chrome/common/print_messages.h4
-rw-r--r--chrome/renderer/print_web_view_helper.cc6
14 files changed, 152 insertions, 22 deletions
diff --git a/chrome/browser/printing/print_preview_message_handler.cc b/chrome/browser/printing/print_preview_message_handler.cc
index d3e1cdf..7cf1f0d 100644
--- a/chrome/browser/printing/print_preview_message_handler.cc
+++ b/chrome/browser/printing/print_preview_message_handler.cc
@@ -13,6 +13,7 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/printing/print_job_manager.h"
#include "chrome/browser/printing/print_preview_tab_controller.h"
+#include "chrome/browser/printing/print_view_manager.h"
#include "chrome/browser/printing/printer_query.h"
#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
#include "chrome/browser/ui/webui/print_preview_ui.h"
@@ -258,6 +259,11 @@ void PrintPreviewMessageHandler::NavigateToPendingEntry(
DCHECK_EQ(NavigationController::RELOAD, reload_type);
return;
}
+ // If |tab| is navigating and it has a print preview tab, notify |tab| to
+ // consider print preview done so it unfreezes the renderer in the case of
+ // window.print().
+ if (preview_tab)
+ tab->print_view_manager()->PrintPreviewDone();
}
} // namespace printing
diff --git a/chrome/browser/printing/print_preview_tab_controller.cc b/chrome/browser/printing/print_preview_tab_controller.cc
index ba6696a..9f542dd 100644
--- a/chrome/browser/printing/print_preview_tab_controller.cc
+++ b/chrome/browser/printing/print_preview_tab_controller.cc
@@ -252,7 +252,7 @@ void PrintPreviewTabController::OnRendererProcessClosed(
}
for (size_t i = 0; i < closed_initiator_tabs.size(); ++i)
- RemoveInitiatorTab(closed_initiator_tabs[i]);
+ RemoveInitiatorTab(closed_initiator_tabs[i], false);
}
void PrintPreviewTabController::OnTabContentsDestroyed(
@@ -266,7 +266,7 @@ void PrintPreviewTabController::OnTabContentsDestroyed(
if (tab == preview_tab)
RemovePreviewTab(tab);
else
- RemoveInitiatorTab(tab);
+ RemoveInitiatorTab(tab, false);
}
void PrintPreviewTabController::OnNavEntryCommitted(
@@ -310,7 +310,7 @@ void PrintPreviewTabController::OnNavEntryCommitted(
}
// Initiator tab navigated.
- RemoveInitiatorTab(tab);
+ RemoveInitiatorTab(tab, true);
}
// static
@@ -436,7 +436,7 @@ void PrintPreviewTabController::RemoveObservers(TabContentsWrapper* tab) {
}
void PrintPreviewTabController::RemoveInitiatorTab(
- TabContentsWrapper* initiator_tab) {
+ TabContentsWrapper* initiator_tab, bool is_navigation) {
TabContentsWrapper* preview_tab = GetPrintPreviewForTab(initiator_tab);
DCHECK(preview_tab);
// Update the map entry first, so when the print preview tab gets destroyed
@@ -445,6 +445,11 @@ void PrintPreviewTabController::RemoveInitiatorTab(
preview_tab_map_[preview_tab] = NULL;
RemoveObservers(initiator_tab);
+ // For the navigation case, PrintPreviewDone() has already been called in
+ // PrintPreviewMessageHandler::NavigateToPendingEntry().
+ if (!is_navigation)
+ initiator_tab->print_view_manager()->PrintPreviewDone();
+
// Initiator tab is closed. Close the print preview tab too.
PrintPreviewUI* print_preview_ui =
static_cast<PrintPreviewUI*>(preview_tab->web_ui());
@@ -456,8 +461,10 @@ void PrintPreviewTabController::RemovePreviewTab(
TabContentsWrapper* preview_tab) {
// Remove the initiator tab's observers before erasing the mapping.
TabContentsWrapper* initiator_tab = GetInitiatorTab(preview_tab);
- if (initiator_tab)
+ if (initiator_tab) {
RemoveObservers(initiator_tab);
+ initiator_tab->print_view_manager()->PrintPreviewDone();
+ }
// Print preview TabContents is destroyed. Notify |PrintPreviewUI| to abort
// the initiator tab preview request.
diff --git a/chrome/browser/printing/print_preview_tab_controller.h b/chrome/browser/printing/print_preview_tab_controller.h
index abd5056..af23ca7 100644
--- a/chrome/browser/printing/print_preview_tab_controller.h
+++ b/chrome/browser/printing/print_preview_tab_controller.h
@@ -106,7 +106,8 @@ class PrintPreviewTabController
void RemoveObservers(TabContentsWrapper* tab);
// Removes tabs when they close/crash/navigate.
- void RemoveInitiatorTab(TabContentsWrapper* initiator_tab);
+ void RemoveInitiatorTab(TabContentsWrapper* initiator_tab,
+ bool is_navigation);
void RemovePreviewTab(TabContentsWrapper* preview_tab);
// Mapping between print preview tab and the corresponding initiator tab.
diff --git a/chrome/browser/printing/print_preview_tab_controller_browsertest.cc b/chrome/browser/printing/print_preview_tab_controller_browsertest.cc
index c870827..4dcf532 100644
--- a/chrome/browser/printing/print_preview_tab_controller_browsertest.cc
+++ b/chrome/browser/printing/print_preview_tab_controller_browsertest.cc
@@ -4,6 +4,7 @@
#include "base/command_line.h"
#include "chrome/browser/printing/print_preview_tab_controller.h"
+#include "chrome/browser/printing/print_view_manager.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
@@ -69,6 +70,7 @@ IN_PROC_BROWSER_TEST_F(PrintPreviewTabControllerBrowserTest,
ASSERT_TRUE(tab_controller);
// Get the preview tab for initiator tab.
+ initiator_tab->print_view_manager()->PrintPreviewNow();
TabContentsWrapper* preview_tab =
tab_controller->GetOrCreatePreviewTab(initiator_tab);
@@ -85,6 +87,7 @@ IN_PROC_BROWSER_TEST_F(PrintPreviewTabControllerBrowserTest,
ASSERT_TRUE(observer.tab_destroyed());
// Get the print preview tab for initiator tab.
+ initiator_tab->print_view_manager()->PrintPreviewNow();
TabContentsWrapper* new_preview_tab =
tab_controller->GetOrCreatePreviewTab(initiator_tab);
@@ -115,6 +118,7 @@ IN_PROC_BROWSER_TEST_F(PrintPreviewTabControllerBrowserTest,
ASSERT_TRUE(tab_controller);
// Get the preview tab for initiator tab.
+ initiator_tab->print_view_manager()->PrintPreviewNow();
TabContentsWrapper* preview_tab =
tab_controller->GetOrCreatePreviewTab(initiator_tab);
@@ -134,6 +138,7 @@ IN_PROC_BROWSER_TEST_F(PrintPreviewTabControllerBrowserTest,
ASSERT_TRUE(tab_destroyed_observer.tab_destroyed());
// Get the print preview tab for initiator tab.
+ initiator_tab->print_view_manager()->PrintPreviewNow();
TabContentsWrapper* new_preview_tab =
tab_controller->GetOrCreatePreviewTab(initiator_tab);
diff --git a/chrome/browser/printing/print_preview_tab_controller_unittest.cc b/chrome/browser/printing/print_preview_tab_controller_unittest.cc
index 8fb8938..6e5941e 100644
--- a/chrome/browser/printing/print_preview_tab_controller_unittest.cc
+++ b/chrome/browser/printing/print_preview_tab_controller_unittest.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "chrome/browser/printing/print_preview_tab_controller.h"
+#include "chrome/browser/printing/print_view_manager.h"
#include "chrome/browser/tabs/tab_strip_model.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
@@ -48,6 +49,7 @@ TEST_F(PrintPreviewTabControllerUnitTest, MAYBE_GetOrCreatePreviewTab) {
ASSERT_TRUE(tab_controller);
// Get the preview tab for initiator tab.
+ initiator_tab->print_view_manager()->PrintPreviewNow();
TabContentsWrapper* preview_tab =
tab_controller->GetOrCreatePreviewTab(initiator_tab);
@@ -101,6 +103,7 @@ TEST_F(PrintPreviewTabControllerUnitTest, MAYBE_MultiplePreviewTabs) {
ASSERT_TRUE(tab_controller);
// Create preview tab for |tab_contents_1|
+ tab_contents_1->print_view_manager()->PrintPreviewNow();
TabContentsWrapper* preview_tab_1 =
tab_controller->GetOrCreatePreviewTab(tab_contents_1);
@@ -108,6 +111,7 @@ TEST_F(PrintPreviewTabControllerUnitTest, MAYBE_MultiplePreviewTabs) {
EXPECT_EQ(2, browser()->tab_count());
// Create preview tab for |tab_contents_2|
+ tab_contents_2->print_view_manager()->PrintPreviewNow();
TabContentsWrapper* preview_tab_2 =
tab_controller->GetOrCreatePreviewTab(tab_contents_2);
@@ -162,6 +166,7 @@ TEST_F(PrintPreviewTabControllerUnitTest, MAYBE_ClearInitiatorTabDetails) {
ASSERT_TRUE(tab_controller);
// Get the preview tab for initiator tab.
+ initiator_tab->print_view_manager()->PrintPreviewNow();
TabContentsWrapper* preview_tab =
tab_controller->GetOrCreatePreviewTab(initiator_tab);
diff --git a/chrome/browser/printing/print_view_manager.cc b/chrome/browser/printing/print_view_manager.cc
index b3cd102..ddea4c6 100644
--- a/chrome/browser/printing/print_view_manager.cc
+++ b/chrome/browser/printing/print_view_manager.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/printing/print_view_manager.h"
#include "base/bind.h"
+#include "base/lazy_instance.h"
#include "base/memory/scoped_ptr.h"
#include "base/utf_string_conversions.h"
#include "chrome/browser/browser_process.h"
@@ -50,6 +51,13 @@ void ReleasePrinterQuery(int cookie) {
}
}
+// Keeps track of pending scripted print preview closures.
+// No locking, only access on the UI thread.
+typedef std::map<content::RenderProcessHost*, base::Closure>
+ ScriptedPrintPreviewClosureMap;
+static base::LazyInstance<ScriptedPrintPreviewClosureMap>
+ g_scripted_print_preview_closure_map = LAZY_INSTANCE_INITIALIZER;
+
} // namespace
namespace printing {
@@ -61,13 +69,16 @@ PrintViewManager::PrintViewManager(TabContentsWrapper* tab)
printing_succeeded_(false),
inside_inner_message_loop_(false),
observer_(NULL),
- cookie_(0) {
+ cookie_(0),
+ print_preview_state_(NOT_PREVIEWING),
+ scripted_print_preview_rph_(NULL) {
#if defined(OS_POSIX) && !defined(OS_MACOSX)
expecting_first_page_ = true;
#endif
}
PrintViewManager::~PrintViewManager() {
+ DCHECK_EQ(NOT_PREVIEWING, print_preview_state_);
ReleasePrinterQuery(cookie_);
DisconnectFromCurrentPrintJob();
}
@@ -85,10 +96,8 @@ bool PrintViewManager::AdvancedPrintNow() {
PrintPreviewTabController::GetInstance();
if (!tab_controller)
return false;
- TabContentsWrapper* wrapper =
- TabContentsWrapper::GetCurrentWrapperForContents(tab_contents());
TabContentsWrapper* print_preview_tab =
- tab_controller->GetPrintPreviewForTab(wrapper);
+ tab_controller->GetPrintPreviewForTab(tab_);
if (print_preview_tab) {
// Preview tab exist for current tab or current tab is preview tab.
if (!print_preview_tab->web_ui())
@@ -103,9 +112,31 @@ bool PrintViewManager::AdvancedPrintNow() {
}
bool PrintViewManager::PrintPreviewNow() {
+ if (print_preview_state_ != NOT_PREVIEWING) {
+ NOTREACHED();
+ return false;
+ }
+ print_preview_state_ = USER_INITIATED_PREVIEW;
return PrintNowInternal(new PrintMsg_InitiatePrintPreview(routing_id()));
}
+void PrintViewManager::PrintPreviewDone() {
+ BrowserThread::CurrentlyOn(BrowserThread::UI);
+ DCHECK_NE(NOT_PREVIEWING, print_preview_state_);
+
+ if (print_preview_state_ == SCRIPTED_PREVIEW) {
+ ScriptedPrintPreviewClosureMap& map =
+ g_scripted_print_preview_closure_map.Get();
+ ScriptedPrintPreviewClosureMap::iterator it =
+ map.find(scripted_print_preview_rph_);
+ CHECK(it != map.end());
+ it->second.Run();
+ map.erase(scripted_print_preview_rph_);
+ scripted_print_preview_rph_ = NULL;
+ }
+ print_preview_state_ = NOT_PREVIEWING;
+}
+
void PrintViewManager::PreviewPrintingRequestCancelled() {
if (!tab_contents())
return;
@@ -227,6 +258,43 @@ void PrintViewManager::OnPrintingFailed(int cookie) {
content::NotificationService::NoDetails());
}
+void PrintViewManager::OnScriptedPrintPreview(IPC::Message* reply_msg) {
+ BrowserThread::CurrentlyOn(BrowserThread::UI);
+ ScriptedPrintPreviewClosureMap& map =
+ g_scripted_print_preview_closure_map.Get();
+ content::RenderProcessHost* rph =
+ tab_contents()->render_view_host()->process();
+
+ // This should always be 0 once we get modal window.print().
+ if (map.count(rph) != 0) {
+ // Renderer already handling window.print() in another View.
+ Send(reply_msg);
+ return;
+ }
+ if (print_preview_state_ != NOT_PREVIEWING) {
+ // If a user initiated print dialog is already open, ignore the scripted
+ // print message.
+ DCHECK_EQ(USER_INITIATED_PREVIEW, print_preview_state_);
+ Send(reply_msg);
+ return;
+ }
+
+ print_preview_state_ = SCRIPTED_PREVIEW;
+ base::Closure callback =
+ base::Bind(&PrintViewManager::OnScriptedPrintPreviewReply,
+ base::Unretained(this),
+ reply_msg);
+ map[rph] = callback;
+ scripted_print_preview_rph_ = rph;
+
+ PrintPreviewTabController::PrintPreview(tab_);
+}
+
+void PrintViewManager::OnScriptedPrintPreviewReply(IPC::Message* reply_msg) {
+ BrowserThread::CurrentlyOn(BrowserThread::UI);
+ Send(reply_msg);
+}
+
bool PrintViewManager::OnMessageReceived(const IPC::Message& message) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(PrintViewManager, message)
@@ -237,6 +305,8 @@ bool PrintViewManager::OnMessageReceived(const IPC::Message& message) {
IPC_MESSAGE_HANDLER(PrintHostMsg_DidShowPrintDialog, OnDidShowPrintDialog)
IPC_MESSAGE_HANDLER(PrintHostMsg_DidPrintPage, OnDidPrintPage)
IPC_MESSAGE_HANDLER(PrintHostMsg_PrintingFailed, OnPrintingFailed)
+ IPC_MESSAGE_HANDLER_DELAY_REPLY(PrintHostMsg_ScriptedPrintPreview,
+ OnScriptedPrintPreview)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
return handled;
diff --git a/chrome/browser/printing/print_view_manager.h b/chrome/browser/printing/print_view_manager.h
index 4925a45..195c3ba 100644
--- a/chrome/browser/printing/print_view_manager.h
+++ b/chrome/browser/printing/print_view_manager.h
@@ -16,6 +16,10 @@
class TabContentsWrapper;
struct PrintHostMsg_DidPrintPage_Params;
+namespace content {
+class RenderProcessHost;
+}
+
namespace printing {
class JobEventDetails;
@@ -52,6 +56,10 @@ class PrintViewManager : public content::NotificationObserver,
// print preview is impossible at the moment.
bool PrintPreviewNow();
+ // Notify PrintViewManager that print preview has finished. Unfreeze the
+ // renderer in the case of scripted print preview.
+ void PrintPreviewDone();
+
// Handles cancelled preview printing request.
void PreviewPrintingRequestCancelled();
@@ -78,6 +86,12 @@ class PrintViewManager : public content::NotificationObserver,
virtual void StopNavigation() OVERRIDE;
private:
+ enum PrintPreviewState {
+ NOT_PREVIEWING,
+ USER_INITIATED_PREVIEW,
+ SCRIPTED_PREVIEW,
+ };
+
// IPC Message handlers.
void OnDidGetPrintedPagesCount(int cookie, int number_pages);
void OnDidGetDocumentCookie(int cookie);
@@ -85,6 +99,9 @@ class PrintViewManager : public content::NotificationObserver,
void OnDidPrintPage(const PrintHostMsg_DidPrintPage_Params& params);
void OnPrintingFailed(int cookie);
+ void OnScriptedPrintPreview(IPC::Message* reply_msg);
+ void OnScriptedPrintPreviewReply(IPC::Message* reply_msg);
+
// Processes a NOTIFY_PRINT_JOB_EVENT notification.
void OnNotifyPrintJobEvent(const JobEventDetails& event_details);
@@ -167,6 +184,12 @@ class PrintViewManager : public content::NotificationObserver,
// The document cookie of the current PrinterQuery.
int cookie_;
+ // Current state of print preview for this view.
+ PrintPreviewState print_preview_state_;
+
+ // Keeps track of the pending callback during scripted print preview.
+ content::RenderProcessHost* scripted_print_preview_rph_;
+
DISALLOW_COPY_AND_ASSIGN(PrintViewManager);
};
diff --git a/chrome/browser/printing/printing_message_filter.cc b/chrome/browser/printing/printing_message_filter.cc
index ddcf209..a497bba 100644
--- a/chrome/browser/printing/printing_message_filter.cc
+++ b/chrome/browser/printing/printing_message_filter.cc
@@ -21,9 +21,6 @@
#include "base/file_util.h"
#include "base/lazy_instance.h"
#include "chrome/browser/printing/print_dialog_cloud.h"
-#else
-#include "base/command_line.h"
-#include "chrome/common/chrome_switches.h"
#endif
using content::BrowserThread;
diff --git a/chrome/browser/printing/printing_message_filter.h b/chrome/browser/printing/printing_message_filter.h
index 10afcba..7531749 100644
--- a/chrome/browser/printing/printing_message_filter.h
+++ b/chrome/browser/printing/printing_message_filter.h
@@ -8,6 +8,7 @@
#include <string>
+#include "base/compiler_specific.h"
#include "content/browser/browser_message_filter.h"
#if defined(OS_WIN)
diff --git a/chrome/browser/ui/webui/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview_handler.cc
index 0f04e4a..e4d6342 100644
--- a/chrome/browser/ui/webui/print_preview_handler.cc
+++ b/chrome/browser/ui/webui/print_preview_handler.cc
@@ -368,10 +368,10 @@ void PrintPreviewHandler::HandlePrint(const ListValue* args) {
regenerate_preview_request_count_);
TabContentsWrapper* initiator_tab = GetInitiatorTab();
- if (initiator_tab) {
- RenderViewHost* rvh = initiator_tab->render_view_host();
- rvh->Send(new PrintMsg_ResetScriptedPrintCount(rvh->routing_id()));
- }
+ CHECK(initiator_tab);
+
+ RenderViewHost* init_rvh = initiator_tab->render_view_host();
+ init_rvh->Send(new PrintMsg_ResetScriptedPrintCount(init_rvh->routing_id()));
scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args));
if (!settings.get())
@@ -439,6 +439,7 @@ void PrintPreviewHandler::HandlePrint(const ListValue* args) {
RenderViewHost* rvh = web_ui_->tab_contents()->render_view_host();
rvh->Send(new PrintMsg_PrintForPrintPreview(rvh->routing_id(), *settings));
}
+ initiator_tab->print_view_manager()->PrintPreviewDone();
}
void PrintPreviewHandler::HandlePrintToPdf(
diff --git a/chrome/browser/ui/webui/print_preview_handler_unittest.cc b/chrome/browser/ui/webui/print_preview_handler_unittest.cc
index 8f41b23..2d2f771 100644
--- a/chrome/browser/ui/webui/print_preview_handler_unittest.cc
+++ b/chrome/browser/ui/webui/print_preview_handler_unittest.cc
@@ -8,6 +8,7 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/printing/background_printing_manager.h"
#include "chrome/browser/printing/print_preview_tab_controller.h"
+#include "chrome/browser/printing/print_view_manager.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
#include "chrome/browser/ui/webui/print_preview_handler.h"
@@ -63,6 +64,7 @@ class PrintPreviewHandlerTest : public BrowserWithTestWindowTest {
printing::PrintPreviewTabController::GetInstance();
ASSERT_TRUE(controller);
+ initiator_tab->print_view_manager()->PrintPreviewNow();
preview_tab_ = controller->GetOrCreatePreviewTab(initiator_tab);
ASSERT_TRUE(preview_tab_);
diff --git a/chrome/browser/ui/webui/print_preview_ui_unittest.cc b/chrome/browser/ui/webui/print_preview_ui_unittest.cc
index 86d1be9f..74fd9cd 100644
--- a/chrome/browser/ui/webui/print_preview_ui_unittest.cc
+++ b/chrome/browser/ui/webui/print_preview_ui_unittest.cc
@@ -7,6 +7,7 @@
#include "base/command_line.h"
#include "base/memory/ref_counted_memory.h"
#include "chrome/browser/printing/print_preview_tab_controller.h"
+#include "chrome/browser/printing/print_view_manager.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/constrained_window_tab_helper.h"
#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
@@ -56,6 +57,7 @@ TEST_F(PrintPreviewUIUnitTest, MAYBE_PrintPreviewData) {
printing::PrintPreviewTabController::GetInstance();
ASSERT_TRUE(controller);
+ initiator_tab->print_view_manager()->PrintPreviewNow();
TabContentsWrapper* preview_tab =
controller->GetOrCreatePreviewTab(initiator_tab);
@@ -120,10 +122,11 @@ TEST_F(PrintPreviewUIUnitTest, MAYBE_PrintPreviewDraftPages) {
browser()->GetSelectedTabContentsWrapper();
ASSERT_TRUE(initiator_tab);
- scoped_refptr<printing::PrintPreviewTabController>
- controller(new printing::PrintPreviewTabController());
+ printing::PrintPreviewTabController* controller =
+ printing::PrintPreviewTabController::GetInstance();
ASSERT_TRUE(controller);
+ initiator_tab->print_view_manager()->PrintPreviewNow();
TabContentsWrapper* preview_tab =
controller->GetOrCreatePreviewTab(initiator_tab);
@@ -195,10 +198,11 @@ TEST_F(PrintPreviewUIUnitTest, MAYBE_GetCurrentPrintPreviewStatus) {
browser()->GetSelectedTabContentsWrapper();
ASSERT_TRUE(initiator_tab);
- scoped_refptr<printing::PrintPreviewTabController>
- controller(new printing::PrintPreviewTabController());
+ printing::PrintPreviewTabController* controller =
+ printing::PrintPreviewTabController::GetInstance();
ASSERT_TRUE(controller);
+ initiator_tab->print_view_manager()->PrintPreviewNow();
TabContentsWrapper* preview_tab =
controller->GetOrCreatePreviewTab(initiator_tab);
diff --git a/chrome/common/print_messages.h b/chrome/common/print_messages.h
index 2b11636..e4a4e9f 100644
--- a/chrome/common/print_messages.h
+++ b/chrome/common/print_messages.h
@@ -387,3 +387,7 @@ IPC_MESSAGE_ROUTED1(PrintHostMsg_PrintPreviewCancelled,
// driver is bogus).
IPC_MESSAGE_ROUTED1(PrintHostMsg_PrintPreviewInvalidPrinterSettings,
int /* document cookie */)
+
+// Run a nested message loop in the renderer until print preview for
+// window.print() finishes.
+IPC_SYNC_MESSAGE_ROUTED0_0(PrintHostMsg_ScriptedPrintPreview)
diff --git a/chrome/renderer/print_web_view_helper.cc b/chrome/renderer/print_web_view_helper.cc
index bb97e80..8ee1c07 100644
--- a/chrome/renderer/print_web_view_helper.cc
+++ b/chrome/renderer/print_web_view_helper.cc
@@ -462,7 +462,11 @@ void PrintWebViewHelper::PrintPage(WebKit::WebFrame* frame) {
if (is_preview_enabled_) {
print_preview_context_.InitWithFrame(frame);
- RequestPrintPreview();
+
+ old_print_pages_params_.reset(); // Same as in RequestPrintPreview().
+ IPC::SyncMessage* msg = new PrintHostMsg_ScriptedPrintPreview(routing_id());
+ msg->EnableMessagePumping();
+ Send(msg);
} else {
Print(frame, WebNode());
}