| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #define PEPPER_APIS_ENABLED 1 | 5 #define PEPPER_APIS_ENABLED 1 |
| 6 | 6 |
| 7 #include "chrome/renderer/webplugin_delegate_pepper.h" | 7 #include "chrome/renderer/webplugin_delegate_pepper.h" |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| 11 | 11 |
| 12 #if defined(OS_LINUX) | 12 #if defined(OS_LINUX) |
| 13 #include <unistd.h> | 13 #include <unistd.h> |
| 14 #endif | 14 #endif |
| 15 | 15 |
| 16 #include "base/file_util.h" | 16 #include "base/file_util.h" |
| 17 #include "base/keyboard_codes.h" | 17 #include "base/keyboard_codes.h" |
| 18 #if defined(OS_MACOSX) | 18 #if defined(OS_MACOSX) |
| 19 #include "base/mac_util.h" | 19 #include "base/mac_util.h" |
| 20 #endif | 20 #endif |
| 21 #include "base/md5.h" | 21 #include "base/md5.h" |
| 22 #include "base/message_loop.h" | 22 #include "base/message_loop.h" |
| 23 #include "base/path_service.h" |
| 23 #include "base/process_util.h" | 24 #include "base/process_util.h" |
| 24 #if defined(OS_MACOSX) | 25 #if defined(OS_MACOSX) |
| 25 #include "base/scoped_cftyperef.h" | 26 #include "base/scoped_cftyperef.h" |
| 26 #endif | 27 #endif |
| 27 #include "base/scoped_ptr.h" | 28 #include "base/scoped_ptr.h" |
| 28 #include "base/stats_counters.h" | 29 #include "base/stats_counters.h" |
| 29 #include "base/string_util.h" | 30 #include "base/string_util.h" |
| 30 #include "base/time.h" | 31 #include "base/time.h" |
| 32 #include "chrome/common/chrome_paths.h" |
| 31 #include "chrome/common/render_messages.h" | 33 #include "chrome/common/render_messages.h" |
| 32 #include "chrome/renderer/pepper_widget.h" | 34 #include "chrome/renderer/pepper_widget.h" |
| 33 #include "chrome/renderer/render_thread.h" | 35 #include "chrome/renderer/render_thread.h" |
| 34 #if defined(OS_LINUX) | 36 #if defined(OS_LINUX) |
| 35 #include "chrome/renderer/renderer_sandbox_support_linux.h" | 37 #include "chrome/renderer/renderer_sandbox_support_linux.h" |
| 36 #endif | 38 #endif |
| 37 #include "chrome/renderer/webplugin_delegate_proxy.h" | 39 #include "chrome/renderer/webplugin_delegate_proxy.h" |
| 38 #include "gfx/blit.h" | 40 #include "gfx/blit.h" |
| 39 #if defined(OS_WIN) | 41 #if defined(OS_WIN) |
| 40 #include "gfx/codec/jpeg_codec.h" | 42 #include "gfx/codec/jpeg_codec.h" |
| 41 #include "gfx/gdi_util.h" | 43 #include "gfx/gdi_util.h" |
| 44 #include "printing/units.h" |
| 42 #include "skia/ext/vector_platform_device.h" | 45 #include "skia/ext/vector_platform_device.h" |
| 43 #endif | 46 #endif |
| 44 #include "third_party/npapi/bindings/npapi_extensions.h" | 47 #include "third_party/npapi/bindings/npapi_extensions.h" |
| 45 #include "third_party/npapi/bindings/npapi_extensions_private.h" | 48 #include "third_party/npapi/bindings/npapi_extensions_private.h" |
| 46 #include "third_party/WebKit/WebKit/chromium/public/WebCursorInfo.h" | 49 #include "third_party/WebKit/WebKit/chromium/public/WebCursorInfo.h" |
| 47 #include "third_party/WebKit/WebKit/chromium/public/WebInputEvent.h" | 50 #include "third_party/WebKit/WebKit/chromium/public/WebInputEvent.h" |
| 48 #include "webkit/glue/plugins/plugin_constants_win.h" | 51 #include "webkit/glue/plugins/plugin_constants_win.h" |
| 49 #include "webkit/glue/plugins/plugin_instance.h" | 52 #include "webkit/glue/plugins/plugin_instance.h" |
| 50 #include "webkit/glue/plugins/plugin_lib.h" | 53 #include "webkit/glue/plugins/plugin_lib.h" |
| 51 #include "webkit/glue/plugins/plugin_list.h" | 54 #include "webkit/glue/plugins/plugin_list.h" |
| 55 #include "webkit/glue/plugins/plugin_host.h" |
| 52 #include "webkit/glue/plugins/plugin_stream_url.h" | 56 #include "webkit/glue/plugins/plugin_stream_url.h" |
| 53 #include "webkit/glue/webkit_glue.h" | 57 #include "webkit/glue/webkit_glue.h" |
| 54 | 58 |
| 55 #if defined(ENABLE_GPU) | 59 #if defined(ENABLE_GPU) |
| 56 #include "webkit/glue/plugins/plugin_constants_win.h" | 60 #include "webkit/glue/plugins/plugin_constants_win.h" |
| 57 #endif | 61 #endif |
| 58 | 62 |
| 59 using gpu::Buffer; | 63 using gpu::Buffer; |
| 60 using webkit_glue::WebPlugin; | 64 using webkit_glue::WebPlugin; |
| 61 using webkit_glue::WebPluginDelegate; | 65 using webkit_glue::WebPluginDelegate; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 75 | 79 |
| 76 struct Device3DImpl { | 80 struct Device3DImpl { |
| 77 gpu::CommandBuffer* command_buffer; | 81 gpu::CommandBuffer* command_buffer; |
| 78 bool dynamically_created; | 82 bool dynamically_created; |
| 79 }; | 83 }; |
| 80 | 84 |
| 81 const int32 kDefaultCommandBufferSize = 1024 * 1024; | 85 const int32 kDefaultCommandBufferSize = 1024 * 1024; |
| 82 | 86 |
| 83 } // namespace | 87 } // namespace |
| 84 | 88 |
| 89 static const float kPointsPerInch = 72.0; |
| 90 |
| 91 #if defined(OS_WIN) |
| 92 // Exported by pdf.dll |
| 93 typedef bool (__stdcall *RenderPDFPageToDCProc)( |
| 94 const unsigned char* pdf_buffer, int buffer_size, int page_number, HDC dc, |
| 95 int dpi_x, int dpi_y, int bounds_origin_x, int bounds_origin_y, |
| 96 int bounds_width, int bounds_height, bool fit_to_bounds, |
| 97 bool stretch_to_bounds, bool keep_aspect_ratio, bool center_in_bounds); |
| 98 #endif // defined(OS_WIN) |
| 99 |
| 85 WebPluginDelegatePepper* WebPluginDelegatePepper::Create( | 100 WebPluginDelegatePepper* WebPluginDelegatePepper::Create( |
| 86 const FilePath& filename, | 101 const FilePath& filename, |
| 87 const std::string& mime_type, | 102 const std::string& mime_type, |
| 88 const base::WeakPtr<RenderView>& render_view) { | 103 const base::WeakPtr<RenderView>& render_view) { |
| 89 scoped_refptr<NPAPI::PluginLib> plugin_lib = | 104 scoped_refptr<NPAPI::PluginLib> plugin_lib = |
| 90 NPAPI::PluginLib::CreatePluginLib(filename); | 105 NPAPI::PluginLib::CreatePluginLib(filename); |
| 91 if (plugin_lib.get() == NULL) | 106 if (plugin_lib.get() == NULL) |
| 92 return NULL; | 107 return NULL; |
| 93 | 108 |
| 94 NPError err = plugin_lib->NP_Initialize(); | 109 NPError err = plugin_lib->NP_Initialize(); |
| (...skipping 1011 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1106 NPRect np_printable_area = {0}; | 1121 NPRect np_printable_area = {0}; |
| 1107 np_printable_area.left = printable_area.x(); | 1122 np_printable_area.left = printable_area.x(); |
| 1108 np_printable_area.top = printable_area.y(); | 1123 np_printable_area.top = printable_area.y(); |
| 1109 np_printable_area.right = np_printable_area.left + printable_area.width(); | 1124 np_printable_area.right = np_printable_area.left + printable_area.width(); |
| 1110 np_printable_area.bottom = np_printable_area.top + printable_area.height(); | 1125 np_printable_area.bottom = np_printable_area.top + printable_area.height(); |
| 1111 if (NPERR_NO_ERROR == print_extensions->printBegin(instance()->npp(), | 1126 if (NPERR_NO_ERROR == print_extensions->printBegin(instance()->npp(), |
| 1112 &np_printable_area, | 1127 &np_printable_area, |
| 1113 printer_dpi, | 1128 printer_dpi, |
| 1114 &num_pages)) { | 1129 &num_pages)) { |
| 1115 current_printable_area_ = printable_area; | 1130 current_printable_area_ = printable_area; |
| 1131 current_printer_dpi_ = printer_dpi; |
| 1116 } | 1132 } |
| 1117 } | 1133 } |
| 1118 return num_pages; | 1134 return num_pages; |
| 1119 } | 1135 } |
| 1120 | 1136 |
| 1137 bool WebPluginDelegatePepper::VectorPrintPage(int page_number, |
| 1138 WebKit::WebCanvas* canvas) { |
| 1139 #if !defined(OS_WIN) |
| 1140 // TODO(sanjeevr): Add vector print support for Mac and Linux. |
| 1141 return false; |
| 1142 #endif // !defined(OS_WIN) |
| 1143 NPPPrintExtensions* print_extensions = GetPrintExtensions(); |
| 1144 if (!print_extensions) |
| 1145 return false; |
| 1146 #if defined(OS_WIN) |
| 1147 // For Windows, we need the PDF DLL to render the output PDF to a DC. |
| 1148 FilePath pdf_path; |
| 1149 PathService::Get(chrome::FILE_PDF_PLUGIN, &pdf_path); |
| 1150 HMODULE pdf_module = GetModuleHandle(pdf_path.value().c_str()); |
| 1151 if (!pdf_module) |
| 1152 return false; |
| 1153 RenderPDFPageToDCProc render_proc = |
| 1154 reinterpret_cast<RenderPDFPageToDCProc>( |
| 1155 GetProcAddress(pdf_module, "RenderPDFPageToDC")); |
| 1156 if (!render_proc) |
| 1157 return false; |
| 1158 #endif // defined(OS_WIN) |
| 1159 |
| 1160 unsigned char* pdf_output = NULL; |
| 1161 int32 output_size = 0; |
| 1162 NPError err = print_extensions->printPageAsPDF(instance()->npp(), page_number, |
| 1163 &pdf_output, &output_size); |
| 1164 if (err != NPERR_NO_ERROR) |
| 1165 return false; |
| 1166 |
| 1167 bool ret = false; |
| 1168 #if defined(OS_WIN) |
| 1169 // On Windows, we now need to render the PDF to the DC that backs the |
| 1170 // supplied canvas. |
| 1171 skia::VectorPlatformDevice& device = |
| 1172 static_cast<skia::VectorPlatformDevice&>( |
| 1173 canvas->getTopPlatformDevice()); |
| 1174 HDC dc = device.getBitmapDC(); |
| 1175 gfx::Size size_in_pixels; |
| 1176 size_in_pixels.set_width( |
| 1177 printing::ConvertUnit(current_printable_area_.width(), |
| 1178 static_cast<int>(kPointsPerInch), |
| 1179 current_printer_dpi_)); |
| 1180 size_in_pixels.set_height( |
| 1181 printing::ConvertUnit(current_printable_area_.height(), |
| 1182 static_cast<int>(kPointsPerInch), |
| 1183 current_printer_dpi_)); |
| 1184 // We need to render using the actual printer DPI (rendering to a smaller |
| 1185 // set of pixels leads to a blurry output). However, we need to counter the |
| 1186 // scaling up that will happen in the browser. |
| 1187 XFORM xform = {0}; |
| 1188 xform.eM11 = xform.eM22 = kPointsPerInch / current_printer_dpi_; |
| 1189 ModifyWorldTransform(dc, &xform, MWT_LEFTMULTIPLY); |
| 1190 |
| 1191 ret = render_proc(pdf_output, output_size, 0, dc, current_printer_dpi_, |
| 1192 current_printer_dpi_, 0, 0, size_in_pixels.width(), |
| 1193 size_in_pixels.height(), true, false, true, true); |
| 1194 #endif // defined(OS_WIN) |
| 1195 |
| 1196 NPAPI::PluginHost::Singleton()->host_functions()->memfree(pdf_output); |
| 1197 return ret; |
| 1198 } |
| 1199 |
| 1121 bool WebPluginDelegatePepper::PrintPage(int page_number, | 1200 bool WebPluginDelegatePepper::PrintPage(int page_number, |
| 1122 WebKit::WebCanvas* canvas) { | 1201 WebKit::WebCanvas* canvas) { |
| 1123 NPPPrintExtensions* print_extensions = GetPrintExtensions(); | 1202 NPPPrintExtensions* print_extensions = GetPrintExtensions(); |
| 1124 if (!print_extensions) | 1203 if (!print_extensions) |
| 1125 return false; | 1204 return false; |
| 1126 | 1205 |
| 1206 // First try and use vector print. |
| 1207 if (VectorPrintPage(page_number, canvas)) |
| 1208 return true; |
| 1209 |
| 1127 DCHECK(!current_printable_area_.IsEmpty()); | 1210 DCHECK(!current_printable_area_.IsEmpty()); |
| 1128 | 1211 |
| 1129 // Calculate the width and height needed for the raster image. | 1212 // Calculate the width and height needed for the raster image. |
| 1130 NPRect np_printable_area = {0}; | 1213 NPRect np_printable_area = {0}; |
| 1131 np_printable_area.left = current_printable_area_.x(); | 1214 np_printable_area.left = current_printable_area_.x(); |
| 1132 np_printable_area.top = current_printable_area_.y(); | 1215 np_printable_area.top = current_printable_area_.y(); |
| 1133 np_printable_area.right = | 1216 np_printable_area.right = |
| 1134 current_printable_area_.x() + current_printable_area_.width(); | 1217 current_printable_area_.x() + current_printable_area_.width(); |
| 1135 np_printable_area.bottom = | 1218 np_printable_area.bottom = |
| 1136 current_printable_area_.y() + current_printable_area_.height(); | 1219 current_printable_area_.y() + current_printable_area_.height(); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1200 canvas->drawBitmapRect(committed, &src_rect, dest_rect); | 1283 canvas->drawBitmapRect(committed, &src_rect, dest_rect); |
| 1201 #endif // defined(OS_MACOSX) | 1284 #endif // defined(OS_MACOSX) |
| 1202 return true; | 1285 return true; |
| 1203 } | 1286 } |
| 1204 | 1287 |
| 1205 void WebPluginDelegatePepper::PrintEnd() { | 1288 void WebPluginDelegatePepper::PrintEnd() { |
| 1206 NPPPrintExtensions* print_extensions = GetPrintExtensions(); | 1289 NPPPrintExtensions* print_extensions = GetPrintExtensions(); |
| 1207 if (print_extensions) | 1290 if (print_extensions) |
| 1208 print_extensions->printEnd(instance()->npp()); | 1291 print_extensions->printEnd(instance()->npp()); |
| 1209 current_printable_area_ = gfx::Rect(); | 1292 current_printable_area_ = gfx::Rect(); |
| 1293 current_printer_dpi_ = -1; |
| 1210 #if defined(OS_MACOSX) | 1294 #if defined(OS_MACOSX) |
| 1211 last_printed_page_ = SkBitmap(); | 1295 last_printed_page_ = SkBitmap(); |
| 1212 #endif // defined(OS_MACOSX) | 1296 #endif // defined(OS_MACOSX) |
| 1213 } | 1297 } |
| 1214 | 1298 |
| 1215 bool WebPluginDelegatePepper::SupportsFind() { | 1299 bool WebPluginDelegatePepper::SupportsFind() { |
| 1216 return GetFindExtensions() != NULL; | 1300 return GetFindExtensions() != NULL; |
| 1217 } | 1301 } |
| 1218 | 1302 |
| 1219 | 1303 |
| 1220 WebPluginDelegatePepper::WebPluginDelegatePepper( | 1304 WebPluginDelegatePepper::WebPluginDelegatePepper( |
| 1221 const base::WeakPtr<RenderView>& render_view, | 1305 const base::WeakPtr<RenderView>& render_view, |
| 1222 NPAPI::PluginInstance *instance) | 1306 NPAPI::PluginInstance *instance) |
| 1223 : render_view_(render_view), | 1307 : render_view_(render_view), |
| 1224 plugin_(NULL), | 1308 plugin_(NULL), |
| 1225 instance_(instance), | 1309 instance_(instance), |
| 1226 nested_delegate_(NULL), | 1310 nested_delegate_(NULL), |
| 1311 current_printer_dpi_(-1), |
| 1227 #if defined(ENABLE_GPU) | 1312 #if defined(ENABLE_GPU) |
| 1228 command_buffer_(NULL), | 1313 command_buffer_(NULL), |
| 1229 #endif | 1314 #endif |
| 1230 find_identifier_(-1), | 1315 find_identifier_(-1), |
| 1231 method_factory3d_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), | 1316 method_factory3d_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
| 1232 current_choose_file_callback_(NULL), | 1317 current_choose_file_callback_(NULL), |
| 1233 current_choose_file_user_data_(NULL) { | 1318 current_choose_file_user_data_(NULL) { |
| 1234 // For now we keep a window struct, although it isn't used. | 1319 // For now we keep a window struct, although it isn't used. |
| 1235 memset(&window_, 0, sizeof(window_)); | 1320 memset(&window_, 0, sizeof(window_)); |
| 1236 // All Pepper plugins are windowless and transparent. | 1321 // All Pepper plugins are windowless and transparent. |
| (...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1611 bounds.origin.x = dest_rect.x(); | 1696 bounds.origin.x = dest_rect.x(); |
| 1612 bounds.origin.y = canvas_height - dest_rect.y() - dest_rect.height(); | 1697 bounds.origin.y = canvas_height - dest_rect.y() - dest_rect.height(); |
| 1613 bounds.size.width = dest_rect.width(); | 1698 bounds.size.width = dest_rect.width(); |
| 1614 bounds.size.height = dest_rect.height(); | 1699 bounds.size.height = dest_rect.height(); |
| 1615 | 1700 |
| 1616 CGContextDrawImage(canvas, bounds, image); | 1701 CGContextDrawImage(canvas, bounds, image); |
| 1617 CGContextRestoreGState(canvas); | 1702 CGContextRestoreGState(canvas); |
| 1618 } | 1703 } |
| 1619 #endif // defined(OS_MACOSX) | 1704 #endif // defined(OS_MACOSX) |
| 1620 | 1705 |
| OLD | NEW |