| Index: chrome/browser/printing/print_preview_message_handler.cc
|
| diff --git a/chrome/browser/printing/print_preview_message_handler.cc b/chrome/browser/printing/print_preview_message_handler.cc
|
| index 2ec09eb6df871bca49ab237a11e57bcdbe6a1000..9c2315cb5997300129d95965c3ac2b5ce4d207fa 100644
|
| --- a/chrome/browser/printing/print_preview_message_handler.cc
|
| +++ b/chrome/browser/printing/print_preview_message_handler.cc
|
| @@ -14,7 +14,9 @@
|
| #include "base/memory/ref_counted.h"
|
| #include "base/memory/ref_counted_memory.h"
|
| #include "base/memory/shared_memory.h"
|
| +#include "base/memory/shared_memory_handle.h"
|
| #include "chrome/browser/browser_process.h"
|
| +#include "chrome/browser/printing/print_composite_client.h"
|
| #include "chrome/browser/printing/print_job_manager.h"
|
| #include "chrome/browser/printing/print_preview_dialog_controller.h"
|
| #include "chrome/browser/printing/print_view_manager.h"
|
| @@ -22,10 +24,12 @@
|
| #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h"
|
| #include "components/printing/common/print_messages.h"
|
| #include "content/public/browser/browser_thread.h"
|
| +#include "content/public/browser/render_frame_host.h"
|
| #include "content/public/browser/web_contents.h"
|
| #include "content/public/browser/web_ui.h"
|
| #include "printing/page_size_margins.h"
|
| #include "printing/print_job_constants.h"
|
| +#include "services/pdf_compositor/public/cpp/compositor_data.h"
|
|
|
| using content::BrowserThread;
|
| using content::WebContents;
|
| @@ -71,6 +75,11 @@ PrintPreviewMessageHandler::PrintPreviewMessageHandler(
|
| WebContents* web_contents)
|
| : content::WebContentsObserver(web_contents) {
|
| DCHECK(web_contents);
|
| + composite_client_ = PrintCompositeClient::FromWebContents(web_contents);
|
| + if (!composite_client_) {
|
| + PrintCompositeClient::CreateForWebContents(web_contents);
|
| + composite_client_ = PrintCompositeClient::FromWebContents(web_contents);
|
| + }
|
| }
|
|
|
| PrintPreviewMessageHandler::~PrintPreviewMessageHandler() {
|
| @@ -120,6 +129,7 @@ void PrintPreviewMessageHandler::OnDidGetPreviewPageCount(
|
| }
|
|
|
| void PrintPreviewMessageHandler::OnDidPreviewPage(
|
| + content::RenderFrameHost* render_frame_host,
|
| const PrintHostMsg_DidPreviewPage_Params& params) {
|
| int page_number = params.page_number;
|
| if (page_number < FIRST_PAGE_INDEX || !params.data_size)
|
| @@ -129,16 +139,17 @@ void PrintPreviewMessageHandler::OnDidPreviewPage(
|
| if (!print_preview_ui)
|
| return;
|
|
|
| - scoped_refptr<base::RefCountedBytes> data_bytes =
|
| - GetDataFromHandle(params.metafile_data_handle, params.data_size);
|
| - DCHECK(data_bytes);
|
| -
|
| - print_preview_ui->SetPrintPreviewDataForIndex(page_number,
|
| - std::move(data_bytes));
|
| - print_preview_ui->OnDidPreviewPage(page_number, params.preview_request_id);
|
| + // Use utility process to convert skia metafile to pdf.
|
| + composite_client_->DoComposite(
|
| + page_number, params.metafile_data_handle, params.data_size,
|
| + base::Bind(&PrintPreviewMessageHandler::OnCompositePdfPageDone,
|
| + base::Unretained(this), params.page_number,
|
| + params.preview_request_id),
|
| + base::ThreadTaskRunnerHandle::Get());
|
| }
|
|
|
| void PrintPreviewMessageHandler::OnMetafileReadyForPrinting(
|
| + content::RenderFrameHost* render_frame_host,
|
| const PrintHostMsg_DidPreviewDocument_Params& params) {
|
| // Always try to stop the worker.
|
| StopWorker(params.document_cookie);
|
| @@ -152,18 +163,86 @@ void PrintPreviewMessageHandler::OnMetafileReadyForPrinting(
|
| if (!print_preview_ui)
|
| return;
|
|
|
| - // TODO(joth): This seems like a good match for using RefCountedStaticMemory
|
| - // to avoid the memory copy, but the SetPrintPreviewData call chain below
|
| - // needs updating to accept the RefCountedMemory* base class.
|
| - scoped_refptr<base::RefCountedBytes> data_bytes =
|
| - GetDataFromHandle(params.metafile_data_handle, params.data_size);
|
| - if (!data_bytes || !data_bytes->size())
|
| + composite_client_->DoComposite(
|
| + pdf_compositor::kPageRangeAll, params.metafile_data_handle,
|
| + params.data_size,
|
| + base::Bind(&PrintPreviewMessageHandler::OnCompositePdfDocumentDone,
|
| + base::Unretained(this), params.expected_pages_count,
|
| + params.preview_request_id),
|
| + base::ThreadTaskRunnerHandle::Get());
|
| +}
|
| +
|
| +void PrintPreviewMessageHandler::OnCompositePdfPageDone(
|
| + int page_number,
|
| + int request_id,
|
| + mojo::ScopedSharedBufferHandle handle) {
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| + if (!handle.is_valid()) {
|
| + DLOG(ERROR) << "Sth wrong converting to pdf";
|
| + return;
|
| + }
|
| +
|
| + base::SharedMemoryHandle memory_handle;
|
| + size_t memory_size = 0;
|
| + bool read_only_flag = false;
|
| +
|
| + const MojoResult result = mojo::UnwrapSharedMemoryHandle(
|
| + std::move(handle), &memory_handle, &memory_size, &read_only_flag);
|
| + DCHECK_EQ(MOJO_RESULT_OK, result);
|
| + DCHECK_GT(memory_size, 0u);
|
| +
|
| + std::unique_ptr<base::SharedMemory> shm(
|
| + new base::SharedMemory(memory_handle, true /* read_only */));
|
| + if (!shm->Map(memory_size)) {
|
| + DLOG(ERROR) << "OnBufferCreated: Map failed.";
|
| + return;
|
| + }
|
| +
|
| + scoped_refptr<base::RefCountedBytes> bytes(new base::RefCountedBytes(
|
| + (unsigned char*)shm->memory(), shm->mapped_size()));
|
| +
|
| + PrintPreviewUI* print_preview_ui = GetPrintPreviewUI();
|
| + if (!print_preview_ui)
|
| + return;
|
| + print_preview_ui->SetPrintPreviewDataForIndex(page_number, std::move(bytes));
|
| + print_preview_ui->OnDidPreviewPage(page_number, request_id);
|
| +}
|
| +
|
| +void PrintPreviewMessageHandler::OnCompositePdfDocumentDone(
|
| + int page_count,
|
| + int request_id,
|
| + mojo::ScopedSharedBufferHandle handle) {
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| + if (!handle.is_valid()) {
|
| + DLOG(ERROR) << "Sth wrong converting to pdf";
|
| return;
|
| + }
|
| +
|
| + base::SharedMemoryHandle memory_handle;
|
| + size_t memory_size = 0;
|
| + bool read_only_flag = false;
|
| +
|
| + const MojoResult result = mojo::UnwrapSharedMemoryHandle(
|
| + std::move(handle), &memory_handle, &memory_size, &read_only_flag);
|
| + DCHECK_EQ(MOJO_RESULT_OK, result);
|
| + DCHECK_GT(memory_size, 0u);
|
| +
|
| + std::unique_ptr<base::SharedMemory> shm(
|
| + new base::SharedMemory(memory_handle, true /* read_only */));
|
| + if (!shm->Map(memory_size)) {
|
| + DLOG(ERROR) << "OnBufferCreated: Map failed.";
|
| + return;
|
| + }
|
|
|
| + scoped_refptr<base::RefCountedBytes> bytes(new base::RefCountedBytes(
|
| + (unsigned char*)shm->memory(), shm->mapped_size()));
|
| +
|
| + PrintPreviewUI* print_preview_ui = GetPrintPreviewUI();
|
| + if (!print_preview_ui)
|
| + return;
|
| print_preview_ui->SetPrintPreviewDataForIndex(COMPLETE_PREVIEW_DOCUMENT_INDEX,
|
| - std::move(data_bytes));
|
| - print_preview_ui->OnPreviewDataIsAvailable(
|
| - params.expected_pages_count, params.preview_request_id);
|
| + std::move(bytes));
|
| + print_preview_ui->OnPreviewDataIsAvailable(page_count, request_id);
|
| }
|
|
|
| void PrintPreviewMessageHandler::OnPrintPreviewFailed(int document_cookie) {
|
| @@ -216,6 +295,9 @@ bool PrintPreviewMessageHandler::OnMessageReceived(
|
| render_frame_host)
|
| IPC_MESSAGE_HANDLER(PrintHostMsg_RequestPrintPreview,
|
| OnRequestPrintPreview)
|
| + IPC_MESSAGE_HANDLER(PrintHostMsg_DidPreviewPage, OnDidPreviewPage)
|
| + IPC_MESSAGE_HANDLER(PrintHostMsg_MetafileReadyForPrinting,
|
| + OnMetafileReadyForPrinting)
|
| IPC_MESSAGE_UNHANDLED(handled = false)
|
| IPC_END_MESSAGE_MAP()
|
| if (handled)
|
| @@ -224,10 +306,6 @@ bool PrintPreviewMessageHandler::OnMessageReceived(
|
| IPC_BEGIN_MESSAGE_MAP(PrintPreviewMessageHandler, message)
|
| IPC_MESSAGE_HANDLER(PrintHostMsg_DidGetPreviewPageCount,
|
| OnDidGetPreviewPageCount)
|
| - IPC_MESSAGE_HANDLER(PrintHostMsg_DidPreviewPage,
|
| - OnDidPreviewPage)
|
| - IPC_MESSAGE_HANDLER(PrintHostMsg_MetafileReadyForPrinting,
|
| - OnMetafileReadyForPrinting)
|
| IPC_MESSAGE_HANDLER(PrintHostMsg_PrintPreviewFailed,
|
| OnPrintPreviewFailed)
|
| IPC_MESSAGE_HANDLER(PrintHostMsg_DidGetDefaultPageLayout,
|
|
|