Chromium Code Reviews| Index: chrome/renderer/print_web_view_helper_linux.cc |
| =================================================================== |
| --- chrome/renderer/print_web_view_helper_linux.cc (revision 74997) |
| +++ chrome/renderer/print_web_view_helper_linux.cc (working copy) |
| @@ -13,6 +13,10 @@ |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebSize.h" |
| +#if !defined(OS_CHROMEOS) |
| +#include "base/process_util.h" |
| +#endif // !defined(OS_CHROMEOS) |
| + |
| using printing::NativeMetafile; |
| using WebKit::WebFrame; |
| using WebKit::WebNode; |
| @@ -39,10 +43,13 @@ |
| node, |
| frame->view()); |
| page_count = prep_frame_view.GetExpectedPageCount(); |
| +#if !defined(OS_CHROMEOS) |
| + Send(new ViewHostMsg_DidGetPrintedPagesCount(routing_id(), |
| + printParams.document_cookie, |
| + page_count)); |
| +#endif // !defined(OS_CHROMEOS) |
| - // TODO(myhuang): Send ViewHostMsg_DidGetPrintedPagesCount. |
| - |
| - if (page_count == 0) |
| + if (!page_count) |
| return; |
| metafile.Init(); |
| @@ -68,11 +75,12 @@ |
| delete canvas; |
| metafile.Close(); |
| - int sequence_number = -1; |
| // Get the size of the resulting metafile. |
| uint32 buf_size = metafile.GetDataSize(); |
| DCHECK_GT(buf_size, 0u); |
| +#if defined(OS_CHROMEOS) |
| + int sequence_number = -1; |
| base::FileDescriptor fd; |
| // Ask the browser to open a file for us. |
| @@ -80,12 +88,57 @@ |
| &sequence_number))) { |
| return; |
| } |
| - |
| if (!metafile.SaveTo(fd)) |
| return; |
| // Tell the browser we've finished writing the file. |
| Send(new ViewHostMsg_TempFileForPrintingWritten(sequence_number)); |
| +#else |
| + ViewHostMsg_DidPrintPage_Params printed_page_params; |
| + printed_page_params.data_size = 0; |
| + printed_page_params.document_cookie = params.params.document_cookie; |
| + |
| + base::SharedMemoryHandle shared_mem_handle; |
| + if (!Send(new ViewHostMsg_AllocateSharedMemoryBuffer(buf_size, |
| + &shared_mem_handle))) { |
| + NOTREACHED() << "AllocateSharedMemoryBuffer failed"; |
| + return; |
| + } |
| + if (!base::SharedMemory::IsHandleValid(shared_mem_handle)) { |
| + NOTREACHED() << "AllocateSharedMemoryBuffer returned bad handle"; |
| + return; |
| + } |
| + |
| + { |
| + base::SharedMemory shared_buf(shared_mem_handle, false); |
| + if (!shared_buf.Map(buf_size)) { |
| + NOTREACHED() << "Map failed"; |
| + return; |
| + } |
| + metafile.GetData(shared_buf.memory(), buf_size); |
| + printed_page_params.data_size = buf_size; |
| + shared_buf.GiveToProcess(base::GetCurrentProcessHandle(), |
| + &(printed_page_params.metafile_data_handle)); |
| + } |
| + |
| + // Send the first page with a valid handle. |
| + printed_page_params.page_number = 0; |
| + Send(new ViewHostMsg_DidPrintPage(routing_id(), printed_page_params)); |
| + |
| + // Send the rest of the pages with an invalid metafile handle. |
| + printed_page_params.metafile_data_handle.fd = -1; |
|
sanjeevr
2011/02/17 21:09:48
Instead of sending these dummy DidPrintPage IPCs,
Lei Zhang
2011/02/18 00:10:08
It's probably more work to handle a new IPC than i
|
| + if (params.pages.empty()) { |
| + for (int i = 1; i < page_count; ++i) { |
| + printed_page_params.page_number = i; |
| + Send(new ViewHostMsg_DidPrintPage(routing_id(), printed_page_params)); |
| + } |
| + } else { |
| + for (size_t i = 1; i < params.pages.size(); ++i) { |
| + printed_page_params.page_number = params.pages[i]; |
| + Send(new ViewHostMsg_DidPrintPage(routing_id(), printed_page_params)); |
| + } |
| + } |
| +#endif // defined(OS_CHROMEOS) |
| } |
| void PrintWebViewHelper::PrintPage(const ViewMsg_PrintPage_Params& params, |