Update printing code to latest

This commit is contained in:
Cheng Zhao 2016-03-09 22:19:47 +09:00
parent bfc6d77bb3
commit 044daee086
5 changed files with 55 additions and 111 deletions

View file

@ -386,7 +386,7 @@ class PrepareFrameAndViewForPrint : public blink::WebViewClient,
blink::WebLocalFrame* frame,
const blink::WebNode& node,
bool ignore_css_margins);
virtual ~PrepareFrameAndViewForPrint();
~PrepareFrameAndViewForPrint() override;
// Optional. Replaces |frame_| with selection if needed. Will call |on_ready|
// when completed.
@ -810,13 +810,19 @@ bool PrintWebViewHelper::FinalizePrintReadyDocument() {
DCHECK(!is_print_ready_metafile_sent_);
print_preview_context_.FinalizePrintReadyDocument();
// Get the size of the resulting metafile.
PdfMetafileSkia* metafile = print_preview_context_.metafile();
uint32_t buf_size = metafile->GetDataSize();
DCHECK_GT(buf_size, 0u);
PrintHostMsg_DidPreviewDocument_Params preview_params;
preview_params.data_size = buf_size;
// Ask the browser to create the shared memory for us.
if (!CopyMetafileDataToSharedMem(*metafile,
&(preview_params.metafile_data_handle))) {
LOG(ERROR) << "CopyMetafileDataToSharedMem failed";
print_preview_context_.set_error(PREVIEW_ERROR_METAFILE_COPY_FAILED);
return false;
}
preview_params.data_size = metafile->GetDataSize();
preview_params.document_cookie = print_pages_params_->params.document_cookie;
preview_params.expected_pages_count =
print_preview_context_.total_page_count();
@ -824,13 +830,6 @@ bool PrintWebViewHelper::FinalizePrintReadyDocument() {
preview_params.preview_request_id =
print_pages_params_->params.preview_request_id;
// Ask the browser to create the shared memory for us.
if (!CopyMetafileDataToSharedMem(metafile,
&(preview_params.metafile_data_handle))) {
LOG(ERROR) << "CopyMetafileDataToSharedMem failed";
print_preview_context_.set_error(PREVIEW_ERROR_METAFILE_COPY_FAILED);
return false;
}
is_print_ready_metafile_sent_ = true;
Send(new PrintHostMsg_MetafileReadyForPrinting(routing_id(), preview_params));
@ -1160,21 +1159,25 @@ bool PrintWebViewHelper::RenderPagesForPrint(blink::WebLocalFrame* frame,
#if defined(OS_POSIX)
bool PrintWebViewHelper::CopyMetafileDataToSharedMem(
PdfMetafileSkia* metafile,
const PdfMetafileSkia& metafile,
base::SharedMemoryHandle* shared_mem_handle) {
uint32_t buf_size = metafile->GetDataSize();
scoped_ptr<base::SharedMemory> shared_buf(
content::RenderThread::Get()->HostAllocateSharedMemoryBuffer(
buf_size).release());
uint32_t buf_size = metafile.GetDataSize();
if (buf_size == 0)
return false;
if (shared_buf) {
if (shared_buf->Map(buf_size)) {
metafile->GetData(shared_buf->memory(), buf_size);
return shared_buf->GiveToProcess(base::GetCurrentProcessHandle(),
shared_mem_handle);
}
}
return false;
scoped_ptr<base::SharedMemory> shared_buf(
content::RenderThread::Get()->HostAllocateSharedMemoryBuffer(buf_size));
if (!shared_buf)
return false;
if (!shared_buf->Map(buf_size))
return false;
if (!metafile.GetData(shared_buf->memory(), buf_size))
return false;
return shared_buf->GiveToProcess(base::GetCurrentProcessHandle(),
shared_mem_handle);
}
#endif // defined(OS_POSIX)

View file

@ -218,7 +218,7 @@ class PrintWebViewHelper
// Helper methods -----------------------------------------------------------
bool CopyMetafileDataToSharedMem(PdfMetafileSkia* metafile,
bool CopyMetafileDataToSharedMem(const PdfMetafileSkia& metafile,
base::SharedMemoryHandle* shared_mem_handle);
// Helper method to get page layout in points and fit to page if needed.

View file

@ -11,7 +11,6 @@
#include "printing/metafile_skia_wrapper.h"
#include "printing/page_size_margins.h"
#include "printing/pdf_metafile_skia.h"
#include "skia/ext/platform_device.h"
#include "third_party/WebKit/public/web/WebLocalFrame.h"
#if !defined(OS_CHROMEOS) && !defined(OS_ANDROID)
@ -91,49 +90,15 @@ bool PrintWebViewHelper::PrintPagesNative(blink::WebFrame* frame,
metafile.FinishDocument();
// Get the size of the resulting metafile.
uint32_t buf_size = metafile.GetDataSize();
DCHECK_GT(buf_size, 0u);
#if defined(OS_CHROMEOS) || defined(OS_ANDROID)
int sequence_number = -1;
base::FileDescriptor fd;
// Ask the browser to open a file for us.
Send(new PrintHostMsg_AllocateTempFileForPrinting(routing_id(),
&fd,
&sequence_number));
if (!metafile.SaveToFD(fd))
return false;
// Tell the browser we've finished writing the file.
Send(new PrintHostMsg_TempFileForPrintingWritten(routing_id(),
sequence_number));
return true;
#else
PrintHostMsg_DidPrintPage_Params printed_page_params;
printed_page_params.data_size = 0;
printed_page_params.document_cookie = params.params.document_cookie;
{
scoped_ptr<base::SharedMemory> shared_mem(
content::RenderThread::Get()->HostAllocateSharedMemoryBuffer(
buf_size).release());
if (!shared_mem.get()) {
NOTREACHED() << "AllocateSharedMemoryBuffer failed";
return false;
}
if (!shared_mem->Map(buf_size)) {
NOTREACHED() << "Map failed";
return false;
}
metafile.GetData(shared_mem->memory(), buf_size);
printed_page_params.data_size = buf_size;
shared_mem->GiveToProcess(base::GetCurrentProcessHandle(),
&(printed_page_params.metafile_data_handle));
if (!CopyMetafileDataToSharedMem(
metafile, &printed_page_params.metafile_data_handle)) {
return false;
}
printed_page_params.data_size = metafile.GetDataSize();
printed_page_params.document_cookie = params.params.document_cookie;
for (size_t i = 0; i < printed_pages.size(); ++i) {
printed_page_params.page_number = printed_pages[i];
Send(new PrintHostMsg_DidPrintPage(routing_id(), printed_page_params));
@ -141,7 +106,6 @@ bool PrintWebViewHelper::PrintPagesNative(blink::WebFrame* frame,
printed_page_params.metafile_data_handle.fd = -1;
}
return true;
#endif // defined(OS_CHROMEOS)
}
void PrintWebViewHelper::PrintPageInternal(
@ -165,7 +129,6 @@ void PrintWebViewHelper::PrintPageInternal(
return;
MetafileSkiaWrapper::SetMetafileOnCanvas(*canvas, metafile);
skia::SetIsDraftMode(*canvas, is_print_ready_metafile_sent_);
RenderPageContent(frame, params.page_number, canvas_area, content_area,
scale_factor, canvas);

View file

@ -42,8 +42,9 @@ void PrintWebViewHelper::PrintPageInternal(
page_params.content_area = content_area_in_dpi;
// Ask the browser to create the shared memory for us.
if (!CopyMetafileDataToSharedMem(&metafile,
if (!CopyMetafileDataToSharedMem(metafile,
&(page_params.metafile_data_handle))) {
// TODO(thestig): Fail and return false instead.
page_params.data_size = 0;
}

View file

@ -95,40 +95,16 @@ bool PrintWebViewHelper::PrintPagesNative(blink::WebFrame* frame,
metafile.FinishDocument();
// Get the size of the resulting metafile.
uint32_t buf_size = metafile.GetDataSize();
DCHECK_GT(buf_size, 0u);
PrintHostMsg_DidPrintPage_Params printed_page_params;
printed_page_params.data_size = 0;
if (!CopyMetafileDataToSharedMem(
metafile, &printed_page_params.metafile_data_handle)) {
return false;
}
printed_page_params.content_area = params.params.printable_area;
printed_page_params.data_size = metafile.GetDataSize();
printed_page_params.document_cookie = params.params.document_cookie;
printed_page_params.page_size = params.params.page_size;
printed_page_params.content_area = params.params.printable_area;
{
base::SharedMemory shared_buf;
// Allocate a shared memory buffer to hold the generated metafile data.
if (!shared_buf.CreateAndMapAnonymous(buf_size)) {
NOTREACHED() << "Buffer allocation failed";
return false;
}
// Copy the bits into shared memory.
if (!metafile.GetData(shared_buf.memory(), buf_size)) {
NOTREACHED() << "GetData() failed";
shared_buf.Unmap();
return false;
}
shared_buf.GiveToProcess(base::GetCurrentProcessHandle(),
&printed_page_params.metafile_data_handle);
shared_buf.Unmap();
printed_page_params.data_size = buf_size;
Send(new PrintHostMsg_DuplicateSection(
routing_id(),
printed_page_params.metafile_data_handle,
&printed_page_params.metafile_data_handle));
}
for (size_t i = 0; i < printed_pages.size(); ++i) {
printed_page_params.page_number = printed_pages[i];
@ -216,24 +192,25 @@ void PrintWebViewHelper::PrintPageInternal(
}
bool PrintWebViewHelper::CopyMetafileDataToSharedMem(
PdfMetafileSkia* metafile,
const PdfMetafileSkia& metafile,
base::SharedMemoryHandle* shared_mem_handle) {
uint32_t buf_size = metafile->GetDataSize();
uint32_t buf_size = metafile.GetDataSize();
if (buf_size == 0)
return false;
base::SharedMemory shared_buf;
// Allocate a shared memory buffer to hold the generated metafile data.
if (!shared_buf.CreateAndMapAnonymous(buf_size)) {
NOTREACHED() << "Buffer allocation failed";
if (!shared_buf.CreateAndMapAnonymous(buf_size))
return false;
}
// Copy the bits into shared memory.
if (!metafile->GetData(shared_buf.memory(), buf_size)) {
NOTREACHED() << "GetData() failed";
shared_buf.Unmap();
if (!metafile.GetData(shared_buf.memory(), buf_size))
return false;
if (!shared_buf.GiveToProcess(base::GetCurrentProcessHandle(),
shared_mem_handle)) {
return false;
}
shared_buf.GiveToProcess(base::GetCurrentProcessHandle(), shared_mem_handle);
shared_buf.Unmap();
Send(new PrintHostMsg_DuplicateSection(routing_id(), *shared_mem_handle,
shared_mem_handle));