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

Side by Side Diff: chrome/renderer/print_web_view_helper_linux.cc

Issue 203062: Linux: print page to file rather than using shared memory to send it to the b... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: style Created 11 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « chrome/common/temp_scaffolding_stubs.cc ('k') | printing/pdf_ps_metafile_linux.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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 "chrome/renderer/print_web_view_helper.h" 5 #include "chrome/renderer/print_web_view_helper.h"
6 6
7 #include "base/file_descriptor_posix.h"
7 #include "base/logging.h" 8 #include "base/logging.h"
8 #include "chrome/common/render_messages.h" 9 #include "chrome/common/render_messages.h"
9 #include "printing/native_metafile.h" 10 #include "printing/native_metafile.h"
10 #include "skia/ext/vector_canvas.h" 11 #include "skia/ext/vector_canvas.h"
11 #include "webkit/api/public/WebFrame.h" 12 #include "webkit/api/public/WebFrame.h"
12 13
13 using WebKit::WebFrame; 14 using WebKit::WebFrame;
14 15
15 void PrintWebViewHelper::Print(WebFrame* frame, bool script_initiated) { 16 void PrintWebViewHelper::Print(WebFrame* frame, bool script_initiated) {
16 // If still not finished with earlier print request simply ignore. 17 // If still not finished with earlier print request simply ignore.
(...skipping 29 matching lines...) Expand all
46 47
47 void PrintWebViewHelper::PrintPages(const ViewMsg_PrintPages_Params& params, 48 void PrintWebViewHelper::PrintPages(const ViewMsg_PrintPages_Params& params,
48 WebFrame* frame) { 49 WebFrame* frame) {
49 PrepareFrameAndViewForPrint prep_frame_view(params.params, 50 PrepareFrameAndViewForPrint prep_frame_view(params.params,
50 frame, 51 frame,
51 frame->view()); 52 frame->view());
52 int page_count = prep_frame_view.GetExpectedPageCount(); 53 int page_count = prep_frame_view.GetExpectedPageCount();
53 54
54 // TODO(myhuang): Send ViewHostMsg_DidGetPrintedPagesCount. 55 // TODO(myhuang): Send ViewHostMsg_DidGetPrintedPagesCount.
55 56
56 if (page_count) { 57 if (page_count == 0)
57 // We only can use PDF in the renderer because Cairo needs to create a 58 return;
58 // temporary file for a PostScript surface.
59 printing::NativeMetafile metafile(printing::NativeMetafile::PDF);
60 metafile.Init();
61 59
62 ViewMsg_PrintPage_Params print_page_params; 60 // We only can use PDF in the renderer because Cairo needs to create a
63 print_page_params.params = params.params; 61 // temporary file for a PostScript surface.
64 const gfx::Size& canvas_size = prep_frame_view.GetPrintCanvasSize(); 62 printing::NativeMetafile metafile(printing::NativeMetafile::PDF);
65 if (params.pages.empty()) { 63 metafile.Init();
66 for (int i = 0; i < page_count; ++i) { 64
67 print_page_params.page_number = i; 65 ViewMsg_PrintPage_Params print_page_params;
68 PrintPage(print_page_params, canvas_size, frame, &metafile); 66 print_page_params.params = params.params;
69 } 67 const gfx::Size& canvas_size = prep_frame_view.GetPrintCanvasSize();
70 } else { 68 if (params.pages.empty()) {
71 for (size_t i = 0; i < params.pages.size(); ++i) { 69 for (int i = 0; i < page_count; ++i) {
72 print_page_params.page_number = params.pages[i]; 70 print_page_params.page_number = i;
73 PrintPage(print_page_params, canvas_size, frame, &metafile); 71 PrintPage(print_page_params, canvas_size, frame, &metafile);
74 }
75 } 72 }
76 73 } else {
77 metafile.Close(); 74 for (size_t i = 0; i < params.pages.size(); ++i) {
78 75 print_page_params.page_number = params.pages[i];
79 // Get the size of the resulting metafile. 76 PrintPage(print_page_params, canvas_size, frame, &metafile);
80 unsigned int buf_size = metafile.GetDataSize();
81 DCHECK_GT(buf_size, 0u);
82
83 ViewHostMsg_DidPrintPage_Params did_page_params;
84
85 // Ask the browser create the shared memory for us.
86 if (Send(new ViewHostMsg_AllocateShareMemory(
87 routing_id(),
88 buf_size,
89 &did_page_params.metafile_data_handle))) {
90 if (did_page_params.metafile_data_handle.fd > -1) {
91 base::SharedMemory shared_buf(did_page_params.metafile_data_handle,
92 false);
93 if (shared_buf.Map(buf_size)) {
94 if (metafile.GetData(shared_buf.memory(), buf_size)) {
95 // FIXME(myhuang): This is for testing purpose at this moment.
96 // We use this message to pass the resulting PDF to the browser,
97 // and the browser will save this PDF on the disk.
98 did_page_params.data_size = buf_size;
99 Send(new ViewHostMsg_DidPrintPage(routing_id(), did_page_params));
100 } else {
101 NOTREACHED() << "GetData() failed";
102 }
103 shared_buf.Unmap();
104 } else {
105 NOTREACHED() << "Buffer mapping failed";
106 }
107 } else {
108 NOTREACHED() << "Buffer allocation failed";
109 }
110 } else {
111 NOTREACHED() << "Buffer allocation failed";
112 } 77 }
113 } 78 }
79
80 metafile.Close();
81
82 // Get the size of the resulting metafile.
83 unsigned int buf_size = metafile.GetDataSize();
84 DCHECK_GT(buf_size, 0u);
85
86 base::FileDescriptor fd;
87 int fd_in_browser = -1;
88
89 // Ask the browser to open a file for us.
90 if (!Send(new ViewHostMsg_AllocateTempFileForPrinting(&fd,
91 &fd_in_browser))) {
92 return;
93 }
94
95 if (!metafile.SaveTo(fd))
96 return;
97
98 // Tell the browser we've finished writing the file.
99 Send(new ViewHostMsg_TempFileForPrintingWritten(fd_in_browser));
114 } 100 }
115 101
116 void PrintWebViewHelper::PrintPage(const ViewMsg_PrintPage_Params& params, 102 void PrintWebViewHelper::PrintPage(const ViewMsg_PrintPage_Params& params,
117 const gfx::Size& canvas_size, 103 const gfx::Size& canvas_size,
118 WebFrame* frame, 104 WebFrame* frame,
119 printing::NativeMetafile* metafile) { 105 printing::NativeMetafile* metafile) {
120 // Since WebKit extends the page width depending on the magical shrink 106 // Since WebKit extends the page width depending on the magical shrink
121 // factor we make sure the canvas covers the worst case scenario 107 // factor we make sure the canvas covers the worst case scenario
122 // (x2.0 currently). PrintContext will then set the correct clipping region. 108 // (x2.0 currently). PrintContext will then set the correct clipping region.
123 int size_x = static_cast<int>(canvas_size.width() * params.params.max_shrink); 109 int size_x = static_cast<int>(canvas_size.width() * params.params.max_shrink);
(...skipping 22 matching lines...) Expand all
146 132
147 // TODO(myhuang): We should handle transformation for paper margins. 133 // TODO(myhuang): We should handle transformation for paper margins.
148 // TODO(myhuang): We should render the header and the footer. 134 // TODO(myhuang): We should render the header and the footer.
149 135
150 // Done printing. Close the device context to retrieve the compiled metafile. 136 // Done printing. Close the device context to retrieve the compiled metafile.
151 if (!metafile->FinishPage(shrink)) { 137 if (!metafile->FinishPage(shrink)) {
152 NOTREACHED() << "metafile failed"; 138 NOTREACHED() << "metafile failed";
153 } 139 }
154 } 140 }
155 141
OLDNEW
« no previous file with comments | « chrome/common/temp_scaffolding_stubs.cc ('k') | printing/pdf_ps_metafile_linux.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698