| 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 e559fdba7784c4eee84b2681b44571498ad564de..33ada8ce7b315e2bd327883bc682e5527ff0696e 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/features/features.h"
|
| @@ -70,6 +71,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)
|
| @@ -80,9 +82,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)));
|
| }
|
|
|
| @@ -92,15 +93,19 @@ PrintViewManagerBase::~PrintViewManagerBase() {
|
| }
|
|
|
| #if BUILDFLAG(ENABLE_BASIC_PRINTING)
|
| -bool PrintViewManagerBase::PrintNow() {
|
| - return PrintNowInternal(new PrintMsg_PrintPages(routing_id()));
|
| +bool PrintViewManagerBase::PrintNow(content::RenderFrameHost* rfh) {
|
| + DisconnectFromCurrentPrintJob();
|
| +
|
| + SetPrintingRFH(rfh);
|
| + int32_t id = rfh->GetRoutingID();
|
| + return PrintNowInternal(rfh, 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::SendPrintingEnabled,
|
| + base::Unretained(this), printing_enabled_.GetValue()));
|
| }
|
|
|
| void PrintViewManagerBase::NavigationStopped() {
|
| @@ -108,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())
|
| @@ -240,10 +229,35 @@ void PrintViewManagerBase::OnShowInvalidPrinterSettingsError() {
|
| }
|
|
|
| void PrintViewManagerBase::DidStartLoading() {
|
| - UpdateScriptedPrintingBlocked();
|
| + UpdatePrintingEnabled();
|
| +}
|
| +
|
| +void PrintViewManagerBase::RenderFrameDeleted(
|
| + content::RenderFrameHost* render_frame_host) {
|
| + // Terminates or cancels the print job if one was pending.
|
| + if (render_frame_host != 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) {
|
| +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)
|
| @@ -251,7 +265,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(
|
| @@ -363,7 +377,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.
|
| @@ -408,12 +422,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;
|
| @@ -435,16 +443,23 @@ 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) {
|
| + auto msg = base::MakeUnique<PrintMsg_PrintingDone>(rfh->GetRoutingID(),
|
| + printing_succeeded_);
|
| + rfh->Send(msg.release());
|
| + }
|
|
|
| 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() {
|
| @@ -513,14 +528,18 @@ bool PrintViewManagerBase::OpportunisticallyCreatePrintJob(int cookie) {
|
| return true;
|
| }
|
|
|
| -bool PrintViewManagerBase::PrintNowInternal(IPC::Message* message) {
|
| +bool PrintViewManagerBase::PrintNowInternal(
|
| + content::RenderFrameHost* rfh,
|
| + 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 rfh->Send(message.release());
|
| +}
|
| +
|
| +void PrintViewManagerBase::SetPrintingRFH(content::RenderFrameHost* rfh) {
|
| + DCHECK(!printing_rfh_);
|
| + printing_rfh_ = rfh;
|
| }
|
|
|
| void PrintViewManagerBase::ReleasePrinterQuery() {
|
| @@ -544,4 +563,9 @@ void PrintViewManagerBase::ReleasePrinterQuery() {
|
| base::Bind(&PrinterQuery::StopWorker, printer_query));
|
| }
|
|
|
| +void PrintViewManagerBase::SendPrintingEnabled(bool enabled,
|
| + content::RenderFrameHost* rfh) {
|
| + rfh->Send(new PrintMsg_SetPrintingEnabled(rfh->GetRoutingID(), enabled));
|
| +}
|
| +
|
| } // namespace printing
|
|
|