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/message_loop.h" | 8 #include "base/message_loop.h" |
9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
10 #include "base/scoped_ptr.h" | 10 #include "base/scoped_ptr.h" |
(...skipping 24 matching lines...) Expand all Loading... |
35 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginContainer.h" | 35 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginContainer.h" |
36 #include "third_party/WebKit/Source/WebKit/chromium/public/WebRect.h" | 36 #include "third_party/WebKit/Source/WebKit/chromium/public/WebRect.h" |
37 #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" | 37 #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" |
38 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLRequest.h" | 38 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLRequest.h" |
39 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" | 39 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" |
40 #include "ui/gfx/rect.h" | 40 #include "ui/gfx/rect.h" |
41 #include "ui/gfx/skia_util.h" | 41 #include "ui/gfx/skia_util.h" |
42 #include "webkit/plugins/ppapi/common.h" | 42 #include "webkit/plugins/ppapi/common.h" |
43 #include "webkit/plugins/ppapi/event_conversion.h" | 43 #include "webkit/plugins/ppapi/event_conversion.h" |
44 #include "webkit/plugins/ppapi/fullscreen_container.h" | 44 #include "webkit/plugins/ppapi/fullscreen_container.h" |
| 45 #include "webkit/plugins/ppapi/message_channel.h" |
45 #include "webkit/plugins/ppapi/plugin_delegate.h" | 46 #include "webkit/plugins/ppapi/plugin_delegate.h" |
46 #include "webkit/plugins/ppapi/plugin_module.h" | 47 #include "webkit/plugins/ppapi/plugin_module.h" |
47 #include "webkit/plugins/ppapi/plugin_object.h" | 48 #include "webkit/plugins/ppapi/plugin_object.h" |
48 #include "webkit/plugins/ppapi/ppb_buffer_impl.h" | 49 #include "webkit/plugins/ppapi/ppb_buffer_impl.h" |
49 #include "webkit/plugins/ppapi/ppb_graphics_2d_impl.h" | 50 #include "webkit/plugins/ppapi/ppb_graphics_2d_impl.h" |
50 #include "webkit/plugins/ppapi/ppb_image_data_impl.h" | 51 #include "webkit/plugins/ppapi/ppb_image_data_impl.h" |
51 #include "webkit/plugins/ppapi/ppb_surface_3d_impl.h" | 52 #include "webkit/plugins/ppapi/ppb_surface_3d_impl.h" |
52 #include "webkit/plugins/ppapi/ppb_url_loader_impl.h" | 53 #include "webkit/plugins/ppapi/ppb_url_loader_impl.h" |
53 #include "webkit/plugins/ppapi/ppp_pdf.h" | 54 #include "webkit/plugins/ppapi/ppp_pdf.h" |
54 #include "webkit/plugins/ppapi/string.h" | 55 #include "webkit/plugins/ppapi/string.h" |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 typedef bool (*RenderPDFPageToDCProc)( | 93 typedef bool (*RenderPDFPageToDCProc)( |
93 const unsigned char* pdf_buffer, int buffer_size, int page_number, HDC dc, | 94 const unsigned char* pdf_buffer, int buffer_size, int page_number, HDC dc, |
94 int dpi_x, int dpi_y, int bounds_origin_x, int bounds_origin_y, | 95 int dpi_x, int dpi_y, int bounds_origin_x, int bounds_origin_y, |
95 int bounds_width, int bounds_height, bool fit_to_bounds, | 96 int bounds_width, int bounds_height, bool fit_to_bounds, |
96 bool stretch_to_bounds, bool keep_aspect_ratio, bool center_in_bounds); | 97 bool stretch_to_bounds, bool keep_aspect_ratio, bool center_in_bounds); |
97 #endif // defined(OS_WIN) | 98 #endif // defined(OS_WIN) |
98 | 99 |
99 namespace { | 100 namespace { |
100 | 101 |
101 #define COMPILE_ASSERT_MATCHING_ENUM(webkit_name, np_name) \ | 102 #define COMPILE_ASSERT_MATCHING_ENUM(webkit_name, np_name) \ |
102 COMPILE_ASSERT(int(WebCursorInfo::webkit_name) == int(np_name), \ | 103 COMPILE_ASSERT(static_cast<int>(WebCursorInfo::webkit_name) \ |
| 104 == static_cast<int>(np_name), \ |
103 mismatching_enums) | 105 mismatching_enums) |
104 | 106 |
105 COMPILE_ASSERT_MATCHING_ENUM(TypePointer, PP_CURSORTYPE_POINTER); | 107 COMPILE_ASSERT_MATCHING_ENUM(TypePointer, PP_CURSORTYPE_POINTER); |
106 COMPILE_ASSERT_MATCHING_ENUM(TypeCross, PP_CURSORTYPE_CROSS); | 108 COMPILE_ASSERT_MATCHING_ENUM(TypeCross, PP_CURSORTYPE_CROSS); |
107 COMPILE_ASSERT_MATCHING_ENUM(TypeHand, PP_CURSORTYPE_HAND); | 109 COMPILE_ASSERT_MATCHING_ENUM(TypeHand, PP_CURSORTYPE_HAND); |
108 COMPILE_ASSERT_MATCHING_ENUM(TypeIBeam, PP_CURSORTYPE_IBEAM); | 110 COMPILE_ASSERT_MATCHING_ENUM(TypeIBeam, PP_CURSORTYPE_IBEAM); |
109 COMPILE_ASSERT_MATCHING_ENUM(TypeWait, PP_CURSORTYPE_WAIT); | 111 COMPILE_ASSERT_MATCHING_ENUM(TypeWait, PP_CURSORTYPE_WAIT); |
110 COMPILE_ASSERT_MATCHING_ENUM(TypeHelp, PP_CURSORTYPE_HELP); | 112 COMPILE_ASSERT_MATCHING_ENUM(TypeHelp, PP_CURSORTYPE_HELP); |
111 COMPILE_ASSERT_MATCHING_ENUM(TypeEastResize, PP_CURSORTYPE_EASTRESIZE); | 113 COMPILE_ASSERT_MATCHING_ENUM(TypeEastResize, PP_CURSORTYPE_EASTRESIZE); |
112 COMPILE_ASSERT_MATCHING_ENUM(TypeNorthResize, PP_CURSORTYPE_NORTHRESIZE); | 114 COMPILE_ASSERT_MATCHING_ENUM(TypeNorthResize, PP_CURSORTYPE_NORTHRESIZE); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 | 196 |
195 PP_Var ExecuteScript(PP_Instance instance_id, | 197 PP_Var ExecuteScript(PP_Instance instance_id, |
196 PP_Var script, | 198 PP_Var script, |
197 PP_Var* exception) { | 199 PP_Var* exception) { |
198 PluginInstance* instance = ResourceTracker::Get()->GetInstance(instance_id); | 200 PluginInstance* instance = ResourceTracker::Get()->GetInstance(instance_id); |
199 if (!instance) | 201 if (!instance) |
200 return PP_MakeUndefined(); | 202 return PP_MakeUndefined(); |
201 return instance->ExecuteScript(script, exception); | 203 return instance->ExecuteScript(script, exception); |
202 } | 204 } |
203 | 205 |
| 206 void PostMessage(PP_Instance instance_id, PP_Var message) { |
| 207 PluginInstance* instance = ResourceTracker::Get()->GetInstance(instance_id); |
| 208 if (!instance) |
| 209 return; |
| 210 instance->PostMessage(message); |
| 211 } |
| 212 |
204 const PPB_Instance ppb_instance = { | 213 const PPB_Instance ppb_instance = { |
205 &GetWindowObject, | 214 &GetWindowObject, |
206 &GetOwnerElementObject, | 215 &GetOwnerElementObject, |
207 &BindGraphics, | 216 &BindGraphics, |
208 &IsFullFrame, | 217 &IsFullFrame, |
209 &ExecuteScript, | 218 &ExecuteScript, |
| 219 &PostMessage |
210 }; | 220 }; |
211 | 221 |
212 void NumberOfFindResultsChanged(PP_Instance instance_id, | 222 void NumberOfFindResultsChanged(PP_Instance instance_id, |
213 int32_t total, | 223 int32_t total, |
214 PP_Bool final_result) { | 224 PP_Bool final_result) { |
215 PluginInstance* instance = ResourceTracker::Get()->GetInstance(instance_id); | 225 PluginInstance* instance = ResourceTracker::Get()->GetInstance(instance_id); |
216 if (!instance) | 226 if (!instance) |
217 return; | 227 return; |
218 | 228 |
219 DCHECK_NE(instance->find_identifier(), -1); | 229 DCHECK_NE(instance->find_identifier(), -1); |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
307 | 317 |
308 const PPB_Zoom_Dev ppb_zoom = { | 318 const PPB_Zoom_Dev ppb_zoom = { |
309 &ZoomChanged, | 319 &ZoomChanged, |
310 &ZoomLimitsChanged | 320 &ZoomLimitsChanged |
311 }; | 321 }; |
312 | 322 |
313 } // namespace | 323 } // namespace |
314 | 324 |
315 PluginInstance::PluginInstance(PluginDelegate* delegate, | 325 PluginInstance::PluginInstance(PluginDelegate* delegate, |
316 PluginModule* module, | 326 PluginModule* module, |
317 const PPP_Instance* instance_interface) | 327 const PPP_Instance* instance_interface, |
| 328 InterfaceOwner ppp_instance_owner) |
318 : delegate_(delegate), | 329 : delegate_(delegate), |
319 module_(module), | 330 module_(module), |
320 instance_interface_(instance_interface), | 331 instance_interface_(instance_interface), |
321 pp_instance_(0), | 332 pp_instance_(0), |
322 container_(NULL), | 333 container_(NULL), |
323 full_frame_(false), | 334 full_frame_(false), |
324 has_webkit_focus_(false), | 335 has_webkit_focus_(false), |
325 has_content_area_focus_(false), | 336 has_content_area_focus_(false), |
326 find_identifier_(-1), | 337 find_identifier_(-1), |
327 plugin_find_interface_(NULL), | 338 plugin_find_interface_(NULL), |
328 plugin_pdf_interface_(NULL), | 339 plugin_pdf_interface_(NULL), |
329 plugin_selection_interface_(NULL), | 340 plugin_selection_interface_(NULL), |
330 plugin_zoom_interface_(NULL), | 341 plugin_zoom_interface_(NULL), |
331 #if defined(OS_LINUX) | 342 #if defined(OS_LINUX) |
332 canvas_(NULL), | 343 canvas_(NULL), |
333 #endif // defined(OS_LINUX) | 344 #endif // defined(OS_LINUX) |
334 plugin_print_interface_(NULL), | 345 plugin_print_interface_(NULL), |
335 plugin_graphics_3d_interface_(NULL), | 346 plugin_graphics_3d_interface_(NULL), |
336 always_on_top_(false), | 347 always_on_top_(false), |
337 fullscreen_container_(NULL), | 348 fullscreen_container_(NULL), |
338 fullscreen_(false) { | 349 fullscreen_(false), |
| 350 message_channel_(NULL), |
| 351 ppp_instance_owner_(ppp_instance_owner) { |
339 pp_instance_ = ResourceTracker::Get()->AddInstance(this); | 352 pp_instance_ = ResourceTracker::Get()->AddInstance(this); |
340 | 353 |
341 memset(¤t_print_settings_, 0, sizeof(current_print_settings_)); | 354 memset(¤t_print_settings_, 0, sizeof(current_print_settings_)); |
342 DCHECK(delegate); | 355 DCHECK(delegate); |
343 module_->InstanceCreated(this); | 356 module_->InstanceCreated(this); |
344 delegate_->InstanceCreated(this); | 357 delegate_->InstanceCreated(this); |
| 358 message_channel_.reset(new MessageChannel(this)); |
345 } | 359 } |
346 | 360 |
347 PluginInstance::~PluginInstance() { | 361 PluginInstance::~PluginInstance() { |
348 // Free all the plugin objects. This will automatically clear the back- | 362 // Free all the plugin objects. This will automatically clear the back- |
349 // pointer from the NPObject so WebKit can't call into the plugin any more. | 363 // pointer from the NPObject so WebKit can't call into the plugin any more. |
350 // | 364 // |
351 // Swap out the set so we can delete from it (the objects will try to | 365 // Swap out the set so we can delete from it (the objects will try to |
352 // unregister themselves inside the delete call). | 366 // unregister themselves inside the delete call). |
353 PluginObjectSet plugin_object_copy; | 367 PluginObjectSet plugin_object_copy; |
354 live_plugin_objects_.swap(plugin_object_copy); | 368 live_plugin_objects_.swap(plugin_object_copy); |
355 for (PluginObjectSet::iterator i = plugin_object_copy.begin(); | 369 for (PluginObjectSet::iterator i = plugin_object_copy.begin(); |
356 i != plugin_object_copy.end(); ++i) | 370 i != plugin_object_copy.end(); ++i) |
357 delete *i; | 371 delete *i; |
358 | 372 |
359 delegate_->InstanceDeleted(this); | 373 delegate_->InstanceDeleted(this); |
360 module_->InstanceDeleted(this); | 374 module_->InstanceDeleted(this); |
361 | 375 |
362 ResourceTracker::Get()->InstanceDeleted(pp_instance_); | 376 ResourceTracker::Get()->InstanceDeleted(pp_instance_); |
363 #if defined(OS_LINUX) | 377 #if defined(OS_LINUX) |
364 ranges_.clear(); | 378 ranges_.clear(); |
365 #endif // defined(OS_LINUX) | 379 #endif // defined(OS_LINUX) |
| 380 |
| 381 if (BROWSER_OWNS_INTERFACE == ppp_instance_owner_) |
| 382 delete const_cast<PPP_Instance*>(instance_interface_); |
366 } | 383 } |
367 | 384 |
368 // static | 385 // static |
369 const PPB_Instance* PluginInstance::GetInterface() { | 386 const void* PluginInstance::GetInterface(const std::string& interface) { |
370 return &ppb_instance; | 387 // At the time of writing, we support both 0.4 and 0.5. But for future- |
| 388 // proofing, we also compare to PPB_INSTANCE_INTERFACE so that we can work |
| 389 // with later versions, assuming other parts work. If PPB_Instance changes |
| 390 // in a fashion that breaks the struct layout (e.g. modifying or deleting |
| 391 // functions), this code must either get more complicated (to return a |
| 392 // different, backwards-compatible struct) or just get rid of support for |
| 393 // 0.4 and 0.5. |
| 394 if ((interface == PPB_INSTANCE_INTERFACE_0_4) |
| 395 || (interface == PPB_INSTANCE_INTERFACE_0_5) |
| 396 || (interface == PPB_INSTANCE_INTERFACE)) |
| 397 return &ppb_instance; |
| 398 return NULL; |
371 } | 399 } |
372 | 400 |
373 // static | 401 // static |
374 const PPB_Find_Dev* PluginInstance::GetFindInterface() { | 402 const PPB_Find_Dev* PluginInstance::GetFindInterface() { |
375 return &ppb_find; | 403 return &ppb_find; |
376 } | 404 } |
377 | 405 |
378 // static | 406 // static |
379 const PPB_Fullscreen_Dev* PluginInstance::GetFullscreenInterface() { | 407 const PPB_Fullscreen_Dev* PluginInstance::GetFullscreenInterface() { |
380 return &ppb_fullscreen; | 408 return &ppb_fullscreen; |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
583 try_catch.SetException("Exception caught"); | 611 try_catch.SetException("Exception caught"); |
584 WebBindings::releaseVariantValue(&result); | 612 WebBindings::releaseVariantValue(&result); |
585 return PP_MakeUndefined(); | 613 return PP_MakeUndefined(); |
586 } | 614 } |
587 | 615 |
588 PP_Var ret = Var::NPVariantToPPVar(this, &result); | 616 PP_Var ret = Var::NPVariantToPPVar(this, &result); |
589 WebBindings::releaseVariantValue(&result); | 617 WebBindings::releaseVariantValue(&result); |
590 return ret; | 618 return ret; |
591 } | 619 } |
592 | 620 |
| 621 void PluginInstance::PostMessage(PP_Var message) { |
| 622 message_channel_->PostMessageToJavaScript(message); |
| 623 } |
| 624 |
593 void PluginInstance::Delete() { | 625 void PluginInstance::Delete() { |
594 // Keep a reference on the stack. See NOTE above. | 626 // Keep a reference on the stack. See NOTE above. |
595 scoped_refptr<PluginInstance> ref(this); | 627 scoped_refptr<PluginInstance> ref(this); |
596 instance_interface_->DidDestroy(pp_instance()); | 628 instance_interface_->DidDestroy(pp_instance()); |
597 | 629 |
598 if (fullscreen_container_) { | 630 if (fullscreen_container_) { |
599 fullscreen_container_->Destroy(); | 631 fullscreen_container_->Destroy(); |
600 fullscreen_container_ = NULL; | 632 fullscreen_container_ = NULL; |
601 } | 633 } |
602 container_ = NULL; | 634 container_ = NULL; |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
642 for (size_t i = 0; i < pp_events.size(); i++) { | 674 for (size_t i = 0; i < pp_events.size(); i++) { |
643 rv |= PPBoolToBool(instance_interface_->HandleInputEvent(pp_instance(), | 675 rv |= PPBoolToBool(instance_interface_->HandleInputEvent(pp_instance(), |
644 &pp_events[i])); | 676 &pp_events[i])); |
645 } | 677 } |
646 | 678 |
647 if (cursor_.get()) | 679 if (cursor_.get()) |
648 *cursor_info = *cursor_; | 680 *cursor_info = *cursor_; |
649 return rv; | 681 return rv; |
650 } | 682 } |
651 | 683 |
| 684 void PluginInstance::HandleMessage(PP_Var message) { |
| 685 if ((instance_interface_ != NULL) && |
| 686 (instance_interface_->HandleMessage != NULL)) { |
| 687 instance_interface_->HandleMessage(pp_instance(), message); |
| 688 } |
| 689 } |
| 690 |
652 PP_Var PluginInstance::GetInstanceObject() { | 691 PP_Var PluginInstance::GetInstanceObject() { |
653 return instance_interface_->GetInstanceObject(pp_instance()); | 692 return instance_interface_->GetInstanceObject(pp_instance()); |
654 } | 693 } |
655 | 694 |
656 void PluginInstance::ViewChanged(const gfx::Rect& position, | 695 void PluginInstance::ViewChanged(const gfx::Rect& position, |
657 const gfx::Rect& clip) { | 696 const gfx::Rect& clip) { |
658 fullscreen_ = (fullscreen_container_ != NULL); | 697 fullscreen_ = (fullscreen_container_ != NULL); |
659 position_ = position; | 698 position_ = position; |
660 | 699 |
661 if (clip.IsEmpty()) { | 700 if (clip.IsEmpty()) { |
(...skipping 675 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1337 return found->second; | 1376 return found->second; |
1338 } | 1377 } |
1339 | 1378 |
1340 bool PluginInstance::IsFullPagePlugin() const { | 1379 bool PluginInstance::IsFullPagePlugin() const { |
1341 WebFrame* frame = container()->element().document().frame(); | 1380 WebFrame* frame = container()->element().document().frame(); |
1342 return frame->view()->mainFrame()->document().isPluginDocument(); | 1381 return frame->view()->mainFrame()->document().isPluginDocument(); |
1343 } | 1382 } |
1344 | 1383 |
1345 } // namespace ppapi | 1384 } // namespace ppapi |
1346 } // namespace webkit | 1385 } // namespace webkit |
OLD | NEW |