| 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/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 // returned vector are only guaranteed valid so long as the vector of strings | 317 // returned vector are only guaranteed valid so long as the vector of strings |
| 318 // is not modified. | 318 // is not modified. |
| 319 scoped_ptr<const char*[]> StringVectorToArgArray( | 319 scoped_ptr<const char*[]> StringVectorToArgArray( |
| 320 const std::vector<std::string>& vector) { | 320 const std::vector<std::string>& vector) { |
| 321 scoped_ptr<const char*[]> array(new const char*[vector.size()]); | 321 scoped_ptr<const char*[]> array(new const char*[vector.size()]); |
| 322 for (size_t i = 0; i < vector.size(); ++i) | 322 for (size_t i = 0; i < vector.size(); ++i) |
| 323 array[i] = vector[i].c_str(); | 323 array[i] = vector[i].c_str(); |
| 324 return array.Pass(); | 324 return array.Pass(); |
| 325 } | 325 } |
| 326 | 326 |
| 327 class PluginInstanceLockTarget : public MouseLockDispatcher::LockTarget { |
| 328 public: |
| 329 PluginInstanceLockTarget(PepperPluginInstanceImpl* plugin) |
| 330 : plugin_(plugin) {} |
| 331 |
| 332 virtual void OnLockMouseACK(bool succeeded) OVERRIDE { |
| 333 plugin_->OnLockMouseACK(succeeded); |
| 334 } |
| 335 |
| 336 virtual void OnMouseLockLost() OVERRIDE { |
| 337 plugin_->OnMouseLockLost(); |
| 338 } |
| 339 |
| 340 virtual bool HandleMouseLockedInputEvent( |
| 341 const WebKit::WebMouseEvent &event) OVERRIDE { |
| 342 plugin_->HandleMouseLockedInputEvent(event); |
| 343 return true; |
| 344 } |
| 345 |
| 346 private: |
| 347 PepperPluginInstanceImpl* plugin_; |
| 348 }; |
| 349 |
| 350 |
| 327 } // namespace | 351 } // namespace |
| 328 | 352 |
| 329 // static | 353 // static |
| 330 PepperPluginInstanceImpl* PepperPluginInstanceImpl::Create( | 354 PepperPluginInstanceImpl* PepperPluginInstanceImpl::Create( |
| 331 PluginDelegate* delegate, | 355 PluginDelegate* delegate, |
| 332 RenderViewImpl* render_view, | 356 RenderViewImpl* render_view, |
| 333 PluginModule* module, | 357 PluginModule* module, |
| 334 WebPluginContainer* container, | 358 WebPluginContainer* container, |
| 335 const GURL& plugin_url) { | 359 const GURL& plugin_url) { |
| 336 base::Callback<const void*(const char*)> get_plugin_interface_func = | 360 base::Callback<const void*(const char*)> get_plugin_interface_func = |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 501 PluginObjectSet plugin_object_copy; | 525 PluginObjectSet plugin_object_copy; |
| 502 live_plugin_objects_.swap(plugin_object_copy); | 526 live_plugin_objects_.swap(plugin_object_copy); |
| 503 for (PluginObjectSet::iterator i = plugin_object_copy.begin(); | 527 for (PluginObjectSet::iterator i = plugin_object_copy.begin(); |
| 504 i != plugin_object_copy.end(); ++i) | 528 i != plugin_object_copy.end(); ++i) |
| 505 delete *i; | 529 delete *i; |
| 506 | 530 |
| 507 if (TrackedCallback::IsPending(lock_mouse_callback_)) | 531 if (TrackedCallback::IsPending(lock_mouse_callback_)) |
| 508 lock_mouse_callback_->Abort(); | 532 lock_mouse_callback_->Abort(); |
| 509 | 533 |
| 510 delegate_->InstanceDeleted(this); | 534 delegate_->InstanceDeleted(this); |
| 535 UnSetAndDeleteLockTargetAdapter(); |
| 511 module_->InstanceDeleted(this); | 536 module_->InstanceDeleted(this); |
| 512 // If we switched from the NaCl plugin module, notify it too. | 537 // If we switched from the NaCl plugin module, notify it too. |
| 513 if (original_module_.get()) | 538 if (original_module_.get()) |
| 514 original_module_->InstanceDeleted(this); | 539 original_module_->InstanceDeleted(this); |
| 515 | 540 |
| 516 // This should be last since some of the above "instance deleted" calls will | 541 // This should be last since some of the above "instance deleted" calls will |
| 517 // want to look up in the global map to get info off of our object. | 542 // want to look up in the global map to get info off of our object. |
| 518 HostGlobals::Get()->InstanceDeleted(pp_instance_); | 543 HostGlobals::Get()->InstanceDeleted(pp_instance_); |
| 519 } | 544 } |
| 520 | 545 |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 612 // Force free all resources and vars. | 637 // Force free all resources and vars. |
| 613 HostGlobals::Get()->InstanceCrashed(pp_instance()); | 638 HostGlobals::Get()->InstanceCrashed(pp_instance()); |
| 614 | 639 |
| 615 // Free any associated graphics. | 640 // Free any associated graphics. |
| 616 SetFullscreen(false); | 641 SetFullscreen(false); |
| 617 FlashSetFullscreen(false, false); | 642 FlashSetFullscreen(false, false); |
| 618 // Unbind current 2D or 3D graphics context. | 643 // Unbind current 2D or 3D graphics context. |
| 619 BindGraphics(pp_instance(), 0); | 644 BindGraphics(pp_instance(), 0); |
| 620 InvalidateRect(gfx::Rect()); | 645 InvalidateRect(gfx::Rect()); |
| 621 | 646 |
| 622 delegate()->PluginCrashed(this); | 647 render_view_->PluginCrashed(module_->path(), module_->GetPeerProcessId()); |
| 648 UnSetAndDeleteLockTargetAdapter(); |
| 623 } | 649 } |
| 624 | 650 |
| 625 static void SetGPUHistogram(const ::ppapi::Preferences& prefs, | 651 static void SetGPUHistogram(const ::ppapi::Preferences& prefs, |
| 626 const std::vector<std::string>& arg_names, | 652 const std::vector<std::string>& arg_names, |
| 627 const std::vector<std::string>& arg_values) { | 653 const std::vector<std::string>& arg_values) { |
| 628 // Calculate a histogram to let us determine how likely people are to try to | 654 // Calculate a histogram to let us determine how likely people are to try to |
| 629 // run Stage3D content on machines that have it blacklisted. | 655 // run Stage3D content on machines that have it blacklisted. |
| 630 #if defined(OS_WIN) | 656 #if defined(OS_WIN) |
| 631 bool needs_gpu = false; | 657 bool needs_gpu = false; |
| 632 bool is_xp = base::win::GetVersion() <= base::win::VERSION_XP; | 658 bool is_xp = base::win::GetVersion() <= base::win::VERSION_XP; |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 856 gfx::Rect caret(text_input_caret_); | 882 gfx::Rect caret(text_input_caret_); |
| 857 caret.Offset(view_data_.rect.point.x, view_data_.rect.point.y); | 883 caret.Offset(view_data_.rect.point.x, view_data_.rect.point.y); |
| 858 return caret; | 884 return caret; |
| 859 } | 885 } |
| 860 | 886 |
| 861 bool PepperPluginInstanceImpl::HandleInputEvent( | 887 bool PepperPluginInstanceImpl::HandleInputEvent( |
| 862 const WebKit::WebInputEvent& event, | 888 const WebKit::WebInputEvent& event, |
| 863 WebCursorInfo* cursor_info) { | 889 WebCursorInfo* cursor_info) { |
| 864 TRACE_EVENT0("ppapi", "PepperPluginInstanceImpl::HandleInputEvent"); | 890 TRACE_EVENT0("ppapi", "PepperPluginInstanceImpl::HandleInputEvent"); |
| 865 | 891 |
| 866 if (WebInputEvent::isMouseEventType(event.type)) | 892 if (WebInputEvent::isMouseEventType(event.type)) { |
| 867 delegate()->DidReceiveMouseEvent(this); | 893 static_cast<PepperPluginDelegateImpl*>(delegate_)->DidReceiveMouseEvent( |
| 894 this); |
| 895 } |
| 868 | 896 |
| 869 // Don't dispatch input events to crashed plugins. | 897 // Don't dispatch input events to crashed plugins. |
| 870 if (module()->is_crashed()) | 898 if (module()->is_crashed()) |
| 871 return false; | 899 return false; |
| 872 | 900 |
| 873 // Keep a reference on the stack. See NOTE above. | 901 // Keep a reference on the stack. See NOTE above. |
| 874 scoped_refptr<PepperPluginInstanceImpl> ref(this); | 902 scoped_refptr<PepperPluginInstanceImpl> ref(this); |
| 875 | 903 |
| 876 bool rv = false; | 904 bool rv = false; |
| 877 if (LoadInputEventInterface()) { | 905 if (LoadInputEventInterface()) { |
| (...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1579 lock_mouse_callback_->Run(PP_ERROR_FAILED); | 1607 lock_mouse_callback_->Run(PP_ERROR_FAILED); |
| 1580 return; | 1608 return; |
| 1581 } | 1609 } |
| 1582 | 1610 |
| 1583 PPB_Graphics3D_Impl* graphics_3d = bound_graphics_3d_.get(); | 1611 PPB_Graphics3D_Impl* graphics_3d = bound_graphics_3d_.get(); |
| 1584 if (graphics_3d) | 1612 if (graphics_3d) |
| 1585 UpdateLayer(); | 1613 UpdateLayer(); |
| 1586 | 1614 |
| 1587 bool old_plugin_focus = PluginHasFocus(); | 1615 bool old_plugin_focus = PluginHasFocus(); |
| 1588 flash_fullscreen_ = flash_fullscreen; | 1616 flash_fullscreen_ = flash_fullscreen; |
| 1589 if (is_mouselock_pending && !delegate()->IsMouseLocked(this)) { | 1617 if (is_mouselock_pending && !IsMouseLocked()) { |
| 1590 if (!IsProcessingUserGesture() && | 1618 if (!IsProcessingUserGesture() && |
| 1591 !module_->permissions().HasPermission( | 1619 !module_->permissions().HasPermission( |
| 1592 ::ppapi::PERMISSION_BYPASS_USER_GESTURE)) { | 1620 ::ppapi::PERMISSION_BYPASS_USER_GESTURE)) { |
| 1593 lock_mouse_callback_->Run(PP_ERROR_NO_USER_GESTURE); | 1621 lock_mouse_callback_->Run(PP_ERROR_NO_USER_GESTURE); |
| 1594 } else { | 1622 } else { |
| 1595 // Open a user gesture here so the Webkit user gesture checks will succeed | 1623 // Open a user gesture here so the Webkit user gesture checks will succeed |
| 1596 // for out-of-process plugins. | 1624 // for out-of-process plugins. |
| 1597 WebScopedUserGesture user_gesture(CurrentUserGestureToken()); | 1625 WebScopedUserGesture user_gesture(CurrentUserGestureToken()); |
| 1598 if (!delegate()->LockMouse(this)) | 1626 if (!LockMouse()) |
| 1599 lock_mouse_callback_->Run(PP_ERROR_FAILED); | 1627 lock_mouse_callback_->Run(PP_ERROR_FAILED); |
| 1600 } | 1628 } |
| 1601 } | 1629 } |
| 1602 | 1630 |
| 1603 if (PluginHasFocus() != old_plugin_focus) | 1631 if (PluginHasFocus() != old_plugin_focus) |
| 1604 SendFocusChangeNotification(); | 1632 SendFocusChangeNotification(); |
| 1605 } | 1633 } |
| 1606 | 1634 |
| 1607 bool PepperPluginInstanceImpl::IsViewAccelerated() { | 1635 bool PepperPluginInstanceImpl::IsViewAccelerated() { |
| 1608 if (!container_) | 1636 if (!container_) |
| (...skipping 665 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2274 DoSetCursor(custom_cursor.release()); | 2302 DoSetCursor(custom_cursor.release()); |
| 2275 return PP_TRUE; | 2303 return PP_TRUE; |
| 2276 } | 2304 } |
| 2277 | 2305 |
| 2278 int32_t PepperPluginInstanceImpl::LockMouse( | 2306 int32_t PepperPluginInstanceImpl::LockMouse( |
| 2279 PP_Instance instance, | 2307 PP_Instance instance, |
| 2280 scoped_refptr<TrackedCallback> callback) { | 2308 scoped_refptr<TrackedCallback> callback) { |
| 2281 if (TrackedCallback::IsPending(lock_mouse_callback_)) | 2309 if (TrackedCallback::IsPending(lock_mouse_callback_)) |
| 2282 return PP_ERROR_INPROGRESS; | 2310 return PP_ERROR_INPROGRESS; |
| 2283 | 2311 |
| 2284 if (delegate()->IsMouseLocked(this)) | 2312 if (IsMouseLocked()) |
| 2285 return PP_OK; | 2313 return PP_OK; |
| 2286 | 2314 |
| 2287 if (!CanAccessMainFrame()) | 2315 if (!CanAccessMainFrame()) |
| 2288 return PP_ERROR_NOACCESS; | 2316 return PP_ERROR_NOACCESS; |
| 2289 | 2317 |
| 2290 if (!IsProcessingUserGesture()) | 2318 if (!IsProcessingUserGesture()) |
| 2291 return PP_ERROR_NO_USER_GESTURE; | 2319 return PP_ERROR_NO_USER_GESTURE; |
| 2292 | 2320 |
| 2293 // Attempt mouselock only if Flash isn't waiting on fullscreen, otherwise | 2321 // Attempt mouselock only if Flash isn't waiting on fullscreen, otherwise |
| 2294 // we wait and call LockMouse() in UpdateFlashFullscreenState(). | 2322 // we wait and call LockMouse() in UpdateFlashFullscreenState(). |
| 2295 if (!FlashIsFullscreenOrPending() || flash_fullscreen()) { | 2323 if (!FlashIsFullscreenOrPending() || flash_fullscreen_) { |
| 2296 // Open a user gesture here so the Webkit user gesture checks will succeed | 2324 // Open a user gesture here so the Webkit user gesture checks will succeed |
| 2297 // for out-of-process plugins. | 2325 // for out-of-process plugins. |
| 2298 WebScopedUserGesture user_gesture(CurrentUserGestureToken()); | 2326 WebScopedUserGesture user_gesture(CurrentUserGestureToken()); |
| 2299 if (!delegate()->LockMouse(this)) | 2327 if (!LockMouse()) |
| 2300 return PP_ERROR_FAILED; | 2328 return PP_ERROR_FAILED; |
| 2301 } | 2329 } |
| 2302 | 2330 |
| 2303 // Either mouselock succeeded or a Flash fullscreen is pending. | 2331 // Either mouselock succeeded or a Flash fullscreen is pending. |
| 2304 lock_mouse_callback_ = callback; | 2332 lock_mouse_callback_ = callback; |
| 2305 return PP_OK_COMPLETIONPENDING; | 2333 return PP_OK_COMPLETIONPENDING; |
| 2306 } | 2334 } |
| 2307 | 2335 |
| 2308 void PepperPluginInstanceImpl::UnlockMouse(PP_Instance instance) { | 2336 void PepperPluginInstanceImpl::UnlockMouse(PP_Instance instance) { |
| 2309 delegate()->UnlockMouse(this); | 2337 GetMouseLockDispatcher()->UnlockMouse(GetOrCreateLockTargetAdapter()); |
| 2310 } | 2338 } |
| 2311 | 2339 |
| 2312 void PepperPluginInstanceImpl::SetTextInputType(PP_Instance instance, | 2340 void PepperPluginInstanceImpl::SetTextInputType(PP_Instance instance, |
| 2313 PP_TextInput_Type type) { | 2341 PP_TextInput_Type type) { |
| 2314 int itype = type; | 2342 int itype = type; |
| 2315 if (itype < 0 || itype > ui::TEXT_INPUT_TYPE_URL) | 2343 if (itype < 0 || itype > ui::TEXT_INPUT_TYPE_URL) |
| 2316 itype = ui::TEXT_INPUT_TYPE_NONE; | 2344 itype = ui::TEXT_INPUT_TYPE_NONE; |
| 2317 text_input_type_ = static_cast<ui::TextInputType>(itype); | 2345 text_input_type_ = static_cast<ui::TextInputType>(itype); |
| 2318 delegate()->PluginTextInputTypeChanged(this); | 2346 delegate()->PluginTextInputTypeChanged(this); |
| 2319 } | 2347 } |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2599 | 2627 |
| 2600 void PepperPluginInstanceImpl::SetAlwaysOnTop(bool on_top) { | 2628 void PepperPluginInstanceImpl::SetAlwaysOnTop(bool on_top) { |
| 2601 always_on_top_ = on_top; | 2629 always_on_top_ = on_top; |
| 2602 } | 2630 } |
| 2603 | 2631 |
| 2604 void PepperPluginInstanceImpl::DoSetCursor(WebCursorInfo* cursor) { | 2632 void PepperPluginInstanceImpl::DoSetCursor(WebCursorInfo* cursor) { |
| 2605 cursor_.reset(cursor); | 2633 cursor_.reset(cursor); |
| 2606 if (fullscreen_container_) { | 2634 if (fullscreen_container_) { |
| 2607 fullscreen_container_->DidChangeCursor(*cursor); | 2635 fullscreen_container_->DidChangeCursor(*cursor); |
| 2608 } else { | 2636 } else { |
| 2609 delegate()->DidChangeCursor(this, *cursor); | 2637 static_cast<PepperPluginDelegateImpl*>(delegate_)->DidChangeCursor( |
| 2638 this, *cursor); |
| 2610 } | 2639 } |
| 2611 } | 2640 } |
| 2612 | 2641 |
| 2613 bool PepperPluginInstanceImpl::IsFullPagePlugin() { | 2642 bool PepperPluginInstanceImpl::IsFullPagePlugin() { |
| 2614 WebFrame* frame = container()->element().document().frame(); | 2643 WebFrame* frame = container()->element().document().frame(); |
| 2615 return frame->view()->mainFrame()->document().isPluginDocument(); | 2644 return frame->view()->mainFrame()->document().isPluginDocument(); |
| 2616 } | 2645 } |
| 2617 | 2646 |
| 2618 void PepperPluginInstanceImpl::FlashSetFullscreen(bool fullscreen, | 2647 void PepperPluginInstanceImpl::FlashSetFullscreen(bool fullscreen, |
| 2619 bool delay_report) { | 2648 bool delay_report) { |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2753 | 2782 |
| 2754 void PepperPluginInstanceImpl::ResetSizeAttributesAfterFullscreen() { | 2783 void PepperPluginInstanceImpl::ResetSizeAttributesAfterFullscreen() { |
| 2755 screen_size_for_fullscreen_ = gfx::Size(); | 2784 screen_size_for_fullscreen_ = gfx::Size(); |
| 2756 WebElement element = container_->element(); | 2785 WebElement element = container_->element(); |
| 2757 element.setAttribute(WebString::fromUTF8(kWidth), width_before_fullscreen_); | 2786 element.setAttribute(WebString::fromUTF8(kWidth), width_before_fullscreen_); |
| 2758 element.setAttribute(WebString::fromUTF8(kHeight), height_before_fullscreen_); | 2787 element.setAttribute(WebString::fromUTF8(kHeight), height_before_fullscreen_); |
| 2759 element.setAttribute(WebString::fromUTF8(kBorder), border_before_fullscreen_); | 2788 element.setAttribute(WebString::fromUTF8(kBorder), border_before_fullscreen_); |
| 2760 element.setAttribute(WebString::fromUTF8(kStyle), style_before_fullscreen_); | 2789 element.setAttribute(WebString::fromUTF8(kStyle), style_before_fullscreen_); |
| 2761 } | 2790 } |
| 2762 | 2791 |
| 2792 bool PepperPluginInstanceImpl::IsMouseLocked() { |
| 2793 return GetMouseLockDispatcher()->IsMouseLockedTo( |
| 2794 GetOrCreateLockTargetAdapter()); |
| 2795 } |
| 2796 |
| 2797 bool PepperPluginInstanceImpl::LockMouse() { |
| 2798 return GetMouseLockDispatcher()->LockMouse(GetOrCreateLockTargetAdapter()); |
| 2799 } |
| 2800 |
| 2801 MouseLockDispatcher::LockTarget* |
| 2802 PepperPluginInstanceImpl::GetOrCreateLockTargetAdapter() { |
| 2803 if (!lock_target_.get()) { |
| 2804 lock_target_.reset(new PluginInstanceLockTarget(this)); |
| 2805 } |
| 2806 return lock_target_.get(); |
| 2807 } |
| 2808 |
| 2809 MouseLockDispatcher* PepperPluginInstanceImpl::GetMouseLockDispatcher() { |
| 2810 if (flash_fullscreen_) { |
| 2811 RenderWidgetFullscreenPepper* container = |
| 2812 static_cast<RenderWidgetFullscreenPepper*>(fullscreen_container_); |
| 2813 return container->mouse_lock_dispatcher(); |
| 2814 } else { |
| 2815 return render_view_->mouse_lock_dispatcher(); |
| 2816 } |
| 2817 } |
| 2818 |
| 2819 void PepperPluginInstanceImpl::UnSetAndDeleteLockTargetAdapter() { |
| 2820 if (lock_target_.get()) { |
| 2821 GetMouseLockDispatcher()->OnLockTargetDestroyed(lock_target_.get()); |
| 2822 lock_target_.reset(); |
| 2823 } |
| 2824 } |
| 2825 |
| 2763 } // namespace content | 2826 } // namespace content |
| OLD | NEW |