Index: android_webview/browser/renderer_host/print_manager.cc |
diff --git a/android_webview/browser/renderer_host/print_manager.cc b/android_webview/browser/renderer_host/print_manager.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e96cc3bf4d5f51afbc235c4e76a866f8368fa4a0 |
--- /dev/null |
+++ b/android_webview/browser/renderer_host/print_manager.cc |
@@ -0,0 +1,143 @@ |
+// Copyright (c) 2013 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 "android_webview/browser/renderer_host/print_manager.h" |
+ |
+#include "android_webview/browser/aw_browser_context.h" |
+#include "android_webview/common/print_messages.h" |
+#include "android_webview/common/render_view_messages.h" |
+#include "base/android/scoped_java_ref.h" |
+#include "base/callback.h" |
+#include "base/file_util.h" |
+#include "base/logging.h" |
+#include "content/public/browser/browser_thread.h" |
+#include "printing/print_settings.h" |
+ |
+using content::BrowserThread; |
+using printing::PrintSettings; |
+ |
+namespace android_webview { |
+ |
+PrintManager::PrintManager(content::WebContents* contents, |
+ PrintSettings* settings, |
+ int fd, |
+ PrintManagerDelegate* delegate) |
+ : content::WebContentsObserver(contents), |
+ settings_(settings), |
+ fd_(fd), |
+ delegate_(delegate), |
+ number_pages_(0), |
+ cookie_(1), |
+ printing_(false) { |
+ DCHECK(delegate_); |
+} |
+ |
+PrintManager::~PrintManager() {} |
+ |
+bool PrintManager::OnMessageReceived(const IPC::Message& message) { |
+ bool handled = true; |
+ IPC_BEGIN_MESSAGE_MAP(PrintManager, message) |
+ IPC_MESSAGE_HANDLER(PrintHostMsg_DidGetPrintedPagesCount, |
+ OnDidGetPrintedPagesCount) |
+ IPC_MESSAGE_HANDLER(PrintHostMsg_DidGetDocumentCookie, |
+ OnDidGetDocumentCookie) |
+ IPC_MESSAGE_HANDLER(PrintHostMsg_PrintingFailed, OnPrintingFailed) |
+ IPC_MESSAGE_HANDLER_DELAY_REPLY(PrintHostMsg_GetDefaultPrintSettings, |
+ OnGetDefaultPrintSettings) |
+ IPC_MESSAGE_HANDLER(PrintHostMsg_AllocateTempFileForPrinting, |
+ OnAllocateTempFileForPrinting) |
+ IPC_MESSAGE_HANDLER(PrintHostMsg_TempFileForPrintingWritten, |
+ OnTempFileForPrintingWritten) |
+ IPC_MESSAGE_UNHANDLED(handled = false) |
+ IPC_END_MESSAGE_MAP() |
+ |
+ return handled ? true : WebContentsObserver::OnMessageReceived(message); |
+} |
+ |
+void PrintManager::OnAllocateTempFileForPrinting( |
+ base::FileDescriptor* temp_file_fd, |
+ int* sequence_number) { |
+ // we don't really use the sequence number. |
+ *sequence_number = 0; |
+ temp_file_fd->fd = fd_; |
+ temp_file_fd->auto_close = false; |
+} |
+ |
+void PrintManager::OnTempFileForPrintingWritten(int sequence_number) { |
+ delegate_->DidExportPdf(true); |
+} |
+ |
+void PrintManager::OnDidGetPrintedPagesCount(int cookie, |
+ int number_pages) { |
+ DCHECK_GT(cookie, 0); |
+ DCHECK_GT(number_pages, 0); |
+ number_pages_ = number_pages; |
+} |
+ |
+void PrintManager::OnDidGetDocumentCookie(int cookie) { |
+ cookie_ = cookie; |
+} |
+ |
+void PrintManager::OnGetDefaultPrintSettings(IPC::Message* reply_msg) { |
+ // Unlike the printing_message_filter, we do process this in ui thread |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ OnGetDefaultPrintSettingsReply(reply_msg); |
+} |
+ |
+void RenderParamsFromPrintSettings(const printing::PrintSettings& settings, |
+ PrintMsg_Print_Params* params) { |
+ params->page_size = settings.page_setup_device_units().physical_size(); |
+ params->content_size.SetSize( |
+ settings.page_setup_device_units().content_area().width(), |
+ settings.page_setup_device_units().content_area().height()); |
+ params->printable_area.SetRect( |
+ settings.page_setup_device_units().printable_area().x(), |
+ settings.page_setup_device_units().printable_area().y(), |
+ settings.page_setup_device_units().printable_area().width(), |
+ settings.page_setup_device_units().printable_area().height()); |
+ params->margin_top = settings.page_setup_device_units().content_area().y(); |
+ params->margin_left = settings.page_setup_device_units().content_area().x(); |
+ params->dpi = settings.dpi(); |
+ // Currently hardcoded at 1.25. See PrintSettings' constructor. |
+ params->min_shrink = settings.min_shrink(); |
+ // Currently hardcoded at 2.0. See PrintSettings' constructor. |
+ params->max_shrink = settings.max_shrink(); |
+ // Currently hardcoded at 72dpi. See PrintSettings' constructor. |
+ params->desired_dpi = settings.desired_dpi(); |
+ // Always use an invalid cookie. |
+ params->document_cookie = 0; |
+ params->selection_only = settings.selection_only(); |
+ params->supports_alpha_blend = settings.supports_alpha_blend(); |
+ params->should_print_backgrounds = settings.should_print_backgrounds(); |
+ params->display_header_footer = settings.display_header_footer(); |
+ params->title = settings.title(); |
+ params->url = settings.url(); |
+} |
+ |
+void PrintManager::OnGetDefaultPrintSettingsReply(IPC::Message* reply_msg) { |
+ PrintMsg_Print_Params params; |
+ RenderParamsFromPrintSettings(*settings_, ¶ms); |
+ params.document_cookie = cookie_; |
+ PrintHostMsg_GetDefaultPrintSettings::WriteReplyParams(reply_msg, params); |
+ Send(reply_msg); |
+} |
+ |
+void PrintManager::OnPrintingFailed(int cookie) { |
+ if (cookie != cookie_) { |
+ NOTREACHED(); |
+ return; |
+ } |
+ delegate_->DidExportPdf(false); |
+} |
+ |
+bool PrintManager::PrintNow() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ if (printing_) |
+ return false; |
+ |
+ printing_ = true; |
+ return Send(new PrintMsg_PrintPages(routing_id())); |
+} |
+ |
+} // namespace android_webview |