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

Unified Diff: chrome/renderer/printing/print_web_view_helper_pdf_win.cc

Issue 255543006: Printing on Windows via PDF (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: almost working; SafePlayback failing in final print Created 6 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 side-by-side diff with in-line comments
Download patch
Index: chrome/renderer/printing/print_web_view_helper_pdf_win.cc
diff --git a/chrome/renderer/printing/print_web_view_helper_linux.cc b/chrome/renderer/printing/print_web_view_helper_pdf_win.cc
similarity index 76%
copy from chrome/renderer/printing/print_web_view_helper_linux.cc
copy to chrome/renderer/printing/print_web_view_helper_pdf_win.cc
index 721dd973b3299de0618a4057dbbe853518b0c7d6..62b87dc4b0743bdec317ab427abbaecc7fd513c9 100644
--- a/chrome/renderer/printing/print_web_view_helper_linux.cc
+++ b/chrome/renderer/printing/print_web_view_helper_pdf_win.cc
@@ -1,11 +1,15 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/renderer/printing/print_web_view_helper.h"
+// XXX TODO in .gyp instead
+#if defined(PRINTING_WIN_USES_PDF_AS_METAFILE)
+
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
+#include "base/process/process_handle.h"
#include "chrome/common/print_messages.h"
#include "content/public/renderer/render_thread.h"
#include "printing/metafile.h"
@@ -16,11 +20,6 @@
#include "skia/ext/vector_canvas.h"
#include "third_party/WebKit/public/web/WebLocalFrame.h"
-#if !defined(OS_CHROMEOS) && !defined(OS_ANDROID)
-#include "base/process/process_handle.h"
-#else
-#include "base/file_descriptor_posix.h"
-#endif // !defined(OS_CHROMEOS) && !defined(OS_ANDROID)
namespace printing {
@@ -99,53 +98,42 @@ bool PrintWebViewHelper::PrintPagesNative(blink::WebFrame* frame,
uint32 buf_size = metafile.GetDataSize();
DCHECK_GT(buf_size, 0u);
-#if defined(OS_CHROMEOS) || defined(OS_ANDROID)
- int sequence_number = -1;
- base::FileDescriptor fd;
-
- // Ask the browser to open a file for us.
- Send(new PrintHostMsg_AllocateTempFileForPrinting(routing_id(),
- &fd,
- &sequence_number));
- if (!metafile.SaveToFD(fd))
- return false;
-
- // Tell the browser we've finished writing the file.
- Send(new PrintHostMsg_TempFileForPrintingWritten(routing_id(),
- sequence_number));
- return true;
-#else
PrintHostMsg_DidPrintPage_Params printed_page_params;
printed_page_params.data_size = 0;
printed_page_params.document_cookie = params.params.document_cookie;
{
- scoped_ptr<base::SharedMemory> shared_mem(
- content::RenderThread::Get()->HostAllocateSharedMemoryBuffer(
- buf_size).release());
- if (!shared_mem.get()) {
- NOTREACHED() << "AllocateSharedMemoryBuffer failed";
+ base::SharedMemory shared_buf;
+ // Allocate a shared memory buffer to hold the generated metafile data.
+ if (!shared_buf.CreateAndMapAnonymous(buf_size)) {
+ NOTREACHED() << "Buffer allocation failed";
return false;
}
- if (!shared_mem->Map(buf_size)) {
- NOTREACHED() << "Map failed";
+ // Copy the bits into shared memory.
+ if (!metafile.GetData(shared_buf.memory(), buf_size)) {
+ NOTREACHED() << "GetData() failed";
+ shared_buf.Unmap();
return false;
}
- metafile.GetData(shared_mem->memory(), buf_size);
+ shared_buf.GiveToProcess(base::GetCurrentProcessHandle(),
+ &printed_page_params.metafile_data_handle);
+ shared_buf.Unmap();
+
printed_page_params.data_size = buf_size;
- shared_mem->GiveToProcess(base::GetCurrentProcessHandle(),
- &(printed_page_params.metafile_data_handle));
+ Send(new PrintHostMsg_DuplicateSection(
+ routing_id(),
+ printed_page_params.metafile_data_handle,
+ &printed_page_params.metafile_data_handle));
}
for (size_t i = 0; i < printed_pages.size(); ++i) {
printed_page_params.page_number = printed_pages[i];
Send(new PrintHostMsg_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;
+ printed_page_params.metafile_data_handle = INVALID_HANDLE_VALUE;
}
return true;
-#endif // defined(OS_CHROMEOS)
}
void PrintWebViewHelper::PrintPageInternal(
@@ -195,4 +183,30 @@ void PrintWebViewHelper::PrintPageInternal(
NOTREACHED() << "metafile failed";
}
+bool PrintWebViewHelper::CopyMetafileDataToSharedMem(
+ Metafile* metafile, base::SharedMemoryHandle* shared_mem_handle) {
+ uint32 buf_size = metafile->GetDataSize();
+ base::SharedMemory shared_buf;
+ // Allocate a shared memory buffer to hold the generated metafile data.
+ if (!shared_buf.CreateAndMapAnonymous(buf_size)) {
+ NOTREACHED() << "Buffer allocation failed";
+ return false;
+ }
+
+ // Copy the bits into shared memory.
+ if (!metafile->GetData(shared_buf.memory(), buf_size)) {
+ NOTREACHED() << "GetData() failed";
+ shared_buf.Unmap();
+ return false;
+ }
+ shared_buf.GiveToProcess(base::GetCurrentProcessHandle(), shared_mem_handle);
+ shared_buf.Unmap();
+
+ Send(new PrintHostMsg_DuplicateSection(routing_id(), *shared_mem_handle,
+ shared_mem_handle));
+ return true;
+}
+
} // namespace printing
+
+#endif // PRINTING_WIN_USES_PDF_AS_METAFILE

Powered by Google App Engine
This is Rietveld 408576698