Commit 514a77b5 authored by Julie Jeongeun Kim's avatar Julie Jeongeun Kim Committed by Chromium LUCI CQ

[printing] Convert PrintHostMsg_RequestPrintPreview to Mojo

This CL converts PrintHostMsg_RequestPrintPreview message to
RequestPrintPreview() in mojom::PrintManagerHost.

Since PrintHostMsg_RequestPrintPreview is a message to
request a print preview, a Preview ID is not generated yet
when the message is requested. So, the converted message is
added to mojom::PrintManagerHost, not mojom::PrintPreviewUI.

This change also updates PrintPreviewDialogControllerBrowserTest
to use TestPrintViewManager instead of
RequestPrintPreviewObserver::OnMessageReceived.

Bug: 1008939
Change-Id: Id5db2862ddb01a91f80cf5534fde71e88c2d2b7b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2593847Reviewed-by: default avatarWei Li <weili@chromium.org>
Reviewed-by: default avatarDave Tapuska <dtapuska@chromium.org>
Reviewed-by: default avatarSam McNally <sammc@chromium.org>
Commit-Queue: Julie Kim <jkim@igalia.com>
Cr-Commit-Position: refs/heads/master@{#840939}
parent 25be8f6b
......@@ -16,7 +16,7 @@
#include "build/build_config.h"
#include "chrome/browser/extensions/extension_browsertest.h"
#include "chrome/browser/printing/print_job_manager.h"
#include "chrome/browser/printing/print_view_manager_base.h"
#include "chrome/browser/printing/print_view_manager.h"
#include "chrome/browser/printing/print_view_manager_common.h"
#include "chrome/browser/printing/printer_query.h"
#include "chrome/browser/printing/printing_message_filter.h"
......@@ -317,10 +317,10 @@ class KillPrintRenderFrame
} // namespace
class TestPrintViewManager : public PrintViewManagerBase {
class TestPrintViewManager : public PrintViewManager {
public:
explicit TestPrintViewManager(content::WebContents* web_contents)
: PrintViewManagerBase(web_contents) {}
: PrintViewManager(web_contents) {}
TestPrintViewManager(const TestPrintViewManager&) = delete;
TestPrintViewManager& operator=(const TestPrintViewManager&) = delete;
~TestPrintViewManager() override = default;
......
......@@ -51,60 +51,61 @@ using content::WebContentsObserver;
namespace {
class RequestPrintPreviewObserver : public WebContentsObserver {
class TestPrintViewManager : public printing::PrintViewManager {
public:
explicit RequestPrintPreviewObserver(WebContents* dialog)
: WebContentsObserver(dialog) {}
~RequestPrintPreviewObserver() override = default;
explicit TestPrintViewManager(content::WebContents* web_contents)
: PrintViewManager(web_contents) {}
TestPrintViewManager(const TestPrintViewManager&) = delete;
TestPrintViewManager& operator=(const TestPrintViewManager&) = delete;
~TestPrintViewManager() override = default;
static TestPrintViewManager* FromWebContents(WebContents* web_contents) {
return static_cast<TestPrintViewManager*>(
printing::PrintViewManager::FromWebContents(web_contents));
}
// Create TestPrintViewManager with PrintViewManager::UserDataKey() so that
// PrintViewManager::FromWebContents() in printing path returns
// TestPrintViewManager*.
static void CreateForWebContents(WebContents* web_contents) {
TestPrintViewManager* print_manager =
new TestPrintViewManager(web_contents);
web_contents->SetUserData(printing::PrintViewManager::UserDataKey(),
base::WrapUnique(print_manager));
}
void set_quit_closure(base::OnceClosure quit_closure) {
quit_closure_ = std::move(quit_closure);
}
private:
// content::WebContentsObserver implementation.
bool OnMessageReceived(const IPC::Message& message,
content::RenderFrameHost* render_frame_host) override {
IPC_BEGIN_MESSAGE_MAP(RequestPrintPreviewObserver, message)
IPC_MESSAGE_HANDLER(PrintHostMsg_RequestPrintPreview,
OnRequestPrintPreview)
IPC_MESSAGE_UNHANDLED(break)
IPC_END_MESSAGE_MAP()
return false; // Report not handled so the real handler receives it.
}
void OnRequestPrintPreview(
const printing::mojom::RequestPrintPreviewParams& /* params */) {
// printing::mojom::PrintManagerHost:
void RequestPrintPreview(
printing::mojom::RequestPrintPreviewParamsPtr params) override {
base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
std::move(quit_closure_));
printing::PrintViewManager::RequestPrintPreview(std::move(params));
}
base::OnceClosure quit_closure_;
DISALLOW_COPY_AND_ASSIGN(RequestPrintPreviewObserver);
};
class PrintPreviewDialogClonedObserver : public WebContentsObserver {
public:
explicit PrintPreviewDialogClonedObserver(WebContents* dialog)
: WebContentsObserver(dialog) {}
PrintPreviewDialogClonedObserver(const PrintPreviewDialogClonedObserver&) =
delete;
PrintPreviewDialogClonedObserver& operator=(
const PrintPreviewDialogClonedObserver&) = delete;
~PrintPreviewDialogClonedObserver() override = default;
RequestPrintPreviewObserver* request_preview_dialog_observer() {
return request_preview_dialog_observer_.get();
}
private:
// content::WebContentsObserver implementation.
void DidCloneToNewWebContents(WebContents* old_web_contents,
WebContents* new_web_contents) override {
request_preview_dialog_observer_ =
std::make_unique<RequestPrintPreviewObserver>(new_web_contents);
TestPrintViewManager::CreateForWebContents(new_web_contents);
}
std::unique_ptr<RequestPrintPreviewObserver> request_preview_dialog_observer_;
DISALLOW_COPY_AND_ASSIGN(PrintPreviewDialogClonedObserver);
};
void PluginsLoadedCallback(
......@@ -142,6 +143,10 @@ void CheckPdfPluginForRenderFrame(content::RenderFrameHost* frame) {
class PrintPreviewDialogControllerBrowserTest : public InProcessBrowserTest {
public:
PrintPreviewDialogControllerBrowserTest() = default;
PrintPreviewDialogControllerBrowserTest(
const PrintPreviewDialogControllerBrowserTest&) = delete;
PrintPreviewDialogControllerBrowserTest& operator=(
const PrintPreviewDialogControllerBrowserTest&) = delete;
~PrintPreviewDialogControllerBrowserTest() override = default;
WebContents* initiator() {
......@@ -150,7 +155,7 @@ class PrintPreviewDialogControllerBrowserTest : public InProcessBrowserTest {
void PrintPreview() {
base::RunLoop run_loop;
request_preview_dialog_observer()->set_quit_closure(run_loop.QuitClosure());
test_print_view_manager_->set_quit_closure(run_loop.QuitClosure());
chrome::Print(browser());
run_loop.Run();
}
......@@ -161,11 +166,7 @@ class PrintPreviewDialogControllerBrowserTest : public InProcessBrowserTest {
return dialog_controller->GetPrintPreviewForContents(initiator_);
}
void PrintPreviewDone() {
auto* print_view_manager =
printing::PrintViewManager::FromWebContents(initiator());
print_view_manager->PrintPreviewDone();
}
void PrintPreviewDone() { test_print_view_manager_->PrintPreviewDone(); }
void SetAlwaysOpenPdfExternallyForTests() {
PluginPrefs::GetForProfile(browser()->profile())
......@@ -183,11 +184,12 @@ class PrintPreviewDialogControllerBrowserTest : public InProcessBrowserTest {
browser()->tab_strip_model()->GetActiveWebContents();
ASSERT_TRUE(first_tab);
// Open a new tab so |cloned_tab_observer_| can see it first and attach a
// RequestPrintPreviewObserver to it before the real
// PrintPreviewMessageHandler gets created. Thus enabling
// RequestPrintPreviewObserver to get messages first for the purposes of
// this test.
// Open a new tab so |cloned_tab_observer_| can see it and create a
// TestPrintViewManager for it before the real PrintViewManager gets
// created. Since TestPrintViewManager is created with
// PrintViewManager::UserDataKey(), the real PrintViewManager is not
// created and TestPrintViewManager gets mojo messages for the
// purposes of this test.
cloned_tab_observer_ =
std::make_unique<PrintPreviewDialogClonedObserver>(first_tab);
chrome::DuplicateTab(browser());
......@@ -196,6 +198,8 @@ class PrintPreviewDialogControllerBrowserTest : public InProcessBrowserTest {
ASSERT_TRUE(initiator_);
ASSERT_NE(first_tab, initiator_);
test_print_view_manager_ =
TestPrintViewManager::FromWebContents(initiator_);
content::PluginService::GetInstance()->Init();
}
......@@ -204,14 +208,10 @@ class PrintPreviewDialogControllerBrowserTest : public InProcessBrowserTest {
initiator_ = nullptr;
}
RequestPrintPreviewObserver* request_preview_dialog_observer() {
return cloned_tab_observer_->request_preview_dialog_observer();
}
std::unique_ptr<PrintPreviewDialogClonedObserver> cloned_tab_observer_;
TestPrintViewManager* test_print_view_manager_;
WebContents* initiator_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(PrintPreviewDialogControllerBrowserTest);
};
// Test to verify that when a initiator navigates, we can create a new preview
......
......@@ -99,22 +99,6 @@ PrintPreviewUI* PrintPreviewMessageHandler::GetPrintPreviewUI(
return (id && *id == preview_ui_id) ? preview_ui : nullptr;
}
void PrintPreviewMessageHandler::OnRequestPrintPreview(
content::RenderFrameHost* render_frame_host,
const mojom::RequestPrintPreviewParams& params) {
PrintViewManager* print_view_manager =
PrintViewManager::FromWebContents(web_contents());
if (print_view_manager->RejectPrintPreviewRequestIfRestricted(
render_frame_host)) {
return;
}
if (params.webnode_only) {
print_view_manager->PrintPreviewForWebNode(render_frame_host);
}
PrintPreviewDialogController::PrintPreview(web_contents());
PrintPreviewUI::SetInitialParams(GetPrintPreviewDialog(), params);
}
void PrintPreviewMessageHandler::OnDidStartPreview(
const mojom::DidStartPreviewParams& params,
const mojom::PreviewIds& ids) {
......@@ -496,8 +480,6 @@ bool PrintPreviewMessageHandler::OnMessageReceived(
bool handled = true;
IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(PrintPreviewMessageHandler, message,
render_frame_host)
IPC_MESSAGE_HANDLER(PrintHostMsg_RequestPrintPreview,
OnRequestPrintPreview)
IPC_MESSAGE_HANDLER(PrintHostMsg_DidPrepareDocumentForPreview,
OnDidPrepareForDocumentToPdf)
IPC_MESSAGE_HANDLER(PrintHostMsg_DidPreviewPage, OnDidPreviewPage)
......
......@@ -57,8 +57,6 @@ class PrintPreviewMessageHandler
PrintPreviewUI* GetPrintPreviewUI(int preview_ui_id);
// Message handlers.
void OnRequestPrintPreview(content::RenderFrameHost* render_frame_host,
const mojom::RequestPrintPreviewParams& params);
void OnDidGetDefaultPageLayout(
const mojom::PageSizeMargins& page_layout_in_points,
const gfx::Rect& printable_area_in_points,
......
......@@ -36,6 +36,8 @@
using content::BrowserThread;
namespace printing {
namespace {
// Keeps track of pending scripted print preview closures.
......@@ -58,9 +60,16 @@ void EnableInternalPDFPluginForContents(int render_process_id,
render_process_id, render_frame_id, info->ToWebPluginInfo());
}
} // namespace
content::WebContents* GetPrintPreviewDialog(
content::WebContents* web_contents) {
PrintPreviewDialogController* dialog_controller =
PrintPreviewDialogController::GetInstance();
if (!dialog_controller)
return nullptr;
return dialog_controller->GetPrintPreviewForContents(web_contents);
}
namespace printing {
} // namespace
struct PrintViewManager::FrameDispatchHelper {
PrintViewManager* manager;
......@@ -326,6 +335,22 @@ void PrintViewManager::ShowScriptedPrintPreview(bool source_is_modifiable) {
dialog_controller->GetPrintPreviewForContents(web_contents()), params);
}
void PrintViewManager::RequestPrintPreview(
mojom::RequestPrintPreviewParamsPtr params) {
content::RenderFrameHost* render_frame_host =
print_manager_host_receivers_.GetCurrentTargetFrame();
if (RejectPrintPreviewRequestIfRestricted(render_frame_host))
return;
if (params->webnode_only) {
PrintPreviewForWebNode(render_frame_host);
}
PrintPreviewDialogController::PrintPreview(web_contents());
PrintPreviewUI::SetInitialParams(GetPrintPreviewDialog(web_contents()),
*params);
}
void PrintViewManager::OnScriptedPrintPreviewReply(IPC::Message* reply_msg) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
print_preview_rfh_->Send(reply_msg);
......
......@@ -58,13 +58,10 @@ class PrintViewManager : public PrintViewManagerBase,
// renderer in the case of scripted print preview if needed.
void PrintPreviewDone();
// Checks whether printing is currently restricted and aborts print preview if
// needed.
bool RejectPrintPreviewRequestIfRestricted(content::RenderFrameHost* rfh);
// mojom::PrintManagerHost:
void DidShowPrintDialog() override;
void ShowScriptedPrintPreview(bool source_is_modifiable) override;
void RequestPrintPreview(mojom::RequestPrintPreviewParamsPtr params) override;
// content::WebContentsObserver implementation.
void RenderFrameCreated(content::RenderFrameHost* render_frame_host) override;
......@@ -108,6 +105,10 @@ class PrintViewManager : public PrintViewManagerBase,
// Checks whether printing is restricted due to Data Leak Protection rules.
bool IsPrintingRestricted() const;
// Checks whether printing is currently restricted and aborts print preview if
// needed.
bool RejectPrintPreviewRequestIfRestricted(content::RenderFrameHost* rfh);
base::OnceClosure on_print_dialog_shown_callback_;
// Current state of print preview for this view.
......
......@@ -94,6 +94,9 @@ void PrintManager::PrintingFailed(int32_t cookie) {
#if BUILDFLAG(ENABLE_PRINT_PREVIEW)
void PrintManager::ShowScriptedPrintPreview(bool source_is_modifiable) {}
void PrintManager::RequestPrintPreview(
mojom::RequestPrintPreviewParamsPtr params) {}
#endif
bool PrintManager::IsPrintRenderFrameConnected(content::RenderFrameHost* rfh) {
......
......@@ -62,6 +62,7 @@ class PrintManager : public content::WebContentsObserver,
void PrintingFailed(int32_t cookie) override;
#if BUILDFLAG(ENABLE_PRINT_PREVIEW)
void ShowScriptedPrintPreview(bool source_is_modifiable) override;
void RequestPrintPreview(mojom::RequestPrintPreviewParamsPtr params) override;
#endif
protected:
......
......@@ -330,4 +330,8 @@ interface PrintManagerHost {
// modifiable or not.
[EnableIf=enable_print_preview]
ShowScriptedPrintPreview(bool is_modifiable);
// Asks the browser to do print preview.
[EnableIf=enable_print_preview]
RequestPrintPreview(RequestPrintPreviewParams params);
};
......@@ -127,15 +127,6 @@ IPC_STRUCT_TRAITS_BEGIN(printing::PageRange)
IPC_STRUCT_TRAITS_END()
#if BUILDFLAG(ENABLE_PRINT_PREVIEW)
IPC_STRUCT_TRAITS_BEGIN(printing::mojom::RequestPrintPreviewParams)
IPC_STRUCT_TRAITS_MEMBER(is_from_arc)
IPC_STRUCT_TRAITS_MEMBER(is_modifiable)
IPC_STRUCT_TRAITS_MEMBER(is_pdf)
IPC_STRUCT_TRAITS_MEMBER(webnode_only)
IPC_STRUCT_TRAITS_MEMBER(has_selection)
IPC_STRUCT_TRAITS_MEMBER(selection_only)
IPC_STRUCT_TRAITS_END()
IPC_STRUCT_TRAITS_BEGIN(printing::mojom::PreviewIds)
IPC_STRUCT_TRAITS_MEMBER(request_id)
IPC_STRUCT_TRAITS_MEMBER(ui_id)
......@@ -259,10 +250,6 @@ IPC_SYNC_MESSAGE_ROUTED1_1(PrintHostMsg_ScriptedPrint,
/* settings chosen by the user*/)
#if BUILDFLAG(ENABLE_PRINT_PREVIEW)
// Asks the browser to do print preview.
IPC_MESSAGE_ROUTED1(PrintHostMsg_RequestPrintPreview,
printing::mojom::RequestPrintPreviewParams /* params */)
// Notify the browser the about the to-be-rendered print preview document.
IPC_MESSAGE_ROUTED2(PrintHostMsg_DidStartPreview,
printing::mojom::DidStartPreviewParams /* params */,
......
......@@ -2404,11 +2404,11 @@ void PrintRenderFrameHelper::RequestPrintPreview(PrintPreviewRequestType type) {
if (delegate_->ShouldGenerateTaggedPDF())
snapshotter_ = render_frame()->CreateAXTreeSnapshotter();
mojom::RequestPrintPreviewParams params;
params.is_from_arc = is_from_arc;
params.is_modifiable = is_modifiable;
params.is_pdf = is_pdf;
params.has_selection = has_selection;
auto params = mojom::RequestPrintPreviewParams::New();
params->is_from_arc = is_from_arc;
params->is_modifiable = is_modifiable;
params->is_pdf = is_pdf;
params->has_selection = has_selection;
switch (type) {
case PRINT_PREVIEW_SCRIPTED: {
// Shows scripted print preview in two stages.
......@@ -2456,7 +2456,7 @@ void PrintRenderFrameHelper::RequestPrintPreview(PrintPreviewRequestType type) {
case PRINT_PREVIEW_USER_INITIATED_SELECTION: {
DCHECK(has_selection);
DCHECK(!print_preview_context_.IsPlugin());
params.selection_only = has_selection;
params->selection_only = has_selection;
break;
}
case PRINT_PREVIEW_USER_INITIATED_CONTEXT_NODE: {
......@@ -2467,7 +2467,7 @@ void PrintRenderFrameHelper::RequestPrintPreview(PrintPreviewRequestType type) {
return;
}
params.webnode_only = true;
params->webnode_only = true;
break;
}
default: {
......@@ -2480,7 +2480,7 @@ void PrintRenderFrameHelper::RequestPrintPreview(PrintPreviewRequestType type) {
base::UmaHistogramEnumeration("Arc.PrintPreview.PreviewEvent",
PREVIEW_EVENT_INITIATED, PREVIEW_EVENT_MAX);
}
Send(new PrintHostMsg_RequestPrintPreview(routing_id(), params));
GetPrintManagerHost()->RequestPrintPreview(std::move(params));
}
bool PrintRenderFrameHelper::CheckForCancel() {
......
......@@ -333,6 +333,8 @@ class TestPrintManagerHost
void DidShowPrintDialog() override {}
#if BUILDFLAG(ENABLE_PRINT_PREVIEW)
void ShowScriptedPrintPreview(bool source_is_modifiable) override {}
void RequestPrintPreview(
mojom::RequestPrintPreviewParamsPtr params) override {}
#endif
bool IsPrinted() { return is_printed_; }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment