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 |