| Index: components/printing/renderer/print_web_view_helper.cc
|
| diff --git a/components/printing/renderer/print_web_view_helper.cc b/components/printing/renderer/print_web_view_helper.cc
|
| index 9d9a87c8cc077b7437928f4763871a082e0ce68d..66b34efb3ffc568187bd3c79f64f50ca09226b1a 100644
|
| --- a/components/printing/renderer/print_web_view_helper.cc
|
| +++ b/components/printing/renderer/print_web_view_helper.cc
|
| @@ -42,6 +42,7 @@
|
| #include "third_party/WebKit/public/web/WebConsoleMessage.h"
|
| #include "third_party/WebKit/public/web/WebDocument.h"
|
| #include "third_party/WebKit/public/web/WebElement.h"
|
| +#include "third_party/WebKit/public/web/WebFrame.h"
|
| #include "third_party/WebKit/public/web/WebFrameClient.h"
|
| #include "third_party/WebKit/public/web/WebFrameOwnerProperties.h"
|
| #include "third_party/WebKit/public/web/WebFrameWidget.h"
|
| @@ -55,6 +56,7 @@
|
| #include "third_party/WebKit/public/web/WebSettings.h"
|
| #include "third_party/WebKit/public/web/WebView.h"
|
| #include "third_party/WebKit/public/web/WebViewClient.h"
|
| +//#include "third_party/WebKit/Source/web/WebRemoteFrameImpl.h"
|
| #include "third_party/skia/include/core/SkCanvas.h"
|
| #include "ui/base/resource/resource_bundle.h"
|
|
|
| @@ -736,6 +738,8 @@ PrepareFrameAndViewForPrint::PrepareFrameAndViewForPrint(
|
| frame->printEnd();
|
| }
|
| ComputeWebKitPrintParamsInDesiredDpi(print_params, &web_print_params_);
|
| + web_print_params_.rootFrameRoutingId =
|
| + content::RenderFrame::FromWebFrame(frame)->GetRoutingID();
|
| }
|
|
|
| PrepareFrameAndViewForPrint::~PrepareFrameAndViewForPrint() {
|
| @@ -767,7 +771,6 @@ void PrepareFrameAndViewForPrint::ResizeForPrinting() {
|
| prev_scroll_offset_ = web_frame->getScrollOffset();
|
| }
|
| prev_view_size_ = web_view->size();
|
| -
|
| web_view->resize(print_layout_size);
|
| }
|
|
|
| @@ -981,6 +984,52 @@ void PrintWebViewHelper::ScriptedPrint(bool user_initiated) {
|
| // just return.
|
| }
|
|
|
| +void PrintWebViewHelper::PrintFrame(const gfx::Rect& rect, int src_id) {
|
| + if (ipc_nesting_level_ > 1)
|
| + return;
|
| +
|
| + PrintMsg_PrintPages_Params settings;
|
| + settings.params.dpi = 300;
|
| + settings.params.desired_dpi = 300;
|
| + settings.params.selection_only = false;
|
| + settings.params.should_print_backgrounds = true;
|
| + settings.params.page_size = rect.size();
|
| + settings.params.content_size = rect.size();
|
| + settings.params.printable_area = rect;
|
| + settings.params.is_first_request = true;
|
| + settings.params.print_to_pdf = false;
|
| + settings.params.display_header_footer = false;
|
| + settings.params.document_cookie = -1;
|
| + settings.params.is_subframe = true;
|
| +
|
| + blink::WebLocalFrame* frame = render_frame()->GetWebFrame();
|
| + FrameReference frame_ref(frame);
|
| +
|
| + // If we are printing a PDF extension frame, find the plugin node and print
|
| + // that instead.
|
| + auto node = delegate_->GetPdfElement(frame);
|
| +
|
| + // Handle settings.
|
| + ignore_css_margins_ = false;
|
| + print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings));
|
| +
|
| + prep_frame_view_.reset(new PrepareFrameAndViewForPrint(
|
| + print_pages_params_->params, frame, node, ignore_css_margins_));
|
| + prep_frame_view_->StartPrinting();
|
| +
|
| + int page_count = prep_frame_view_->GetExpectedPageCount();
|
| + if (!page_count) {
|
| + return DidFinishPrinting(FAIL_PRINT);
|
| + }
|
| +
|
| + if (!PrintPagesNative(prep_frame_view_->frame(), page_count)) {
|
| + return DidFinishPrinting(FAIL_PRINT);
|
| + }
|
| +
|
| + FinishFramePrinting();
|
| + scripting_throttler_.Reset();
|
| +}
|
| +
|
| bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) {
|
| // The class is not designed to handle recursive messages. This is not
|
| // expected during regular flow. However, during rendering of content for
|
| @@ -997,6 +1046,8 @@ bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) {
|
| IPC_BEGIN_MESSAGE_MAP(PrintWebViewHelper, message)
|
| #if BUILDFLAG(ENABLE_BASIC_PRINTING)
|
| IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages)
|
| + IPC_MESSAGE_HANDLER(PrintMsg_PrintPagesWithSettings,
|
| + OnPrintPagesWithSettings)
|
| IPC_MESSAGE_HANDLER(PrintMsg_PrintForSystemDialog, OnPrintForSystemDialog)
|
| #endif // BUILDFLAG(ENABLE_BASIC_PRINTING)
|
| #if BUILDFLAG(ENABLE_BASIC_PRINTING) && BUILDFLAG(ENABLE_PRINT_PREVIEW)
|
| @@ -1036,6 +1087,55 @@ void PrintWebViewHelper::OnPrintPages() {
|
| // just return.
|
| }
|
|
|
| +void PrintWebViewHelper::OnPrintPagesWithSettings(const gfx::Rect& rect) {
|
| + if (ipc_nesting_level_ > 1)
|
| + return;
|
| +
|
| + PrintMsg_PrintPages_Params settings;
|
| + settings.params.dpi = 300;
|
| + settings.params.desired_dpi = 300;
|
| + settings.params.selection_only = false;
|
| + settings.params.should_print_backgrounds = true;
|
| + // settings.params.page_size = rect.size();
|
| + settings.params.page_size = gfx::Size(500, 300);
|
| + // settings.params.content_size = rect.size();
|
| + settings.params.content_size = gfx::Size(500, 300);
|
| + // settings.params.printable_area = rect;
|
| + settings.params.printable_area = gfx::Rect(500, 300);
|
| + settings.params.is_first_request = true;
|
| + settings.params.print_to_pdf = false;
|
| + settings.params.display_header_footer = false;
|
| + settings.params.document_cookie = -1;
|
| + settings.params.is_subframe = true;
|
| +
|
| + blink::WebLocalFrame* frame = render_frame()->GetWebFrame();
|
| + FrameReference frame_ref(frame);
|
| +
|
| + // If we are printing a PDF extension frame, find the plugin node and print
|
| + // that instead.
|
| + auto node = delegate_->GetPdfElement(frame);
|
| +
|
| + // Handle settings.
|
| + ignore_css_margins_ = false;
|
| + print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings));
|
| +
|
| + prep_frame_view_.reset(new PrepareFrameAndViewForPrint(
|
| + print_pages_params_->params, frame, node, ignore_css_margins_));
|
| + prep_frame_view_->StartPrinting();
|
| +
|
| + int page_count = prep_frame_view_->GetExpectedPageCount();
|
| + if (!page_count) {
|
| + return DidFinishPrinting(FAIL_PRINT);
|
| + }
|
| +
|
| + if (!PrintPagesNative(prep_frame_view_->frame(), page_count)) {
|
| + return DidFinishPrinting(FAIL_PRINT);
|
| + }
|
| +
|
| + FinishFramePrinting();
|
| + scripting_throttler_.Reset();
|
| +}
|
| +
|
| void PrintWebViewHelper::OnPrintForSystemDialog() {
|
| if (ipc_nesting_level_> 1)
|
| return;
|
| @@ -1340,7 +1440,7 @@ bool PrintWebViewHelper::RenderPreviewPage(
|
| print_preview_context_.RenderedPreviewPage(
|
| base::TimeTicks::Now() - begin_time);
|
| if (draft_metafile.get()) {
|
| - draft_metafile->FinishDocument();
|
| + draft_metafile->FinishAllPages();
|
| } else if (print_preview_context_.IsModifiable() &&
|
| print_preview_context_.generate_draft_pages()) {
|
| DCHECK(!draft_metafile.get());
|
| @@ -1359,21 +1459,21 @@ bool PrintWebViewHelper::FinalizePrintReadyDocument() {
|
| PdfMetafileSkia* metafile = print_preview_context_.metafile();
|
| PrintHostMsg_DidPreviewDocument_Params preview_params;
|
|
|
| - // Ask the browser to create the shared memory for us.
|
| if (!CopyMetafileDataToSharedMem(*metafile,
|
| - &(preview_params.metafile_data_handle))) {
|
| + &preview_params.metafile_data_handle,
|
| + &preview_params.data_size)) {
|
| 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();
|
| preview_params.modifiable = print_preview_context_.IsModifiable();
|
| preview_params.preview_request_id =
|
| print_pages_params_->params.preview_request_id;
|
| + preview_params.is_subframe = print_pages_params_->params.is_subframe;
|
|
|
| is_print_ready_metafile_sent_ = true;
|
|
|
| @@ -1738,6 +1838,8 @@ bool PrintWebViewHelper::UpdatePrintSettings(
|
| int cookie =
|
| print_pages_params_ ? print_pages_params_->params.document_cookie : 0;
|
| PrintMsg_PrintPages_Params settings;
|
| + // Initial frame should be the root frame.
|
| + settings.params.is_subframe = false;
|
| bool canceled = false;
|
| Send(new PrintHostMsg_UpdatePrintSettings(routing_id(), cookie, *job_settings,
|
| &settings, &canceled));
|
| @@ -1926,24 +2028,34 @@ void PrintWebViewHelper::PrintPageInternal(
|
|
|
| bool PrintWebViewHelper::CopyMetafileDataToSharedMem(
|
| const PdfMetafileSkia& metafile,
|
| - base::SharedMemoryHandle* shared_mem_handle) {
|
| - uint32_t buf_size = metafile.GetDataSize();
|
| - if (buf_size == 0)
|
| + base::SharedMemoryHandle* shared_mem_handle,
|
| + uint32_t* size) {
|
| + std::string file_name = base::StringPrintf(
|
| + "C:\\src\\test_only\\chrome_test_dump\\org_%d.skp", routing_id());
|
| + SkFILEWStream file(file_name.c_str());
|
| + metafile.GetSkp(&file);
|
| + file.fsync();
|
| +
|
| + // Test new utility logic.
|
| + size_t buf_size;
|
| + std::unique_ptr<char[]> buf = metafile.GetPageDataBuffer(&buf_size);
|
| + if (buf_size == 0) {
|
| + NOTREACHED() << "Page data is empty";
|
| return false;
|
| + }
|
|
|
| std::unique_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))
|
| + if (!shared_buf || !shared_buf->Map(buf_size)) {
|
| + NOTREACHED() << "Map data error";
|
| + print_preview_context_.set_error(PREVIEW_ERROR_METAFILE_COPY_FAILED);
|
| return false;
|
| + }
|
| + memcpy(shared_buf->memory(), buf.get(), buf_size);
|
|
|
| *shared_mem_handle =
|
| base::SharedMemory::DuplicateHandle(shared_buf->handle());
|
| + *size = buf_size;
|
| return true;
|
| }
|
|
|
| @@ -2062,18 +2174,26 @@ bool PrintWebViewHelper::PreviewPageRendered(int page_number,
|
| return false;
|
| }
|
|
|
| + // output the debug file.
|
| + std::string file_name = base::StringPrintf(
|
| + "C:\\src\\test_only\\chrome_test_dump\\org_%d.skp", page_number);
|
| + SkFILEWStream file(file_name.c_str());
|
| + metafile->GetSkp(&file);
|
| + file.fsync();
|
| +
|
| PrintHostMsg_DidPreviewPage_Params preview_page_params;
|
| - // Get the size of the resulting metafile.
|
| - if (!CopyMetafileDataToSharedMem(
|
| - *metafile, &(preview_page_params.metafile_data_handle))) {
|
| + if (!CopyMetafileDataToSharedMem(*metafile,
|
| + &preview_page_params.metafile_data_handle,
|
| + &preview_page_params.data_size)) {
|
| LOG(ERROR) << "CopyMetafileDataToSharedMem failed";
|
| print_preview_context_.set_error(PREVIEW_ERROR_METAFILE_COPY_FAILED);
|
| return false;
|
| }
|
| - preview_page_params.data_size = metafile->GetDataSize();
|
| +
|
| preview_page_params.page_number = page_number;
|
| preview_page_params.preview_request_id =
|
| print_pages_params_->params.preview_request_id;
|
| + preview_page_params.is_subframe = print_pages_params_->params.is_subframe;
|
|
|
| Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params));
|
| return true;
|
| @@ -2189,7 +2309,7 @@ void PrintWebViewHelper::PrintPreviewContext::FinalizePrintReadyDocument() {
|
| DCHECK(IsRendering());
|
|
|
| base::TimeTicks begin_time = base::TimeTicks::Now();
|
| - metafile_->FinishDocument();
|
| + metafile_->FinishAllPages();
|
|
|
| if (print_ready_metafile_page_count_ <= 0) {
|
| NOTREACHED();
|
|
|