Index: chrome/renderer/print_web_view_helper_linux.cc |
=================================================================== |
--- chrome/renderer/print_web_view_helper_linux.cc (revision 75320) |
+++ 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; |
+ 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, |