OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" | 5 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 #include "webkit/plugins/ppapi/string.h" | 60 #include "webkit/plugins/ppapi/string.h" |
61 #include "webkit/plugins/ppapi/var.h" | 61 #include "webkit/plugins/ppapi/var.h" |
62 #include "webkit/plugins/sad_plugin.h" | 62 #include "webkit/plugins/sad_plugin.h" |
63 | 63 |
64 #if defined(OS_MACOSX) | 64 #if defined(OS_MACOSX) |
65 #include "base/mac/mac_util.h" | 65 #include "base/mac/mac_util.h" |
66 #include "base/mac/scoped_cftyperef.h" | 66 #include "base/mac/scoped_cftyperef.h" |
67 #include "printing/metafile_impl.h" | 67 #include "printing/metafile_impl.h" |
68 #endif | 68 #endif |
69 | 69 |
70 #if defined(OS_LINUX) | 70 #if defined(OS_POSIX) && !defined(OS_MACOSX) |
71 #include "printing/metafile.h" | 71 #include "printing/metafile.h" |
72 #include "printing/metafile_skia_wrapper.h" | 72 #include "printing/metafile_skia_wrapper.h" |
73 #endif | 73 #endif |
74 | 74 |
75 #if defined(OS_WIN) | 75 #if defined(OS_WIN) |
76 #include "skia/ext/vector_platform_device_emf_win.h" | 76 #include "skia/ext/vector_platform_device_emf_win.h" |
77 #include "ui/gfx/codec/jpeg_codec.h" | 77 #include "ui/gfx/codec/jpeg_codec.h" |
78 #include "ui/gfx/gdi_util.h" | 78 #include "ui/gfx/gdi_util.h" |
79 #endif | 79 #endif |
80 | 80 |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
346 has_webkit_focus_(false), | 346 has_webkit_focus_(false), |
347 has_content_area_focus_(false), | 347 has_content_area_focus_(false), |
348 find_identifier_(-1), | 348 find_identifier_(-1), |
349 plugin_find_interface_(NULL), | 349 plugin_find_interface_(NULL), |
350 plugin_messaging_interface_(NULL), | 350 plugin_messaging_interface_(NULL), |
351 plugin_pdf_interface_(NULL), | 351 plugin_pdf_interface_(NULL), |
352 plugin_private_interface_(NULL), | 352 plugin_private_interface_(NULL), |
353 plugin_selection_interface_(NULL), | 353 plugin_selection_interface_(NULL), |
354 plugin_zoom_interface_(NULL), | 354 plugin_zoom_interface_(NULL), |
355 checked_for_plugin_messaging_interface_(false), | 355 checked_for_plugin_messaging_interface_(false), |
356 #if defined(OS_LINUX) | 356 #if defined(OS_POSIX) && !defined(OS_MACOSX) |
357 canvas_(NULL), | 357 canvas_(NULL), |
358 #endif // defined(OS_LINUX) | 358 #endif // OS_POSIX && !OS_MACOSX |
359 plugin_print_interface_(NULL), | 359 plugin_print_interface_(NULL), |
360 plugin_graphics_3d_interface_(NULL), | 360 plugin_graphics_3d_interface_(NULL), |
361 always_on_top_(false), | 361 always_on_top_(false), |
362 fullscreen_container_(NULL), | 362 fullscreen_container_(NULL), |
363 fullscreen_(false), | 363 fullscreen_(false), |
364 message_channel_(NULL), | 364 message_channel_(NULL), |
365 sad_plugin_(NULL) { | 365 sad_plugin_(NULL) { |
366 pp_instance_ = ResourceTracker::Get()->AddInstance(this); | 366 pp_instance_ = ResourceTracker::Get()->AddInstance(this); |
367 | 367 |
368 memset(¤t_print_settings_, 0, sizeof(current_print_settings_)); | 368 memset(¤t_print_settings_, 0, sizeof(current_print_settings_)); |
(...skipping 12 matching lines...) Expand all Loading... |
381 PluginObjectSet plugin_object_copy; | 381 PluginObjectSet plugin_object_copy; |
382 live_plugin_objects_.swap(plugin_object_copy); | 382 live_plugin_objects_.swap(plugin_object_copy); |
383 for (PluginObjectSet::iterator i = plugin_object_copy.begin(); | 383 for (PluginObjectSet::iterator i = plugin_object_copy.begin(); |
384 i != plugin_object_copy.end(); ++i) | 384 i != plugin_object_copy.end(); ++i) |
385 delete *i; | 385 delete *i; |
386 | 386 |
387 delegate_->InstanceDeleted(this); | 387 delegate_->InstanceDeleted(this); |
388 module_->InstanceDeleted(this); | 388 module_->InstanceDeleted(this); |
389 | 389 |
390 ResourceTracker::Get()->InstanceDeleted(pp_instance_); | 390 ResourceTracker::Get()->InstanceDeleted(pp_instance_); |
391 #if defined(OS_LINUX) | 391 #if defined(OS_POSIX) && !defined(OS_MACOSX) |
392 ranges_.clear(); | 392 ranges_.clear(); |
393 #endif // defined(OS_LINUX) | 393 #endif // OS_POSIX && !OS_MACOSX |
394 } | 394 } |
395 | 395 |
396 // static | 396 // static |
397 const PPB_Instance* PluginInstance::GetInterface() { | 397 const PPB_Instance* PluginInstance::GetInterface() { |
398 return &ppb_instance; | 398 return &ppb_instance; |
399 } | 399 } |
400 | 400 |
401 // static | 401 // static |
402 const PPB_Find_Dev* PluginInstance::GetFindInterface() { | 402 const PPB_Find_Dev* PluginInstance::GetFindInterface() { |
403 return &ppb_find; | 403 return &ppb_find; |
(...skipping 714 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1118 break; | 1118 break; |
1119 default: | 1119 default: |
1120 return 0; | 1120 return 0; |
1121 } | 1121 } |
1122 num_pages = plugin_print_interface_->Begin_0_3(pp_instance(), | 1122 num_pages = plugin_print_interface_->Begin_0_3(pp_instance(), |
1123 &print_settings_0_3); | 1123 &print_settings_0_3); |
1124 } | 1124 } |
1125 if (!num_pages) | 1125 if (!num_pages) |
1126 return 0; | 1126 return 0; |
1127 current_print_settings_ = print_settings; | 1127 current_print_settings_ = print_settings; |
1128 #if defined(OS_LINUX) | 1128 #if defined(OS_POSIX) && !defined(OS_MACOSX) |
1129 canvas_ = NULL; | 1129 canvas_ = NULL; |
1130 ranges_.clear(); | 1130 ranges_.clear(); |
1131 #endif // defined(OS_LINUX) | 1131 #endif // OS_POSIX && !OS_MACOSX |
1132 return num_pages; | 1132 return num_pages; |
1133 } | 1133 } |
1134 | 1134 |
1135 bool PluginInstance::PrintPage(int page_number, WebKit::WebCanvas* canvas) { | 1135 bool PluginInstance::PrintPage(int page_number, WebKit::WebCanvas* canvas) { |
1136 DCHECK(plugin_print_interface_.get()); | 1136 DCHECK(plugin_print_interface_.get()); |
1137 PP_PrintPageNumberRange_Dev page_range; | 1137 PP_PrintPageNumberRange_Dev page_range; |
1138 page_range.first_page_number = page_range.last_page_number = page_number; | 1138 page_range.first_page_number = page_range.last_page_number = page_number; |
1139 #if defined(OS_LINUX) | 1139 #if defined(OS_POSIX) && !defined(OS_MACOSX) |
1140 ranges_.push_back(page_range); | 1140 ranges_.push_back(page_range); |
1141 canvas_ = canvas; | 1141 canvas_ = canvas; |
1142 return true; | 1142 return true; |
1143 #else | 1143 #else |
1144 return PrintPageHelper(&page_range, 1, canvas); | 1144 return PrintPageHelper(&page_range, 1, canvas); |
1145 #endif // defined(OS_LINUX) | 1145 #endif // defined(OS_POSIX) && !defined(OS_MACOSX) |
1146 } | 1146 } |
1147 | 1147 |
1148 bool PluginInstance::PrintPageHelper(PP_PrintPageNumberRange_Dev* page_ranges, | 1148 bool PluginInstance::PrintPageHelper(PP_PrintPageNumberRange_Dev* page_ranges, |
1149 int num_ranges, | 1149 int num_ranges, |
1150 WebKit::WebCanvas* canvas) { | 1150 WebKit::WebCanvas* canvas) { |
1151 // Keep a reference on the stack. See NOTE above. | 1151 // Keep a reference on the stack. See NOTE above. |
1152 scoped_refptr<PluginInstance> ref(this); | 1152 scoped_refptr<PluginInstance> ref(this); |
1153 PP_Resource print_output = plugin_print_interface_->PrintPages( | 1153 PP_Resource print_output = plugin_print_interface_->PrintPages( |
1154 pp_instance(), page_ranges, num_ranges); | 1154 pp_instance(), page_ranges, num_ranges); |
1155 if (!print_output) | 1155 if (!print_output) |
1156 return false; | 1156 return false; |
1157 | 1157 |
1158 bool ret = false; | 1158 bool ret = false; |
1159 | 1159 |
1160 if (current_print_settings_.format == PP_PRINTOUTPUTFORMAT_PDF) | 1160 if (current_print_settings_.format == PP_PRINTOUTPUTFORMAT_PDF) |
1161 ret = PrintPDFOutput(print_output, canvas); | 1161 ret = PrintPDFOutput(print_output, canvas); |
1162 else if (current_print_settings_.format == PP_PRINTOUTPUTFORMAT_RASTER) | 1162 else if (current_print_settings_.format == PP_PRINTOUTPUTFORMAT_RASTER) |
1163 ret = PrintRasterOutput(print_output, canvas); | 1163 ret = PrintRasterOutput(print_output, canvas); |
1164 | 1164 |
1165 // Now we need to release the print output resource. | 1165 // Now we need to release the print output resource. |
1166 PluginModule::GetCore()->ReleaseResource(print_output); | 1166 PluginModule::GetCore()->ReleaseResource(print_output); |
1167 | 1167 |
1168 return ret; | 1168 return ret; |
1169 } | 1169 } |
1170 | 1170 |
1171 void PluginInstance::PrintEnd() { | 1171 void PluginInstance::PrintEnd() { |
1172 // Keep a reference on the stack. See NOTE above. | 1172 // Keep a reference on the stack. See NOTE above. |
1173 scoped_refptr<PluginInstance> ref(this); | 1173 scoped_refptr<PluginInstance> ref(this); |
1174 #if defined(OS_LINUX) | 1174 #if defined(OS_POSIX) && !defined(OS_MACOSX) |
1175 // This hack is here because all pages need to be written to PDF at once. | 1175 // This hack is here because all pages need to be written to PDF at once. |
1176 if (!ranges_.empty()) | 1176 if (!ranges_.empty()) |
1177 PrintPageHelper(&(ranges_.front()), ranges_.size(), canvas_); | 1177 PrintPageHelper(&(ranges_.front()), ranges_.size(), canvas_); |
1178 canvas_ = NULL; | 1178 canvas_ = NULL; |
1179 ranges_.clear(); | 1179 ranges_.clear(); |
1180 #endif // defined(OS_LINUX) | 1180 #endif // OS_POSIX && !OS_MACOSX |
1181 | 1181 |
1182 DCHECK(plugin_print_interface_.get()); | 1182 DCHECK(plugin_print_interface_.get()); |
1183 if (plugin_print_interface_.get()) | 1183 if (plugin_print_interface_.get()) |
1184 plugin_print_interface_->End(pp_instance()); | 1184 plugin_print_interface_->End(pp_instance()); |
1185 | 1185 |
1186 memset(¤t_print_settings_, 0, sizeof(current_print_settings_)); | 1186 memset(¤t_print_settings_, 0, sizeof(current_print_settings_)); |
1187 #if defined(OS_MACOSX) | 1187 #if defined(OS_MACOSX) |
1188 last_printed_page_ = NULL; | 1188 last_printed_page_ = NULL; |
1189 #endif // defined(OS_MACOSX) | 1189 #endif // defined(OS_MACOSX) |
1190 } | 1190 } |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1286 if (!pdf_module) | 1286 if (!pdf_module) |
1287 return false; | 1287 return false; |
1288 RenderPDFPageToDCProc render_proc = | 1288 RenderPDFPageToDCProc render_proc = |
1289 reinterpret_cast<RenderPDFPageToDCProc>( | 1289 reinterpret_cast<RenderPDFPageToDCProc>( |
1290 GetProcAddress(pdf_module, "RenderPDFPageToDC")); | 1290 GetProcAddress(pdf_module, "RenderPDFPageToDC")); |
1291 if (!render_proc) | 1291 if (!render_proc) |
1292 return false; | 1292 return false; |
1293 #endif // defined(OS_WIN) | 1293 #endif // defined(OS_WIN) |
1294 | 1294 |
1295 bool ret = false; | 1295 bool ret = false; |
1296 #if defined(OS_LINUX) | 1296 #if defined(OS_MACOSX) |
1297 // On Linux we just set the final bits in the native metafile | |
1298 // (NativeMetafile and PreviewMetafile must have compatible formats, | |
1299 // i.e. both PDF for this to work). | |
1300 printing::Metafile* metafile = | |
1301 printing::MetafileSkiaWrapper::GetMetafileFromCanvas(canvas); | |
1302 DCHECK(metafile != NULL); | |
1303 if (metafile) | |
1304 ret = metafile->InitFromData(buffer->mapped_buffer(), buffer->size()); | |
1305 #elif defined(OS_MACOSX) | |
1306 printing::NativeMetafile metafile; | 1297 printing::NativeMetafile metafile; |
1307 // Create a PDF metafile and render from there into the passed in context. | 1298 // Create a PDF metafile and render from there into the passed in context. |
1308 if (metafile.InitFromData(buffer->mapped_buffer(), buffer->size())) { | 1299 if (metafile.InitFromData(buffer->mapped_buffer(), buffer->size())) { |
1309 // Flip the transform. | 1300 // Flip the transform. |
1310 CGContextSaveGState(canvas); | 1301 CGContextSaveGState(canvas); |
1311 CGContextTranslateCTM(canvas, 0, | 1302 CGContextTranslateCTM(canvas, 0, |
1312 current_print_settings_.printable_area.size.height); | 1303 current_print_settings_.printable_area.size.height); |
1313 CGContextScaleCTM(canvas, 1.0, -1.0); | 1304 CGContextScaleCTM(canvas, 1.0, -1.0); |
1314 CGRect page_rect; | 1305 CGRect page_rect; |
1315 page_rect.origin.x = current_print_settings_.printable_area.point.x; | 1306 page_rect.origin.x = current_print_settings_.printable_area.point.x; |
1316 page_rect.origin.y = current_print_settings_.printable_area.point.y; | 1307 page_rect.origin.y = current_print_settings_.printable_area.point.y; |
1317 page_rect.size.width = current_print_settings_.printable_area.size.width; | 1308 page_rect.size.width = current_print_settings_.printable_area.size.width; |
1318 page_rect.size.height = current_print_settings_.printable_area.size.height; | 1309 page_rect.size.height = current_print_settings_.printable_area.size.height; |
1319 | 1310 |
1320 ret = metafile.RenderPage(1, canvas, page_rect, true, false, true, true); | 1311 ret = metafile.RenderPage(1, canvas, page_rect, true, false, true, true); |
1321 CGContextRestoreGState(canvas); | 1312 CGContextRestoreGState(canvas); |
1322 } | 1313 } |
| 1314 #elif defined(OS_POSIX) |
| 1315 // On Unix, we just set the final bits in the native metafile |
| 1316 // (NativeMetafile and PreviewMetafile must have compatible formats, |
| 1317 // i.e. both PDF for this to work). |
| 1318 printing::Metafile* metafile = |
| 1319 printing::MetafileSkiaWrapper::GetMetafileFromCanvas(canvas); |
| 1320 DCHECK(metafile != NULL); |
| 1321 if (metafile) |
| 1322 ret = metafile->InitFromData(buffer->mapped_buffer(), buffer->size()); |
1323 #elif defined(OS_WIN) | 1323 #elif defined(OS_WIN) |
1324 // On Windows, we now need to render the PDF to the DC that backs the | 1324 // On Windows, we now need to render the PDF to the DC that backs the |
1325 // supplied canvas. | 1325 // supplied canvas. |
1326 HDC dc = skia::BeginPlatformPaint(canvas); | 1326 HDC dc = skia::BeginPlatformPaint(canvas); |
1327 gfx::Size size_in_pixels; | 1327 gfx::Size size_in_pixels; |
1328 size_in_pixels.set_width( | 1328 size_in_pixels.set_width( |
1329 printing::ConvertUnit(current_print_settings_.printable_area.size.width, | 1329 printing::ConvertUnit(current_print_settings_.printable_area.size.width, |
1330 static_cast<int>(printing::kPointsPerInch), | 1330 static_cast<int>(printing::kPointsPerInch), |
1331 current_print_settings_.dpi)); | 1331 current_print_settings_.dpi)); |
1332 size_in_pixels.set_height( | 1332 size_in_pixels.set_height( |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1560 return found->second; | 1560 return found->second; |
1561 } | 1561 } |
1562 | 1562 |
1563 bool PluginInstance::IsFullPagePlugin() const { | 1563 bool PluginInstance::IsFullPagePlugin() const { |
1564 WebFrame* frame = container()->element().document().frame(); | 1564 WebFrame* frame = container()->element().document().frame(); |
1565 return frame->view()->mainFrame()->document().isPluginDocument(); | 1565 return frame->view()->mainFrame()->document().isPluginDocument(); |
1566 } | 1566 } |
1567 | 1567 |
1568 } // namespace ppapi | 1568 } // namespace ppapi |
1569 } // namespace webkit | 1569 } // namespace webkit |
OLD | NEW |