| Index: chrome/renderer/print_web_view_helper_linux.cc
|
| ===================================================================
|
| --- chrome/renderer/print_web_view_helper_linux.cc (revision 26282)
|
| +++ chrome/renderer/print_web_view_helper_linux.cc (working copy)
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "chrome/renderer/print_web_view_helper.h"
|
|
|
| +#include "base/file_descriptor_posix.h"
|
| #include "base/logging.h"
|
| #include "chrome/common/render_messages.h"
|
| #include "printing/native_metafile.h"
|
| @@ -53,64 +54,49 @@
|
|
|
| // TODO(myhuang): Send ViewHostMsg_DidGetPrintedPagesCount.
|
|
|
| - if (page_count) {
|
| - // We only can use PDF in the renderer because Cairo needs to create a
|
| - // temporary file for a PostScript surface.
|
| - printing::NativeMetafile metafile(printing::NativeMetafile::PDF);
|
| - metafile.Init();
|
| + if (page_count == 0)
|
| + return;
|
|
|
| - ViewMsg_PrintPage_Params print_page_params;
|
| - print_page_params.params = params.params;
|
| - const gfx::Size& canvas_size = prep_frame_view.GetPrintCanvasSize();
|
| - if (params.pages.empty()) {
|
| - for (int i = 0; i < page_count; ++i) {
|
| - print_page_params.page_number = i;
|
| - PrintPage(print_page_params, canvas_size, frame, &metafile);
|
| - }
|
| - } else {
|
| - for (size_t i = 0; i < params.pages.size(); ++i) {
|
| - print_page_params.page_number = params.pages[i];
|
| - PrintPage(print_page_params, canvas_size, frame, &metafile);
|
| - }
|
| + // We only can use PDF in the renderer because Cairo needs to create a
|
| + // temporary file for a PostScript surface.
|
| + printing::NativeMetafile metafile(printing::NativeMetafile::PDF);
|
| + metafile.Init();
|
| +
|
| + ViewMsg_PrintPage_Params print_page_params;
|
| + print_page_params.params = params.params;
|
| + const gfx::Size& canvas_size = prep_frame_view.GetPrintCanvasSize();
|
| + if (params.pages.empty()) {
|
| + for (int i = 0; i < page_count; ++i) {
|
| + print_page_params.page_number = i;
|
| + PrintPage(print_page_params, canvas_size, frame, &metafile);
|
| }
|
| + } else {
|
| + for (size_t i = 0; i < params.pages.size(); ++i) {
|
| + print_page_params.page_number = params.pages[i];
|
| + PrintPage(print_page_params, canvas_size, frame, &metafile);
|
| + }
|
| + }
|
|
|
| - metafile.Close();
|
| + metafile.Close();
|
|
|
| - // Get the size of the resulting metafile.
|
| - unsigned int buf_size = metafile.GetDataSize();
|
| - DCHECK_GT(buf_size, 0u);
|
| + // Get the size of the resulting metafile.
|
| + unsigned int buf_size = metafile.GetDataSize();
|
| + DCHECK_GT(buf_size, 0u);
|
|
|
| - ViewHostMsg_DidPrintPage_Params did_page_params;
|
| + base::FileDescriptor fd;
|
| + int fd_in_browser = -1;
|
|
|
| - // Ask the browser create the shared memory for us.
|
| - if (Send(new ViewHostMsg_AllocateShareMemory(
|
| - routing_id(),
|
| - buf_size,
|
| - &did_page_params.metafile_data_handle))) {
|
| - if (did_page_params.metafile_data_handle.fd > -1) {
|
| - base::SharedMemory shared_buf(did_page_params.metafile_data_handle,
|
| - false);
|
| - if (shared_buf.Map(buf_size)) {
|
| - if (metafile.GetData(shared_buf.memory(), buf_size)) {
|
| - // FIXME(myhuang): This is for testing purpose at this moment.
|
| - // We use this message to pass the resulting PDF to the browser,
|
| - // and the browser will save this PDF on the disk.
|
| - did_page_params.data_size = buf_size;
|
| - Send(new ViewHostMsg_DidPrintPage(routing_id(), did_page_params));
|
| - } else {
|
| - NOTREACHED() << "GetData() failed";
|
| - }
|
| - shared_buf.Unmap();
|
| - } else {
|
| - NOTREACHED() << "Buffer mapping failed";
|
| - }
|
| - } else {
|
| - NOTREACHED() << "Buffer allocation failed";
|
| - }
|
| - } else {
|
| - NOTREACHED() << "Buffer allocation failed";
|
| - }
|
| + // Ask the browser to open a file for us.
|
| + if (!Send(new ViewHostMsg_AllocateTempFileForPrinting(&fd,
|
| + &fd_in_browser))) {
|
| + return;
|
| }
|
| +
|
| + if (!metafile.SaveTo(fd))
|
| + return;
|
| +
|
| + // Tell the browser we've finished writing the file.
|
| + Send(new ViewHostMsg_TempFileForPrintingWritten(fd_in_browser));
|
| }
|
|
|
| void PrintWebViewHelper::PrintPage(const ViewMsg_PrintPage_Params& params,
|
|
|