| 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 <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bit_cast.h" | 10 #include "base/bit_cast.h" |
| (...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 296 return false; | 296 return false; |
| 297 | 297 |
| 298 WebElement plugin_element = instance->container()->element(); | 298 WebElement plugin_element = instance->container()->element(); |
| 299 *security_origin = plugin_element.document().getSecurityOrigin(); | 299 *security_origin = plugin_element.document().getSecurityOrigin(); |
| 300 return true; | 300 return true; |
| 301 } | 301 } |
| 302 | 302 |
| 303 // Convert the given vector to an array of C-strings. The strings in the | 303 // Convert the given vector to an array of C-strings. The strings in the |
| 304 // returned vector are only guaranteed valid so long as the vector of strings | 304 // returned vector are only guaranteed valid so long as the vector of strings |
| 305 // is not modified. | 305 // is not modified. |
| 306 scoped_ptr<const char* []> StringVectorToArgArray( | 306 std::unique_ptr<const char* []> StringVectorToArgArray( |
| 307 const std::vector<std::string>& vector) { | 307 const std::vector<std::string>& vector) { |
| 308 scoped_ptr<const char * []> array(new const char* [vector.size()]); | 308 std::unique_ptr<const char* []> array(new const char*[vector.size()]); |
| 309 for (size_t i = 0; i < vector.size(); ++i) | 309 for (size_t i = 0; i < vector.size(); ++i) |
| 310 array[i] = vector[i].c_str(); | 310 array[i] = vector[i].c_str(); |
| 311 return array; | 311 return array; |
| 312 } | 312 } |
| 313 | 313 |
| 314 // Returns true if this is a "system reserved" key which should not be sent to | 314 // Returns true if this is a "system reserved" key which should not be sent to |
| 315 // a plugin. Some poorly behaving plugins (like Flash) incorrectly report that | 315 // a plugin. Some poorly behaving plugins (like Flash) incorrectly report that |
| 316 // they handle all keys sent to them. This can prevent keystrokes from working | 316 // they handle all keys sent to them. This can prevent keystrokes from working |
| 317 // for things like screen brightness and volume control. | 317 // for things like screen brightness and volume control. |
| 318 bool IsReservedSystemInputEvent(const blink::WebInputEvent& event) { | 318 bool IsReservedSystemInputEvent(const blink::WebInputEvent& event) { |
| (...skipping 495 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 814 | 814 |
| 815 if (render_frame_) | 815 if (render_frame_) |
| 816 render_frame_->PluginCrashed(module_->path(), module_->GetPeerProcessId()); | 816 render_frame_->PluginCrashed(module_->path(), module_->GetPeerProcessId()); |
| 817 UnSetAndDeleteLockTargetAdapter(); | 817 UnSetAndDeleteLockTargetAdapter(); |
| 818 } | 818 } |
| 819 | 819 |
| 820 bool PepperPluginInstanceImpl::Initialize( | 820 bool PepperPluginInstanceImpl::Initialize( |
| 821 const std::vector<std::string>& arg_names, | 821 const std::vector<std::string>& arg_names, |
| 822 const std::vector<std::string>& arg_values, | 822 const std::vector<std::string>& arg_values, |
| 823 bool full_frame, | 823 bool full_frame, |
| 824 scoped_ptr<PluginInstanceThrottlerImpl> throttler) { | 824 std::unique_ptr<PluginInstanceThrottlerImpl> throttler) { |
| 825 DCHECK(!throttler_); | 825 DCHECK(!throttler_); |
| 826 | 826 |
| 827 if (!render_frame_) | 827 if (!render_frame_) |
| 828 return false; | 828 return false; |
| 829 | 829 |
| 830 if (throttler) { | 830 if (throttler) { |
| 831 throttler_ = std::move(throttler); | 831 throttler_ = std::move(throttler); |
| 832 throttler_->AddObserver(this); | 832 throttler_->AddObserver(this); |
| 833 } | 833 } |
| 834 | 834 |
| 835 message_channel_ = MessageChannel::Create(this, &message_channel_object_); | 835 message_channel_ = MessageChannel::Create(this, &message_channel_object_); |
| 836 | 836 |
| 837 full_frame_ = full_frame; | 837 full_frame_ = full_frame; |
| 838 | 838 |
| 839 UpdateTouchEventRequest(); | 839 UpdateTouchEventRequest(); |
| 840 container_->setWantsWheelEvents(IsAcceptingWheelEvents()); | 840 container_->setWantsWheelEvents(IsAcceptingWheelEvents()); |
| 841 | 841 |
| 842 SetGPUHistogram(ppapi::Preferences(PpapiPreferencesBuilder::Build( | 842 SetGPUHistogram(ppapi::Preferences(PpapiPreferencesBuilder::Build( |
| 843 render_frame_->render_view()->webkit_preferences())), | 843 render_frame_->render_view()->webkit_preferences())), |
| 844 arg_names, | 844 arg_names, |
| 845 arg_values); | 845 arg_values); |
| 846 | 846 |
| 847 argn_ = arg_names; | 847 argn_ = arg_names; |
| 848 argv_ = arg_values; | 848 argv_ = arg_values; |
| 849 scoped_ptr<const char * []> argn_array(StringVectorToArgArray(argn_)); | 849 std::unique_ptr<const char* []> argn_array(StringVectorToArgArray(argn_)); |
| 850 scoped_ptr<const char * []> argv_array(StringVectorToArgArray(argv_)); | 850 std::unique_ptr<const char* []> argv_array(StringVectorToArgArray(argv_)); |
| 851 auto weak_this = weak_factory_.GetWeakPtr(); | 851 auto weak_this = weak_factory_.GetWeakPtr(); |
| 852 bool success = PP_ToBool(instance_interface_->DidCreate( | 852 bool success = PP_ToBool(instance_interface_->DidCreate( |
| 853 pp_instance(), argn_.size(), argn_array.get(), argv_array.get())); | 853 pp_instance(), argn_.size(), argn_array.get(), argv_array.get())); |
| 854 if (!weak_this) { | 854 if (!weak_this) { |
| 855 // The plugin may do synchronous scripting during "DidCreate", so |this| | 855 // The plugin may do synchronous scripting during "DidCreate", so |this| |
| 856 // may be deleted. In that case, return failure and don't touch any | 856 // may be deleted. In that case, return failure and don't touch any |
| 857 // member variables. | 857 // member variables. |
| 858 return false; | 858 return false; |
| 859 } | 859 } |
| 860 // If this is a plugin that hosts external plugins, we should delay messages | 860 // If this is a plugin that hosts external plugins, we should delay messages |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 901 // TODO(teravest): Remove set_document_loader() from instance and clean up | 901 // TODO(teravest): Remove set_document_loader() from instance and clean up |
| 902 // this relationship. | 902 // this relationship. |
| 903 set_document_loader(loader_host); | 903 set_document_loader(loader_host); |
| 904 loader_host->didReceiveResponse(NULL, response); | 904 loader_host->didReceiveResponse(NULL, response); |
| 905 | 905 |
| 906 // This host will be pending until the resource object attaches to it. | 906 // This host will be pending until the resource object attaches to it. |
| 907 // | 907 // |
| 908 // PpapiHost now owns the pointer to loader_host, so we don't have to worry | 908 // PpapiHost now owns the pointer to loader_host, so we don't have to worry |
| 909 // about managing it. | 909 // about managing it. |
| 910 int pending_host_id = host_impl->GetPpapiHost()->AddPendingResourceHost( | 910 int pending_host_id = host_impl->GetPpapiHost()->AddPendingResourceHost( |
| 911 scoped_ptr<ppapi::host::ResourceHost>(loader_host)); | 911 std::unique_ptr<ppapi::host::ResourceHost>(loader_host)); |
| 912 DCHECK(pending_host_id); | 912 DCHECK(pending_host_id); |
| 913 | 913 |
| 914 DataFromWebURLResponse( | 914 DataFromWebURLResponse( |
| 915 host_impl, | 915 host_impl, |
| 916 pp_instance(), | 916 pp_instance(), |
| 917 response, | 917 response, |
| 918 base::Bind(&PepperPluginInstanceImpl::DidDataFromWebURLResponse, | 918 base::Bind(&PepperPluginInstanceImpl::DidDataFromWebURLResponse, |
| 919 weak_factory_.GetWeakPtr(), | 919 weak_factory_.GetWeakPtr(), |
| 920 response, | 920 response, |
| 921 pending_host_id)); | 921 pending_host_id)); |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1130 bool rv = false; | 1130 bool rv = false; |
| 1131 if (LoadInputEventInterface()) { | 1131 if (LoadInputEventInterface()) { |
| 1132 PP_InputEvent_Class event_class = ClassifyInputEvent(event.type); | 1132 PP_InputEvent_Class event_class = ClassifyInputEvent(event.type); |
| 1133 if (!event_class) | 1133 if (!event_class) |
| 1134 return false; | 1134 return false; |
| 1135 | 1135 |
| 1136 if ((filtered_input_event_mask_ & event_class) || | 1136 if ((filtered_input_event_mask_ & event_class) || |
| 1137 (input_event_mask_ & event_class)) { | 1137 (input_event_mask_ & event_class)) { |
| 1138 // Actually send the event. | 1138 // Actually send the event. |
| 1139 std::vector<ppapi::InputEventData> events; | 1139 std::vector<ppapi::InputEventData> events; |
| 1140 scoped_ptr<const WebInputEvent> event_in_dip( | 1140 std::unique_ptr<const WebInputEvent> event_in_dip( |
| 1141 ui::ScaleWebInputEvent(event, viewport_to_dip_scale_)); | 1141 ui::ScaleWebInputEvent(event, viewport_to_dip_scale_)); |
| 1142 if (event_in_dip) | 1142 if (event_in_dip) |
| 1143 CreateInputEventData(*event_in_dip.get(), &events); | 1143 CreateInputEventData(*event_in_dip.get(), &events); |
| 1144 else | 1144 else |
| 1145 CreateInputEventData(event, &events); | 1145 CreateInputEventData(event, &events); |
| 1146 | 1146 |
| 1147 // Allow the user gesture to be pending after the plugin handles the | 1147 // Allow the user gesture to be pending after the plugin handles the |
| 1148 // event. This allows out-of-process plugins to respond to the user | 1148 // event. This allows out-of-process plugins to respond to the user |
| 1149 // gesture after processing has finished here. | 1149 // gesture after processing has finished here. |
| 1150 if (WebUserGestureIndicator::isProcessingUserGesture()) { | 1150 if (WebUserGestureIndicator::isProcessingUserGesture()) { |
| (...skipping 916 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2067 } | 2067 } |
| 2068 } | 2068 } |
| 2069 | 2069 |
| 2070 layer_bound_to_fullscreen_ = !!fullscreen_container_; | 2070 layer_bound_to_fullscreen_ = !!fullscreen_container_; |
| 2071 layer_is_hardware_ = want_3d_layer; | 2071 layer_is_hardware_ = want_3d_layer; |
| 2072 UpdateLayerTransform(); | 2072 UpdateLayerTransform(); |
| 2073 } | 2073 } |
| 2074 | 2074 |
| 2075 bool PepperPluginInstanceImpl::PrepareTextureMailbox( | 2075 bool PepperPluginInstanceImpl::PrepareTextureMailbox( |
| 2076 cc::TextureMailbox* mailbox, | 2076 cc::TextureMailbox* mailbox, |
| 2077 scoped_ptr<cc::SingleReleaseCallback>* release_callback, | 2077 std::unique_ptr<cc::SingleReleaseCallback>* release_callback, |
| 2078 bool use_shared_memory) { | 2078 bool use_shared_memory) { |
| 2079 if (!bound_graphics_2d_platform_) | 2079 if (!bound_graphics_2d_platform_) |
| 2080 return false; | 2080 return false; |
| 2081 return bound_graphics_2d_platform_->PrepareTextureMailbox(mailbox, | 2081 return bound_graphics_2d_platform_->PrepareTextureMailbox(mailbox, |
| 2082 release_callback); | 2082 release_callback); |
| 2083 } | 2083 } |
| 2084 | 2084 |
| 2085 void PepperPluginInstanceImpl::OnDestruct() { render_frame_ = NULL; } | 2085 void PepperPluginInstanceImpl::OnDestruct() { render_frame_ = NULL; } |
| 2086 | 2086 |
| 2087 void PepperPluginInstanceImpl::OnThrottleStateChange() { | 2087 void PepperPluginInstanceImpl::OnThrottleStateChange() { |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2144 WebView* web_view = container()->element().document().frame()->view(); | 2144 WebView* web_view = container()->element().document().frame()->view(); |
| 2145 if (!web_view) { | 2145 if (!web_view) { |
| 2146 NOTREACHED(); | 2146 NOTREACHED(); |
| 2147 return; | 2147 return; |
| 2148 } | 2148 } |
| 2149 | 2149 |
| 2150 bool handled = SimulateIMEEvent(input_event); | 2150 bool handled = SimulateIMEEvent(input_event); |
| 2151 if (handled) | 2151 if (handled) |
| 2152 return; | 2152 return; |
| 2153 | 2153 |
| 2154 std::vector<scoped_ptr<WebInputEvent>> events = CreateSimulatedWebInputEvents( | 2154 std::vector<std::unique_ptr<WebInputEvent>> events = |
| 2155 input_event, view_data_.rect.point.x + view_data_.rect.size.width / 2, | 2155 CreateSimulatedWebInputEvents( |
| 2156 view_data_.rect.point.y + view_data_.rect.size.height / 2); | 2156 input_event, view_data_.rect.point.x + view_data_.rect.size.width / 2, |
| 2157 for (std::vector<scoped_ptr<WebInputEvent>>::iterator it = events.begin(); | 2157 view_data_.rect.point.y + view_data_.rect.size.height / 2); |
| 2158 for (std::vector<std::unique_ptr<WebInputEvent>>::iterator it = |
| 2159 events.begin(); |
| 2158 it != events.end(); ++it) { | 2160 it != events.end(); ++it) { |
| 2159 web_view->handleInputEvent(*it->get()); | 2161 web_view->handleInputEvent(*it->get()); |
| 2160 } | 2162 } |
| 2161 } | 2163 } |
| 2162 | 2164 |
| 2163 bool PepperPluginInstanceImpl::SimulateIMEEvent( | 2165 bool PepperPluginInstanceImpl::SimulateIMEEvent( |
| 2164 const InputEventData& input_event) { | 2166 const InputEventData& input_event) { |
| 2165 switch (input_event.event_type) { | 2167 switch (input_event.event_type) { |
| 2166 case PP_INPUTEVENT_TYPE_IME_COMPOSITION_START: | 2168 case PP_INPUTEVENT_TYPE_IME_COMPOSITION_START: |
| 2167 case PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE: | 2169 case PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE: |
| (...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2697 EnterResourceNoLock<PPB_ImageData_API> enter(image, true); | 2699 EnterResourceNoLock<PPB_ImageData_API> enter(image, true); |
| 2698 if (enter.failed()) | 2700 if (enter.failed()) |
| 2699 return PP_FALSE; | 2701 return PP_FALSE; |
| 2700 PPB_ImageData_Impl* image_data = | 2702 PPB_ImageData_Impl* image_data = |
| 2701 static_cast<PPB_ImageData_Impl*>(enter.object()); | 2703 static_cast<PPB_ImageData_Impl*>(enter.object()); |
| 2702 | 2704 |
| 2703 ImageDataAutoMapper auto_mapper(image_data); | 2705 ImageDataAutoMapper auto_mapper(image_data); |
| 2704 if (!auto_mapper.is_valid()) | 2706 if (!auto_mapper.is_valid()) |
| 2705 return PP_FALSE; | 2707 return PP_FALSE; |
| 2706 | 2708 |
| 2707 scoped_ptr<WebCursorInfo> custom_cursor( | 2709 std::unique_ptr<WebCursorInfo> custom_cursor( |
| 2708 new WebCursorInfo(WebCursorInfo::TypeCustom)); | 2710 new WebCursorInfo(WebCursorInfo::TypeCustom)); |
| 2709 custom_cursor->hotSpot.x = hot_spot->x; | 2711 custom_cursor->hotSpot.x = hot_spot->x; |
| 2710 custom_cursor->hotSpot.y = hot_spot->y; | 2712 custom_cursor->hotSpot.y = hot_spot->y; |
| 2711 | 2713 |
| 2712 const SkBitmap* bitmap = image_data->GetMappedBitmap(); | 2714 const SkBitmap* bitmap = image_data->GetMappedBitmap(); |
| 2713 // Make a deep copy, so that the cursor remains valid even after the original | 2715 // Make a deep copy, so that the cursor remains valid even after the original |
| 2714 // image data gets freed. | 2716 // image data gets freed. |
| 2715 if (!bitmap->copyTo(&custom_cursor->customImage.getSkBitmap())) { | 2717 if (!bitmap->copyTo(&custom_cursor->customImage.getSkBitmap())) { |
| 2716 return PP_FALSE; | 2718 return PP_FALSE; |
| 2717 } | 2719 } |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2913 plugin_find_interface_ = NULL; | 2915 plugin_find_interface_ = NULL; |
| 2914 plugin_input_event_interface_ = NULL; | 2916 plugin_input_event_interface_ = NULL; |
| 2915 checked_for_plugin_input_event_interface_ = false; | 2917 checked_for_plugin_input_event_interface_ = false; |
| 2916 plugin_mouse_lock_interface_ = NULL; | 2918 plugin_mouse_lock_interface_ = NULL; |
| 2917 plugin_pdf_interface_ = NULL; | 2919 plugin_pdf_interface_ = NULL; |
| 2918 checked_for_plugin_pdf_interface_ = false; | 2920 checked_for_plugin_pdf_interface_ = false; |
| 2919 plugin_private_interface_ = NULL; | 2921 plugin_private_interface_ = NULL; |
| 2920 plugin_textinput_interface_ = NULL; | 2922 plugin_textinput_interface_ = NULL; |
| 2921 | 2923 |
| 2922 // Re-send the DidCreate event via the proxy. | 2924 // Re-send the DidCreate event via the proxy. |
| 2923 scoped_ptr<const char * []> argn_array(StringVectorToArgArray(argn_)); | 2925 std::unique_ptr<const char* []> argn_array(StringVectorToArgArray(argn_)); |
| 2924 scoped_ptr<const char * []> argv_array(StringVectorToArgArray(argv_)); | 2926 std::unique_ptr<const char* []> argv_array(StringVectorToArgArray(argv_)); |
| 2925 if (!instance_interface_->DidCreate( | 2927 if (!instance_interface_->DidCreate( |
| 2926 pp_instance(), argn_.size(), argn_array.get(), argv_array.get())) | 2928 pp_instance(), argn_.size(), argn_array.get(), argv_array.get())) |
| 2927 return PP_EXTERNAL_PLUGIN_ERROR_INSTANCE; | 2929 return PP_EXTERNAL_PLUGIN_ERROR_INSTANCE; |
| 2928 if (message_channel_) | 2930 if (message_channel_) |
| 2929 message_channel_->Start(); | 2931 message_channel_->Start(); |
| 2930 | 2932 |
| 2931 // Clear sent_initial_did_change_view_ and cancel any pending DidChangeView | 2933 // Clear sent_initial_did_change_view_ and cancel any pending DidChangeView |
| 2932 // event. This way, SendDidChangeView will send the "current" view | 2934 // event. This way, SendDidChangeView will send the "current" view |
| 2933 // immediately (before other events like HandleDocumentLoad). | 2935 // immediately (before other events like HandleDocumentLoad). |
| 2934 sent_initial_did_change_view_ = false; | 2936 sent_initial_did_change_view_ = false; |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3153 container_->loadFrameRequest(web_request, target_str); | 3155 container_->loadFrameRequest(web_request, target_str); |
| 3154 return PP_OK; | 3156 return PP_OK; |
| 3155 } | 3157 } |
| 3156 | 3158 |
| 3157 int PepperPluginInstanceImpl::MakePendingFileRefRendererHost( | 3159 int PepperPluginInstanceImpl::MakePendingFileRefRendererHost( |
| 3158 const base::FilePath& path) { | 3160 const base::FilePath& path) { |
| 3159 RendererPpapiHostImpl* host_impl = module_->renderer_ppapi_host(); | 3161 RendererPpapiHostImpl* host_impl = module_->renderer_ppapi_host(); |
| 3160 PepperFileRefRendererHost* file_ref_host( | 3162 PepperFileRefRendererHost* file_ref_host( |
| 3161 new PepperFileRefRendererHost(host_impl, pp_instance(), 0, path)); | 3163 new PepperFileRefRendererHost(host_impl, pp_instance(), 0, path)); |
| 3162 return host_impl->GetPpapiHost()->AddPendingResourceHost( | 3164 return host_impl->GetPpapiHost()->AddPendingResourceHost( |
| 3163 scoped_ptr<ppapi::host::ResourceHost>(file_ref_host)); | 3165 std::unique_ptr<ppapi::host::ResourceHost>(file_ref_host)); |
| 3164 } | 3166 } |
| 3165 | 3167 |
| 3166 void PepperPluginInstanceImpl::SetEmbedProperty(PP_Var key, PP_Var value) { | 3168 void PepperPluginInstanceImpl::SetEmbedProperty(PP_Var key, PP_Var value) { |
| 3167 if (message_channel_) | 3169 if (message_channel_) |
| 3168 message_channel_->SetReadOnlyProperty(key, value); | 3170 message_channel_->SetReadOnlyProperty(key, value); |
| 3169 } | 3171 } |
| 3170 | 3172 |
| 3171 bool PepperPluginInstanceImpl::CanAccessMainFrame() const { | 3173 bool PepperPluginInstanceImpl::CanAccessMainFrame() const { |
| 3172 if (!container_) | 3174 if (!container_) |
| 3173 return false; | 3175 return false; |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3322 } | 3324 } |
| 3323 | 3325 |
| 3324 void PepperPluginInstanceImpl::ConvertDIPToViewport(gfx::Rect* rect) const { | 3326 void PepperPluginInstanceImpl::ConvertDIPToViewport(gfx::Rect* rect) const { |
| 3325 rect->set_x(rect->x() / viewport_to_dip_scale_); | 3327 rect->set_x(rect->x() / viewport_to_dip_scale_); |
| 3326 rect->set_y(rect->y() / viewport_to_dip_scale_); | 3328 rect->set_y(rect->y() / viewport_to_dip_scale_); |
| 3327 rect->set_width(rect->width() / viewport_to_dip_scale_); | 3329 rect->set_width(rect->width() / viewport_to_dip_scale_); |
| 3328 rect->set_height(rect->height() / viewport_to_dip_scale_); | 3330 rect->set_height(rect->height() / viewport_to_dip_scale_); |
| 3329 } | 3331 } |
| 3330 | 3332 |
| 3331 } // namespace content | 3333 } // namespace content |
| OLD | NEW |