diff --git a/android_webview/browser/BUILD.gn b/android_webview/browser/BUILD.gn index c6a438cc057df9..cac7da1d1eb729 100644 --- a/android_webview/browser/BUILD.gn +++ b/android_webview/browser/BUILD.gn @@ -214,7 +214,6 @@ source_set("browser") { "//components/prefs", "//components/printing/browser", "//components/printing/common", - "//components/printing/common:mojo_interfaces", "//components/safe_browsing", "//components/safe_browsing:features", "//components/safe_browsing:ping_manager", diff --git a/android_webview/browser/aw_print_manager.cc b/android_webview/browser/aw_print_manager.cc index 7e19ba89bd65c3..a179a2b804c7f7 100644 --- a/android_webview/browser/aw_print_manager.cc +++ b/android_webview/browser/aw_print_manager.cc @@ -72,8 +72,7 @@ void AwPrintManager::PdfWritingDone(int page_count) { bool AwPrintManager::PrintNow() { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); auto* rfh = web_contents()->GetMainFrame(); - GetPrintRenderFrame(rfh)->PrintRequestedPages(); - return true; + return rfh->Send(new PrintMsg_PrintPages(rfh->GetRoutingID())); } void AwPrintManager::OnGetDefaultPrintSettings( diff --git a/chrome/browser/printing/print_view_manager.cc b/chrome/browser/printing/print_view_manager.cc index 82a5c800e3f013..ef148eb8563c4d 100644 --- a/chrome/browser/printing/print_view_manager.cc +++ b/chrome/browser/printing/print_view_manager.cc @@ -16,6 +16,7 @@ #include "chrome/browser/printing/print_preview_dialog_controller.h" #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h" #include "chrome/common/chrome_content_client.h" +#include "components/printing/common/print.mojom.h" #include "components/printing/common/print_messages.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/plugin_service.h" @@ -26,6 +27,7 @@ #include "content/public/common/webplugininfo.h" #include "ipc/ipc_message_macros.h" #include "printing/buildflags/buildflags.h" +#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" using content::BrowserThread; @@ -192,6 +194,21 @@ void PrintViewManager::RenderFrameDeleted( PrintViewManagerBase::RenderFrameDeleted(render_frame_host); } +const mojo::AssociatedRemote& +PrintViewManager::GetPrintRenderFrame(content::RenderFrameHost* rfh) { + if (!print_render_frame_.is_bound()) { + rfh->GetRemoteAssociatedInterfaces()->GetInterface(&print_render_frame_); + print_render_frame_.set_disconnect_handler( + base::BindOnce(&PrintViewManager::OnPrintRenderFrameDisconnected, + base::Unretained(this))); + } + return print_render_frame_; +} + +void PrintViewManager::OnPrintRenderFrameDisconnected() { + print_render_frame_.reset(); +} + bool PrintViewManager::PrintPreview( content::RenderFrameHost* rfh, mojom::PrintRendererAssociatedPtrInfo print_renderer, diff --git a/chrome/browser/printing/print_view_manager.h b/chrome/browser/printing/print_view_manager.h index 4cabe91d08ca52..76f9e7bf30235e 100644 --- a/chrome/browser/printing/print_view_manager.h +++ b/chrome/browser/printing/print_view_manager.h @@ -9,6 +9,7 @@ #include "chrome/browser/printing/print_view_manager_base.h" #include "components/printing/common/print.mojom.h" #include "content/public/browser/web_contents_user_data.h" +#include "mojo/public/cpp/bindings/associated_remote.h" #include "printing/buildflags/buildflags.h" namespace content { @@ -79,6 +80,15 @@ class PrintViewManager : public PrintViewManagerBase, struct FrameDispatchHelper; + // Helper method to fetch the PrintRenderFrame associated remote interface + // pointer. + const mojo::AssociatedRemote& + GetPrintRenderFrame(content::RenderFrameHost* rfh); + + // Resets the PrintRenderFrame associated remote when it's disconnected from + // its receiver. + void OnPrintRenderFrameDisconnected(); + // Helper method for PrintPreviewNow() and PrintPreviewWithRenderer(). // Initiate print preview of the current document by first notifying the // renderer. Since this happens asynchronously, the print preview dialog @@ -117,6 +127,10 @@ class PrintViewManager : public PrintViewManagerBase, // flag is true between PrintForSystemDialogNow() and PrintPreviewDone(). bool is_switching_to_system_dialog_ = false; + // Used to transmit mojom interface method calls to the PrintRenderFrame + // associated remote. + mojo::AssociatedRemote print_render_frame_; + WEB_CONTENTS_USER_DATA_KEY_DECL(); DISALLOW_COPY_AND_ASSIGN(PrintViewManager); diff --git a/chrome/browser/printing/print_view_manager_base.cc b/chrome/browser/printing/print_view_manager_base.cc index 81cb954f02363c..7d1e56b3b1a869 100644 --- a/chrome/browser/printing/print_view_manager_base.cc +++ b/chrome/browser/printing/print_view_manager_base.cc @@ -126,13 +126,9 @@ PrintViewManagerBase::~PrintViewManagerBase() { bool PrintViewManagerBase::PrintNow(content::RenderFrameHost* rfh) { DisconnectFromCurrentPrintJob(); - // Don't print / print preview interstitials or crashed tabs. - if (IsInterstitialOrCrashed()) - return false; - SetPrintingRFH(rfh); - GetPrintRenderFrame(rfh)->PrintRequestedPages(); - return true; + int32_t id = rfh->GetRoutingID(); + return PrintNowInternal(rfh, std::make_unique(id)); } #if BUILDFLAG(ENABLE_PRINT_PREVIEW) @@ -615,8 +611,11 @@ void PrintViewManagerBase::ReleasePrintJob() { if (!print_job_) return; - if (rfh) - GetPrintRenderFrame(rfh)->PrintingDone(printing_succeeded_); + if (rfh) { + auto msg = std::make_unique(rfh->GetRoutingID(), + printing_succeeded_); + rfh->Send(msg.release()); + } registrar_.Remove(this, chrome::NOTIFICATION_PRINT_JOB_EVENT, content::Source(print_job_.get())); @@ -724,7 +723,7 @@ void PrintViewManagerBase::ReleasePrinterQuery() { void PrintViewManagerBase::SendPrintingEnabled(bool enabled, content::RenderFrameHost* rfh) { - GetPrintRenderFrame(rfh)->SetPrintingEnabled(enabled); + rfh->Send(new PrintMsg_SetPrintingEnabled(rfh->GetRoutingID(), enabled)); } } // namespace printing diff --git a/components/printing/browser/BUILD.gn b/components/printing/browser/BUILD.gn index 937529a1a9eb9e..8996679706c8f9 100644 --- a/components/printing/browser/BUILD.gn +++ b/components/printing/browser/BUILD.gn @@ -39,7 +39,6 @@ static_library("browser") { "//components/crash/core/common", "//components/discardable_memory/service", "//components/printing/common", - "//components/printing/common:mojo_interfaces", "//components/services/pdf_compositor/public/cpp", "//components/services/pdf_compositor/public/mojom", "//components/strings:components_strings_grit", diff --git a/components/printing/browser/print_manager.cc b/components/printing/browser/print_manager.cc index 37168fd9dc394a..8579ed8a4468ff 100644 --- a/components/printing/browser/print_manager.cc +++ b/components/printing/browser/print_manager.cc @@ -4,11 +4,9 @@ #include "components/printing/browser/print_manager.h" -#include "base/bind.h" #include "build/build_config.h" #include "components/printing/common/print_messages.h" #include "content/public/browser/render_frame_host.h" -#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" namespace printing { @@ -112,19 +110,6 @@ void PrintManager::OnPrintingFailed(int cookie) { #endif } -const mojo::AssociatedRemote& -PrintManager::GetPrintRenderFrame(content::RenderFrameHost* rfh) { - // When print preview is closed, the remote is disconnected from the receiver. - // Reset a disconnected remote before using it again. - if (print_render_frame_.is_bound() && !print_render_frame_.is_connected()) - print_render_frame_.reset(); - - if (!print_render_frame_.is_bound()) - rfh->GetRemoteAssociatedInterfaces()->GetInterface(&print_render_frame_); - - return print_render_frame_; -} - void PrintManager::PrintingRenderFrameDeleted() { #if defined(OS_ANDROID) PdfWritingDone(0); diff --git a/components/printing/browser/print_manager.h b/components/printing/browser/print_manager.h index 594a59664fc137..37da50f5890451 100644 --- a/components/printing/browser/print_manager.h +++ b/components/printing/browser/print_manager.h @@ -9,9 +9,7 @@ #include "base/macros.h" #include "build/build_config.h" -#include "components/printing/common/print.mojom.h" #include "content/public/browser/web_contents_observer.h" -#include "mojo/public/cpp/bindings/associated_remote.h" #if defined(OS_ANDROID) #include "base/callback.h" @@ -41,11 +39,6 @@ class PrintManager : public content::WebContentsObserver { protected: explicit PrintManager(content::WebContents* contents); - // Helper method to fetch the PrintRenderFrame associated remote interface - // pointer. - const mojo::AssociatedRemote& - GetPrintRenderFrame(content::RenderFrameHost* rfh); - // Terminates or cancels the print job if one was pending. void PrintingRenderFrameDeleted(); @@ -103,10 +96,6 @@ class PrintManager : public content::WebContentsObserver { private: void OnDidGetDocumentCookie(int cookie); - // Used to transmit mojom interface method calls to the PrintRenderFrame - // associated remote. - mojo::AssociatedRemote print_render_frame_; - DISALLOW_COPY_AND_ASSIGN(PrintManager); }; diff --git a/components/printing/common/print.mojom b/components/printing/common/print.mojom index d5ff612320fb3f..9166f8d08c0202 100644 --- a/components/printing/common/print.mojom +++ b/components/printing/common/print.mojom @@ -14,10 +14,6 @@ interface PrintRenderer { // Render process interface exposed to the browser to handle most of the // printing grunt work for RenderView. interface PrintRenderFrame { - // Tells the RenderFrame to switch the CSS to print media type, render every - // requested page, and then switch back the CSS to display media type. - PrintRequestedPages(); - // Tells the RenderFrame to switch the CSS to print media type, render every // requested page using the print preview document's frame/node, and then // switch the CSS back to display media type. @@ -32,10 +28,4 @@ interface PrintRenderFrame { // Tells the RenderFrame that the print preview dialog was closed. [EnableIf=enable_print_preview] OnPrintPreviewDialogClosed(); - - // Tells the RenderFrame whether printing is enabled or not. - SetPrintingEnabled(bool enabled); - - // Tells the RenderFrame that printing is done so it can clean up. - PrintingDone(bool success); }; diff --git a/components/printing/common/print_messages.h b/components/printing/common/print_messages.h index 58b2d294319a2e..200288ee10e3e3 100644 --- a/components/printing/common/print_messages.h +++ b/components/printing/common/print_messages.h @@ -362,9 +362,22 @@ IPC_STRUCT_END() // node, depending on which mode the RenderFrame is in. IPC_MESSAGE_ROUTED0(PrintMsg_PrintNodeUnderContextMenu) +#if BUILDFLAG(ENABLE_PRINTING) +// Tells the RenderFrame to switch the CSS to print media type, renders every +// requested pages and switch back the CSS to display media type. +IPC_MESSAGE_ROUTED0(PrintMsg_PrintPages) +#endif + // Print content of an out-of-process subframe. IPC_MESSAGE_ROUTED1(PrintMsg_PrintFrameContent, PrintMsg_PrintFrame_Params) +// Tells the RenderFrame that printing is done so it can clean up. +IPC_MESSAGE_ROUTED1(PrintMsg_PrintingDone, + bool /* success */) + +// Tells the RenderFrame whether printing is enabled or not. +IPC_MESSAGE_ROUTED1(PrintMsg_SetPrintingEnabled, bool /* enabled */) + #if BUILDFLAG(ENABLE_PRINT_PREVIEW) // Tells the RenderFrame to switch the CSS to print media type, renders every // requested pages for print preview using the given |settings|. This gets diff --git a/components/printing/renderer/print_render_frame_helper.cc b/components/printing/renderer/print_render_frame_helper.cc index 95bf9292998311..ae46a9385e0573 100644 --- a/components/printing/renderer/print_render_frame_helper.cc +++ b/components/printing/renderer/print_render_frame_helper.cc @@ -1174,10 +1174,13 @@ bool PrintRenderFrameHelper::OnMessageReceived(const IPC::Message& message) { bool handled = true; IPC_BEGIN_MESSAGE_MAP(PrintRenderFrameHelper, message) + IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages) #if BUILDFLAG(ENABLE_PRINT_PREVIEW) IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview) + IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone) #endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) IPC_MESSAGE_HANDLER(PrintMsg_PrintFrameContent, OnPrintFrameContent) + IPC_MESSAGE_HANDLER(PrintMsg_SetPrintingEnabled, OnSetPrintingEnabled) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() @@ -1197,27 +1200,6 @@ void PrintRenderFrameHelper::BindPrintRenderFrameReceiver( receivers_.Add(this, std::move(receiver)); } -void PrintRenderFrameHelper::PrintRequestedPages() { - ScopedIPC scoped_ipc(weak_ptr_factory_.GetWeakPtr()); - if (ipc_nesting_level_ > 1) - return; - - blink::WebLocalFrame* frame = render_frame()->GetWebFrame(); - frame->DispatchBeforePrintEvent(); - // Don't print if the RenderFrame is gone. - if (render_frame_gone_) - return; - - // If we are printing a PDF extension frame, find the plugin node and print - // that instead. - auto plugin = delegate_->GetPdfElement(frame); - Print(frame, plugin, PrintRequestType::kRegular); - if (!render_frame_gone_) - frame->DispatchAfterPrintEvent(); - // WARNING: |this| may be gone at this point. Do not do any more work here and - // just return. -} - void PrintRenderFrameHelper::PrintForSystemDialog() { ScopedIPC scoped_ipc(weak_ptr_factory_.GetWeakPtr()); if (ipc_nesting_level_ > 1) @@ -1227,9 +1209,10 @@ void PrintRenderFrameHelper::PrintForSystemDialog() { NOTREACHED(); return; } + auto weak_this = weak_ptr_factory_.GetWeakPtr(); Print(frame, print_preview_context_.source_node(), PrintRequestType::kRegular); - if (!render_frame_gone_) + if (weak_this) frame->DispatchAfterPrintEvent(); // WARNING: |this| may be gone at this point. Do not do any more work here and // just return. @@ -1267,17 +1250,24 @@ void PrintRenderFrameHelper::OnPrintPreviewDialogClosed() { } #endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) -void PrintRenderFrameHelper::PrintingDone(bool success) { - ScopedIPC scoped_ipc(weak_ptr_factory_.GetWeakPtr()); +void PrintRenderFrameHelper::OnPrintPages() { if (ipc_nesting_level_ > 1) return; - notify_browser_of_print_failure_ = false; - DidFinishPrinting(success ? OK : FAIL_PRINT); -} -void PrintRenderFrameHelper::SetPrintingEnabled(bool enabled) { - ScopedIPC scoped_ipc(weak_ptr_factory_.GetWeakPtr()); - is_printing_enabled_ = enabled; + auto weak_this = weak_ptr_factory_.GetWeakPtr(); + blink::WebLocalFrame* frame = render_frame()->GetWebFrame(); + frame->DispatchBeforePrintEvent(); + if (!weak_this) + return; + + // If we are printing a PDF extension frame, find the plugin node and print + // that instead. + auto plugin = delegate_->GetPdfElement(frame); + Print(frame, plugin, PrintRequestType::kRegular); + if (weak_this) + frame->DispatchAfterPrintEvent(); + // WARNING: |this| may be gone at this point. Do not do any more work here and + // just return. } void PrintRenderFrameHelper::GetPageSizeAndContentAreaFromPageLayout( @@ -1568,6 +1558,19 @@ int PrintRenderFrameHelper::GetFitToPageScaleFactor( } #endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) +void PrintRenderFrameHelper::OnPrintingDone(bool success) { + if (ipc_nesting_level_ > 1) + return; + notify_browser_of_print_failure_ = false; + if (!success) + LOG(ERROR) << "Failure in OnPrintingDone"; + DidFinishPrinting(success ? OK : FAIL_PRINT); +} + +void PrintRenderFrameHelper::OnSetPrintingEnabled(bool enabled) { + is_printing_enabled_ = enabled; +} + void PrintRenderFrameHelper::OnPrintFrameContent( const PrintMsg_PrintFrame_Params& params) { if (ipc_nesting_level_ > 1) diff --git a/components/printing/renderer/print_render_frame_helper.h b/components/printing/renderer/print_render_frame_helper.h index dcb0da469d5aab..1c3ce368765e78 100644 --- a/components/printing/renderer/print_render_frame_helper.h +++ b/components/printing/renderer/print_render_frame_helper.h @@ -139,8 +139,7 @@ class PrintRenderFrameHelper friend class PrintRenderFrameHelperTestBase; FRIEND_TEST_ALL_PREFIXES(MAYBE_PrintRenderFrameHelperPreviewTest, BlockScriptInitiatedPrinting); - FRIEND_TEST_ALL_PREFIXES(MAYBE_PrintRenderFrameHelperTest, - PrintRequestedPages); + FRIEND_TEST_ALL_PREFIXES(MAYBE_PrintRenderFrameHelperTest, OnPrintPages); FRIEND_TEST_ALL_PREFIXES(MAYBE_PrintRenderFrameHelperTest, BlockScriptInitiatedPrinting); FRIEND_TEST_ALL_PREFIXES(MAYBE_PrintRenderFrameHelperTest, @@ -212,7 +211,6 @@ class PrintRenderFrameHelper mojo::PendingAssociatedReceiver receiver); // printing::mojom::PrintRenderFrame: - void PrintRequestedPages() override; void PrintForSystemDialog() override; #if BUILDFLAG(ENABLE_PRINT_PREVIEW) void InitiatePrintPreview( @@ -220,14 +218,14 @@ class PrintRenderFrameHelper bool has_selection) override; void OnPrintPreviewDialogClosed() override; #endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) - void PrintingDone(bool success) override; - void SetPrintingEnabled(bool enabled) override; // Message handlers --------------------------------------------------------- + void OnPrintPages(); #if BUILDFLAG(ENABLE_PRINT_PREVIEW) void OnPrintPreview(const base::DictionaryValue& settings); #endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) void OnPrintFrameContent(const PrintMsg_PrintFrame_Params& params); + void OnPrintingDone(bool success); // Get |page_size| and |content_area| information from // |page_layout_in_points|. @@ -260,6 +258,9 @@ class PrintRenderFrameHelper int GetFitToPageScaleFactor(const gfx::Rect& printable_area_in_points); #endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) + // Enable/Disable printing. + void OnSetPrintingEnabled(bool enabled); + // Main printing code ------------------------------------------------------- // Print with the system dialog. diff --git a/components/printing/test/print_render_frame_helper_browsertest.cc b/components/printing/test/print_render_frame_helper_browsertest.cc index 1ae130e13d3b0d..7272746f0d60d3 100644 --- a/components/printing/test/print_render_frame_helper_browsertest.cc +++ b/components/printing/test/print_render_frame_helper_browsertest.cc @@ -237,7 +237,7 @@ class PrintRenderFrameHelperTestBase : public content::RenderViewTest { } void OnPrintPages() { - GetPrintRenderFrameHelper()->PrintRequestedPages(); + GetPrintRenderFrameHelper()->OnPrintPages(); base::RunLoop().RunUntilIdle(); } @@ -245,7 +245,7 @@ class PrintRenderFrameHelperTestBase : public content::RenderViewTest { PrintRenderFrameHelper* helper = GetPrintRenderFrameHelperForFrame(frame_name); ASSERT_TRUE(helper); - helper->PrintRequestedPages(); + helper->OnPrintPages(); base::RunLoop().RunUntilIdle(); } @@ -741,11 +741,11 @@ TEST_F(MAYBE_PrintRenderFrameHelperPreviewTest, BlockScriptInitiatedPrinting) { LoadHTML(kHelloWorldHTML); PrintRenderFrameHelper* print_render_frame_helper = GetPrintRenderFrameHelper(); - print_render_frame_helper->SetPrintingEnabled(false); + print_render_frame_helper->OnSetPrintingEnabled(false); PrintWithJavaScript(); VerifyPreviewRequest(false); - print_render_frame_helper->SetPrintingEnabled(true); + print_render_frame_helper->OnSetPrintingEnabled(true); PrintWithJavaScript(); VerifyPreviewRequest(true); } diff --git a/headless/lib/browser/headless_print_manager.cc b/headless/lib/browser/headless_print_manager.cc index d524f7b786f119..1bcba2fa322fd1 100644 --- a/headless/lib/browser/headless_print_manager.cc +++ b/headless/lib/browser/headless_print_manager.cc @@ -139,7 +139,7 @@ void HeadlessPrintManager::GetPDFContents(content::RenderFrameHost* rfh, print_params_ = GetPrintParamsFromSettings(settings); page_ranges_text_ = settings.page_ranges; ignore_invalid_page_ranges_ = settings.ignore_invalid_page_ranges; - GetPrintRenderFrame(rfh)->PrintRequestedPages(); + rfh->Send(new PrintMsg_PrintPages(rfh->GetRoutingID())); } std::unique_ptr @@ -307,7 +307,8 @@ void HeadlessPrintManager::ReleaseJob(PrintResult result) { std::move(callback_).Run(result, base::MakeRefCounted()); } - GetPrintRenderFrame(printing_rfh_)->PrintingDone(result == PRINT_SUCCESS); + printing_rfh_->Send(new PrintMsg_PrintingDone(printing_rfh_->GetRoutingID(), + result == PRINT_SUCCESS)); Reset(); }