Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1535)

Unified Diff: chrome/browser/printing/print_view_manager_base.cc

Issue 2508923003: Make printing work better with OOPIF. (try 2) (Closed)
Patch Set: Fix android_webview Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « chrome/browser/printing/print_view_manager_base.h ('k') | chrome/browser/printing/print_view_manager_common.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698