Skip to content

Commit

Permalink
Convert PrintManager to RenderFrameHostReceiverSet.
Browse files Browse the repository at this point in the history
No intended behavior change.

Bug: 1213679
Change-Id: If32add37ff20f3391ec902ad0baa0523334861d5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3072019
Reviewed-by: Bo <boliu@chromium.org>
Reviewed-by: Andrey Kosyakov <caseq@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Robert Sesek <rsesek@chromium.org>
Cr-Commit-Position: refs/heads/master@{#910477}
  • Loading branch information
rsesek authored and Chromium LUCI CQ committed Aug 10, 2021
1 parent d2dead8 commit 926bda6
Show file tree
Hide file tree
Showing 17 changed files with 164 additions and 19 deletions.
8 changes: 8 additions & 0 deletions android_webview/browser/aw_content_browser_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "android_webview/browser/aw_devtools_manager_delegate.h"
#include "android_webview/browser/aw_feature_list_creator.h"
#include "android_webview/browser/aw_http_auth_handler.h"
#include "android_webview/browser/aw_print_manager.h"
#include "android_webview/browser/aw_quota_permission_context.h"
#include "android_webview/browser/aw_resource_context.h"
#include "android_webview/browser/aw_settings.h"
Expand Down Expand Up @@ -645,6 +646,13 @@ bool AwContentBrowserClient::BindAssociatedReceiverFromFrame(
render_frame_host);
return true;
}
if (interface_name == printing::mojom::PrintManagerHost::Name_) {
AwPrintManager::BindPrintManagerHost(
mojo::PendingAssociatedReceiver<printing::mojom::PrintManagerHost>(
std::move(*handle)),
render_frame_host);
return true;
}
if (interface_name ==
security_interstitials::mojom::InterstitialCommands::Name_) {
security_interstitials::SecurityInterstitialTabHelper::
Expand Down
13 changes: 13 additions & 0 deletions android_webview/browser/aw_print_manager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,19 @@ AwPrintManager::AwPrintManager(content::WebContents* contents)

AwPrintManager::~AwPrintManager() = default;

// static
void AwPrintManager::BindPrintManagerHost(
mojo::PendingAssociatedReceiver<printing::mojom::PrintManagerHost> receiver,
content::RenderFrameHost* rfh) {
auto* web_contents = content::WebContents::FromRenderFrameHost(rfh);
if (!web_contents)
return;
auto* print_manager = AwPrintManager::FromWebContents(web_contents);
if (!print_manager)
return;
print_manager->BindReceiver(std::move(receiver), rfh);
}

void AwPrintManager::PdfWritingDone(int page_count) {
pdf_writing_done_callback().Run(page_count);
// Invalidate the file descriptor so it doesn't get reused.
Expand Down
5 changes: 5 additions & 0 deletions android_webview/browser/aw_print_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ class AwPrintManager : public printing::PrintManager,
public:
~AwPrintManager() override;

static void BindPrintManagerHost(
mojo::PendingAssociatedReceiver<printing::mojom::PrintManagerHost>
receiver,
content::RenderFrameHost* rfh);

// printing::PrintManager:
void PdfWritingDone(int page_count) override;

Expand Down
22 changes: 22 additions & 0 deletions chrome/browser/chrome_content_browser_client_receiver_bindings.cc
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
#include "content/public/browser/service_worker_version_base_info.h"
#include "media/mojo/buildflags.h"
#include "mojo/public/cpp/bindings/binder_map.h"
#include "printing/buildflags/buildflags.h"
#include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
#include "third_party/widevine/cdm/buildflags.h"

Expand Down Expand Up @@ -96,6 +97,13 @@
#include "components/pdf/browser/pdf_web_contents_helper.h" // nogncheck
#endif

#if BUILDFLAG(ENABLE_PRINTING)
#include "chrome/browser/printing/print_view_manager_basic.h"
#if BUILDFLAG(ENABLE_PRINT_PREVIEW)
#include "chrome/browser/printing/print_view_manager.h"
#endif // BUILDFLAG(ENABLE_PRINT_PREVIEW)
#endif // BUILDFLAG(ENABLE_PRINTING)

#if BUILDFLAG(ENABLE_PLUGINS)
#include "chrome/browser/guest_view/web_view/chrome_web_view_permission_helper_delegate.h"
#include "chrome/browser/plugins/plugin_observer.h"
Expand Down Expand Up @@ -472,6 +480,20 @@ bool ChromeContentBrowserClient::BindAssociatedReceiverFromFrame(
return true;
}
#endif
#if BUILDFLAG(ENABLE_PRINTING)
if (interface_name == printing::mojom::PrintManagerHost::Name_) {
mojo::PendingAssociatedReceiver<printing::mojom::PrintManagerHost> receiver(
std::move(*handle));
#if BUILDFLAG(ENABLE_PRINT_PREVIEW)
printing::PrintViewManager::BindPrintManagerHost(std::move(receiver),
render_frame_host);
#else
printing::PrintViewManagerBasic::BindPrintManagerHost(std::move(receiver),
render_frame_host);
#endif
return true;
}
#endif // BUILDFLAG(ENABLE_PRINTING)
if (interface_name ==
security_interstitials::mojom::InterstitialCommands::Name_) {
security_interstitials::SecurityInterstitialTabHelper::
Expand Down
10 changes: 6 additions & 4 deletions chrome/browser/printing/print_browsertest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1055,11 +1055,12 @@ IN_PROC_BROWSER_TEST_F(PrintBrowserTest, PrintNup) {
content::WebContents* web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
ASSERT_TRUE(web_contents);
content::RemoveWebContentsReceiverSet(web_contents,
mojom::PrintManagerHost::Name_);
TestPrintViewManager print_view_manager(web_contents);
PrintViewManager::SetReceiverImplForTesting(&print_view_manager);

PrintAndWaitUntilPreviewIsReady(/*print_only_selection=*/false);

PrintViewManager::SetReceiverImplForTesting(nullptr);
}

// Site per process version of PrintBrowserTest.PrintNup.
Expand All @@ -1071,11 +1072,12 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessPrintBrowserTest, PrintNup) {
content::WebContents* web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
ASSERT_TRUE(web_contents);
content::RemoveWebContentsReceiverSet(web_contents,
mojom::PrintManagerHost::Name_);
TestPrintViewManager print_view_manager(web_contents);
PrintViewManager::SetReceiverImplForTesting(&print_view_manager);

PrintAndWaitUntilPreviewIsReady(/*print_only_selection=*/false);

PrintViewManager::SetReceiverImplForTesting(nullptr);
}

IN_PROC_BROWSER_TEST_F(PrintBrowserTest, MultipagePrint) {
Expand Down
25 changes: 25 additions & 0 deletions chrome/browser/printing/print_view_manager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ namespace printing {

namespace {

PrintManager* g_receiver_for_testing = nullptr;

// Keeps track of pending scripted print preview closures.
// No locking, only access on the UI thread.
base::LazyInstance<std::map<content::RenderProcessHost*, base::OnceClosure>>::
Expand Down Expand Up @@ -84,6 +86,24 @@ PrintViewManager::~PrintViewManager() {
DCHECK_EQ(NOT_PREVIEWING, print_preview_state_);
}

// static
void PrintViewManager::BindPrintManagerHost(
mojo::PendingAssociatedReceiver<mojom::PrintManagerHost> receiver,
content::RenderFrameHost* rfh) {
if (g_receiver_for_testing) {
g_receiver_for_testing->BindReceiver(std::move(receiver), rfh);
return;
}

auto* web_contents = content::WebContents::FromRenderFrameHost(rfh);
if (!web_contents)
return;
auto* print_manager = PrintViewManager::FromWebContents(web_contents);
if (!print_manager)
return;
print_manager->BindReceiver(std::move(receiver), rfh);
}

bool PrintViewManager::PrintForSystemDialogNow(
base::OnceClosure dialog_shown_callback) {
DCHECK(dialog_shown_callback);
Expand Down Expand Up @@ -240,6 +260,11 @@ void PrintViewManager::RenderFrameDeleted(
PrintViewManagerBase::RenderFrameDeleted(render_frame_host);
}

// static
void PrintViewManager::SetReceiverImplForTesting(PrintManager* impl) {
g_receiver_for_testing = impl;
}

bool PrintViewManager::PrintPreview(
content::RenderFrameHost* rfh,
mojo::PendingAssociatedRemote<mojom::PrintRenderer> print_renderer,
Expand Down
7 changes: 7 additions & 0 deletions chrome/browser/printing/print_view_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@ class PrintViewManager : public PrintViewManagerBase,
public:
~PrintViewManager() override;

static void BindPrintManagerHost(
mojo::PendingAssociatedReceiver<mojom::PrintManagerHost> receiver,
content::RenderFrameHost* rfh);

// Same as PrintNow(), but for the case where a user prints with the system
// dialog from print preview.
// |dialog_shown_callback| is called when the print dialog is shown.
Expand Down Expand Up @@ -74,6 +78,9 @@ class PrintViewManager : public PrintViewManagerBase,

content::RenderFrameHost* print_preview_rfh() { return print_preview_rfh_; }

// Sets the target object for BindPrintManagerHost() for tests.
static void SetReceiverImplForTesting(PrintManager* impl);

protected:
explicit PrintViewManager(content::WebContents* web_contents);

Expand Down
13 changes: 13 additions & 0 deletions chrome/browser/printing/print_view_manager_basic.cc
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,19 @@ PrintViewManagerBasic::~PrintViewManagerBasic() {
#endif
}

// static
void PrintViewManagerBasic::BindPrintManagerHost(
mojo::PendingAssociatedReceiver<mojom::PrintManagerHost> receiver,
content::RenderFrameHost* rfh) {
auto* web_contents = content::WebContents::FromRenderFrameHost(rfh);
if (!web_contents)
return;
auto* print_manager = PrintViewManagerBasic::FromWebContents(web_contents);
if (!print_manager)
return;
print_manager->BindReceiver(std::move(receiver), rfh);
}

#if defined(OS_ANDROID)
void PrintViewManagerBasic::PdfWritingDone(int page_count) {
pdf_writing_done_callback().Run(page_count);
Expand Down
4 changes: 4 additions & 0 deletions chrome/browser/printing/print_view_manager_basic.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ class PrintViewManagerBasic
public:
~PrintViewManagerBasic() override;

static void BindPrintManagerHost(
mojo::PendingAssociatedReceiver<mojom::PrintManagerHost> receiver,
content::RenderFrameHost* rfh);

#if defined(OS_ANDROID)
// printing::PrintManager:
void PdfWritingDone(int page_count) override;
Expand Down
6 changes: 3 additions & 3 deletions chrome/browser/printing/print_view_manager_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -164,11 +164,9 @@ TEST_F(PrintViewManagerTest, PostScriptHasCorrectOffsets) {
browser()->tab_strip_model()->GetActiveWebContents();
ASSERT_TRUE(web_contents);

content::RemoveWebContentsReceiverSet(web_contents,
mojom::PrintManagerHost::Name_);

std::unique_ptr<TestPrintViewManager> print_view_manager =
std::make_unique<TestPrintViewManager>(web_contents);
PrintViewManager::SetReceiverImplForTesting(print_view_manager.get());

print_view_manager->PrintPreviewNow(web_contents->GetMainFrame(), false);

Expand All @@ -188,6 +186,8 @@ TEST_F(PrintViewManagerTest, PostScriptHasCorrectOffsets) {
EXPECT_EQ(gfx::Rect(0, 0, 5100, 6600), print_view_manager->content_area());
EXPECT_EQ(mojom::PrinterLanguageType::kPostscriptLevel2,
print_view_manager->type());

PrintViewManager::SetReceiverImplForTesting(nullptr);
}
#endif

Expand Down
11 changes: 7 additions & 4 deletions components/printing/browser/print_manager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,16 @@ namespace printing {

PrintManager::PrintManager(content::WebContents* contents)
: content::WebContentsObserver(contents),
print_manager_host_receivers_(
contents,
this,
content::WebContentsFrameReceiverSetPassKey()) {}
print_manager_host_receivers_(contents, this) {}

PrintManager::~PrintManager() = default;

void PrintManager::BindReceiver(
mojo::PendingAssociatedReceiver<mojom::PrintManagerHost> receiver,
content::RenderFrameHost* rfh) {
print_manager_host_receivers_.Bind(rfh, std::move(receiver));
}

void PrintManager::RenderFrameDeleted(
content::RenderFrameHost* render_frame_host) {
print_render_frames_.erase(render_frame_host);
Expand Down
10 changes: 7 additions & 3 deletions components/printing/browser/print_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@

#include "build/build_config.h"
#include "components/printing/common/print.mojom.h"
#include "content/public/browser/render_frame_host_receiver_set.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_contents_receiver_set.h"
#include "mojo/public/cpp/bindings/associated_remote.h"
#include "printing/buildflags/buildflags.h"

Expand All @@ -30,6 +30,10 @@ class PrintManager : public content::WebContentsObserver,
PrintManager& operator=(const PrintManager&) = delete;
~PrintManager() override;

void BindReceiver(
mojo::PendingAssociatedReceiver<mojom::PrintManagerHost> receiver,
content::RenderFrameHost* rfh);

#if defined(OS_ANDROID)
// TODO(timvolodine): consider introducing PrintManagerAndroid (crbug/500960)
using PdfWritingDoneCallback =
Expand Down Expand Up @@ -86,8 +90,8 @@ class PrintManager : public content::WebContentsObserver,
uint32_t number_pages_ = 0; // Number of pages to print in the print job.
int cookie_ = 0; // The current document cookie.

// Holds WebContents associated mojo receivers.
content::WebContentsFrameReceiverSet<printing::mojom::PrintManagerHost>
// Holds RenderFrameHost-associated mojo receivers.
content::RenderFrameHostReceiverSet<printing::mojom::PrintManagerHost>
print_manager_host_receivers_;

#if defined(OS_ANDROID)
Expand Down
5 changes: 0 additions & 5 deletions content/public/browser/web_contents_receiver_set.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,6 @@
#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"

namespace printing {
class PrintManager;
}

namespace content {

class RenderFrameHost;
Expand Down Expand Up @@ -86,7 +82,6 @@ class WebContentsFrameReceiverSetPassKey {
private:
WebContentsFrameReceiverSetPassKey() = default;

friend class ::printing::PrintManager;
friend class TestFrameInterfaceBinder;
FRIEND_TEST_ALL_PREFIXES(WebContentsReceiverSetBrowserTest,
OverrideForTesting);
Expand Down
21 changes: 21 additions & 0 deletions headless/lib/browser/headless_content_browser_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@
#include "content/public/browser/navigation_throttle.h"
#endif // defined(HEADLESS_USE_POLICY)

#if BUILDFLAG(ENABLE_PRINTING)
#include "headless/lib/browser/headless_print_manager.h"
#endif // defined(ENABLE_PRINTING)

namespace headless {

namespace {
Expand Down Expand Up @@ -185,6 +189,23 @@ void HeadlessContentBrowserClient::RegisterBrowserInterfaceBindersForFrame(
&HeadlessContentBrowserClient::BindBadgeService, base::Unretained(this)));
}

bool HeadlessContentBrowserClient::BindAssociatedReceiverFromFrame(
content::RenderFrameHost* render_frame_host,
const std::string& interface_name,
mojo::ScopedInterfaceEndpointHandle* handle) {
#if BUILDFLAG(ENABLE_PRINTING)
if (interface_name == printing::mojom::PrintManagerHost::Name_) {
HeadlessPrintManager::BindPrintManagerHost(
mojo::PendingAssociatedReceiver<printing::mojom::PrintManagerHost>(
std::move(*handle)),
render_frame_host);
return true;
}
#endif

return false;
}

std::unique_ptr<content::DevToolsManagerDelegate>
HeadlessContentBrowserClient::CreateDevToolsManagerDelegate() {
return std::make_unique<HeadlessDevToolsManagerDelegate>(
Expand Down
5 changes: 5 additions & 0 deletions headless/lib/browser/headless_content_browser_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <memory>
#include <vector>

#include "build/build_config.h"
#include "content/public/browser/content_browser_client.h"
#include "content/public/browser/render_frame_host.h"
#include "headless/public/headless_browser.h"
Expand All @@ -30,6 +31,10 @@ class HeadlessContentBrowserClient : public content::ContentBrowserClient {
void RegisterBrowserInterfaceBindersForFrame(
content::RenderFrameHost* render_frame_host,
mojo::BinderMapWithContext<content::RenderFrameHost*>* map) override;
bool BindAssociatedReceiverFromFrame(
content::RenderFrameHost* render_frame_host,
const std::string& interface_name,
mojo::ScopedInterfaceEndpointHandle* handle) override;
std::unique_ptr<content::DevToolsManagerDelegate>
CreateDevToolsManagerDelegate() override;
scoped_refptr<content::QuotaPermissionContext> CreateQuotaPermissionContext()
Expand Down
13 changes: 13 additions & 0 deletions headless/lib/browser/headless_print_manager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,19 @@ HeadlessPrintManager::HeadlessPrintManager(content::WebContents* web_contents)

HeadlessPrintManager::~HeadlessPrintManager() = default;

// static
void HeadlessPrintManager::BindPrintManagerHost(
mojo::PendingAssociatedReceiver<printing::mojom::PrintManagerHost> receiver,
content::RenderFrameHost* rfh) {
auto* web_contents = content::WebContents::FromRenderFrameHost(rfh);
if (!web_contents)
return;
auto* print_manager = HeadlessPrintManager::FromWebContents(web_contents);
if (!print_manager)
return;
print_manager->BindReceiver(std::move(receiver), rfh);
}

// static
std::string HeadlessPrintManager::PrintResultToString(PrintResult result) {
switch (result) {
Expand Down
Loading

0 comments on commit 926bda6

Please sign in to comment.