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

Unified Diff: components/printing/renderer/print_web_view_helper.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: 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();
« no previous file with comments | « components/printing/renderer/print_web_view_helper.h ('k') | components/printing/renderer/print_web_view_helper_linux.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698