Index: third_party/WebKit/Source/core/frame/WebFrameWidgetBase.cpp |
diff --git a/third_party/WebKit/Source/core/frame/WebFrameWidgetBase.cpp b/third_party/WebKit/Source/core/frame/WebFrameWidgetBase.cpp |
index 4657b6dd7d70254b792f20ba32628a4b9454b637..1c3ac90e96a63ada31fa7b6144bef5bfe178d52d 100644 |
--- a/third_party/WebKit/Source/core/frame/WebFrameWidgetBase.cpp |
+++ b/third_party/WebKit/Source/core/frame/WebFrameWidgetBase.cpp |
@@ -238,6 +238,11 @@ Page* WebFrameWidgetBase::GetPage() const { |
void WebFrameWidgetBase::DidAcquirePointerLock() { |
GetPage()->GetPointerLockController().DidAcquirePointerLock(); |
+ |
+ LocalFrame* focusedFrame = FocusedLocalFrameInWidget(); |
+ if (focusedFrame) { |
+ focusedFrame->GetEventHandler().ReleaseMousePointerCapture(); |
+ } |
} |
void WebFrameWidgetBase::DidNotAcquirePointerLock() { |
@@ -249,10 +254,25 @@ void WebFrameWidgetBase::DidLosePointerLock() { |
GetPage()->GetPointerLockController().DidLosePointerLock(); |
} |
-void WebFrameWidgetBase::PointerLockMouseEvent(const WebInputEvent& event) { |
+// TODO(665924): Remove direct dispatches of mouse events from |
+// PointerLockController, instead passing them through EventHandler. |
+void WebFrameWidgetBase::PointerLockMouseEvent( |
+ const WebCoalescedInputEvent& coalesced_event) { |
+ const WebInputEvent& input_event = coalesced_event.Event(); |
+ const WebMouseEvent& mouse_event = |
+ static_cast<const WebMouseEvent&>(input_event); |
+ WebMouseEvent transformed_event = TransformWebMouseEvent( |
+ ToWebLocalFrameBase(LocalRoot())->GetFrameView(), mouse_event); |
+ |
+ LocalFrame* focusedFrame = FocusedLocalFrameInWidget(); |
+ if (focusedFrame) { |
+ focusedFrame->GetEventHandler().ProcessPendingPointerCaptureForPointerLock( |
+ transformed_event); |
+ } |
+ |
std::unique_ptr<UserGestureIndicator> gesture_indicator; |
AtomicString event_type; |
- switch (event.GetType()) { |
+ switch (input_event.GetType()) { |
case WebInputEvent::kMouseDown: |
event_type = EventTypeNames::mousedown; |
if (!GetPage() || !GetPage()->GetPointerLockController().GetElement()) |
@@ -277,11 +297,7 @@ void WebFrameWidgetBase::PointerLockMouseEvent(const WebInputEvent& event) { |
NOTREACHED(); |
} |
- const WebMouseEvent& mouse_event = static_cast<const WebMouseEvent&>(event); |
- |
if (GetPage()) { |
- WebMouseEvent transformed_event = TransformWebMouseEvent( |
- ToWebLocalFrameBase(LocalRoot())->GetFrameView(), mouse_event); |
GetPage()->GetPointerLockController().DispatchLockedMouseEvent( |
transformed_event, event_type); |
} |
@@ -302,4 +318,11 @@ void WebFrameWidgetBase::ShowContextMenu(WebMenuSourceType source_type) { |
} |
} |
+LocalFrame* WebFrameWidgetBase::FocusedLocalFrameInWidget() const { |
+ LocalFrame* frame = GetPage()->GetFocusController().FocusedFrame(); |
+ return (frame && frame->LocalFrameRoot() == ToCoreFrame(LocalRoot())) |
+ ? frame |
+ : nullptr; |
+} |
+ |
} // namespace blink |