Commit 341120b0 authored by Koji Ishii's avatar Koji Ishii Committed by Commit Bot

Refactor |LocalFrame::PositionForPoint|

This patch reduces calls to |LayoutObject::PositionForPoint|
in |LocalFrame::PositionForPoint|.

Unlike r827152 <crrev.com/c/2535530>, this one cannot
eliminate the use in all cases. Also the logic looks very
similar but has slightly differently written, there may be
some behavior changes.

Bug: 829028
Change-Id: Ife1dd69e7a24462b0370766e4cf89fb76d2de97a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2535890
Commit-Queue: Yoshifumi Inoue <yosin@chromium.org>
Reviewed-by: default avatarYoshifumi Inoue <yosin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#827165}
parent c7397f88
......@@ -1365,19 +1365,7 @@ PositionWithAffinity LocalFrame::PositionForPoint(
const PhysicalOffset& frame_point) {
HitTestLocation location(frame_point);
HitTestResult result = GetEventHandler().HitTestResultAtLocation(location);
Node* node = result.InnerPossiblyPseudoNode();
if (node && !node->IsPseudoElement())
node = result.InnerNodeOrImageMapImage();
if (!node)
return PositionWithAffinity();
LayoutObject* layout_object = node->GetLayoutObject();
if (!layout_object)
return PositionWithAffinity();
const PositionWithAffinity position =
layout_object->PositionForPoint(result.LocalPoint());
if (position.IsNull())
return PositionWithAffinity(FirstPositionInOrBeforeNode(*node));
return position;
return result.GetPositionForInnerNodeOrImageMapImage();
}
Document* LocalFrame::DocumentAtPoint(
......
......@@ -173,6 +173,27 @@ PositionWithAffinity HitTestResult::GetPosition() const {
return layout_object->PositionForPoint(LocalPoint());
}
PositionWithAffinity HitTestResult::GetPositionForInnerNodeOrImageMapImage()
const {
Node* node = InnerPossiblyPseudoNode();
if (node && !node->IsPseudoElement())
node = InnerNodeOrImageMapImage();
if (!node)
return PositionWithAffinity();
LayoutObject* layout_object = node->GetLayoutObject();
if (!layout_object)
return PositionWithAffinity();
PositionWithAffinity position;
if (box_fragment_ && NGPhysicalBoxFragment::SupportsPositionForPoint() &&
layout_object == GetLayoutObject())
position = box_fragment_->PositionForPoint(LocalPoint());
else
position = layout_object->PositionForPoint(LocalPoint());
if (position.IsNull())
return PositionWithAffinity(FirstPositionInOrBeforeNode(*node));
return position;
}
LayoutObject* HitTestResult::GetLayoutObject() const {
return inner_node_ ? inner_node_->GetLayoutObject() : nullptr;
}
......
......@@ -134,6 +134,7 @@ class CORE_EXPORT HitTestResult {
}
PositionWithAffinity GetPosition() const;
PositionWithAffinity GetPositionForInnerNodeOrImageMapImage() const;
LayoutObject* GetLayoutObject() const;
void SetToShadowHostIfInRestrictedShadowRoot();
......
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