Chromium Code Reviews| Index: chrome/browser/printing/print_view_manager_base.cc |
| diff --git a/chrome/browser/printing/print_view_manager_base.cc b/chrome/browser/printing/print_view_manager_base.cc |
| index 809099524fd9d9ead7a1268dedec468a78957ebb..652c79b870ccb074305b21aeff92b9a32b6d4eab 100644 |
| --- a/chrome/browser/printing/print_view_manager_base.cc |
| +++ b/chrome/browser/printing/print_view_manager_base.cc |
| @@ -32,6 +32,7 @@ |
| #include "content/public/browser/notification_details.h" |
| #include "content/public/browser/notification_service.h" |
| #include "content/public/browser/notification_source.h" |
| +#include "content/public/browser/render_frame_host.h" |
| #include "content/public/browser/render_view_host.h" |
| #include "content/public/browser/web_contents.h" |
| #include "printing/pdf_metafile_skia.h" |
| @@ -69,6 +70,7 @@ void ShowWarningMessageBox(const base::string16& message) { |
| PrintViewManagerBase::PrintViewManagerBase(content::WebContents* web_contents) |
| : PrintManager(web_contents), |
| + printing_rfh_(nullptr), |
| printing_succeeded_(false), |
| inside_inner_message_loop_(false), |
| #if !defined(OS_MACOSX) |
| @@ -79,9 +81,8 @@ PrintViewManagerBase::PrintViewManagerBase(content::WebContents* web_contents) |
| Profile* profile = |
| Profile::FromBrowserContext(web_contents->GetBrowserContext()); |
| printing_enabled_.Init( |
| - prefs::kPrintingEnabled, |
| - profile->GetPrefs(), |
| - base::Bind(&PrintViewManagerBase::UpdateScriptedPrintingBlocked, |
| + prefs::kPrintingEnabled, profile->GetPrefs(), |
| + base::Bind(&PrintViewManagerBase::UpdatePrintingEnabled, |
| base::Unretained(this))); |
| } |
| @@ -91,15 +92,20 @@ PrintViewManagerBase::~PrintViewManagerBase() { |
| } |
| #if defined(ENABLE_BASIC_PRINTING) |
| -bool PrintViewManagerBase::PrintNow() { |
| - return PrintNowInternal(new PrintMsg_PrintPages(routing_id())); |
| +bool PrintViewManagerBase::PrintNow(content::RenderFrameHost* rfh) { |
| + DisconnectFromCurrentPrintJob(); |
| + |
| + DCHECK(!printing_rfh_); |
| + printing_rfh_ = rfh; |
| + int32_t id = printing_rfh_->GetRoutingID(); |
| + return PrintNowInternal(base::MakeUnique<PrintMsg_PrintPages>(id)); |
| } |
| #endif |
| -void PrintViewManagerBase::UpdateScriptedPrintingBlocked() { |
| - Send(new PrintMsg_SetScriptedPrintingBlocked( |
| - routing_id(), |
| - !printing_enabled_.GetValue())); |
| +void PrintViewManagerBase::UpdatePrintingEnabled() { |
| + web_contents()->ForEachFrame( |
| + base::Bind(&PrintViewManagerBase::BroadcastPrintingEnabled, |
|
nasko
2016/11/02 04:50:37
minor nit: s/Broadcast/Send/, since the "broadcast
Lei Zhang
2016/11/08 11:13:22
Done.
|
| + base::Unretained(this), printing_enabled_.GetValue())); |
| } |
| void PrintViewManagerBase::NavigationStopped() { |
| @@ -107,22 +113,6 @@ void PrintViewManagerBase::NavigationStopped() { |
| TerminatePrintJob(true); |
| } |
| -void PrintViewManagerBase::RenderProcessGone(base::TerminationStatus status) { |
| - PrintManager::RenderProcessGone(status); |
| - ReleasePrinterQuery(); |
| - |
| - if (!print_job_.get()) |
| - return; |
| - |
| - scoped_refptr<PrintedDocument> document(print_job_->document()); |
| - if (document.get()) { |
| - // If IsComplete() returns false, the document isn't completely rendered. |
| - // Since our renderer is gone, there's nothing to do, cancel it. Otherwise, |
| - // the print job may finish without problem. |
| - TerminatePrintJob(!document->IsComplete()); |
| - } |
| -} |
| - |
| base::string16 PrintViewManagerBase::RenderSourceName() { |
| base::string16 name(web_contents()->GetTitle()); |
| if (name.empty()) |
| @@ -237,10 +227,34 @@ void PrintViewManagerBase::OnShowInvalidPrinterSettingsError() { |
| } |
| void PrintViewManagerBase::DidStartLoading() { |
| - UpdateScriptedPrintingBlocked(); |
| + UpdatePrintingEnabled(); |
| } |
| -bool PrintViewManagerBase::OnMessageReceived(const IPC::Message& message) { |
| +void PrintViewManagerBase::RenderFrameDeleted(content::RenderFrameHost* rfh) { |
| + // Terminates or cancels the print job if one was pending. |
| + if (rfh != printing_rfh_) |
| + return; |
| + |
| + printing_rfh_ = nullptr; |
| + |
| + PrintManager::PrintingRenderFrameDeleted(); |
| + ReleasePrinterQuery(); |
| + |
| + if (!print_job_.get()) |
| + return; |
| + |
| + scoped_refptr<PrintedDocument> document(print_job_->document()); |
| + if (document.get()) { |
| + // If IsComplete() returns false, the document isn't completely rendered. |
| + // Since our renderer is gone, there's nothing to do, cancel it. Otherwise, |
| + // the print job may finish without problem. |
| + TerminatePrintJob(!document->IsComplete()); |
| + } |
| +} |
| + |
| +bool PrintViewManagerBase::OnMessageReceived( |
| + const IPC::Message& message, |
| + content::RenderFrameHost* render_frame_host) { |
| bool handled = true; |
| IPC_BEGIN_MESSAGE_MAP(PrintViewManagerBase, message) |
| IPC_MESSAGE_HANDLER(PrintHostMsg_DidPrintPage, OnDidPrintPage) |
| @@ -248,7 +262,7 @@ bool PrintViewManagerBase::OnMessageReceived(const IPC::Message& message) { |
| OnShowInvalidPrinterSettingsError) |
| IPC_MESSAGE_UNHANDLED(handled = false) |
| IPC_END_MESSAGE_MAP() |
| - return handled || PrintManager::OnMessageReceived(message); |
| + return handled || PrintManager::OnMessageReceived(message, render_frame_host); |
| } |
| void PrintViewManagerBase::Observe( |
| @@ -360,7 +374,7 @@ void PrintViewManagerBase::ShouldQuitFromInnerMessageLoop() { |
| bool PrintViewManagerBase::CreateNewPrintJob(PrintJobWorkerOwner* job) { |
| DCHECK(!inside_inner_message_loop_); |
| - // Disconnect the current print_job_. |
| + // Disconnect the current |print_job_|. |
| DisconnectFromCurrentPrintJob(); |
| // We can't print if there is no renderer. |
| @@ -405,12 +419,6 @@ void PrintViewManagerBase::DisconnectFromCurrentPrintJob() { |
| #endif |
| } |
| -void PrintViewManagerBase::PrintingDone(bool success) { |
| - if (!print_job_.get()) |
| - return; |
| - Send(new PrintMsg_PrintingDone(routing_id(), success)); |
| -} |
| - |
| void PrintViewManagerBase::TerminatePrintJob(bool cancel) { |
| if (!print_job_.get()) |
| return; |
| @@ -432,16 +440,20 @@ void PrintViewManagerBase::TerminatePrintJob(bool cancel) { |
| } |
| void PrintViewManagerBase::ReleasePrintJob() { |
| + content::RenderFrameHost* rfh = printing_rfh_; |
| + printing_rfh_ = nullptr; |
| + |
| if (!print_job_.get()) |
| return; |
| - PrintingDone(printing_succeeded_); |
| + if (rfh) |
| + Send(new PrintMsg_PrintingDone(rfh->GetRoutingID(), printing_succeeded_)); |
| registrar_.Remove(this, chrome::NOTIFICATION_PRINT_JOB_EVENT, |
| content::Source<PrintJob>(print_job_.get())); |
| print_job_->DisconnectSource(); |
| // Don't close the worker thread. |
| - print_job_ = NULL; |
| + print_job_ = nullptr; |
| } |
| bool PrintViewManagerBase::RunInnerMessageLoop() { |
| @@ -510,14 +522,12 @@ bool PrintViewManagerBase::OpportunisticallyCreatePrintJob(int cookie) { |
| return true; |
| } |
| -bool PrintViewManagerBase::PrintNowInternal(IPC::Message* message) { |
| +bool PrintViewManagerBase::PrintNowInternal( |
| + std::unique_ptr<IPC::Message> message) { |
| // Don't print / print preview interstitials or crashed tabs. |
| - if (web_contents()->ShowingInterstitialPage() || |
| - web_contents()->IsCrashed()) { |
| - delete message; |
| + if (web_contents()->ShowingInterstitialPage() || web_contents()->IsCrashed()) |
| return false; |
| - } |
| - return Send(message); |
| + return Send(message.release()); |
| } |
| void PrintViewManagerBase::ReleasePrinterQuery() { |
| @@ -541,4 +551,10 @@ void PrintViewManagerBase::ReleasePrinterQuery() { |
| base::Bind(&PrinterQuery::StopWorker, printer_query)); |
| } |
| +void PrintViewManagerBase::BroadcastPrintingEnabled( |
| + bool enabled, |
| + content::RenderFrameHost* rfh) { |
| + Send(new PrintMsg_SetPrintingEnabled(rfh->GetRoutingID(), enabled)); |
| +} |
| + |
| } // namespace printing |