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

Unified Diff: content/renderer/render_view_impl.cc

Issue 8970016: refactoring mouse lock to support pepper and WebKit (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixes & WebKit APIs are bound now. Created 8 years, 11 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 side-by-side diff with in-line comments
Download patch
Index: content/renderer/render_view_impl.cc
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index ef7fa035fbab6fe06db98ffe53f4c94cd6300d94..763e21f97d3c1d31500b07be094df45708ad5090 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -64,6 +64,7 @@
#include "content/renderer/media/media_stream_impl.h"
#include "content/renderer/media/render_media_log.h"
#include "content/renderer/mhtml_generator.h"
+#include "content/renderer/mouse_lock_dispatcher.h"
#include "content/renderer/notification_provider.h"
#include "content/renderer/p2p/socket_dispatcher.h"
#include "content/renderer/plugin_channel_host.h"
@@ -335,6 +336,35 @@ struct RenderViewImpl::PendingFileChooser {
WebFileChooserCompletion* completion; // MAY BE NULL to skip callback.
};
+namespace {
+
+class WebWidgetLockTarget : public MouseLockDispatcher::LockTarget {
+ public:
+ WebWidgetLockTarget (WebKit::WebWidget* webwidget)
+ : webwidget_(webwidget) {}
+
+ virtual void OnLockMouseACK(bool succeeded) OVERRIDE {
+ if (succeeded)
+ webwidget_->didAcquirePointerLock();
+ else
+ webwidget_->didNotAcquirePointerLock();
+ }
+
+ virtual void OnMouseLockLost() OVERRIDE {
+ webwidget_->didLosePointerLock();
+ }
+
+ virtual bool HandleMouseLockedInputEvent(
+ const WebKit::WebMouseEvent &event) OVERRIDE {
+ // The WebWidget handles mouse lock in WebKit's handleInputEvent().
+ return false;
+ }
+
+ WebKit::WebWidget* webwidget_;
yzshen1 2012/01/25 18:10:01 private, please.
scheib 2012/01/26 01:37:59 Done.
+};
+
+} // namespace
+
RenderViewImpl::RenderViewImpl(
gfx::NativeViewId parent_hwnd,
int32 opener_id,
@@ -374,6 +404,7 @@ RenderViewImpl::RenderViewImpl(
p2p_socket_dispatcher_(NULL),
devtools_agent_(NULL),
renderer_accessibility_(NULL),
+ mouse_lock_dispatcher_(NULL),
session_storage_namespace_id_(session_storage_namespace_id),
handling_select_range_(false),
#if defined(OS_WIN)
@@ -395,6 +426,7 @@ RenderViewImpl::RenderViewImpl(
#endif
webwidget_ = WebView::create(this);
+ webwidget_mouse_lock_target_.reset(new WebWidgetLockTarget(webwidget_));
if (counter) {
shared_popup_counter_ = counter;
@@ -442,9 +474,11 @@ RenderViewImpl::RenderViewImpl(
new TextInputClientObserver(this);
#endif // defined(OS_MACOSX)
+ // The next group of objects all implement RenderViewObserver, so are deleted
+ // along with the RenderView automatically.
devtools_agent_ = new DevToolsAgent(this);
-
renderer_accessibility_ = new RendererAccessibility(this);
+ mouse_lock_dispatcher_ = new MouseLockDispatcher(this);
new IdleUserDetector(this);
@@ -720,8 +754,6 @@ bool RenderViewImpl::OnMessageReceived(const IPC::Message& message) {
IPC_MESSAGE_HANDLER(ViewMsg_SetHistoryLengthAndPrune,
OnSetHistoryLengthAndPrune)
IPC_MESSAGE_HANDLER(ViewMsg_EnableViewSourceMode, OnEnableViewSourceMode)
- IPC_MESSAGE_HANDLER(ViewMsg_LockMouse_ACK, OnLockMouseACK)
- IPC_MESSAGE_HANDLER(ViewMsg_MouseLockLost, OnMouseLockLost)
IPC_MESSAGE_HANDLER(JavaBridgeMsg_Init, OnJavaBridgeInit)
// Have the super handle all other messages.
@@ -1925,6 +1957,19 @@ void RenderViewImpl::exitFullScreen() {
Send(new ViewHostMsg_ToggleFullscreen(routing_id_, false));
}
+bool RenderViewImpl::requestPointerLock() {
+ return mouse_lock_dispatcher_->LockMouse(webwidget_mouse_lock_target_.get());
+}
+
+void RenderViewImpl::requestPointerUnlock() {
+ mouse_lock_dispatcher_->UnlockMouse(webwidget_mouse_lock_target_.get());
+}
+
+bool RenderViewImpl::isPointerLocked() {
+ return mouse_lock_dispatcher_->IsMouseLockedTo(
+ webwidget_mouse_lock_target_.get());
+}
+
// WebKit::WebFrameClient -----------------------------------------------------
WebPlugin* RenderViewImpl::createPlugin(WebFrame* frame,
@@ -4383,7 +4428,11 @@ void RenderViewImpl::DidHandleKeyEvent() {
}
bool RenderViewImpl::WillHandleMouseEvent(const WebKit::WebMouseEvent& event) {
- return pepper_delegate_.HandleMouseEvent(event);
+ pepper_delegate_.WillHandleMouseEvent();
+
+ // If the mouse is locked, only the current owner of the mouse lock can
+ // process mouse events.
+ return mouse_lock_dispatcher_->WillHandleMouseEvent(event);
}
void RenderViewImpl::DidHandleMouseEvent(const WebKit::WebMouseEvent& event) {
@@ -4892,23 +4941,6 @@ void RenderViewImpl::OnEnableViewSourceMode() {
main_frame->enableViewSourceMode(true);
}
-void RenderViewImpl::OnLockMouseACK(bool succeeded) {
- // Mouse Lock removes the system cursor and provides all mouse motion as
- // .movementX/Y values on events all sent to a fixed target. This requires
- // content to specifically request the mode to be entered.
- // Mouse Capture is implicitly given for the duration of a drag event, and
- // sends all mouse events to the initial target of the drag.
- // If Lock is entered it supercedes any in progress Capture.
- if (succeeded)
- OnMouseCaptureLost();
-
- pepper_delegate_.OnLockMouseACK(succeeded);
-}
-
-void RenderViewImpl::OnMouseLockLost() {
- pepper_delegate_.OnMouseLockLost();
-}
-
bool RenderViewImpl::WebWidgetHandlesCompositorScheduling() const {
return !!RenderThreadImpl::current()->compositor_thread();
}

Powered by Google App Engine
This is Rietveld 408576698