| 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 #include "webkit/glue/plugins/pepper_plugin_instance.h" | 5 #include "webkit/glue/plugins/pepper_plugin_instance.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/histogram.h" | 8 #include "base/histogram.h" |
| 9 #if defined(OS_MACOSX) | 9 #if defined(OS_MACOSX) |
| 10 #include "base/mac_util.h" | 10 #include "base/mac_util.h" |
| 11 #include "base/scoped_cftyperef.h" | 11 #include "base/scoped_cftyperef.h" |
| 12 #endif | 12 #endif |
| 13 #include "base/scoped_ptr.h" | 13 #include "base/scoped_ptr.h" |
| 14 #include "base/utf_string_conversions.h" | 14 #include "base/utf_string_conversions.h" |
| 15 #include "gfx/rect.h" | 15 #include "gfx/rect.h" |
| 16 #if defined(OS_WIN) | 16 #if defined(OS_WIN) |
| 17 #include "gfx/codec/jpeg_codec.h" | 17 #include "gfx/codec/jpeg_codec.h" |
| 18 #include "gfx/gdi_util.h" | 18 #include "gfx/gdi_util.h" |
| 19 #endif | 19 #endif |
| 20 #include "gfx/skia_util.h" | 20 #include "gfx/skia_util.h" |
| 21 #include "printing/native_metafile.h" | 21 #include "printing/native_metafile.h" |
| 22 #include "printing/units.h" | 22 #include "printing/units.h" |
| 23 #include "skia/ext/vector_platform_device.h" | 23 #include "skia/ext/vector_platform_device.h" |
| 24 #include "skia/ext/platform_canvas.h" | 24 #include "skia/ext/platform_canvas.h" |
| 25 #include "third_party/ppapi/c/dev/ppb_find_dev.h" |
| 26 #include "third_party/ppapi/c/dev/ppp_find_dev.h" |
| 27 #include "third_party/ppapi/c/dev/ppp_zoom_dev.h" |
| 28 #include "third_party/ppapi/c/pp_event.h" |
| 25 #include "third_party/ppapi/c/pp_instance.h" | 29 #include "third_party/ppapi/c/pp_instance.h" |
| 26 #include "third_party/ppapi/c/pp_event.h" | |
| 27 #include "third_party/ppapi/c/pp_rect.h" | 30 #include "third_party/ppapi/c/pp_rect.h" |
| 28 #include "third_party/ppapi/c/pp_resource.h" | 31 #include "third_party/ppapi/c/pp_resource.h" |
| 29 #include "third_party/ppapi/c/pp_var.h" | 32 #include "third_party/ppapi/c/pp_var.h" |
| 30 #include "third_party/ppapi/c/ppb_core.h" | 33 #include "third_party/ppapi/c/ppb_core.h" |
| 31 #include "third_party/ppapi/c/ppb_find.h" | |
| 32 #include "third_party/ppapi/c/ppb_instance.h" | 34 #include "third_party/ppapi/c/ppb_instance.h" |
| 33 #include "third_party/ppapi/c/ppp_find.h" | |
| 34 #include "third_party/ppapi/c/ppp_instance.h" | 35 #include "third_party/ppapi/c/ppp_instance.h" |
| 35 #include "third_party/ppapi/c/ppp_zoom.h" | |
| 36 #include "third_party/WebKit/WebKit/chromium/public/WebCursorInfo.h" | 36 #include "third_party/WebKit/WebKit/chromium/public/WebCursorInfo.h" |
| 37 #include "third_party/WebKit/WebKit/chromium/public/WebDocument.h" | 37 #include "third_party/WebKit/WebKit/chromium/public/WebDocument.h" |
| 38 #include "third_party/WebKit/WebKit/chromium/public/WebElement.h" | 38 #include "third_party/WebKit/WebKit/chromium/public/WebElement.h" |
| 39 #include "third_party/WebKit/WebKit/chromium/public/WebFrame.h" | 39 #include "third_party/WebKit/WebKit/chromium/public/WebFrame.h" |
| 40 #include "third_party/WebKit/WebKit/chromium/public/WebInputEvent.h" | 40 #include "third_party/WebKit/WebKit/chromium/public/WebInputEvent.h" |
| 41 #include "third_party/WebKit/WebKit/chromium/public/WebPluginContainer.h" | 41 #include "third_party/WebKit/WebKit/chromium/public/WebPluginContainer.h" |
| 42 #include "third_party/WebKit/WebKit/chromium/public/WebRect.h" | 42 #include "third_party/WebKit/WebKit/chromium/public/WebRect.h" |
| 43 #include "webkit/glue/plugins/pepper_buffer.h" | 43 #include "webkit/glue/plugins/pepper_buffer.h" |
| 44 #include "webkit/glue/plugins/pepper_device_context_2d.h" | 44 #include "webkit/glue/plugins/pepper_graphics_2d.h" |
| 45 #include "webkit/glue/plugins/pepper_event_conversion.h" | 45 #include "webkit/glue/plugins/pepper_event_conversion.h" |
| 46 #include "webkit/glue/plugins/pepper_image_data.h" | 46 #include "webkit/glue/plugins/pepper_image_data.h" |
| 47 #include "webkit/glue/plugins/pepper_plugin_delegate.h" | 47 #include "webkit/glue/plugins/pepper_plugin_delegate.h" |
| 48 #include "webkit/glue/plugins/pepper_plugin_module.h" | 48 #include "webkit/glue/plugins/pepper_plugin_module.h" |
| 49 #include "webkit/glue/plugins/pepper_string.h" | 49 #include "webkit/glue/plugins/pepper_string.h" |
| 50 #include "webkit/glue/plugins/pepper_url_loader.h" | 50 #include "webkit/glue/plugins/pepper_url_loader.h" |
| 51 #include "webkit/glue/plugins/pepper_var.h" | 51 #include "webkit/glue/plugins/pepper_var.h" |
| 52 | 52 |
| 53 using WebKit::WebCanvas; | 53 using WebKit::WebCanvas; |
| 54 using WebKit::WebCursorInfo; | 54 using WebKit::WebCursorInfo; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 139 return instance->GetWindowObject(); | 139 return instance->GetWindowObject(); |
| 140 } | 140 } |
| 141 | 141 |
| 142 PP_Var GetOwnerElementObject(PP_Instance instance_id) { | 142 PP_Var GetOwnerElementObject(PP_Instance instance_id) { |
| 143 PluginInstance* instance = PluginInstance::FromPPInstance(instance_id); | 143 PluginInstance* instance = PluginInstance::FromPPInstance(instance_id); |
| 144 if (!instance) | 144 if (!instance) |
| 145 return PP_MakeVoid(); | 145 return PP_MakeVoid(); |
| 146 return instance->GetOwnerElementObject(); | 146 return instance->GetOwnerElementObject(); |
| 147 } | 147 } |
| 148 | 148 |
| 149 bool BindGraphicsDeviceContext(PP_Instance instance_id, PP_Resource device_id) { | 149 bool BindGraphics(PP_Instance instance_id, PP_Resource device_id) { |
| 150 PluginInstance* instance = PluginInstance::FromPPInstance(instance_id); | 150 PluginInstance* instance = PluginInstance::FromPPInstance(instance_id); |
| 151 if (!instance) | 151 if (!instance) |
| 152 return false; | 152 return false; |
| 153 return instance->BindGraphicsDeviceContext(device_id); | 153 return instance->BindGraphics(device_id); |
| 154 } | 154 } |
| 155 | 155 |
| 156 bool IsFullFrame(PP_Instance instance_id) { | 156 bool IsFullFrame(PP_Instance instance_id) { |
| 157 PluginInstance* instance = PluginInstance::FromPPInstance(instance_id); | 157 PluginInstance* instance = PluginInstance::FromPPInstance(instance_id); |
| 158 if (!instance) | 158 if (!instance) |
| 159 return false; | 159 return false; |
| 160 return instance->full_frame(); | 160 return instance->full_frame(); |
| 161 } | 161 } |
| 162 | 162 |
| 163 const PPB_Instance ppb_instance = { | 163 const PPB_Instance ppb_instance = { |
| 164 &GetWindowObject, | 164 &GetWindowObject, |
| 165 &GetOwnerElementObject, | 165 &GetOwnerElementObject, |
| 166 &BindGraphicsDeviceContext, | 166 &BindGraphics, |
| 167 &IsFullFrame, | 167 &IsFullFrame, |
| 168 }; | 168 }; |
| 169 | 169 |
| 170 void NumberOfFindResultsChanged(PP_Instance instance_id, | 170 void NumberOfFindResultsChanged(PP_Instance instance_id, |
| 171 int32_t total, | 171 int32_t total, |
| 172 bool final_result) { | 172 bool final_result) { |
| 173 PluginInstance* instance = PluginInstance::FromPPInstance(instance_id); | 173 PluginInstance* instance = PluginInstance::FromPPInstance(instance_id); |
| 174 if (!instance) | 174 if (!instance) |
| 175 return; | 175 return; |
| 176 | 176 |
| 177 DCHECK_NE(instance->find_identifier(), -1); | 177 DCHECK_NE(instance->find_identifier(), -1); |
| 178 instance->delegate()->DidChangeNumberOfFindResults( | 178 instance->delegate()->DidChangeNumberOfFindResults( |
| 179 instance->find_identifier(), total, final_result); | 179 instance->find_identifier(), total, final_result); |
| 180 } | 180 } |
| 181 | 181 |
| 182 void SelectedFindResultChanged(PP_Instance instance_id, | 182 void SelectedFindResultChanged(PP_Instance instance_id, |
| 183 int32_t index) { | 183 int32_t index) { |
| 184 PluginInstance* instance = PluginInstance::FromPPInstance(instance_id); | 184 PluginInstance* instance = PluginInstance::FromPPInstance(instance_id); |
| 185 if (!instance) | 185 if (!instance) |
| 186 return; | 186 return; |
| 187 | 187 |
| 188 DCHECK_NE(instance->find_identifier(), -1); | 188 DCHECK_NE(instance->find_identifier(), -1); |
| 189 instance->delegate()->DidChangeSelectedFindResult( | 189 instance->delegate()->DidChangeSelectedFindResult( |
| 190 instance->find_identifier(), index); | 190 instance->find_identifier(), index); |
| 191 } | 191 } |
| 192 | 192 |
| 193 const PPB_Find ppb_find = { | 193 const PPB_Find_Dev ppb_find = { |
| 194 &NumberOfFindResultsChanged, | 194 &NumberOfFindResultsChanged, |
| 195 &SelectedFindResultChanged, | 195 &SelectedFindResultChanged, |
| 196 }; | 196 }; |
| 197 | 197 |
| 198 } // namespace | 198 } // namespace |
| 199 | 199 |
| 200 PluginInstance::PluginInstance(PluginDelegate* delegate, | 200 PluginInstance::PluginInstance(PluginDelegate* delegate, |
| 201 PluginModule* module, | 201 PluginModule* module, |
| 202 const PPP_Instance* instance_interface) | 202 const PPP_Instance* instance_interface) |
| 203 : delegate_(delegate), | 203 : delegate_(delegate), |
| (...skipping 25 matching lines...) Expand all Loading... |
| 229 const PPB_Instance* PluginInstance::GetInterface() { | 229 const PPB_Instance* PluginInstance::GetInterface() { |
| 230 return &ppb_instance; | 230 return &ppb_instance; |
| 231 } | 231 } |
| 232 | 232 |
| 233 // static | 233 // static |
| 234 PluginInstance* PluginInstance::FromPPInstance(PP_Instance instance) { | 234 PluginInstance* PluginInstance::FromPPInstance(PP_Instance instance) { |
| 235 return reinterpret_cast<PluginInstance*>(instance); | 235 return reinterpret_cast<PluginInstance*>(instance); |
| 236 } | 236 } |
| 237 | 237 |
| 238 // static | 238 // static |
| 239 const PPB_Find* PluginInstance::GetFindInterface() { | 239 const PPB_Find_Dev* PluginInstance::GetFindInterface() { |
| 240 return &ppb_find; | 240 return &ppb_find; |
| 241 } | 241 } |
| 242 | 242 |
| 243 PP_Instance PluginInstance::GetPPInstance() { | 243 PP_Instance PluginInstance::GetPPInstance() { |
| 244 return reinterpret_cast<intptr_t>(this); | 244 return reinterpret_cast<intptr_t>(this); |
| 245 } | 245 } |
| 246 | 246 |
| 247 void PluginInstance::Paint(WebCanvas* canvas, | 247 void PluginInstance::Paint(WebCanvas* canvas, |
| 248 const gfx::Rect& plugin_rect, | 248 const gfx::Rect& plugin_rect, |
| 249 const gfx::Rect& paint_rect) { | 249 const gfx::Rect& paint_rect) { |
| 250 if (device_context_2d_) | 250 if (bound_graphics_2d_) |
| 251 device_context_2d_->Paint(canvas, plugin_rect, paint_rect); | 251 bound_graphics_2d_->Paint(canvas, plugin_rect, paint_rect); |
| 252 } | 252 } |
| 253 | 253 |
| 254 void PluginInstance::InvalidateRect(const gfx::Rect& rect) { | 254 void PluginInstance::InvalidateRect(const gfx::Rect& rect) { |
| 255 if (!container_ || position_.IsEmpty()) | 255 if (!container_ || position_.IsEmpty()) |
| 256 return; // Nothing to do. | 256 return; // Nothing to do. |
| 257 if (rect.IsEmpty()) | 257 if (rect.IsEmpty()) |
| 258 container_->invalidate(); | 258 container_->invalidate(); |
| 259 else | 259 else |
| 260 container_->invalidateRect(rect); | 260 container_->invalidateRect(rect); |
| 261 } | 261 } |
| 262 | 262 |
| 263 PP_Var PluginInstance::GetWindowObject() { | 263 PP_Var PluginInstance::GetWindowObject() { |
| 264 if (!container_) | 264 if (!container_) |
| 265 return PP_MakeVoid(); | 265 return PP_MakeVoid(); |
| 266 | 266 |
| 267 WebFrame* frame = container_->element().document().frame(); | 267 WebFrame* frame = container_->element().document().frame(); |
| 268 if (!frame) | 268 if (!frame) |
| 269 return PP_MakeVoid(); | 269 return PP_MakeVoid(); |
| 270 | 270 |
| 271 return NPObjectToPPVar(frame->windowObject()); | 271 return NPObjectToPPVar(frame->windowObject()); |
| 272 } | 272 } |
| 273 | 273 |
| 274 PP_Var PluginInstance::GetOwnerElementObject() { | 274 PP_Var PluginInstance::GetOwnerElementObject() { |
| 275 if (!container_) | 275 if (!container_) |
| 276 return PP_MakeVoid(); | 276 return PP_MakeVoid(); |
| 277 | 277 |
| 278 return NPObjectToPPVar(container_->scriptableObjectForElement()); | 278 return NPObjectToPPVar(container_->scriptableObjectForElement()); |
| 279 } | 279 } |
| 280 | 280 |
| 281 bool PluginInstance::BindGraphicsDeviceContext(PP_Resource device_id) { | 281 bool PluginInstance::BindGraphics(PP_Resource device_id) { |
| 282 if (!device_id) { | 282 if (!device_id) { |
| 283 // Special-case clearing the current device. | 283 // Special-case clearing the current device. |
| 284 if (device_context_2d_) { | 284 if (bound_graphics_2d_) { |
| 285 device_context_2d_->BindToInstance(NULL); | 285 bound_graphics_2d_->BindToInstance(NULL); |
| 286 device_context_2d_ = NULL; | 286 bound_graphics_2d_ = NULL; |
| 287 InvalidateRect(gfx::Rect()); | 287 InvalidateRect(gfx::Rect()); |
| 288 } | 288 } |
| 289 return true; | 289 return true; |
| 290 } | 290 } |
| 291 | 291 |
| 292 scoped_refptr<DeviceContext2D> device_2d = | 292 scoped_refptr<Graphics2D> device_2d = Resource::GetAs<Graphics2D>(device_id); |
| 293 Resource::GetAs<DeviceContext2D>(device_id); | |
| 294 | 293 |
| 295 if (device_2d) { | 294 if (device_2d) { |
| 296 if (!device_2d->BindToInstance(this)) | 295 if (!device_2d->BindToInstance(this)) |
| 297 return false; // Can't bind to more than one instance. | 296 return false; // Can't bind to more than one instance. |
| 298 | 297 |
| 299 // See http://crbug.com/49403: this can be further optimized by keeping the | 298 // See http://crbug.com/49403: this can be further optimized by keeping the |
| 300 // old device around and painting from it. | 299 // old device around and painting from it. |
| 301 if (device_context_2d_.get()) { | 300 if (bound_graphics_2d_.get()) { |
| 302 // Start the new image with the content of the old image until the plugin | 301 // Start the new image with the content of the old image until the plugin |
| 303 // repaints. | 302 // repaints. |
| 304 const SkBitmap* old_backing_bitmap = | 303 const SkBitmap* old_backing_bitmap = |
| 305 device_context_2d_->image_data()->GetMappedBitmap(); | 304 bound_graphics_2d_->image_data()->GetMappedBitmap(); |
| 306 SkRect old_size = SkRect::MakeWH( | 305 SkRect old_size = SkRect::MakeWH( |
| 307 SkScalar(static_cast<float>(old_backing_bitmap->width())), | 306 SkScalar(static_cast<float>(old_backing_bitmap->width())), |
| 308 SkScalar(static_cast<float>(old_backing_bitmap->height()))); | 307 SkScalar(static_cast<float>(old_backing_bitmap->height()))); |
| 309 | 308 |
| 310 SkCanvas canvas(*device_2d->image_data()->GetMappedBitmap()); | 309 SkCanvas canvas(*device_2d->image_data()->GetMappedBitmap()); |
| 311 canvas.drawBitmap(*old_backing_bitmap, 0, 0); | 310 canvas.drawBitmap(*old_backing_bitmap, 0, 0); |
| 312 | 311 |
| 313 // Fill in any extra space with white. | 312 // Fill in any extra space with white. |
| 314 canvas.clipRect(old_size, SkRegion::kDifference_Op); | 313 canvas.clipRect(old_size, SkRegion::kDifference_Op); |
| 315 canvas.drawARGB(255, 255, 255, 255); | 314 canvas.drawARGB(255, 255, 255, 255); |
| 316 } | 315 } |
| 317 | 316 |
| 318 device_context_2d_ = device_2d; | 317 bound_graphics_2d_ = device_2d; |
| 319 // BindToInstance will have invalidated the plugin if necessary. | 318 // BindToInstance will have invalidated the plugin if necessary. |
| 320 } | 319 } |
| 321 | 320 |
| 322 return true; | 321 return true; |
| 323 } | 322 } |
| 324 | 323 |
| 325 bool PluginInstance::SetCursor(PP_CursorType_Dev type) { | 324 bool PluginInstance::SetCursor(PP_CursorType_Dev type) { |
| 326 cursor_.reset(new WebCursorInfo(static_cast<WebCursorInfo::Type>(type))); | 325 cursor_.reset(new WebCursorInfo(static_cast<WebCursorInfo::Type>(type))); |
| 327 return true; | 326 return true; |
| 328 } | 327 } |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 clip_ = clip; | 389 clip_ = clip; |
| 391 } | 390 } |
| 392 | 391 |
| 393 PP_Rect pp_position, pp_clip; | 392 PP_Rect pp_position, pp_clip; |
| 394 RectToPPRect(position_, &pp_position); | 393 RectToPPRect(position_, &pp_position); |
| 395 RectToPPRect(clip_, &pp_clip); | 394 RectToPPRect(clip_, &pp_clip); |
| 396 instance_interface_->ViewChanged(GetPPInstance(), &pp_position, &pp_clip); | 395 instance_interface_->ViewChanged(GetPPInstance(), &pp_position, &pp_clip); |
| 397 } | 396 } |
| 398 | 397 |
| 399 void PluginInstance::ViewInitiatedPaint() { | 398 void PluginInstance::ViewInitiatedPaint() { |
| 400 if (device_context_2d_) | 399 if (bound_graphics_2d_) |
| 401 device_context_2d_->ViewInitiatedPaint(); | 400 bound_graphics_2d_->ViewInitiatedPaint(); |
| 402 } | 401 } |
| 403 | 402 |
| 404 void PluginInstance::ViewFlushedPaint() { | 403 void PluginInstance::ViewFlushedPaint() { |
| 405 if (device_context_2d_) | 404 if (bound_graphics_2d_) |
| 406 device_context_2d_->ViewFlushedPaint(); | 405 bound_graphics_2d_->ViewFlushedPaint(); |
| 407 } | 406 } |
| 408 | 407 |
| 409 string16 PluginInstance::GetSelectedText(bool html) { | 408 string16 PluginInstance::GetSelectedText(bool html) { |
| 410 PP_Var rv = instance_interface_->GetSelectedText(GetPPInstance(), html); | 409 PP_Var rv = instance_interface_->GetSelectedText(GetPPInstance(), html); |
| 411 String* string = GetString(rv); | 410 String* string = GetString(rv); |
| 412 if (!string) | 411 if (!string) |
| 413 return string16(); | 412 return string16(); |
| 414 return UTF8ToUTF16(string->value()); | 413 return UTF8ToUTF16(string->value()); |
| 415 } | 414 } |
| 416 | 415 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 440 void PluginInstance::StopFind() { | 439 void PluginInstance::StopFind() { |
| 441 if (!LoadFindInterface()) | 440 if (!LoadFindInterface()) |
| 442 return; | 441 return; |
| 443 find_identifier_ = -1; | 442 find_identifier_ = -1; |
| 444 plugin_find_interface_->StopFind(GetPPInstance()); | 443 plugin_find_interface_->StopFind(GetPPInstance()); |
| 445 } | 444 } |
| 446 | 445 |
| 447 bool PluginInstance::LoadFindInterface() { | 446 bool PluginInstance::LoadFindInterface() { |
| 448 if (!plugin_find_interface_) { | 447 if (!plugin_find_interface_) { |
| 449 plugin_find_interface_ = | 448 plugin_find_interface_ = |
| 450 reinterpret_cast<const PPP_Find*>(module_->GetPluginInterface( | 449 reinterpret_cast<const PPP_Find_Dev*>(module_->GetPluginInterface( |
| 451 PPP_FIND_INTERFACE)); | 450 PPP_FIND_DEV_INTERFACE)); |
| 452 } | 451 } |
| 453 | 452 |
| 454 return !!plugin_find_interface_; | 453 return !!plugin_find_interface_; |
| 455 } | 454 } |
| 456 | 455 |
| 457 bool PluginInstance::LoadZoomInterface() { | 456 bool PluginInstance::LoadZoomInterface() { |
| 458 if (!plugin_zoom_interface_) { | 457 if (!plugin_zoom_interface_) { |
| 459 plugin_zoom_interface_ = | 458 plugin_zoom_interface_ = |
| 460 reinterpret_cast<const PPP_Zoom*>(module_->GetPluginInterface( | 459 reinterpret_cast<const PPP_Zoom_Dev*>(module_->GetPluginInterface( |
| 461 PPP_ZOOM_INTERFACE)); | 460 PPP_ZOOM_DEV_INTERFACE)); |
| 462 } | 461 } |
| 463 | 462 |
| 464 return !!plugin_zoom_interface_; | 463 return !!plugin_zoom_interface_; |
| 465 } | 464 } |
| 466 | 465 |
| 467 bool PluginInstance::GetPreferredPrintOutputFormat( | 466 bool PluginInstance::GetPreferredPrintOutputFormat( |
| 468 PP_PrintOutputFormat* format) { | 467 PP_PrintOutputFormat_Dev* format) { |
| 469 if (!plugin_print_interface_) { | 468 if (!plugin_print_interface_) { |
| 470 plugin_print_interface_ = | 469 plugin_print_interface_ = |
| 471 reinterpret_cast<const PPP_Printing*>(module_->GetPluginInterface( | 470 reinterpret_cast<const PPP_Printing_Dev*>(module_->GetPluginInterface( |
| 472 PPP_PRINTING_INTERFACE)); | 471 PPP_PRINTING_DEV_INTERFACE)); |
| 473 } | 472 } |
| 474 if (!plugin_print_interface_) | 473 if (!plugin_print_interface_) |
| 475 return false; | 474 return false; |
| 476 uint32_t format_count = 0; | 475 uint32_t format_count = 0; |
| 477 PP_PrintOutputFormat* supported_formats = | 476 PP_PrintOutputFormat_Dev* supported_formats = |
| 478 plugin_print_interface_->QuerySupportedFormats(GetPPInstance(), | 477 plugin_print_interface_->QuerySupportedFormats(GetPPInstance(), |
| 479 &format_count); | 478 &format_count); |
| 480 if (!supported_formats) | 479 if (!supported_formats) |
| 481 return false; | 480 return false; |
| 482 | 481 |
| 483 bool found_supported_format = false; | 482 bool found_supported_format = false; |
| 484 for (uint32_t index = 0; index < format_count; index++) { | 483 for (uint32_t index = 0; index < format_count; index++) { |
| 485 if (supported_formats[index] == PP_PRINTOUTPUTFORMAT_PDF) { | 484 if (supported_formats[index] == PP_PRINTOUTPUTFORMAT_PDF) { |
| 486 // If we found PDF, we are done. | 485 // If we found PDF, we are done. |
| 487 found_supported_format = true; | 486 found_supported_format = true; |
| 488 *format = PP_PRINTOUTPUTFORMAT_PDF; | 487 *format = PP_PRINTOUTPUTFORMAT_PDF; |
| 489 break; | 488 break; |
| 490 } else if (supported_formats[index] == PP_PRINTOUTPUTFORMAT_RASTER) { | 489 } else if (supported_formats[index] == PP_PRINTOUTPUTFORMAT_RASTER) { |
| 491 // We found raster. Keep looking. | 490 // We found raster. Keep looking. |
| 492 found_supported_format = true; | 491 found_supported_format = true; |
| 493 *format = PP_PRINTOUTPUTFORMAT_RASTER; | 492 *format = PP_PRINTOUTPUTFORMAT_RASTER; |
| 494 } | 493 } |
| 495 } | 494 } |
| 496 PluginModule::GetCore()->MemFree(supported_formats); | 495 PluginModule::GetCore()->MemFree(supported_formats); |
| 497 return found_supported_format; | 496 return found_supported_format; |
| 498 } | 497 } |
| 499 | 498 |
| 500 bool PluginInstance::SupportsPrintInterface() { | 499 bool PluginInstance::SupportsPrintInterface() { |
| 501 PP_PrintOutputFormat format; | 500 PP_PrintOutputFormat_Dev format; |
| 502 return GetPreferredPrintOutputFormat(&format); | 501 return GetPreferredPrintOutputFormat(&format); |
| 503 } | 502 } |
| 504 | 503 |
| 505 int PluginInstance::PrintBegin(const gfx::Rect& printable_area, | 504 int PluginInstance::PrintBegin(const gfx::Rect& printable_area, |
| 506 int printer_dpi) { | 505 int printer_dpi) { |
| 507 PP_PrintOutputFormat format; | 506 PP_PrintOutputFormat_Dev format; |
| 508 if (!GetPreferredPrintOutputFormat(&format)) { | 507 if (!GetPreferredPrintOutputFormat(&format)) { |
| 509 // PrintBegin should not have been called since SupportsPrintInterface | 508 // PrintBegin should not have been called since SupportsPrintInterface |
| 510 // would have returned false; | 509 // would have returned false; |
| 511 NOTREACHED(); | 510 NOTREACHED(); |
| 512 return 0; | 511 return 0; |
| 513 } | 512 } |
| 514 | 513 |
| 515 PP_PrintSettings print_settings; | 514 PP_PrintSettings_Dev print_settings; |
| 516 RectToPPRect(printable_area, &print_settings.printable_area); | 515 RectToPPRect(printable_area, &print_settings.printable_area); |
| 517 print_settings.dpi = printer_dpi; | 516 print_settings.dpi = printer_dpi; |
| 518 print_settings.orientation = PP_PRINTORIENTATION_NORMAL; | 517 print_settings.orientation = PP_PRINTORIENTATION_NORMAL; |
| 519 print_settings.grayscale = false; | 518 print_settings.grayscale = false; |
| 520 print_settings.format = format; | 519 print_settings.format = format; |
| 521 int num_pages = plugin_print_interface_->Begin(GetPPInstance(), | 520 int num_pages = plugin_print_interface_->Begin(GetPPInstance(), |
| 522 &print_settings); | 521 &print_settings); |
| 523 if (!num_pages) | 522 if (!num_pages) |
| 524 return 0; | 523 return 0; |
| 525 current_print_settings_ = print_settings; | 524 current_print_settings_ = print_settings; |
| 526 #if defined (OS_LINUX) | 525 #if defined (OS_LINUX) |
| 527 num_pages_ = num_pages; | 526 num_pages_ = num_pages; |
| 528 pdf_output_done_ = false; | 527 pdf_output_done_ = false; |
| 529 #endif // (OS_LINUX) | 528 #endif // (OS_LINUX) |
| 530 return num_pages; | 529 return num_pages; |
| 531 } | 530 } |
| 532 | 531 |
| 533 bool PluginInstance::PrintPage(int page_number, WebKit::WebCanvas* canvas) { | 532 bool PluginInstance::PrintPage(int page_number, WebKit::WebCanvas* canvas) { |
| 534 DCHECK(plugin_print_interface_); | 533 DCHECK(plugin_print_interface_); |
| 535 PP_PrintPageNumberRange page_range; | 534 PP_PrintPageNumberRange_Dev page_range; |
| 536 #if defined(OS_LINUX) | 535 #if defined(OS_LINUX) |
| 537 if (current_print_settings_.format == PP_PRINTOUTPUTFORMAT_PDF) { | 536 if (current_print_settings_.format == PP_PRINTOUTPUTFORMAT_PDF) { |
| 538 // On Linux we will try and output all pages as PDF in the first call to | 537 // On Linux we will try and output all pages as PDF in the first call to |
| 539 // PrintPage. This is a temporary hack. | 538 // PrintPage. This is a temporary hack. |
| 540 // TODO(sanjeevr): Remove this hack and fix this by changing the print | 539 // TODO(sanjeevr): Remove this hack and fix this by changing the print |
| 541 // interfaces for WebFrame and WebPlugin. | 540 // interfaces for WebFrame and WebPlugin. |
| 542 if (page_number != 0) | 541 if (page_number != 0) |
| 543 return pdf_output_done_; | 542 return pdf_output_done_; |
| 544 page_range.first_page_number = 0; | 543 page_range.first_page_number = 0; |
| 545 page_range.last_page_number = num_pages_ - 1; | 544 page_range.last_page_number = num_pages_ - 1; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 576 last_printed_page_ = NULL; | 575 last_printed_page_ = NULL; |
| 577 #elif defined(OS_LINUX) | 576 #elif defined(OS_LINUX) |
| 578 num_pages_ = 0; | 577 num_pages_ = 0; |
| 579 pdf_output_done_ = false; | 578 pdf_output_done_ = false; |
| 580 #endif // defined(OS_LINUX) | 579 #endif // defined(OS_LINUX) |
| 581 } | 580 } |
| 582 | 581 |
| 583 void PluginInstance::Graphics3DContextLost() { | 582 void PluginInstance::Graphics3DContextLost() { |
| 584 if (!plugin_graphics_3d_interface_) { | 583 if (!plugin_graphics_3d_interface_) { |
| 585 plugin_graphics_3d_interface_ = | 584 plugin_graphics_3d_interface_ = |
| 586 reinterpret_cast<const PPP_Graphics3D*>(module_->GetPluginInterface( | 585 reinterpret_cast<const PPP_Graphics3D_Dev*>(module_->GetPluginInterface( |
| 587 PPP_GRAPHICS_3D_INTERFACE)); | 586 PPP_GRAPHICS_3D_DEV_INTERFACE)); |
| 588 } | 587 } |
| 589 if (plugin_graphics_3d_interface_) | 588 if (plugin_graphics_3d_interface_) |
| 590 plugin_graphics_3d_interface_->Graphics3DContextLost(GetPPInstance()); | 589 plugin_graphics_3d_interface_->Graphics3DContextLost(GetPPInstance()); |
| 591 } | 590 } |
| 592 | 591 |
| 593 bool PluginInstance::PrintPDFOutput(PP_Resource print_output, | 592 bool PluginInstance::PrintPDFOutput(PP_Resource print_output, |
| 594 WebKit::WebCanvas* canvas) { | 593 WebKit::WebCanvas* canvas) { |
| 595 scoped_refptr<Buffer> buffer(Resource::GetAs<Buffer>(print_output)); | 594 scoped_refptr<Buffer> buffer(Resource::GetAs<Buffer>(print_output)); |
| 596 if (!buffer.get() || !buffer->is_mapped() || !buffer->size()) { | 595 if (!buffer.get() || !buffer->is_mapped() || !buffer->size()) { |
| 597 NOTREACHED(); | 596 NOTREACHED(); |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 810 bounds.size.width = dest_rect.width(); | 809 bounds.size.width = dest_rect.width(); |
| 811 bounds.size.height = dest_rect.height(); | 810 bounds.size.height = dest_rect.height(); |
| 812 | 811 |
| 813 CGContextDrawImage(canvas, bounds, image); | 812 CGContextDrawImage(canvas, bounds, image); |
| 814 CGContextRestoreGState(canvas); | 813 CGContextRestoreGState(canvas); |
| 815 } | 814 } |
| 816 #endif // defined(OS_MACOSX) | 815 #endif // defined(OS_MACOSX) |
| 817 | 816 |
| 818 | 817 |
| 819 } // namespace pepper | 818 } // namespace pepper |
| OLD | NEW |