Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(261)

Side by Side Diff: content/renderer/pepper_plugin_delegate_impl.cc

Issue 7863003: Mouse lock implementation, including the renderer side and the Windows version of the browser side. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove two tab chars. Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/pepper_plugin_delegate_impl.h" 5 #include "content/renderer/pepper_plugin_delegate_impl.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 #include <queue> 8 #include <queue>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
45 #include "content/renderer/webplugin_delegate_proxy.h" 45 #include "content/renderer/webplugin_delegate_proxy.h"
46 #include "ipc/ipc_channel_handle.h" 46 #include "ipc/ipc_channel_handle.h"
47 #include "media/video/capture/video_capture_proxy.h" 47 #include "media/video/capture/video_capture_proxy.h"
48 #include "ppapi/c/dev/pp_video_dev.h" 48 #include "ppapi/c/dev/pp_video_dev.h"
49 #include "ppapi/c/pp_errors.h" 49 #include "ppapi/c/pp_errors.h"
50 #include "ppapi/c/private/ppb_flash.h" 50 #include "ppapi/c/private/ppb_flash.h"
51 #include "ppapi/c/private/ppb_flash_net_connector.h" 51 #include "ppapi/c/private/ppb_flash_net_connector.h"
52 #include "ppapi/proxy/host_dispatcher.h" 52 #include "ppapi/proxy/host_dispatcher.h"
53 #include "ppapi/proxy/ppapi_messages.h" 53 #include "ppapi/proxy/ppapi_messages.h"
54 #include "ppapi/shared_impl/ppapi_preferences.h" 54 #include "ppapi/shared_impl/ppapi_preferences.h"
55 #include "third_party/WebKit/Source/WebKit/chromium/public/WebCursorInfo.h"
55 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFileChooserComplet ion.h" 56 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFileChooserComplet ion.h"
56 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFileChooserParams. h" 57 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFileChooserParams. h"
58 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
57 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginContainer.h" 59 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginContainer.h"
58 #include "third_party/WebKit/Source/WebKit/chromium/public/WebScreenInfo.h" 60 #include "third_party/WebKit/Source/WebKit/chromium/public/WebScreenInfo.h"
59 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" 61 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
60 #include "ui/gfx/size.h" 62 #include "ui/gfx/size.h"
61 #include "ui/gfx/surface/transport_dib.h" 63 #include "ui/gfx/surface/transport_dib.h"
62 #include "webkit/fileapi/file_system_callback_dispatcher.h" 64 #include "webkit/fileapi/file_system_callback_dispatcher.h"
63 #include "webkit/glue/context_menu.h" 65 #include "webkit/glue/context_menu.h"
64 #include "webkit/plugins/npapi/webplugin.h" 66 #include "webkit/plugins/npapi/webplugin.h"
65 #include "webkit/plugins/ppapi/file_path.h" 67 #include "webkit/plugins/ppapi/file_path.h"
66 #include "webkit/plugins/ppapi/ppb_file_io_impl.h" 68 #include "webkit/plugins/ppapi/ppb_file_io_impl.h"
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after
643 // saved pipe handle. 645 // saved pipe handle.
644 // Temporarily, just call back. 646 // Temporarily, just call back.
645 client->BrokerConnected(PlatformFileToInt(plugin_handle), result); 647 client->BrokerConnected(PlatformFileToInt(plugin_handle), result);
646 } 648 }
647 649
648 PepperPluginDelegateImpl::PepperPluginDelegateImpl(RenderView* render_view) 650 PepperPluginDelegateImpl::PepperPluginDelegateImpl(RenderView* render_view)
649 : render_view_(render_view), 651 : render_view_(render_view),
650 has_saved_context_menu_action_(false), 652 has_saved_context_menu_action_(false),
651 saved_context_menu_action_(0), 653 saved_context_menu_action_(0),
652 id_generator_(0), 654 id_generator_(0),
653 is_pepper_plugin_focused_(false) { 655 is_pepper_plugin_focused_(false),
656 mouse_lock_owner_(NULL),
657 mouse_locked_(false),
658 pending_lock_request_(false),
659 pending_unlock_request_(false) {
654 } 660 }
655 661
656 PepperPluginDelegateImpl::~PepperPluginDelegateImpl() { 662 PepperPluginDelegateImpl::~PepperPluginDelegateImpl() {
663 DCHECK(!mouse_lock_owner_);
657 } 664 }
658 665
659 scoped_refptr<webkit::ppapi::PluginModule> 666 scoped_refptr<webkit::ppapi::PluginModule>
660 PepperPluginDelegateImpl::CreatePepperPluginModule( 667 PepperPluginDelegateImpl::CreatePepperPluginModule(
661 const webkit::WebPluginInfo& webplugin_info, 668 const webkit::WebPluginInfo& webplugin_info,
662 bool* pepper_plugin_was_registered) { 669 bool* pepper_plugin_was_registered) {
663 *pepper_plugin_was_registered = true; 670 *pepper_plugin_was_registered = true;
664 671
665 // See if a module has already been loaded for this plugin. 672 // See if a module has already been loaded for this plugin.
666 FilePath path(webplugin_info.path); 673 FilePath path(webplugin_info.path);
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
830 void PepperPluginDelegateImpl::PluginFocusChanged(bool focused) { 837 void PepperPluginDelegateImpl::PluginFocusChanged(bool focused) {
831 is_pepper_plugin_focused_ = focused; 838 is_pepper_plugin_focused_ = focused;
832 if (render_view_) 839 if (render_view_)
833 render_view_->PpapiPluginFocusChanged(); 840 render_view_->PpapiPluginFocusChanged();
834 } 841 }
835 842
836 void PepperPluginDelegateImpl::PluginCrashed( 843 void PepperPluginDelegateImpl::PluginCrashed(
837 webkit::ppapi::PluginInstance* instance) { 844 webkit::ppapi::PluginInstance* instance) {
838 subscribed_to_policy_updates_.erase(instance); 845 subscribed_to_policy_updates_.erase(instance);
839 render_view_->PluginCrashed(instance->module()->path()); 846 render_view_->PluginCrashed(instance->module()->path());
847
848 UnlockMouse(instance);
840 } 849 }
841 850
842 void PepperPluginDelegateImpl::InstanceCreated( 851 void PepperPluginDelegateImpl::InstanceCreated(
843 webkit::ppapi::PluginInstance* instance) { 852 webkit::ppapi::PluginInstance* instance) {
844 active_instances_.insert(instance); 853 active_instances_.insert(instance);
845 854
846 // Set the initial focus. 855 // Set the initial focus.
847 instance->SetContentAreaFocus(render_view_->has_focus()); 856 instance->SetContentAreaFocus(render_view_->has_focus());
848 } 857 }
849 858
850 void PepperPluginDelegateImpl::InstanceDeleted( 859 void PepperPluginDelegateImpl::InstanceDeleted(
851 webkit::ppapi::PluginInstance* instance) { 860 webkit::ppapi::PluginInstance* instance) {
852 active_instances_.erase(instance); 861 active_instances_.erase(instance);
853 subscribed_to_policy_updates_.erase(instance); 862 subscribed_to_policy_updates_.erase(instance);
863
864 if (mouse_lock_owner_ && mouse_lock_owner_ == instance) {
865 // UnlockMouse() will determine whether a ViewHostMsg_UnlockMouse needs to
866 // be sent, and set internal state properly. We only need to forget about
867 // the current |mouse_lock_owner_|.
868 UnlockMouse(mouse_lock_owner_);
869 mouse_lock_owner_ = NULL;
870 }
854 } 871 }
855 872
856 SkBitmap* PepperPluginDelegateImpl::GetSadPluginBitmap() { 873 SkBitmap* PepperPluginDelegateImpl::GetSadPluginBitmap() {
857 return content::GetContentClient()->renderer()->GetSadPluginBitmap(); 874 return content::GetContentClient()->renderer()->GetSadPluginBitmap();
858 } 875 }
859 876
860 webkit::ppapi::PluginDelegate::PlatformImage2D* 877 webkit::ppapi::PluginDelegate::PlatformImage2D*
861 PepperPluginDelegateImpl::CreateImage2D(int width, int height) { 878 PepperPluginDelegateImpl::CreateImage2D(int width, int height) {
862 uint32 buffer_size = width * height * 4; 879 uint32 buffer_size = width * height * 4;
863 880
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
1004 messages_waiting_replies_.Remove(message_id); 1021 messages_waiting_replies_.Remove(message_id);
1005 callback->Run(error_code, base::PassPlatformFile(&file)); 1022 callback->Run(error_code, base::PassPlatformFile(&file));
1006 // Make sure we won't leak file handle if the requester has died. 1023 // Make sure we won't leak file handle if the requester has died.
1007 if (file != base::kInvalidPlatformFileValue) 1024 if (file != base::kInvalidPlatformFileValue)
1008 base::FileUtilProxy::Close(GetFileThreadMessageLoopProxy(), file, NULL); 1025 base::FileUtilProxy::Close(GetFileThreadMessageLoopProxy(), file, NULL);
1009 delete callback; 1026 delete callback;
1010 } 1027 }
1011 1028
1012 void PepperPluginDelegateImpl::OnSetFocus(bool has_focus) { 1029 void PepperPluginDelegateImpl::OnSetFocus(bool has_focus) {
1013 for (std::set<webkit::ppapi::PluginInstance*>::iterator i = 1030 for (std::set<webkit::ppapi::PluginInstance*>::iterator i =
1014 active_instances_.begin(); 1031 active_instances_.begin();
1015 i != active_instances_.end(); ++i) 1032 i != active_instances_.end(); ++i)
1016 (*i)->SetContentAreaFocus(has_focus); 1033 (*i)->SetContentAreaFocus(has_focus);
1017 } 1034 }
1018 1035
1019 bool PepperPluginDelegateImpl::IsPluginFocused() const { 1036 bool PepperPluginDelegateImpl::IsPluginFocused() const {
1020 return is_pepper_plugin_focused_; 1037 return is_pepper_plugin_focused_;
1021 } 1038 }
1022 1039
1040 void PepperPluginDelegateImpl::OnLockMouseACK(bool succeeded) {
1041 DCHECK(!mouse_locked_ && pending_lock_request_);
1042
1043 mouse_locked_ = succeeded;
1044 pending_lock_request_ = false;
1045 if (pending_unlock_request_ && !succeeded) {
1046 // We have sent an unlock request after the lock request. However, since
1047 // the lock request has failed, the unlock request will be ignored by the
1048 // browser side and there won't be any response to it.
1049 pending_unlock_request_ = false;
1050 }
1051 // If the PluginInstance has been deleted, |mouse_lock_owner_| can be NULL.
1052 if (mouse_lock_owner_) {
1053 webkit::ppapi::PluginInstance* last_mouse_lock_owner = mouse_lock_owner_;
1054 if (!succeeded) {
1055 // Reset |mouse_lock_owner_| to NULL before calling OnLockMouseACK(), so
1056 // that if OnLockMouseACK() results in calls to any mouse lock method
1057 // (e.g., LockMouse()), the method will see consistent internal state.
1058 mouse_lock_owner_ = NULL;
1059 }
1060
1061 last_mouse_lock_owner->OnLockMouseACK(succeeded ? PP_OK : PP_ERROR_FAILED);
1062 }
1063 }
1064
1065 void PepperPluginDelegateImpl::OnMouseLockLost() {
1066 DCHECK(mouse_locked_ && !pending_lock_request_);
1067
1068 mouse_locked_ = false;
1069 pending_unlock_request_ = false;
1070 // If the PluginInstance has been deleted, |mouse_lock_owner_| can be NULL.
1071 if (mouse_lock_owner_) {
1072 // Reset |mouse_lock_owner_| to NULL before calling OnMouseLockLost(), so
1073 // that if OnMouseLockLost() results in calls to any mouse lock method
1074 // (e.g., LockMouse()), the method will see consistent internal state.
1075 webkit::ppapi::PluginInstance* last_mouse_lock_owner = mouse_lock_owner_;
1076 mouse_lock_owner_ = NULL;
1077
1078 last_mouse_lock_owner->OnMouseLockLost();
1079 }
1080 }
1081
1082 bool PepperPluginDelegateImpl::DispatchLockedMouseEvent(
1083 const WebKit::WebMouseEvent& event) {
1084 if (mouse_locked_) {
1085 if (mouse_lock_owner_) {
1086 // |cursor_info| is ignored since it is hidden when the mouse is locked.
1087 WebKit::WebCursorInfo cursor_info;
1088 mouse_lock_owner_->HandleInputEvent(event, &cursor_info);
1089 }
1090
1091 // If the mouse is locked, only the current owner of the mouse lock can
1092 // process mouse events.
1093 return true;
1094 }
1095 return false;
1096 }
1097
1023 bool PepperPluginDelegateImpl::OpenFileSystem( 1098 bool PepperPluginDelegateImpl::OpenFileSystem(
1024 const GURL& url, 1099 const GURL& url,
1025 fileapi::FileSystemType type, 1100 fileapi::FileSystemType type,
1026 long long size, 1101 long long size,
1027 fileapi::FileSystemCallbackDispatcher* dispatcher) { 1102 fileapi::FileSystemCallbackDispatcher* dispatcher) {
1028 FileSystemDispatcher* file_system_dispatcher = 1103 FileSystemDispatcher* file_system_dispatcher =
1029 ChildThread::current()->file_system_dispatcher(); 1104 ChildThread::current()->file_system_dispatcher();
1030 return file_system_dispatcher->OpenFileSystem( 1105 return file_system_dispatcher->OpenFileSystem(
1031 url.GetWithEmptyPath(), type, size, true /* create */, dispatcher); 1106 url.GetWithEmptyPath(), type, size, true /* create */, dispatcher);
1032 } 1107 }
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
1467 DLOG(WARNING) << "Browser failed to allocate shared memory"; 1542 DLOG(WARNING) << "Browser failed to allocate shared memory";
1468 return NULL; 1543 return NULL;
1469 } 1544 }
1470 return new base::SharedMemory(handle, false); 1545 return new base::SharedMemory(handle, false);
1471 } 1546 }
1472 1547
1473 ppapi::Preferences PepperPluginDelegateImpl::GetPreferences() { 1548 ppapi::Preferences PepperPluginDelegateImpl::GetPreferences() {
1474 return ppapi::Preferences(render_view_->webkit_preferences()); 1549 return ppapi::Preferences(render_view_->webkit_preferences());
1475 } 1550 }
1476 1551
1552 void PepperPluginDelegateImpl::LockMouse(
1553 webkit::ppapi::PluginInstance* instance) {
1554 DCHECK(instance);
1555 if (!MouseLockedOrPending()) {
1556 DCHECK(!mouse_lock_owner_);
1557 pending_lock_request_ = true;
1558 mouse_lock_owner_ = instance;
1559
1560 render_view_->Send(
1561 new ViewHostMsg_LockMouse(render_view_->routing_id()));
1562 } else if (instance != mouse_lock_owner_) {
1563 // Another plugin instance is using mouse lock. Fail immediately.
1564 instance->OnLockMouseACK(PP_ERROR_FAILED);
1565 } else {
1566 if (mouse_locked_) {
1567 instance->OnLockMouseACK(PP_OK);
1568 } else if (pending_lock_request_) {
1569 instance->OnLockMouseACK(PP_ERROR_INPROGRESS);
1570 } else {
1571 // The only case left here is
1572 // !mouse_locked_ && !pending_lock_request_ && pending_unlock_request_,
1573 // which is not possible.
1574 NOTREACHED();
1575 instance->OnLockMouseACK(PP_ERROR_FAILED);
1576 }
1577 }
1578 }
1579
1580 void PepperPluginDelegateImpl::UnlockMouse(
1581 webkit::ppapi::PluginInstance* instance) {
1582 DCHECK(instance);
1583
1584 // If no one is using mouse lock or the user is not |instance|, ignore
1585 // the unlock request.
1586 if (MouseLockedOrPending() && mouse_lock_owner_ == instance) {
1587 if (mouse_locked_ || pending_lock_request_) {
1588 DCHECK(!mouse_locked_ || !pending_lock_request_);
1589 if (!pending_unlock_request_) {
1590 pending_unlock_request_ = true;
1591
1592 render_view_->Send(
1593 new ViewHostMsg_UnlockMouse(render_view_->routing_id()));
1594 }
1595 } else {
1596 // The only case left here is
1597 // !mouse_locked_ && !pending_lock_request_ && pending_unlock_request_,
1598 // which is not possible.
1599 NOTREACHED();
1600 }
1601 }
1602 }
1603
1477 int PepperPluginDelegateImpl::GetRoutingId() const { 1604 int PepperPluginDelegateImpl::GetRoutingId() const {
1478 return render_view_->routing_id(); 1605 return render_view_->routing_id();
1479 } 1606 }
1480 1607
1481 void PepperPluginDelegateImpl::PublishInitialPolicy( 1608 void PepperPluginDelegateImpl::PublishInitialPolicy(
1482 scoped_refptr<webkit::ppapi::PluginInstance> instance, 1609 scoped_refptr<webkit::ppapi::PluginInstance> instance,
1483 const std::string& policy) { 1610 const std::string& policy) {
1484 instance->HandlePolicyUpdate(policy); 1611 instance->HandlePolicyUpdate(policy);
1485 } 1612 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698