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

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

Issue 2426503002: Make printing work better with OOPIF. (Closed)
Patch Set: Fix build, nits Created 4 years, 2 months 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 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

Powered by Google App Engine
This is Rietveld 408576698