 Chromium Code Reviews
 Chromium Code Reviews Issue 2807433003:
  No pointer captured when the pointer lock is applied  (Closed)
    
  
    Issue 2807433003:
  No pointer captured when the pointer lock is applied  (Closed) 
  | 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 9ee7908429997bd101b086f9ee7adf0e858f6d18..04cd18cc77610340c2e2d3c9699dcc05b7a9f2fc 100644 | 
| --- a/third_party/WebKit/Source/core/frame/WebFrameWidgetBase.cpp | 
| +++ b/third_party/WebKit/Source/core/frame/WebFrameWidgetBase.cpp | 
| @@ -15,6 +15,7 @@ | 
| #include "core/page/DragController.h" | 
| #include "core/page/DragData.h" | 
| #include "core/page/DragSession.h" | 
| +#include "core/page/FocusController.h" | 
| #include "core/page/Page.h" | 
| #include "core/page/PointerLockController.h" | 
| #include "platform/UserGestureIndicator.h" | 
| @@ -235,6 +236,11 @@ Page* WebFrameWidgetBase::GetPage() const { | 
| void WebFrameWidgetBase::DidAcquirePointerLock() { | 
| GetPage()->GetPointerLockController().DidAcquirePointerLock(); | 
| + | 
| + LocalFrame* focusedFrame = FocusedLocalFrameInWidget(); | 
| + if (focusedFrame) { | 
| + focusedFrame->GetEventHandler().ReleaseMousePointerCapture(); | 
| + } | 
| } | 
| void WebFrameWidgetBase::DidNotAcquirePointerLock() { | 
| @@ -246,10 +252,29 @@ 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( | 
| 
scheib
2017/05/26 05:44:12
NOTE: I'm not familiar enough with this code, and
 | 
| + const WebCoalescedInputEvent& coalesced_event) { | 
| 
Navid Zolghadr
2017/05/25 16:59:15
I love the idea that you changed this to WebCoales
 
lanwei
2017/05/29 18:30:07
Done.
 | 
| + 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) { | 
| + Vector<WebMouseEvent> transformed_coalesced_events = | 
| + TransformWebMouseEventVector( | 
| + ToWebLocalFrameBase(LocalRoot())->GetFrameView(), | 
| + coalesced_event.GetCoalescedEventsPointers()); | 
| + focusedFrame->GetEventHandler().ProcessPendingPointerCapture( | 
| + transformed_event, transformed_coalesced_events); | 
| + } | 
| + | 
| 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()) | 
| @@ -274,14 +299,17 @@ 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); | 
| } | 
| } | 
| +LocalFrame* WebFrameWidgetBase::FocusedLocalFrameInWidget() const { | 
| + LocalFrame* frame = GetPage()->GetFocusController().FocusedFrame(); | 
| + return (frame && frame->LocalFrameRoot() == ToCoreFrame(LocalRoot())) | 
| + ? frame | 
| + : nullptr; | 
| +} | 
| + | 
| } // namespace blink |