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 15 matching lines...) Expand all Loading... |
26 #include "content/public/common/page_zoom.h" | 26 #include "content/public/common/page_zoom.h" |
27 #include "content/public/renderer/content_renderer_client.h" | 27 #include "content/public/renderer/content_renderer_client.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" | 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" | 36 #include "content/renderer/pepper/pepper_browser_connection.h" |
38 #include "content/renderer/pepper/pepper_compositor_host.h" | 37 #include "content/renderer/pepper/pepper_compositor_host.h" |
39 #include "content/renderer/pepper/pepper_file_ref_renderer_host.h" | 38 #include "content/renderer/pepper/pepper_file_ref_renderer_host.h" |
40 #include "content/renderer/pepper/pepper_graphics_2d_host.h" | 39 #include "content/renderer/pepper/pepper_graphics_2d_host.h" |
41 #include "content/renderer/pepper/pepper_in_process_router.h" | 40 #include "content/renderer/pepper/pepper_in_process_router.h" |
| 41 #include "content/renderer/pepper/pepper_try_catch.h" |
42 #include "content/renderer/pepper/pepper_url_loader_host.h" | 42 #include "content/renderer/pepper/pepper_url_loader_host.h" |
43 #include "content/renderer/pepper/plugin_module.h" | 43 #include "content/renderer/pepper/plugin_module.h" |
44 #include "content/renderer/pepper/plugin_object.h" | 44 #include "content/renderer/pepper/plugin_object.h" |
45 #include "content/renderer/pepper/ppapi_preferences_builder.h" | 45 #include "content/renderer/pepper/ppapi_preferences_builder.h" |
46 #include "content/renderer/pepper/ppb_buffer_impl.h" | 46 #include "content/renderer/pepper/ppb_buffer_impl.h" |
47 #include "content/renderer/pepper/ppb_graphics_3d_impl.h" | 47 #include "content/renderer/pepper/ppb_graphics_3d_impl.h" |
48 #include "content/renderer/pepper/ppb_image_data_impl.h" | 48 #include "content/renderer/pepper/ppb_image_data_impl.h" |
49 #include "content/renderer/pepper/renderer_ppapi_host_impl.h" | 49 #include "content/renderer/pepper/renderer_ppapi_host_impl.h" |
50 #include "content/renderer/pepper/url_request_info_util.h" | 50 #include "content/renderer/pepper/url_request_info_util.h" |
51 #include "content/renderer/pepper/url_response_info_util.h" | 51 #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" | 108 #include "third_party/WebKit/public/web/WebCompositionUnderline.h" |
109 #include "third_party/WebKit/public/web/WebDataSource.h" | 109 #include "third_party/WebKit/public/web/WebDataSource.h" |
110 #include "third_party/WebKit/public/web/WebDocument.h" | 110 #include "third_party/WebKit/public/web/WebDocument.h" |
111 #include "third_party/WebKit/public/web/WebElement.h" | 111 #include "third_party/WebKit/public/web/WebElement.h" |
112 #include "third_party/WebKit/public/web/WebInputEvent.h" | 112 #include "third_party/WebKit/public/web/WebInputEvent.h" |
113 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 113 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
114 #include "third_party/WebKit/public/web/WebPluginContainer.h" | 114 #include "third_party/WebKit/public/web/WebPluginContainer.h" |
115 #include "third_party/WebKit/public/web/WebPrintParams.h" | 115 #include "third_party/WebKit/public/web/WebPrintParams.h" |
116 #include "third_party/WebKit/public/web/WebPrintScalingOption.h" | 116 #include "third_party/WebKit/public/web/WebPrintScalingOption.h" |
117 #include "third_party/WebKit/public/web/WebScopedUserGesture.h" | 117 #include "third_party/WebKit/public/web/WebScopedUserGesture.h" |
| 118 #include "third_party/WebKit/public/web/WebScriptSource.h" |
118 #include "third_party/WebKit/public/web/WebSecurityOrigin.h" | 119 #include "third_party/WebKit/public/web/WebSecurityOrigin.h" |
119 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h" | 120 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h" |
120 #include "third_party/WebKit/public/web/WebView.h" | 121 #include "third_party/WebKit/public/web/WebView.h" |
121 #include "third_party/khronos/GLES2/gl2.h" | 122 #include "third_party/khronos/GLES2/gl2.h" |
122 #include "third_party/skia/include/core/SkCanvas.h" | 123 #include "third_party/skia/include/core/SkCanvas.h" |
123 #include "third_party/skia/include/core/SkRect.h" | 124 #include "third_party/skia/include/core/SkRect.h" |
124 #include "ui/gfx/image/image_skia.h" | 125 #include "ui/gfx/image/image_skia.h" |
125 #include "ui/gfx/image/image_skia_rep.h" | 126 #include "ui/gfx/image/image_skia_rep.h" |
126 #include "ui/gfx/range/range.h" | 127 #include "ui/gfx/range/range.h" |
127 #include "ui/gfx/rect_conversions.h" | 128 #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), | 553 filtered_input_event_mask_(0), |
553 text_input_type_(kPluginDefaultTextInputType), | 554 text_input_type_(kPluginDefaultTextInputType), |
554 text_input_caret_(0, 0, 0, 0), | 555 text_input_caret_(0, 0, 0, 0), |
555 text_input_caret_bounds_(0, 0, 0, 0), | 556 text_input_caret_bounds_(0, 0, 0, 0), |
556 text_input_caret_set_(false), | 557 text_input_caret_set_(false), |
557 selection_caret_(0), | 558 selection_caret_(0), |
558 selection_anchor_(0), | 559 selection_anchor_(0), |
559 pending_user_gesture_(0.0), | 560 pending_user_gesture_(0.0), |
560 document_loader_(NULL), | 561 document_loader_(NULL), |
561 external_document_load_(false), | 562 external_document_load_(false), |
562 npp_(new NPP_t), | |
563 isolate_(v8::Isolate::GetCurrent()), | 563 isolate_(v8::Isolate::GetCurrent()), |
564 is_deleted_(false), | 564 is_deleted_(false), |
565 last_input_number_(0), | 565 last_input_number_(0), |
566 is_tracking_latency_(false), | 566 is_tracking_latency_(false), |
567 view_change_weak_ptr_factory_(this), | 567 view_change_weak_ptr_factory_(this), |
568 weak_factory_(this) { | 568 weak_factory_(this) { |
569 pp_instance_ = HostGlobals::Get()->AddInstance(this); | 569 pp_instance_ = HostGlobals::Get()->AddInstance(this); |
570 | 570 |
571 memset(¤t_print_settings_, 0, sizeof(current_print_settings_)); | 571 memset(¤t_print_settings_, 0, sizeof(current_print_settings_)); |
572 module_->InstanceCreated(this); | 572 module_->InstanceCreated(this); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
613 resource_creation_ = host_impl->CreateInProcessResourceCreationAPI(this); | 613 resource_creation_ = host_impl->CreateInProcessResourceCreationAPI(this); |
614 | 614 |
615 if (GetContentClient()->renderer() && // NULL in unit tests. | 615 if (GetContentClient()->renderer() && // NULL in unit tests. |
616 GetContentClient()->renderer()->IsExternalPepperPlugin(module->name())) | 616 GetContentClient()->renderer()->IsExternalPepperPlugin(module->name())) |
617 external_document_load_ = true; | 617 external_document_load_ = true; |
618 } | 618 } |
619 | 619 |
620 PepperPluginInstanceImpl::~PepperPluginInstanceImpl() { | 620 PepperPluginInstanceImpl::~PepperPluginInstanceImpl() { |
621 DCHECK(!fullscreen_container_); | 621 DCHECK(!fullscreen_container_); |
622 | 622 |
623 // Free all the plugin objects. This will automatically clear the back- | 623 // Notify all the plugin objects of deletion. This will prevent blink from |
624 // pointer from the NPObject so WebKit can't call into the plugin any more. | 624 // calling into the plugin any more. |
625 // | 625 // |
626 // Swap out the set so we can delete from it (the objects will try to | 626 // Swap out the set so we can delete from it (the objects will try to |
627 // unregister themselves inside the delete call). | 627 // unregister themselves inside the delete call). |
628 PluginObjectSet plugin_object_copy; | 628 PluginObjectSet plugin_object_copy; |
629 live_plugin_objects_.swap(plugin_object_copy); | 629 live_plugin_objects_.swap(plugin_object_copy); |
630 for (PluginObjectSet::iterator i = plugin_object_copy.begin(); | 630 for (PluginObjectSet::iterator i = plugin_object_copy.begin(); |
631 i != plugin_object_copy.end(); | 631 i != plugin_object_copy.end(); |
632 ++i) | 632 ++i) { |
633 delete *i; | 633 (*i)->InstanceDeleted(); |
| 634 } |
| 635 |
| 636 if (message_channel_) { |
| 637 message_channel_->InstanceDeleted(); |
| 638 message_channel_object_.Reset(); |
| 639 message_channel_ = NULL; |
| 640 } |
634 | 641 |
635 if (TrackedCallback::IsPending(lock_mouse_callback_)) | 642 if (TrackedCallback::IsPending(lock_mouse_callback_)) |
636 lock_mouse_callback_->Abort(); | 643 lock_mouse_callback_->Abort(); |
637 | 644 |
638 if (!instance_deleted_callback_.is_null()) | 645 if (!instance_deleted_callback_.is_null()) |
639 instance_deleted_callback_.Run(); | 646 instance_deleted_callback_.Run(); |
640 | 647 |
641 if (!module_->IsProxied() && render_frame_) { | 648 if (!module_->IsProxied() && render_frame_) { |
642 PepperBrowserConnection* browser_connection = | 649 PepperBrowserConnection* browser_connection = |
643 PepperBrowserConnection::Get(render_frame_); | 650 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. | 661 // want to look up in the global map to get info off of our object. |
655 HostGlobals::Get()->InstanceDeleted(pp_instance_); | 662 HostGlobals::Get()->InstanceDeleted(pp_instance_); |
656 } | 663 } |
657 | 664 |
658 // NOTE: Any of these methods that calls into the plugin needs to take into | 665 // 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 | 666 // 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. | 667 // 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 | 668 // 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. | 669 // returned, then it needs to keep its own reference on the stack. |
663 | 670 |
| 671 v8::Local<v8::Object> PepperPluginInstanceImpl::GetMessageChannelObject() { |
| 672 return v8::Local<v8::Object>::New(isolate_, message_channel_object_); |
| 673 } |
| 674 |
664 v8::Local<v8::Context> PepperPluginInstanceImpl::GetContext() { | 675 v8::Local<v8::Context> PepperPluginInstanceImpl::GetContext() { |
665 if (!container_) | 676 if (!container_) |
666 return v8::Handle<v8::Context>(); | 677 return v8::Handle<v8::Context>(); |
667 WebLocalFrame* frame = container_->element().document().frame(); | 678 WebLocalFrame* frame = container_->element().document().frame(); |
668 if (!frame) | 679 if (!frame) |
669 return v8::Handle<v8::Context>(); | 680 return v8::Handle<v8::Context>(); |
670 | 681 |
671 v8::Local<v8::Context> context = frame->mainWorldScriptContext(); | 682 v8::Local<v8::Context> context = frame->mainWorldScriptContext(); |
672 DCHECK(context->GetIsolate() == isolate_); | 683 DCHECK(context->GetIsolate() == isolate_); |
673 return context; | 684 return context; |
674 } | 685 } |
675 | 686 |
676 void PepperPluginInstanceImpl::Delete() { | 687 void PepperPluginInstanceImpl::Delete() { |
677 is_deleted_ = true; | 688 is_deleted_ = true; |
678 | 689 |
679 if (render_frame_ && | 690 if (render_frame_ && |
680 render_frame_->render_view()->plugin_find_handler() == this) { | 691 render_frame_->render_view()->plugin_find_handler() == this) { |
681 render_frame_->render_view()->set_plugin_find_handler(NULL); | 692 render_frame_->render_view()->set_plugin_find_handler(NULL); |
682 } | 693 } |
683 | 694 |
684 // Keep a reference on the stack. See NOTE above. | 695 // Keep a reference on the stack. See NOTE above. |
685 scoped_refptr<PepperPluginInstanceImpl> ref(this); | 696 scoped_refptr<PepperPluginInstanceImpl> ref(this); |
686 // Force the MessageChannel to release its "passthrough object" which should | 697 // Force the MessageChannel to release its "passthrough object" which should |
687 // release our last reference to the "InstanceObject" and will probably | 698 // 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 | 699 // 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. | 700 // destructor of the instance object tries to use the instance. |
690 message_channel_->SetPassthroughObject(NULL); | 701 message_channel_->SetPassthroughObject(v8::Handle<v8::Object>()); |
691 // If this is a NaCl plugin instance, shut down the NaCl plugin by calling | 702 // 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, | 703 // its DidDestroy. Don't call DidDestroy on the untrusted plugin instance, |
693 // since there is little that it can do at this point. | 704 // since there is little that it can do at this point. |
694 if (original_instance_interface_) | 705 if (original_instance_interface_) |
695 original_instance_interface_->DidDestroy(pp_instance()); | 706 original_instance_interface_->DidDestroy(pp_instance()); |
696 else | 707 else |
697 instance_interface_->DidDestroy(pp_instance()); | 708 instance_interface_->DidDestroy(pp_instance()); |
698 // Ensure we don't attempt to call functions on the destroyed instance. | 709 // Ensure we don't attempt to call functions on the destroyed instance. |
699 original_instance_interface_.reset(); | 710 original_instance_interface_.reset(); |
700 instance_interface_.reset(); | 711 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); | 853 "Flash.UsesGPU", is_xp * 4 + needs_gpu * 2 + prefs.is_webgl_supported, 8); |
843 #endif | 854 #endif |
844 } | 855 } |
845 | 856 |
846 bool PepperPluginInstanceImpl::Initialize( | 857 bool PepperPluginInstanceImpl::Initialize( |
847 const std::vector<std::string>& arg_names, | 858 const std::vector<std::string>& arg_names, |
848 const std::vector<std::string>& arg_values, | 859 const std::vector<std::string>& arg_values, |
849 bool full_frame) { | 860 bool full_frame) { |
850 if (!render_frame_) | 861 if (!render_frame_) |
851 return false; | 862 return false; |
852 message_channel_.reset(new MessageChannel(this)); | 863 message_channel_ = MessageChannel::Create(this, &message_channel_object_); |
853 | 864 |
854 full_frame_ = full_frame; | 865 full_frame_ = full_frame; |
855 | 866 |
856 UpdateTouchEventRequest(); | 867 UpdateTouchEventRequest(); |
857 container_->setWantsWheelEvents(IsAcceptingWheelEvents()); | 868 container_->setWantsWheelEvents(IsAcceptingWheelEvents()); |
858 | 869 |
859 SetGPUHistogram(ppapi::Preferences(PpapiPreferencesBuilder::Build( | 870 SetGPUHistogram(ppapi::Preferences(PpapiPreferencesBuilder::Build( |
860 render_frame_->render_view()->webkit_preferences())), | 871 render_frame_->render_view()->webkit_preferences())), |
861 arg_names, | 872 arg_names, |
862 arg_values); | 873 arg_values); |
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1211 ppapi::proxy::SerializedVarSendInputShmem(dispatcher, message.get(), | 1222 ppapi::proxy::SerializedVarSendInputShmem(dispatcher, message.get(), |
1212 pp_instance()), | 1223 pp_instance()), |
1213 &msg_reply, | 1224 &msg_reply, |
1214 &was_handled)); | 1225 &was_handled)); |
1215 *result = ScopedPPVar(ScopedPPVar::PassRef(), msg_reply.Return(dispatcher)); | 1226 *result = ScopedPPVar(ScopedPPVar::PassRef(), msg_reply.Return(dispatcher)); |
1216 TRACE_EVENT0("ppapi", | 1227 TRACE_EVENT0("ppapi", |
1217 "PepperPluginInstanceImpl::HandleBlockingMessage return."); | 1228 "PepperPluginInstanceImpl::HandleBlockingMessage return."); |
1218 return was_handled; | 1229 return was_handled; |
1219 } | 1230 } |
1220 | 1231 |
1221 PP_Var PepperPluginInstanceImpl::GetInstanceObject() { | 1232 PP_Var PepperPluginInstanceImpl::GetInstanceObject(v8::Isolate* isolate) { |
1222 // Keep a reference on the stack. See NOTE above. | 1233 // Keep a reference on the stack. See NOTE above. |
1223 scoped_refptr<PepperPluginInstanceImpl> ref(this); | 1234 scoped_refptr<PepperPluginInstanceImpl> ref(this); |
1224 | 1235 |
| 1236 DCHECK_EQ(isolate, isolate_); |
| 1237 |
1225 // If the plugin supports the private instance interface, try to retrieve its | 1238 // If the plugin supports the private instance interface, try to retrieve its |
1226 // instance object. | 1239 // instance object. |
1227 if (LoadPrivateInterface()) | 1240 if (LoadPrivateInterface()) |
1228 return plugin_private_interface_->GetInstanceObject(pp_instance()); | 1241 return plugin_private_interface_->GetInstanceObject(pp_instance()); |
1229 return PP_MakeUndefined(); | 1242 return PP_MakeUndefined(); |
1230 } | 1243 } |
1231 | 1244 |
1232 void PepperPluginInstanceImpl::ViewChanged( | 1245 void PepperPluginInstanceImpl::ViewChanged( |
1233 const gfx::Rect& position, | 1246 const gfx::Rect& position, |
1234 const gfx::Rect& clip, | 1247 const gfx::Rect& clip, |
(...skipping 1118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2353 } | 2366 } |
2354 | 2367 |
2355 PP_Bool PepperPluginInstanceImpl::FlashIsFullscreen(PP_Instance instance) { | 2368 PP_Bool PepperPluginInstanceImpl::FlashIsFullscreen(PP_Instance instance) { |
2356 return PP_FromBool(flash_fullscreen_); | 2369 return PP_FromBool(flash_fullscreen_); |
2357 } | 2370 } |
2358 | 2371 |
2359 PP_Var PepperPluginInstanceImpl::GetWindowObject(PP_Instance instance) { | 2372 PP_Var PepperPluginInstanceImpl::GetWindowObject(PP_Instance instance) { |
2360 if (!container_) | 2373 if (!container_) |
2361 return PP_MakeUndefined(); | 2374 return PP_MakeUndefined(); |
2362 | 2375 |
| 2376 PepperTryCatchVar try_catch(this, NULL); |
2363 WebLocalFrame* frame = container_->element().document().frame(); | 2377 WebLocalFrame* frame = container_->element().document().frame(); |
2364 if (!frame) | 2378 if (!frame) { |
| 2379 try_catch.SetException("No frame exists for window object."); |
2365 return PP_MakeUndefined(); | 2380 return PP_MakeUndefined(); |
| 2381 } |
2366 | 2382 |
2367 return NPObjectToPPVar(this, frame->windowObject()); | 2383 ScopedPPVar result = |
| 2384 try_catch.FromV8(frame->mainWorldScriptContext()->Global()); |
| 2385 DCHECK(!try_catch.HasException()); |
| 2386 return result.Release(); |
2368 } | 2387 } |
2369 | 2388 |
2370 PP_Var PepperPluginInstanceImpl::GetOwnerElementObject(PP_Instance instance) { | 2389 PP_Var PepperPluginInstanceImpl::GetOwnerElementObject(PP_Instance instance) { |
2371 if (!container_) | 2390 if (!container_) |
2372 return PP_MakeUndefined(); | 2391 return PP_MakeUndefined(); |
2373 return NPObjectToPPVar(this, container_->scriptableObjectForElement()); | 2392 PepperTryCatchVar try_catch(this, NULL); |
| 2393 ScopedPPVar result = try_catch.FromV8(container_->v8ObjectForElement()); |
| 2394 DCHECK(!try_catch.HasException()); |
| 2395 return result.Release(); |
2374 } | 2396 } |
2375 | 2397 |
2376 PP_Var PepperPluginInstanceImpl::ExecuteScript(PP_Instance instance, | 2398 PP_Var PepperPluginInstanceImpl::ExecuteScript(PP_Instance instance, |
2377 PP_Var script, | 2399 PP_Var script_var, |
2378 PP_Var* exception) { | 2400 PP_Var* exception) { |
| 2401 if (!container_) |
| 2402 return PP_MakeUndefined(); |
| 2403 |
2379 // Executing the script may remove the plugin from the DOM, so we need to keep | 2404 // Executing the script may remove the plugin from the DOM, so we need to keep |
2380 // a reference to ourselves so that we can still process the result after the | 2405 // a reference to ourselves so that we can still process the result after the |
2381 // WebBindings::evaluate() below. | 2406 // WebBindings::evaluate() below. |
2382 scoped_refptr<PepperPluginInstanceImpl> ref(this); | 2407 scoped_refptr<PepperPluginInstanceImpl> ref(this); |
2383 TryCatch try_catch(exception); | 2408 PepperTryCatchVar try_catch(this, exception); |
2384 if (try_catch.has_exception()) | 2409 WebLocalFrame* frame = container_->element().document().frame(); |
| 2410 if (!frame) { |
| 2411 try_catch.SetException("No frame to execute script in."); |
2385 return PP_MakeUndefined(); | 2412 return PP_MakeUndefined(); |
| 2413 } |
2386 | 2414 |
2387 // Convert the script into an inconvenient NPString object. | 2415 StringVar* script_string_var = StringVar::FromPPVar(script_var); |
2388 StringVar* script_string = StringVar::FromPPVar(script); | 2416 if (!script_string_var) { |
2389 if (!script_string) { | |
2390 try_catch.SetException("Script param to ExecuteScript must be a string."); | 2417 try_catch.SetException("Script param to ExecuteScript must be a string."); |
2391 return PP_MakeUndefined(); | 2418 return PP_MakeUndefined(); |
2392 } | 2419 } |
2393 NPString np_script; | |
2394 np_script.UTF8Characters = script_string->value().c_str(); | |
2395 np_script.UTF8Length = script_string->value().length(); | |
2396 | 2420 |
2397 // Get the current frame to pass to the evaluate function. | 2421 std::string script_string = script_string_var->value(); |
2398 WebLocalFrame* frame = NULL; | 2422 blink::WebScriptSource script( |
2399 if (container_) | 2423 blink::WebString::fromUTF8(script_string.c_str())); |
2400 frame = container_->element().document().frame(); | 2424 v8::Handle<v8::Value> result; |
2401 if (!frame || !frame->windowObject()) { | 2425 if (IsProcessingUserGesture()) { |
2402 try_catch.SetException("No context in which to execute script."); | 2426 blink::WebScopedUserGesture user_gesture(CurrentUserGestureToken()); |
2403 return PP_MakeUndefined(); | 2427 result = frame->executeScriptAndReturnValue(script); |
| 2428 } else { |
| 2429 result = frame->executeScriptAndReturnValue(script); |
2404 } | 2430 } |
2405 | 2431 |
2406 NPVariant result; | 2432 ScopedPPVar var_result = try_catch.FromV8(result); |
2407 bool ok = false; | 2433 if (try_catch.HasException()) |
2408 if (IsProcessingUserGesture()) { | |
2409 blink::WebScopedUserGesture user_gesture(CurrentUserGestureToken()); | |
2410 ok = | |
2411 WebBindings::evaluate(NULL, frame->windowObject(), &np_script, &result); | |
2412 } else { | |
2413 ok = | |
2414 WebBindings::evaluate(NULL, frame->windowObject(), &np_script, &result); | |
2415 } | |
2416 if (!ok) { | |
2417 // TryCatch doesn't catch the exceptions properly. Since this is only for | |
2418 // a trusted API, just set to a general exception message. | |
2419 try_catch.SetException("Exception caught"); | |
2420 WebBindings::releaseVariantValue(&result); | |
2421 return PP_MakeUndefined(); | 2434 return PP_MakeUndefined(); |
2422 } | |
2423 | 2435 |
2424 PP_Var ret = NPVariantToPPVar(this, &result); | 2436 return var_result.Release(); |
2425 WebBindings::releaseVariantValue(&result); | |
2426 return ret; | |
2427 } | 2437 } |
2428 | 2438 |
2429 uint32_t PepperPluginInstanceImpl::GetAudioHardwareOutputSampleRate( | 2439 uint32_t PepperPluginInstanceImpl::GetAudioHardwareOutputSampleRate( |
2430 PP_Instance instance) { | 2440 PP_Instance instance) { |
2431 RenderThreadImpl* thread = RenderThreadImpl::current(); | 2441 RenderThreadImpl* thread = RenderThreadImpl::current(); |
2432 return thread->GetAudioHardwareConfig()->GetOutputSampleRate(); | 2442 return thread->GetAudioHardwareConfig()->GetOutputSampleRate(); |
2433 } | 2443 } |
2434 | 2444 |
2435 uint32_t PepperPluginInstanceImpl::GetAudioHardwareOutputBufferSize( | 2445 uint32_t PepperPluginInstanceImpl::GetAudioHardwareOutputBufferSize( |
2436 PP_Instance instance) { | 2446 PP_Instance instance) { |
(...skipping 537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2974 } | 2984 } |
2975 | 2985 |
2976 return PP_EXTERNAL_PLUGIN_OK; | 2986 return PP_EXTERNAL_PLUGIN_OK; |
2977 } | 2987 } |
2978 | 2988 |
2979 bool PepperPluginInstanceImpl::IsValidInstanceOf(PluginModule* module) { | 2989 bool PepperPluginInstanceImpl::IsValidInstanceOf(PluginModule* module) { |
2980 DCHECK(module); | 2990 DCHECK(module); |
2981 return module == module_.get() || module == original_module_.get(); | 2991 return module == module_.get() || module == original_module_.get(); |
2982 } | 2992 } |
2983 | 2993 |
2984 NPP PepperPluginInstanceImpl::instanceNPP() { return npp_.get(); } | |
2985 | |
2986 PepperPluginInstance* PepperPluginInstance::Get(PP_Instance instance_id) { | 2994 PepperPluginInstance* PepperPluginInstance::Get(PP_Instance instance_id) { |
2987 return HostGlobals::Get()->GetInstance(instance_id); | 2995 return HostGlobals::Get()->GetInstance(instance_id); |
2988 } | 2996 } |
2989 | 2997 |
2990 RenderView* PepperPluginInstanceImpl::GetRenderView() { | 2998 RenderView* PepperPluginInstanceImpl::GetRenderView() { |
2991 return render_frame_ ? render_frame_->render_view() : NULL; | 2999 return render_frame_ ? render_frame_->render_view() : NULL; |
2992 } | 3000 } |
2993 | 3001 |
2994 blink::WebPluginContainer* PepperPluginInstanceImpl::GetContainer() { | 3002 blink::WebPluginContainer* PepperPluginInstanceImpl::GetContainer() { |
2995 return container_; | 3003 return container_; |
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3319 // Running out-of-process. Initiate an IPC call to notify the plugin | 3327 // Running out-of-process. Initiate an IPC call to notify the plugin |
3320 // process. | 3328 // process. |
3321 ppapi::proxy::HostDispatcher* dispatcher = | 3329 ppapi::proxy::HostDispatcher* dispatcher = |
3322 ppapi::proxy::HostDispatcher::GetForInstance(pp_instance()); | 3330 ppapi::proxy::HostDispatcher::GetForInstance(pp_instance()); |
3323 dispatcher->Send(new PpapiMsg_PPPInstance_HandleDocumentLoad( | 3331 dispatcher->Send(new PpapiMsg_PPPInstance_HandleDocumentLoad( |
3324 ppapi::API_ID_PPP_INSTANCE, pp_instance(), pending_host_id, data)); | 3332 ppapi::API_ID_PPP_INSTANCE, pp_instance(), pending_host_id, data)); |
3325 } | 3333 } |
3326 } | 3334 } |
3327 | 3335 |
3328 } // namespace content | 3336 } // namespace content |
OLD | NEW |