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

Side by Side Diff: components/printing/renderer/print_web_view_helper_pdf_win.cc

Issue 2653963002: [Experimental] Supporting OOPIF printing
Patch Set: Rename service, fix for webview, and connect to DiscardableMemoryManager Created 3 years, 8 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/printing/renderer/print_web_view_helper.h" 5 #include "components/printing/renderer/print_web_view_helper.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/process/process_handle.h" 10 #include "base/process/process_handle.h"
11 #include "components/printing/common/print_messages.h" 11 #include "components/printing/common/print_messages.h"
12 #include "content/public/renderer/render_thread.h"
12 #include "printing/features/features.h" 13 #include "printing/features/features.h"
13 #include "printing/metafile_skia_wrapper.h" 14 #include "printing/metafile_skia_wrapper.h"
15 #include "printing/pdf_metafile_skia.h"
16 #include "third_party/WebKit/public/web/WebLocalFrame.h"
14 17
15 namespace printing { 18 namespace printing {
16 19
17 #if BUILDFLAG(ENABLE_BASIC_PRINTING) 20 #if BUILDFLAG(ENABLE_BASIC_PRINTING)
18 bool PrintWebViewHelper::PrintPagesNative(blink::WebLocalFrame* frame, 21 bool PrintWebViewHelper::PrintPagesNative(blink::WebLocalFrame* frame,
19 int page_count) { 22 int page_count) {
20 const PrintMsg_PrintPages_Params& params = *print_pages_params_; 23 const PrintMsg_PrintPages_Params& params = *print_pages_params_;
21 std::vector<int> printed_pages = GetPrintedPages(params, page_count); 24 std::vector<int> printed_pages = GetPrintedPages(params, page_count);
22 if (printed_pages.empty()) 25 if (printed_pages.empty())
23 return false; 26 return false;
24 27
25 std::vector<gfx::Size> page_size_in_dpi(printed_pages.size()); 28 std::vector<gfx::Size> page_size_in_dpi(printed_pages.size());
26 std::vector<gfx::Rect> content_area_in_dpi(printed_pages.size()); 29 std::vector<gfx::Rect> content_area_in_dpi(printed_pages.size());
27 std::vector<gfx::Rect> printable_area_in_dpi(printed_pages.size()); 30 std::vector<gfx::Rect> printable_area_in_dpi(printed_pages.size());
28 31
29 PdfMetafileSkia metafile(PDF_SKIA_DOCUMENT_TYPE); 32 PdfMetafileSkia metafile(PDF_SKIA_DOCUMENT_TYPE);
30 CHECK(metafile.Init()); 33 CHECK(metafile.Init());
31 34
32 PrintMsg_PrintPage_Params page_params; 35 PrintMsg_PrintPage_Params page_params;
33 page_params.params = params.params; 36 page_params.params = params.params;
34 for (size_t i = 0; i < printed_pages.size(); ++i) { 37 for (size_t i = 0; i < printed_pages.size(); ++i) {
35 page_params.page_number = printed_pages[i]; 38 page_params.page_number = printed_pages[i];
36 PrintPageInternal(page_params, frame, &metafile, &page_size_in_dpi[i], 39 PrintPageInternal(page_params, frame, &metafile, &page_size_in_dpi[i],
37 &content_area_in_dpi[i], &printable_area_in_dpi[i]); 40 &content_area_in_dpi[i], &printable_area_in_dpi[i]);
38 } 41 }
39 42
40 // blink::printEnd() for PDF should be called before metafile is closed. 43 // blink::printEnd() for PDF should be called before metafile is closed.
41 FinishFramePrinting(); 44 FinishFramePrinting();
42 45
43 metafile.FinishDocument(); 46 if (true) {
47 // End the document.
48 metafile.FinishAllPages();
49 std::string file_name = base::StringPrintf(
50 "C:\\src\\test_only\\chrome_test_dump\\org_%lld.skp", (size_t)frame);
51 SkFILEWStream file(file_name.c_str());
52 metafile.GetSkp(&file);
53 file.fsync();
44 54
45 PrintHostMsg_DidPrintPage_Params printed_page_params; 55 // Test new utility logic.
46 if (!CopyMetafileDataToSharedMem( 56 size_t buf_size;
47 metafile, &printed_page_params.metafile_data_handle)) { 57 std::unique_ptr<char[]> buf = metafile.GetPageDataBuffer(&buf_size);
48 return false; 58 if (buf_size == 0) {
59 LOG(ERROR) << "!!! Page data is empty";
60 print_preview_context_.set_error(PREVIEW_ERROR_METAFILE_COPY_FAILED);
61 return false;
62 }
63
64 std::unique_ptr<base::SharedMemory> shared_buf(
65 content::RenderThread::Get()->HostAllocateSharedMemoryBuffer(buf_size));
66 if (!shared_buf || !shared_buf->Map(buf_size)) {
67 print_preview_context_.set_error(PREVIEW_ERROR_METAFILE_COPY_FAILED);
68 return false;
69 }
70
71 memcpy(shared_buf->memory(), buf.get(), buf_size);
72
73 PrintHostMsg_DidPrintPage_Params printed_page_params;
74 if (!CopyMetafileDataToSharedMem(metafile,
75 &printed_page_params.metafile_data_handle,
76 &printed_page_params.data_size)) {
77 print_preview_context_.set_error(PREVIEW_ERROR_METAFILE_COPY_FAILED);
78 return false;
79 }
80
81 printed_page_params.content_area = params.params.printable_area;
82 printed_page_params.document_cookie = params.params.document_cookie;
83 printed_page_params.page_size = params.params.page_size;
84 printed_page_params.is_subframe = params.params.is_subframe;
85
86 for (size_t i = 0; i < printed_pages.size(); ++i) {
87 printed_page_params.page_number = printed_pages[i];
88 printed_page_params.page_size = page_size_in_dpi[i];
89 printed_page_params.content_area = content_area_in_dpi[i];
90 Send(new PrintHostMsg_DidPrintPage(routing_id(), printed_page_params));
91 // Send the rest of the pages with an invalid metafile handle.
92 // TODO(erikchen): Fix semantics. See https://crbug.com/640840
93 if (printed_page_params.metafile_data_handle.IsValid())
94 printed_page_params.metafile_data_handle = base::SharedMemoryHandle();
95 }
96 return true;
97 } else {
98 metafile.FinishAllPages();
99 SkFILEWStream file("C:\\src\\test_only\\chrome_test_dump\\org.skp");
100 metafile.GetSkp(&file);
101 file.fsync();
102 // End the document.
103 metafile.FinishDocument();
104
105 PrintHostMsg_DidPrintPage_Params printed_page_params;
106 if (!CopyMetafileDataToSharedMem(metafile,
107 &printed_page_params.metafile_data_handle,
108 &printed_page_params.data_size)) {
109 return false;
110 }
111
112 printed_page_params.content_area = params.params.printable_area;
113 printed_page_params.data_size = metafile.GetDataSize();
114 printed_page_params.document_cookie = params.params.document_cookie;
115 printed_page_params.page_size = params.params.page_size;
116
117 for (size_t i = 0; i < printed_pages.size(); ++i) {
118 printed_page_params.page_number = printed_pages[i];
119 printed_page_params.page_size = page_size_in_dpi[i];
120 printed_page_params.content_area = content_area_in_dpi[i];
121 Send(new PrintHostMsg_DidPrintPage(routing_id(), printed_page_params));
122 // Send the rest of the pages with an invalid metafile handle.
123 // TODO(erikchen): Fix semantics. See https://crbug.com/640840
124 if (printed_page_params.metafile_data_handle.IsValid())
125 printed_page_params.metafile_data_handle = base::SharedMemoryHandle();
126 }
127 return true;
49 } 128 }
50
51 printed_page_params.content_area = params.params.printable_area;
52 printed_page_params.data_size = metafile.GetDataSize();
53 printed_page_params.document_cookie = params.params.document_cookie;
54 printed_page_params.page_size = params.params.page_size;
55
56 for (size_t i = 0; i < printed_pages.size(); ++i) {
57 printed_page_params.page_number = printed_pages[i];
58 printed_page_params.page_size = page_size_in_dpi[i];
59 printed_page_params.content_area = content_area_in_dpi[i];
60 printed_page_params.physical_offsets =
61 gfx::Point(printable_area_in_dpi[i].x(), printable_area_in_dpi[i].y());
62 Send(new PrintHostMsg_DidPrintPage(routing_id(), printed_page_params));
63 // Send the rest of the pages with an invalid metafile handle.
64 // TODO(erikchen): Fix semantics. See https://crbug.com/640840
65 if (printed_page_params.metafile_data_handle.IsValid())
66 printed_page_params.metafile_data_handle = base::SharedMemoryHandle();
67 }
68 return true;
69 } 129 }
70 #endif // BUILDFLAG(ENABLE_BASIC_PRINTING) 130 #endif // BUILDFLAG(ENABLE_BASIC_PRINTING)
71 131
72 } // namespace printing 132 } // namespace printing
OLDNEW
« no previous file with comments | « components/printing/renderer/print_web_view_helper_mac.mm ('k') | content/browser/frame_host/render_frame_proxy_host.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698