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

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

Issue 2653963002: [Experimental] Supporting OOPIF printing
Patch Set: Rename service, fix for webview, and connect to DiscardableMemoryManager Created 3 years, 9 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_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,
« no previous file with comments | « chrome/browser/printing/print_preview_message_handler.h ('k') | chrome/browser/printing/print_view_manager_base.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698