Commit c54d361f authored by Ella Ge's avatar Ella Ge Committed by Commit Bot

Captured mouse event local_point should use transform

When mouse events are captured, we use the capturing element instead of
doing hit test. The local_point is computed by AbsoluteToLocalPoint, but
we didn't apply transfroms. This is wrong and causes selection incorrect
when there is transform.
This CL removes the incorrect kIgnoreTransforms.

Bug: 969695
Change-Id: Icfcaf627f58999f037b793feeb3fe712a827ca8e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1634719
Commit-Queue: Ella Ge <eirage@chromium.org>
Reviewed-by: default avatarDavid Bokan <bokan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#665554}
parent e77165bd
...@@ -2294,12 +2294,10 @@ MouseEventWithHitTestResults EventHandler::GetMouseEventTarget( ...@@ -2294,12 +2294,10 @@ MouseEventWithHitTestResults EventHandler::GetMouseEventTarget(
if (capture_target) { if (capture_target) {
LayoutObject* layout_object = capture_target->GetLayoutObject(); LayoutObject* layout_object = capture_target->GetLayoutObject();
// TODO(eirage): Is kIgnoreTransforms correct here?
LayoutPoint local_point = LayoutPoint local_point =
layout_object ? layout_object layout_object ? layout_object
->AbsoluteToLocalPoint( ->AbsoluteToLocalPoint(
PhysicalOffsetToBeNoop(document_point), PhysicalOffsetToBeNoop(document_point))
kIgnoreTransforms)
.ToLayoutPoint() .ToLayoutPoint()
: document_point; : document_point;
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "third_party/blink/public/platform/web_keyboard_event.h" #include "third_party/blink/public/platform/web_keyboard_event.h"
#include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/dom/range.h" #include "third_party/blink/renderer/core/dom/range.h"
#include "third_party/blink/renderer/core/editing/dom_selection.h"
#include "third_party/blink/renderer/core/editing/editing_behavior.h" #include "third_party/blink/renderer/core/editing/editing_behavior.h"
#include "third_party/blink/renderer/core/editing/editor.h" #include "third_party/blink/renderer/core/editing/editor.h"
#include "third_party/blink/renderer/core/editing/ephemeral_range.h" #include "third_party/blink/renderer/core/editing/ephemeral_range.h"
...@@ -2170,4 +2171,62 @@ TEST_F(EventHandlerSimTest, ElementTargetedGestureScrollViewport) { ...@@ -2170,4 +2171,62 @@ TEST_F(EventHandlerSimTest, ElementTargetedGestureScrollViewport) {
ASSERT_EQ(visual_viewport.GetScrollOffset().Height(), 300); ASSERT_EQ(visual_viewport.GetScrollOffset().Height(), 300);
} }
TEST_F(EventHandlerSimTest, SelecteTransformedTextWhenCapturing) {
WebView().MainFrameWidget()->Resize(WebSize(800, 600));
SimRequest request("https://example.com/test.html", "text/html");
LoadURL("https://example.com/test.html");
request.Complete(R"HTML(
<!DOCTYPE html>
<div id='target' style = "width:250px; transform: rotate(180deg)">
Some text to select
</div>
)HTML");
Compositor().BeginFrame();
WebMouseEvent mouse_down_event(WebInputEvent::kMouseDown,
WebFloatPoint(100, 20), WebFloatPoint(0, 0),
WebPointerProperties::Button::kLeft, 1,
WebInputEvent::Modifiers::kLeftButtonDown,
WebInputEvent::GetStaticTimeStampForTests());
mouse_down_event.SetFrameScale(1);
GetDocument().GetFrame()->GetEventHandler().HandleMousePressEvent(
mouse_down_event);
ASSERT_TRUE(GetDocument()
.GetFrame()
->GetEventHandler()
.GetSelectionController()
.MouseDownMayStartSelect());
Element* target = GetDocument().getElementById("target");
GetDocument().GetFrame()->GetEventHandler().SetPointerCapture(
PointerEventFactory::kMouseId, target);
WebMouseEvent mouse_move_event(WebInputEvent::kMouseMove,
WebFloatPoint(258, 20), WebFloatPoint(0, 0),
WebPointerProperties::Button::kLeft, 1,
WebInputEvent::Modifiers::kLeftButtonDown,
WebInputEvent::GetStaticTimeStampForTests());
mouse_move_event.SetFrameScale(1);
GetDocument().GetFrame()->GetEventHandler().HandleMouseMoveEvent(
mouse_move_event, Vector<WebMouseEvent>(), Vector<WebMouseEvent>());
WebMouseEvent mouse_up_event(
WebMouseEvent::kMouseUp, WebFloatPoint(258, 20), WebFloatPoint(0, 0),
WebPointerProperties::Button::kLeft, 1, WebInputEvent::kNoModifiers,
WebInputEvent::GetStaticTimeStampForTests());
mouse_up_event.SetFrameScale(1);
GetDocument().GetFrame()->GetEventHandler().HandleMouseReleaseEvent(
mouse_up_event);
ASSERT_FALSE(GetDocument()
.GetFrame()
->GetEventHandler()
.GetSelectionController()
.MouseDownMayStartSelect());
ASSERT_TRUE(GetDocument().GetSelection());
EXPECT_EQ("Some text to select", GetDocument().GetSelection()->toString());
}
} // namespace blink } // namespace blink
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment