15d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun// Copyright 2013 The Chromium Authors. All rights reserved. 25d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun// Use of this source code is governed by a BSD-style license that can be 35d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun// found in the LICENSE file. 45d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun 55d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun#include "android_webview/native/aw_pdf_exporter.h" 6f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun 7f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun#include "android_webview/browser/browser_view_renderer.h" 8f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun#include "android_webview/browser/renderer_host/print_manager.h" 95d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun#include "base/android/jni_android.h" 105d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun#include "base/logging.h" 115d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun#include "content/public/browser/browser_thread.h" 12f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun#include "content/public/browser/web_contents.h" 135d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun#include "jni/AwPdfExporter_jni.h" 14f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun#include "printing/units.h" 15f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun#include "printing/print_settings.h" 165d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun 175d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurunusing base::android::AttachCurrentThread; 185d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurunusing base::android::ScopedJavaGlobalRef; 195d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurunusing content::BrowserThread; 20f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurunusing content::WebContents; 21f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurunusing printing::ConvertUnitDouble; 22f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurunusing printing::PageMargins; 23f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurunusing printing::PrintSettings; 245d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun 255d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurunnamespace android_webview { 265d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun 275d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim GurunAwPdfExporter::AwPdfExporter(JNIEnv* env, 285d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun jobject obj, 29f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun BrowserViewRenderer* view_renderer, 30f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun WebContents* web_contents) 315d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun : java_ref_(env, obj), 325d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun view_renderer_(view_renderer), 33f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun web_contents_(web_contents) { 345d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun 355d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun DCHECK(obj); 365d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun Java_AwPdfExporter_setNativeAwPdfExporter( 375d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun env, obj, reinterpret_cast<jint>(this)); 385d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun} 395d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun 405d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim GurunAwPdfExporter::~AwPdfExporter() { 415d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun JNIEnv* env = AttachCurrentThread(); 425d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); 435d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun if (obj.is_null()) 445d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun return; 455d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun // Clear the Java peer's weak pointer to |this| object. 465d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun Java_AwPdfExporter_setNativeAwPdfExporter(env, obj.obj(), 0); 475d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun} 485d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun 495d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurunvoid AwPdfExporter::ExportToPdf(JNIEnv* env, 505d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun jobject obj, 51f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun int fd, 525d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun jobject cancel_signal) { 535d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 54f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun CreatePdfSettings(env, obj); 55f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun print_manager_.reset( 56f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun new PrintManager(web_contents_, print_settings_.get(), fd, this)); 57f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun if (!print_manager_->PrintNow()) 58f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun DidExportPdf(false); 595d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun} 605d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun 61f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurunnamespace { 62f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun// Converts from 1/1000 of inches to device units using DPI. 63f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurunint MilsToDots(int val, int dpi) { 64f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun return static_cast<int>(ConvertUnitDouble(val, 1000.0, dpi)); 65f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun} 665d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun 67f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun} // anonymous namespace 68f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun 69f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurunvoid AwPdfExporter::CreatePdfSettings(JNIEnv* env, jobject obj) { 70f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun print_settings_.reset(new PrintSettings); 71f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun int dpi = Java_AwPdfExporter_getDpi(env, obj); 72f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun int width = Java_AwPdfExporter_getPageWidth(env, obj); 73f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun int height = Java_AwPdfExporter_getPageHeight(env, obj); 74f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun gfx::Size physical_size_device_units; 75f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun int width_in_dots = MilsToDots(width, dpi); 76f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun int height_in_dots = MilsToDots(height, dpi); 77f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun physical_size_device_units.SetSize(width_in_dots, height_in_dots); 78f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun 79f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun gfx::Rect printable_area_device_units; 80f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun // Assume full page is printable for now. 81f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun printable_area_device_units.SetRect(0, 0, width_in_dots, height_in_dots); 82f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun 83f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun print_settings_->set_dpi(dpi); 84f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun print_settings_->SetPrinterPrintableArea(physical_size_device_units, 85f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun printable_area_device_units, 86f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun dpi); 87f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun 88f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun PageMargins margins; 89f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun margins.left = 90f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun MilsToDots(Java_AwPdfExporter_getLeftMargin(env, obj), dpi); 91f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun margins.right = 92f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun MilsToDots(Java_AwPdfExporter_getRightMargin(env, obj), dpi); 93f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun margins.top = 94f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun MilsToDots(Java_AwPdfExporter_getTopMargin(env, obj), dpi); 95f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun margins.bottom = 96f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun MilsToDots(Java_AwPdfExporter_getBottomMargin(env, obj), dpi); 97f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun print_settings_->SetCustomMargins(margins); 985d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun} 995d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun 100f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurunvoid AwPdfExporter::DidExportPdf(bool success) { 1015d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun JNIEnv* env = AttachCurrentThread(); 1025d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); 1035d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun if (obj.is_null()) 1045d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun return; 105f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun Java_AwPdfExporter_didExportPdf(env, obj.obj(), success); 106f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun} 107f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun 108f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurunbool AwPdfExporter::IsCancelled() { 109f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun // TODO(sgurun) implement 110f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun return false; 1115d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun} 1125d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun 1135d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurunbool RegisterAwPdfExporter(JNIEnv* env) { 1145d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun return RegisterNativesImpl(env) >= 0; 1155d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun} 1165d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun 1175d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun} // namespace android_webview 118