diff options
author | thestig@chromium.org <thestig@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-23 08:55:24 +0000 |
---|---|---|
committer | thestig@chromium.org <thestig@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-23 08:55:24 +0000 |
commit | a9c36832d49e1fe97cfb378b474e047955917c40 (patch) | |
tree | f9b67f10f9c5341a43d3fdea471774b4e54eb166 | |
parent | b0dafaf9f930b128ef43d752c15a1bdb7620062b (diff) | |
download | chromium_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
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()); } |