diff options
Diffstat (limited to 'chromium/chrome/browser/printing/print_view_manager_base.cc')
-rw-r--r-- | chromium/chrome/browser/printing/print_view_manager_base.cc | 127 |
1 files changed, 78 insertions, 49 deletions
diff --git a/chromium/chrome/browser/printing/print_view_manager_base.cc b/chromium/chrome/browser/printing/print_view_manager_base.cc index 7bc9f77ba3f..33ada8ce7b3 100644 --- a/chromium/chrome/browser/printing/print_view_manager_base.cc +++ b/chromium/chrome/browser/printing/print_view_manager_base.cc @@ -32,13 +32,15 @@ #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" #include "printing/pdf_metafile_skia.h" #include "printing/printed_document.h" #include "ui/base/l10n/l10n_util.h" -#if defined(ENABLE_PRINT_PREVIEW) +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) #include "chrome/browser/printing/print_error_dialog.h" #endif @@ -69,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) @@ -79,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))); } @@ -90,16 +92,20 @@ PrintViewManagerBase::~PrintViewManagerBase() { DisconnectFromCurrentPrintJob(); } -#if defined(ENABLE_BASIC_PRINTING) -bool PrintViewManagerBase::PrintNow() { - return PrintNowInternal(new PrintMsg_PrintPages(routing_id())); +#if BUILDFLAG(ENABLE_BASIC_PRINTING) +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() { @@ -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()) @@ -192,16 +182,20 @@ void PrintViewManagerBase::OnDidPrintPage( #if defined(OS_WIN) print_job_->AppendPrintedPage(params.page_number); if (metafile_must_be_valid) { + // TODO(thestig): Figure out why rendering text with GDI results in random + // missing characters for some users. https://crbug.com/658606 + bool print_text_with_gdi = + document->settings().print_text_with_gdi() && + !document->settings().printer_is_xps() && + switches::GDITextPrintingEnabled(); scoped_refptr<base::RefCountedBytes> bytes = new base::RefCountedBytes( reinterpret_cast<const unsigned char*>(shared_buf->memory()), params.data_size); document->DebugDumpData(bytes.get(), FILE_PATH_LITERAL(".pdf")); - // TODO(thestig): Figure out why rendering text with GDI results in random - // missing characters for some users. https://crbug.com/658606 print_job_->StartPdfToEmfConversion( bytes, params.page_size, params.content_area, - false /* print_text_with_gdi? */); + print_text_with_gdi); } #else // Update the rendered document. It will send notifications to the listener. @@ -215,7 +209,7 @@ void PrintViewManagerBase::OnDidPrintPage( void PrintViewManagerBase::OnPrintingFailed(int cookie) { PrintManager::OnPrintingFailed(cookie); -#if defined(ENABLE_PRINT_PREVIEW) +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) chrome::ShowPrintErrorDialog(); #endif @@ -235,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) @@ -246,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( @@ -358,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. @@ -403,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; @@ -430,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() { @@ -508,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() { @@ -539,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 |