| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/renderer/pepper/pepper_plugin_instance_impl.h" | 5 #include "content/renderer/pepper/pepper_plugin_instance_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/callback_helpers.h" | 8 #include "base/callback_helpers.h" |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 #include "content/public/common/page_zoom.h" | 25 #include "content/public/common/page_zoom.h" |
| 26 #include "content/public/renderer/content_renderer_client.h" | 26 #include "content/public/renderer/content_renderer_client.h" |
| 27 #include "content/renderer/compositor_bindings/web_layer_impl.h" | 27 #include "content/renderer/compositor_bindings/web_layer_impl.h" |
| 28 #include "content/renderer/gpu/render_widget_compositor.h" | 28 #include "content/renderer/gpu/render_widget_compositor.h" |
| 29 #include "content/renderer/pepper/content_decryptor_delegate.h" | 29 #include "content/renderer/pepper/content_decryptor_delegate.h" |
| 30 #include "content/renderer/pepper/event_conversion.h" | 30 #include "content/renderer/pepper/event_conversion.h" |
| 31 #include "content/renderer/pepper/fullscreen_container.h" | 31 #include "content/renderer/pepper/fullscreen_container.h" |
| 32 #include "content/renderer/pepper/gfx_conversion.h" | 32 #include "content/renderer/pepper/gfx_conversion.h" |
| 33 #include "content/renderer/pepper/host_dispatcher_wrapper.h" | 33 #include "content/renderer/pepper/host_dispatcher_wrapper.h" |
| 34 #include "content/renderer/pepper/host_globals.h" | 34 #include "content/renderer/pepper/host_globals.h" |
| 35 #include "content/renderer/pepper/message_channel.h" | |
| 36 #include "content/renderer/pepper/npapi_glue.h" | |
| 37 #include "content/renderer/pepper/pepper_browser_connection.h" | 35 #include "content/renderer/pepper/pepper_browser_connection.h" |
| 38 #include "content/renderer/pepper/pepper_compositor_host.h" | 36 #include "content/renderer/pepper/pepper_compositor_host.h" |
| 39 #include "content/renderer/pepper/pepper_file_ref_renderer_host.h" | 37 #include "content/renderer/pepper/pepper_file_ref_renderer_host.h" |
| 40 #include "content/renderer/pepper/pepper_graphics_2d_host.h" | 38 #include "content/renderer/pepper/pepper_graphics_2d_host.h" |
| 41 #include "content/renderer/pepper/pepper_in_process_router.h" | 39 #include "content/renderer/pepper/pepper_in_process_router.h" |
| 40 #include "content/renderer/pepper/pepper_try_catch.h" |
| 42 #include "content/renderer/pepper/pepper_url_loader_host.h" | 41 #include "content/renderer/pepper/pepper_url_loader_host.h" |
| 43 #include "content/renderer/pepper/plugin_module.h" | 42 #include "content/renderer/pepper/plugin_module.h" |
| 44 #include "content/renderer/pepper/plugin_object.h" | 43 #include "content/renderer/pepper/plugin_object.h" |
| 45 #include "content/renderer/pepper/ppapi_preferences_builder.h" | 44 #include "content/renderer/pepper/ppapi_preferences_builder.h" |
| 46 #include "content/renderer/pepper/ppb_buffer_impl.h" | 45 #include "content/renderer/pepper/ppb_buffer_impl.h" |
| 47 #include "content/renderer/pepper/ppb_graphics_3d_impl.h" | 46 #include "content/renderer/pepper/ppb_graphics_3d_impl.h" |
| 48 #include "content/renderer/pepper/ppb_image_data_impl.h" | 47 #include "content/renderer/pepper/ppb_image_data_impl.h" |
| 49 #include "content/renderer/pepper/renderer_ppapi_host_impl.h" | 48 #include "content/renderer/pepper/renderer_ppapi_host_impl.h" |
| 50 #include "content/renderer/pepper/url_request_info_util.h" | 49 #include "content/renderer/pepper/url_request_info_util.h" |
| 51 #include "content/renderer/pepper/url_response_info_util.h" | 50 #include "content/renderer/pepper/url_response_info_util.h" |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 108 #include "third_party/WebKit/public/web/WebCompositionUnderline.h" | 107 #include "third_party/WebKit/public/web/WebCompositionUnderline.h" |
| 109 #include "third_party/WebKit/public/web/WebDataSource.h" | 108 #include "third_party/WebKit/public/web/WebDataSource.h" |
| 110 #include "third_party/WebKit/public/web/WebDocument.h" | 109 #include "third_party/WebKit/public/web/WebDocument.h" |
| 111 #include "third_party/WebKit/public/web/WebElement.h" | 110 #include "third_party/WebKit/public/web/WebElement.h" |
| 112 #include "third_party/WebKit/public/web/WebInputEvent.h" | 111 #include "third_party/WebKit/public/web/WebInputEvent.h" |
| 113 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 112 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
| 114 #include "third_party/WebKit/public/web/WebPluginContainer.h" | 113 #include "third_party/WebKit/public/web/WebPluginContainer.h" |
| 115 #include "third_party/WebKit/public/web/WebPrintParams.h" | 114 #include "third_party/WebKit/public/web/WebPrintParams.h" |
| 116 #include "third_party/WebKit/public/web/WebPrintScalingOption.h" | 115 #include "third_party/WebKit/public/web/WebPrintScalingOption.h" |
| 117 #include "third_party/WebKit/public/web/WebScopedUserGesture.h" | 116 #include "third_party/WebKit/public/web/WebScopedUserGesture.h" |
| 117 #include "third_party/WebKit/public/web/WebScriptSource.h" |
| 118 #include "third_party/WebKit/public/web/WebSecurityOrigin.h" | 118 #include "third_party/WebKit/public/web/WebSecurityOrigin.h" |
| 119 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h" | 119 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h" |
| 120 #include "third_party/WebKit/public/web/WebView.h" | 120 #include "third_party/WebKit/public/web/WebView.h" |
| 121 #include "third_party/khronos/GLES2/gl2.h" | 121 #include "third_party/khronos/GLES2/gl2.h" |
| 122 #include "third_party/skia/include/core/SkCanvas.h" | 122 #include "third_party/skia/include/core/SkCanvas.h" |
| 123 #include "third_party/skia/include/core/SkRect.h" | 123 #include "third_party/skia/include/core/SkRect.h" |
| 124 #include "ui/gfx/image/image_skia.h" | 124 #include "ui/gfx/image/image_skia.h" |
| 125 #include "ui/gfx/image/image_skia_rep.h" | 125 #include "ui/gfx/image/image_skia_rep.h" |
| 126 #include "ui/gfx/range/range.h" | 126 #include "ui/gfx/range/range.h" |
| 127 #include "ui/gfx/rect_conversions.h" | 127 #include "ui/gfx/rect_conversions.h" |
| (...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 552 filtered_input_event_mask_(0), | 552 filtered_input_event_mask_(0), |
| 553 text_input_type_(kPluginDefaultTextInputType), | 553 text_input_type_(kPluginDefaultTextInputType), |
| 554 text_input_caret_(0, 0, 0, 0), | 554 text_input_caret_(0, 0, 0, 0), |
| 555 text_input_caret_bounds_(0, 0, 0, 0), | 555 text_input_caret_bounds_(0, 0, 0, 0), |
| 556 text_input_caret_set_(false), | 556 text_input_caret_set_(false), |
| 557 selection_caret_(0), | 557 selection_caret_(0), |
| 558 selection_anchor_(0), | 558 selection_anchor_(0), |
| 559 pending_user_gesture_(0.0), | 559 pending_user_gesture_(0.0), |
| 560 document_loader_(NULL), | 560 document_loader_(NULL), |
| 561 external_document_load_(false), | 561 external_document_load_(false), |
| 562 npp_(new NPP_t), | |
| 563 isolate_(v8::Isolate::GetCurrent()), | 562 isolate_(v8::Isolate::GetCurrent()), |
| 564 is_deleted_(false), | 563 is_deleted_(false), |
| 565 last_input_number_(0), | 564 last_input_number_(0), |
| 566 is_tracking_latency_(false), | 565 is_tracking_latency_(false), |
| 567 view_change_weak_ptr_factory_(this), | 566 view_change_weak_ptr_factory_(this), |
| 568 weak_factory_(this) { | 567 weak_factory_(this) { |
| 569 pp_instance_ = HostGlobals::Get()->AddInstance(this); | 568 pp_instance_ = HostGlobals::Get()->AddInstance(this); |
| 570 | 569 |
| 571 memset(¤t_print_settings_, 0, sizeof(current_print_settings_)); | 570 memset(¤t_print_settings_, 0, sizeof(current_print_settings_)); |
| 572 module_->InstanceCreated(this); | 571 module_->InstanceCreated(this); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 613 resource_creation_ = host_impl->CreateInProcessResourceCreationAPI(this); | 612 resource_creation_ = host_impl->CreateInProcessResourceCreationAPI(this); |
| 614 | 613 |
| 615 if (GetContentClient()->renderer() && // NULL in unit tests. | 614 if (GetContentClient()->renderer() && // NULL in unit tests. |
| 616 GetContentClient()->renderer()->IsExternalPepperPlugin(module->name())) | 615 GetContentClient()->renderer()->IsExternalPepperPlugin(module->name())) |
| 617 external_document_load_ = true; | 616 external_document_load_ = true; |
| 618 } | 617 } |
| 619 | 618 |
| 620 PepperPluginInstanceImpl::~PepperPluginInstanceImpl() { | 619 PepperPluginInstanceImpl::~PepperPluginInstanceImpl() { |
| 621 DCHECK(!fullscreen_container_); | 620 DCHECK(!fullscreen_container_); |
| 622 | 621 |
| 623 // Free all the plugin objects. This will automatically clear the back- | 622 // Notify all the plugin objects of deletion. This will prevent WebKit from |
| 624 // pointer from the NPObject so WebKit can't call into the plugin any more. | 623 // calling into the plugin any more. |
| 625 // | |
| 626 // Swap out the set so we can delete from it (the objects will try to | |
| 627 // unregister themselves inside the delete call). | |
| 628 PluginObjectSet plugin_object_copy; | 624 PluginObjectSet plugin_object_copy; |
| 629 live_plugin_objects_.swap(plugin_object_copy); | 625 live_plugin_objects_.swap(plugin_object_copy); |
| 630 for (PluginObjectSet::iterator i = plugin_object_copy.begin(); | 626 for (PluginObjectSet::iterator i = plugin_object_copy.begin(); |
| 631 i != plugin_object_copy.end(); | 627 i != plugin_object_copy.end(); |
| 632 ++i) | 628 ++i) { |
| 633 delete *i; | 629 (*i)->InstanceDeleted(); |
| 630 } |
| 634 | 631 |
| 635 if (TrackedCallback::IsPending(lock_mouse_callback_)) | 632 if (TrackedCallback::IsPending(lock_mouse_callback_)) |
| 636 lock_mouse_callback_->Abort(); | 633 lock_mouse_callback_->Abort(); |
| 637 | 634 |
| 638 if (!instance_deleted_callback_.is_null()) | 635 if (!instance_deleted_callback_.is_null()) |
| 639 instance_deleted_callback_.Run(); | 636 instance_deleted_callback_.Run(); |
| 640 | 637 |
| 641 if (!module_->IsProxied() && render_frame_) { | 638 if (!module_->IsProxied() && render_frame_) { |
| 642 PepperBrowserConnection* browser_connection = | 639 PepperBrowserConnection* browser_connection = |
| 643 PepperBrowserConnection::Get(render_frame_); | 640 PepperBrowserConnection::Get(render_frame_); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 654 // want to look up in the global map to get info off of our object. | 651 // want to look up in the global map to get info off of our object. |
| 655 HostGlobals::Get()->InstanceDeleted(pp_instance_); | 652 HostGlobals::Get()->InstanceDeleted(pp_instance_); |
| 656 } | 653 } |
| 657 | 654 |
| 658 // NOTE: Any of these methods that calls into the plugin needs to take into | 655 // NOTE: Any of these methods that calls into the plugin needs to take into |
| 659 // account that the plugin may use Var to remove the <embed> from the DOM, which | 656 // account that the plugin may use Var to remove the <embed> from the DOM, which |
| 660 // will make the PepperWebPluginImpl drop its reference, usually the last one. | 657 // will make the PepperWebPluginImpl drop its reference, usually the last one. |
| 661 // If a method needs to access a member of the instance after the call has | 658 // If a method needs to access a member of the instance after the call has |
| 662 // returned, then it needs to keep its own reference on the stack. | 659 // returned, then it needs to keep its own reference on the stack. |
| 663 | 660 |
| 661 v8::Local<v8::Object> PepperPluginInstanceImpl::GetMessageChannelObject() { |
| 662 return v8::Local<v8::Object>::New(isolate_, message_channel_); |
| 663 } |
| 664 |
| 665 MessageChannel* PepperPluginInstanceImpl::GetMessageChannel() { |
| 666 MessageChannel* message_channel; |
| 667 v8::HandleScope scope(isolate_); |
| 668 if (gin::ConvertFromV8(isolate_, GetMessageChannelObject(), &message_channel)) |
| 669 return message_channel; |
| 670 return NULL; |
| 671 } |
| 672 |
| 664 v8::Local<v8::Context> PepperPluginInstanceImpl::GetContext() { | 673 v8::Local<v8::Context> PepperPluginInstanceImpl::GetContext() { |
| 665 if (!container_) | 674 if (!container_) |
| 666 return v8::Handle<v8::Context>(); | 675 return v8::Handle<v8::Context>(); |
| 667 WebLocalFrame* frame = container_->element().document().frame(); | 676 WebLocalFrame* frame = container_->element().document().frame(); |
| 668 if (!frame) | 677 if (!frame) |
| 669 return v8::Handle<v8::Context>(); | 678 return v8::Handle<v8::Context>(); |
| 670 | 679 |
| 671 v8::Local<v8::Context> context = frame->mainWorldScriptContext(); | 680 v8::Local<v8::Context> context = frame->mainWorldScriptContext(); |
| 672 DCHECK(context->GetIsolate() == isolate_); | 681 DCHECK(context->GetIsolate() == isolate_); |
| 673 return context; | 682 return context; |
| 674 } | 683 } |
| 675 | 684 |
| 676 void PepperPluginInstanceImpl::Delete() { | 685 void PepperPluginInstanceImpl::Delete() { |
| 677 is_deleted_ = true; | 686 is_deleted_ = true; |
| 678 | 687 |
| 679 if (render_frame_ && | 688 if (render_frame_ && |
| 680 render_frame_->render_view()->plugin_find_handler() == this) { | 689 render_frame_->render_view()->plugin_find_handler() == this) { |
| 681 render_frame_->render_view()->set_plugin_find_handler(NULL); | 690 render_frame_->render_view()->set_plugin_find_handler(NULL); |
| 682 } | 691 } |
| 683 | 692 |
| 684 // Keep a reference on the stack. See NOTE above. | 693 // Keep a reference on the stack. See NOTE above. |
| 685 scoped_refptr<PepperPluginInstanceImpl> ref(this); | 694 scoped_refptr<PepperPluginInstanceImpl> ref(this); |
| 686 // Force the MessageChannel to release its "passthrough object" which should | 695 // Force the MessageChannel to release its "passthrough object" which should |
| 687 // release our last reference to the "InstanceObject" and will probably | 696 // release our last reference to the "InstanceObject" and will probably |
| 688 // destroy it. We want to do this prior to calling DidDestroy in case the | 697 // destroy it. We want to do this prior to calling DidDestroy in case the |
| 689 // destructor of the instance object tries to use the instance. | 698 // destructor of the instance object tries to use the instance. |
| 690 message_channel_->SetPassthroughObject(NULL); | 699 GetMessageChannel()->SetPassthroughObject(v8::Handle<v8::Object>()); |
| 691 // If this is a NaCl plugin instance, shut down the NaCl plugin by calling | 700 // If this is a NaCl plugin instance, shut down the NaCl plugin by calling |
| 692 // its DidDestroy. Don't call DidDestroy on the untrusted plugin instance, | 701 // its DidDestroy. Don't call DidDestroy on the untrusted plugin instance, |
| 693 // since there is little that it can do at this point. | 702 // since there is little that it can do at this point. |
| 694 if (original_instance_interface_) | 703 if (original_instance_interface_) |
| 695 original_instance_interface_->DidDestroy(pp_instance()); | 704 original_instance_interface_->DidDestroy(pp_instance()); |
| 696 else | 705 else |
| 697 instance_interface_->DidDestroy(pp_instance()); | 706 instance_interface_->DidDestroy(pp_instance()); |
| 698 // Ensure we don't attempt to call functions on the destroyed instance. | 707 // Ensure we don't attempt to call functions on the destroyed instance. |
| 699 original_instance_interface_.reset(); | 708 original_instance_interface_.reset(); |
| 700 instance_interface_.reset(); | 709 instance_interface_.reset(); |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 842 "Flash.UsesGPU", is_xp * 4 + needs_gpu * 2 + prefs.is_webgl_supported, 8); | 851 "Flash.UsesGPU", is_xp * 4 + needs_gpu * 2 + prefs.is_webgl_supported, 8); |
| 843 #endif | 852 #endif |
| 844 } | 853 } |
| 845 | 854 |
| 846 bool PepperPluginInstanceImpl::Initialize( | 855 bool PepperPluginInstanceImpl::Initialize( |
| 847 const std::vector<std::string>& arg_names, | 856 const std::vector<std::string>& arg_names, |
| 848 const std::vector<std::string>& arg_values, | 857 const std::vector<std::string>& arg_values, |
| 849 bool full_frame) { | 858 bool full_frame) { |
| 850 if (!render_frame_) | 859 if (!render_frame_) |
| 851 return false; | 860 return false; |
| 852 message_channel_.reset(new MessageChannel(this)); | 861 MessageChannel::Create(this, &message_channel_); |
| 853 | 862 |
| 854 full_frame_ = full_frame; | 863 full_frame_ = full_frame; |
| 855 | 864 |
| 856 UpdateTouchEventRequest(); | 865 UpdateTouchEventRequest(); |
| 857 container_->setWantsWheelEvents(IsAcceptingWheelEvents()); | 866 container_->setWantsWheelEvents(IsAcceptingWheelEvents()); |
| 858 | 867 |
| 859 SetGPUHistogram(ppapi::Preferences(PpapiPreferencesBuilder::Build( | 868 SetGPUHistogram(ppapi::Preferences(PpapiPreferencesBuilder::Build( |
| 860 render_frame_->render_view()->webkit_preferences())), | 869 render_frame_->render_view()->webkit_preferences())), |
| 861 arg_names, | 870 arg_names, |
| 862 arg_values); | 871 arg_values); |
| 863 | 872 |
| 864 argn_ = arg_names; | 873 argn_ = arg_names; |
| 865 argv_ = arg_values; | 874 argv_ = arg_values; |
| 866 scoped_ptr<const char * []> argn_array(StringVectorToArgArray(argn_)); | 875 scoped_ptr<const char * []> argn_array(StringVectorToArgArray(argn_)); |
| 867 scoped_ptr<const char * []> argv_array(StringVectorToArgArray(argv_)); | 876 scoped_ptr<const char * []> argv_array(StringVectorToArgArray(argv_)); |
| 868 bool success = PP_ToBool(instance_interface_->DidCreate( | 877 bool success = PP_ToBool(instance_interface_->DidCreate( |
| 869 pp_instance(), argn_.size(), argn_array.get(), argv_array.get())); | 878 pp_instance(), argn_.size(), argn_array.get(), argv_array.get())); |
| 870 // If this is a plugin that hosts external plugins, we should delay messages | 879 // If this is a plugin that hosts external plugins, we should delay messages |
| 871 // so that the child plugin that's created later will receive all the | 880 // so that the child plugin that's created later will receive all the |
| 872 // messages. (E.g., NaCl trusted plugin starting a child NaCl app.) | 881 // messages. (E.g., NaCl trusted plugin starting a child NaCl app.) |
| 873 // | 882 // |
| 874 // A host for external plugins will call ResetAsProxied later, at which point | 883 // A host for external plugins will call ResetAsProxied later, at which point |
| 875 // we can Start() the message_channel_. | 884 // we can Start() the message_channel_. |
| 876 if (success && (!module_->renderer_ppapi_host()->IsExternalPluginHost())) | 885 if (success && (!module_->renderer_ppapi_host()->IsExternalPluginHost())) |
| 877 message_channel_->Start(); | 886 GetMessageChannel()->Start(); |
| 878 return success; | 887 return success; |
| 879 } | 888 } |
| 880 | 889 |
| 881 bool PepperPluginInstanceImpl::HandleDocumentLoad( | 890 bool PepperPluginInstanceImpl::HandleDocumentLoad( |
| 882 const blink::WebURLResponse& response) { | 891 const blink::WebURLResponse& response) { |
| 883 DCHECK(!document_loader_); | 892 DCHECK(!document_loader_); |
| 884 if (external_document_load_) { | 893 if (external_document_load_) { |
| 885 // The external proxy isn't available, so save the response and record | 894 // The external proxy isn't available, so save the response and record |
| 886 // document load notifications for later replay. | 895 // document load notifications for later replay. |
| 887 external_document_response_ = response; | 896 external_document_response_ = response; |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1211 ppapi::proxy::SerializedVarSendInputShmem(dispatcher, message.get(), | 1220 ppapi::proxy::SerializedVarSendInputShmem(dispatcher, message.get(), |
| 1212 pp_instance()), | 1221 pp_instance()), |
| 1213 &msg_reply, | 1222 &msg_reply, |
| 1214 &was_handled)); | 1223 &was_handled)); |
| 1215 *result = ScopedPPVar(ScopedPPVar::PassRef(), msg_reply.Return(dispatcher)); | 1224 *result = ScopedPPVar(ScopedPPVar::PassRef(), msg_reply.Return(dispatcher)); |
| 1216 TRACE_EVENT0("ppapi", | 1225 TRACE_EVENT0("ppapi", |
| 1217 "PepperPluginInstanceImpl::HandleBlockingMessage return."); | 1226 "PepperPluginInstanceImpl::HandleBlockingMessage return."); |
| 1218 return was_handled; | 1227 return was_handled; |
| 1219 } | 1228 } |
| 1220 | 1229 |
| 1221 PP_Var PepperPluginInstanceImpl::GetInstanceObject() { | 1230 PP_Var PepperPluginInstanceImpl::GetInstanceObject(v8::Isolate* isolate) { |
| 1222 // Keep a reference on the stack. See NOTE above. | 1231 // Keep a reference on the stack. See NOTE above. |
| 1223 scoped_refptr<PepperPluginInstanceImpl> ref(this); | 1232 scoped_refptr<PepperPluginInstanceImpl> ref(this); |
| 1224 | 1233 |
| 1234 DCHECK(isolate == isolate_); |
| 1235 |
| 1225 // If the plugin supports the private instance interface, try to retrieve its | 1236 // If the plugin supports the private instance interface, try to retrieve its |
| 1226 // instance object. | 1237 // instance object. |
| 1227 if (LoadPrivateInterface()) | 1238 if (LoadPrivateInterface()) |
| 1228 return plugin_private_interface_->GetInstanceObject(pp_instance()); | 1239 return plugin_private_interface_->GetInstanceObject(pp_instance()); |
| 1229 return PP_MakeUndefined(); | 1240 return PP_MakeUndefined(); |
| 1230 } | 1241 } |
| 1231 | 1242 |
| 1232 void PepperPluginInstanceImpl::ViewChanged( | 1243 void PepperPluginInstanceImpl::ViewChanged( |
| 1233 const gfx::Rect& position, | 1244 const gfx::Rect& position, |
| 1234 const gfx::Rect& clip, | 1245 const gfx::Rect& clip, |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1350 void PepperPluginInstanceImpl::SetLinkUnderCursor(const std::string& url) { | 1361 void PepperPluginInstanceImpl::SetLinkUnderCursor(const std::string& url) { |
| 1351 link_under_cursor_ = base::UTF8ToUTF16(url); | 1362 link_under_cursor_ = base::UTF8ToUTF16(url); |
| 1352 } | 1363 } |
| 1353 | 1364 |
| 1354 void PepperPluginInstanceImpl::SetTextInputType(ui::TextInputType type) { | 1365 void PepperPluginInstanceImpl::SetTextInputType(ui::TextInputType type) { |
| 1355 text_input_type_ = type; | 1366 text_input_type_ = type; |
| 1356 render_frame_->PepperTextInputTypeChanged(this); | 1367 render_frame_->PepperTextInputTypeChanged(this); |
| 1357 } | 1368 } |
| 1358 | 1369 |
| 1359 void PepperPluginInstanceImpl::PostMessageToJavaScript(PP_Var message) { | 1370 void PepperPluginInstanceImpl::PostMessageToJavaScript(PP_Var message) { |
| 1360 message_channel_->PostMessageToJavaScript(message); | 1371 GetMessageChannel()->PostMessageToJavaScript(message); |
| 1361 } | 1372 } |
| 1362 | 1373 |
| 1363 int32_t PepperPluginInstanceImpl::RegisterMessageHandler( | 1374 int32_t PepperPluginInstanceImpl::RegisterMessageHandler( |
| 1364 PP_Instance instance, | 1375 PP_Instance instance, |
| 1365 void* user_data, | 1376 void* user_data, |
| 1366 const PPP_MessageHandler_0_1* handler, | 1377 const PPP_MessageHandler_0_1* handler, |
| 1367 PP_Resource message_loop) { | 1378 PP_Resource message_loop) { |
| 1368 // Not supported in-process. | 1379 // Not supported in-process. |
| 1369 NOTIMPLEMENTED(); | 1380 NOTIMPLEMENTED(); |
| 1370 return PP_ERROR_FAILED; | 1381 return PP_ERROR_FAILED; |
| (...skipping 980 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2351 | 2362 |
| 2352 const ViewData* PepperPluginInstanceImpl::GetViewData(PP_Instance instance) { | 2363 const ViewData* PepperPluginInstanceImpl::GetViewData(PP_Instance instance) { |
| 2353 return &view_data_; | 2364 return &view_data_; |
| 2354 } | 2365 } |
| 2355 | 2366 |
| 2356 PP_Bool PepperPluginInstanceImpl::FlashIsFullscreen(PP_Instance instance) { | 2367 PP_Bool PepperPluginInstanceImpl::FlashIsFullscreen(PP_Instance instance) { |
| 2357 return PP_FromBool(flash_fullscreen_); | 2368 return PP_FromBool(flash_fullscreen_); |
| 2358 } | 2369 } |
| 2359 | 2370 |
| 2360 PP_Var PepperPluginInstanceImpl::GetWindowObject(PP_Instance instance) { | 2371 PP_Var PepperPluginInstanceImpl::GetWindowObject(PP_Instance instance) { |
| 2361 if (!container_) | 2372 ScopedPPVar script(ScopedPPVar::PassRef(), |
| 2362 return PP_MakeUndefined(); | 2373 StringVar::StringToPPVar("window")); |
| 2363 | 2374 return ExecuteScript(pp_instance(), script.get(), NULL); |
| 2364 WebLocalFrame* frame = container_->element().document().frame(); | |
| 2365 if (!frame) | |
| 2366 return PP_MakeUndefined(); | |
| 2367 | |
| 2368 return NPObjectToPPVar(this, frame->windowObject()); | |
| 2369 } | 2375 } |
| 2370 | 2376 |
| 2371 PP_Var PepperPluginInstanceImpl::GetOwnerElementObject(PP_Instance instance) { | 2377 PP_Var PepperPluginInstanceImpl::GetOwnerElementObject(PP_Instance instance) { |
| 2372 if (!container_) | 2378 if (!container_) |
| 2373 return PP_MakeUndefined(); | 2379 return PP_MakeUndefined(); |
| 2374 return NPObjectToPPVar(this, container_->scriptableObjectForElement()); | 2380 PepperTryCatchVar try_catch(this, true, NULL); |
| 2381 ScopedPPVar result = try_catch.FromV8(container_->v8ObjectForElement()); |
| 2382 DCHECK(!try_catch.HasException()); |
| 2383 return result.Release(); |
| 2375 } | 2384 } |
| 2376 | 2385 |
| 2377 PP_Var PepperPluginInstanceImpl::ExecuteScript(PP_Instance instance, | 2386 PP_Var PepperPluginInstanceImpl::ExecuteScript(PP_Instance instance, |
| 2378 PP_Var script, | 2387 PP_Var script_var, |
| 2379 PP_Var* exception) { | 2388 PP_Var* exception) { |
| 2389 if (!container_) |
| 2390 return PP_MakeUndefined(); |
| 2391 |
| 2380 // Executing the script may remove the plugin from the DOM, so we need to keep | 2392 // Executing the script may remove the plugin from the DOM, so we need to keep |
| 2381 // a reference to ourselves so that we can still process the result after the | 2393 // a reference to ourselves so that we can still process the result after the |
| 2382 // WebBindings::evaluate() below. | 2394 // WebBindings::evaluate() below. |
| 2383 scoped_refptr<PepperPluginInstanceImpl> ref(this); | 2395 scoped_refptr<PepperPluginInstanceImpl> ref(this); |
| 2384 TryCatch try_catch(exception); | 2396 PepperTryCatchVar try_catch(this, true, exception); |
| 2385 if (try_catch.has_exception()) | 2397 WebLocalFrame* frame = container_->element().document().frame(); |
| 2398 if (!frame) { |
| 2399 try_catch.SetException("No frame to execute script in."); |
| 2386 return PP_MakeUndefined(); | 2400 return PP_MakeUndefined(); |
| 2401 } |
| 2387 | 2402 |
| 2388 // Convert the script into an inconvenient NPString object. | 2403 StringVar* script_string_var = StringVar::FromPPVar(script_var); |
| 2389 StringVar* script_string = StringVar::FromPPVar(script); | 2404 if (!script_string_var) { |
| 2390 if (!script_string) { | |
| 2391 try_catch.SetException("Script param to ExecuteScript must be a string."); | 2405 try_catch.SetException("Script param to ExecuteScript must be a string."); |
| 2392 return PP_MakeUndefined(); | 2406 return PP_MakeUndefined(); |
| 2393 } | 2407 } |
| 2394 NPString np_script; | |
| 2395 np_script.UTF8Characters = script_string->value().c_str(); | |
| 2396 np_script.UTF8Length = script_string->value().length(); | |
| 2397 | 2408 |
| 2398 // Get the current frame to pass to the evaluate function. | 2409 std::string script_string = script_string_var->value(); |
| 2399 WebLocalFrame* frame = NULL; | 2410 blink::WebScriptSource script( |
| 2400 if (container_) | 2411 blink::WebString::fromUTF8(script_string.c_str())); |
| 2401 frame = container_->element().document().frame(); | 2412 v8::Handle<v8::Value> result; |
| 2402 if (!frame || !frame->windowObject()) { | 2413 if (IsProcessingUserGesture()) { |
| 2403 try_catch.SetException("No context in which to execute script."); | 2414 blink::WebScopedUserGesture user_gesture(CurrentUserGestureToken()); |
| 2404 return PP_MakeUndefined(); | 2415 result = frame->executeScriptAndReturnValue(script); |
| 2416 } else { |
| 2417 result = frame->executeScriptAndReturnValue(script); |
| 2405 } | 2418 } |
| 2406 | 2419 |
| 2407 NPVariant result; | 2420 ScopedPPVar var_result = try_catch.FromV8(result); |
| 2408 bool ok = false; | 2421 if (try_catch.HasException()) |
| 2409 if (IsProcessingUserGesture()) { | |
| 2410 blink::WebScopedUserGesture user_gesture(CurrentUserGestureToken()); | |
| 2411 ok = | |
| 2412 WebBindings::evaluate(NULL, frame->windowObject(), &np_script, &result); | |
| 2413 } else { | |
| 2414 ok = | |
| 2415 WebBindings::evaluate(NULL, frame->windowObject(), &np_script, &result); | |
| 2416 } | |
| 2417 if (!ok) { | |
| 2418 // TryCatch doesn't catch the exceptions properly. Since this is only for | |
| 2419 // a trusted API, just set to a general exception message. | |
| 2420 try_catch.SetException("Exception caught"); | |
| 2421 WebBindings::releaseVariantValue(&result); | |
| 2422 return PP_MakeUndefined(); | 2422 return PP_MakeUndefined(); |
| 2423 } | |
| 2424 | 2423 |
| 2425 PP_Var ret = NPVariantToPPVar(this, &result); | 2424 return var_result.Release(); |
| 2426 WebBindings::releaseVariantValue(&result); | |
| 2427 return ret; | |
| 2428 } | 2425 } |
| 2429 | 2426 |
| 2430 uint32_t PepperPluginInstanceImpl::GetAudioHardwareOutputSampleRate( | 2427 uint32_t PepperPluginInstanceImpl::GetAudioHardwareOutputSampleRate( |
| 2431 PP_Instance instance) { | 2428 PP_Instance instance) { |
| 2432 RenderThreadImpl* thread = RenderThreadImpl::current(); | 2429 RenderThreadImpl* thread = RenderThreadImpl::current(); |
| 2433 return thread->GetAudioHardwareConfig()->GetOutputSampleRate(); | 2430 return thread->GetAudioHardwareConfig()->GetOutputSampleRate(); |
| 2434 } | 2431 } |
| 2435 | 2432 |
| 2436 uint32_t PepperPluginInstanceImpl::GetAudioHardwareOutputBufferSize( | 2433 uint32_t PepperPluginInstanceImpl::GetAudioHardwareOutputBufferSize( |
| 2437 PP_Instance instance) { | 2434 PP_Instance instance) { |
| (...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2946 plugin_selection_interface_ = NULL; | 2943 plugin_selection_interface_ = NULL; |
| 2947 plugin_textinput_interface_ = NULL; | 2944 plugin_textinput_interface_ = NULL; |
| 2948 plugin_zoom_interface_ = NULL; | 2945 plugin_zoom_interface_ = NULL; |
| 2949 | 2946 |
| 2950 // Re-send the DidCreate event via the proxy. | 2947 // Re-send the DidCreate event via the proxy. |
| 2951 scoped_ptr<const char * []> argn_array(StringVectorToArgArray(argn_)); | 2948 scoped_ptr<const char * []> argn_array(StringVectorToArgArray(argn_)); |
| 2952 scoped_ptr<const char * []> argv_array(StringVectorToArgArray(argv_)); | 2949 scoped_ptr<const char * []> argv_array(StringVectorToArgArray(argv_)); |
| 2953 if (!instance_interface_->DidCreate( | 2950 if (!instance_interface_->DidCreate( |
| 2954 pp_instance(), argn_.size(), argn_array.get(), argv_array.get())) | 2951 pp_instance(), argn_.size(), argn_array.get(), argv_array.get())) |
| 2955 return PP_EXTERNAL_PLUGIN_ERROR_INSTANCE; | 2952 return PP_EXTERNAL_PLUGIN_ERROR_INSTANCE; |
| 2956 message_channel_->Start(); | 2953 GetMessageChannel()->Start(); |
| 2957 | 2954 |
| 2958 // Clear sent_initial_did_change_view_ and cancel any pending DidChangeView | 2955 // Clear sent_initial_did_change_view_ and cancel any pending DidChangeView |
| 2959 // event. This way, SendDidChangeView will send the "current" view | 2956 // event. This way, SendDidChangeView will send the "current" view |
| 2960 // immediately (before other events like HandleDocumentLoad). | 2957 // immediately (before other events like HandleDocumentLoad). |
| 2961 sent_initial_did_change_view_ = false; | 2958 sent_initial_did_change_view_ = false; |
| 2962 view_change_weak_ptr_factory_.InvalidateWeakPtrs(); | 2959 view_change_weak_ptr_factory_.InvalidateWeakPtrs(); |
| 2963 SendDidChangeView(); | 2960 SendDidChangeView(); |
| 2964 | 2961 |
| 2965 DCHECK(external_document_load_); | 2962 DCHECK(external_document_load_); |
| 2966 external_document_load_ = false; | 2963 external_document_load_ = false; |
| 2967 if (!external_document_response_.isNull()) { | 2964 if (!external_document_response_.isNull()) { |
| 2968 document_loader_ = NULL; | 2965 document_loader_ = NULL; |
| 2969 // Pass the response to the new proxy. | 2966 // Pass the response to the new proxy. |
| 2970 HandleDocumentLoad(external_document_response_); | 2967 HandleDocumentLoad(external_document_response_); |
| 2971 external_document_response_ = blink::WebURLResponse(); | 2968 external_document_response_ = blink::WebURLResponse(); |
| 2972 // Replay any document load events we've received to the real loader. | 2969 // Replay any document load events we've received to the real loader. |
| 2973 external_document_loader_->ReplayReceivedData(document_loader_); | 2970 external_document_loader_->ReplayReceivedData(document_loader_); |
| 2974 external_document_loader_.reset(NULL); | 2971 external_document_loader_.reset(NULL); |
| 2975 } | 2972 } |
| 2976 | 2973 |
| 2977 return PP_EXTERNAL_PLUGIN_OK; | 2974 return PP_EXTERNAL_PLUGIN_OK; |
| 2978 } | 2975 } |
| 2979 | 2976 |
| 2980 bool PepperPluginInstanceImpl::IsValidInstanceOf(PluginModule* module) { | 2977 bool PepperPluginInstanceImpl::IsValidInstanceOf(PluginModule* module) { |
| 2981 DCHECK(module); | 2978 DCHECK(module); |
| 2982 return module == module_.get() || module == original_module_.get(); | 2979 return module == module_.get() || module == original_module_.get(); |
| 2983 } | 2980 } |
| 2984 | 2981 |
| 2985 NPP PepperPluginInstanceImpl::instanceNPP() { return npp_.get(); } | |
| 2986 | |
| 2987 PepperPluginInstance* PepperPluginInstance::Get(PP_Instance instance_id) { | 2982 PepperPluginInstance* PepperPluginInstance::Get(PP_Instance instance_id) { |
| 2988 return HostGlobals::Get()->GetInstance(instance_id); | 2983 return HostGlobals::Get()->GetInstance(instance_id); |
| 2989 } | 2984 } |
| 2990 | 2985 |
| 2991 RenderView* PepperPluginInstanceImpl::GetRenderView() { | 2986 RenderView* PepperPluginInstanceImpl::GetRenderView() { |
| 2992 return render_frame_ ? render_frame_->render_view() : NULL; | 2987 return render_frame_ ? render_frame_->render_view() : NULL; |
| 2993 } | 2988 } |
| 2994 | 2989 |
| 2995 blink::WebPluginContainer* PepperPluginInstanceImpl::GetContainer() { | 2990 blink::WebPluginContainer* PepperPluginInstanceImpl::GetContainer() { |
| 2996 return container_; | 2991 return container_; |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3183 int PepperPluginInstanceImpl::MakePendingFileRefRendererHost( | 3178 int PepperPluginInstanceImpl::MakePendingFileRefRendererHost( |
| 3184 const base::FilePath& path) { | 3179 const base::FilePath& path) { |
| 3185 RendererPpapiHostImpl* host_impl = module_->renderer_ppapi_host(); | 3180 RendererPpapiHostImpl* host_impl = module_->renderer_ppapi_host(); |
| 3186 PepperFileRefRendererHost* file_ref_host( | 3181 PepperFileRefRendererHost* file_ref_host( |
| 3187 new PepperFileRefRendererHost(host_impl, pp_instance(), 0, path)); | 3182 new PepperFileRefRendererHost(host_impl, pp_instance(), 0, path)); |
| 3188 return host_impl->GetPpapiHost()->AddPendingResourceHost( | 3183 return host_impl->GetPpapiHost()->AddPendingResourceHost( |
| 3189 scoped_ptr<ppapi::host::ResourceHost>(file_ref_host)); | 3184 scoped_ptr<ppapi::host::ResourceHost>(file_ref_host)); |
| 3190 } | 3185 } |
| 3191 | 3186 |
| 3192 void PepperPluginInstanceImpl::SetEmbedProperty(PP_Var key, PP_Var value) { | 3187 void PepperPluginInstanceImpl::SetEmbedProperty(PP_Var key, PP_Var value) { |
| 3193 message_channel_->SetReadOnlyProperty(key, value); | 3188 GetMessageChannel()->SetReadOnlyProperty(key, value); |
| 3194 } | 3189 } |
| 3195 | 3190 |
| 3196 bool PepperPluginInstanceImpl::CanAccessMainFrame() const { | 3191 bool PepperPluginInstanceImpl::CanAccessMainFrame() const { |
| 3197 if (!container_) | 3192 if (!container_) |
| 3198 return false; | 3193 return false; |
| 3199 blink::WebDocument containing_document = container_->element().document(); | 3194 blink::WebDocument containing_document = container_->element().document(); |
| 3200 | 3195 |
| 3201 if (!containing_document.frame() || !containing_document.frame()->view() || | 3196 if (!containing_document.frame() || !containing_document.frame()->view() || |
| 3202 !containing_document.frame()->view()->mainFrame()) { | 3197 !containing_document.frame()->view()->mainFrame()) { |
| 3203 return false; | 3198 return false; |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3320 // Running out-of-process. Initiate an IPC call to notify the plugin | 3315 // Running out-of-process. Initiate an IPC call to notify the plugin |
| 3321 // process. | 3316 // process. |
| 3322 ppapi::proxy::HostDispatcher* dispatcher = | 3317 ppapi::proxy::HostDispatcher* dispatcher = |
| 3323 ppapi::proxy::HostDispatcher::GetForInstance(pp_instance()); | 3318 ppapi::proxy::HostDispatcher::GetForInstance(pp_instance()); |
| 3324 dispatcher->Send(new PpapiMsg_PPPInstance_HandleDocumentLoad( | 3319 dispatcher->Send(new PpapiMsg_PPPInstance_HandleDocumentLoad( |
| 3325 ppapi::API_ID_PPP_INSTANCE, pp_instance(), pending_host_id, data)); | 3320 ppapi::API_ID_PPP_INSTANCE, pp_instance(), pending_host_id, data)); |
| 3326 } | 3321 } |
| 3327 } | 3322 } |
| 3328 | 3323 |
| 3329 } // namespace content | 3324 } // namespace content |
| OLD | NEW |