Commit cec402d2 authored by Yoshifumi Inoue's avatar Yoshifumi Inoue Committed by Commit Bot

Convert LineEndpointComputationMode to template parameter in StartPositionForLine()

This patch changes |LineEndpointComputationMode| parameter to template parameter
in |StartPositionForLine()| to avoid runtime checking of parameter and reducing
source code size of body of |StartPositionForLine()| for improving readability.

The patch[1] will do same thing for |EndPositionForLine()| and remove
|LineEndpointComputationMode| enum.

[1] http://crrev.com/c/882531 Convert Li

Change-Id: I2345ff86d92423ba4dcf6852ec49b34e9563b31e
Reviewed-on: https://chromium-review.googlesource.com/882791
Commit-Queue: Yoshifumi Inoue <yosin@chromium.org>
Reviewed-by: default avatarXiaocheng Hu <xiaochengh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#531776}
parent 4f455a2c
......@@ -174,10 +174,9 @@ InlineBox* FindRightNonPseudoNodeInlineBox(const RootInlineBox& root_box) {
}
enum LineEndpointComputationMode { kUseLogicalOrdering, kUseInlineBoxOrdering };
template <typename Strategy>
template <typename Strategy, typename Ordering>
PositionWithAffinityTemplate<Strategy> StartPositionForLine(
const PositionWithAffinityTemplate<Strategy>& c,
LineEndpointComputationMode mode) {
const PositionWithAffinityTemplate<Strategy>& c) {
if (c.IsNull())
return PositionWithAffinityTemplate<Strategy>();
......@@ -195,30 +194,47 @@ PositionWithAffinityTemplate<Strategy> StartPositionForLine(
return PositionWithAffinityTemplate<Strategy>();
}
Node* start_node;
InlineBox* start_box;
if (mode == kUseLogicalOrdering) {
start_node = root_box->GetLogicalStartBoxWithNode(start_box);
const auto& node_and_box = Ordering::StartNodeAndBoxOf(*root_box);
Node* const start_node = std::get<Node*>(node_and_box);
InlineBox* const start_box = std::get<InlineBox*>(node_and_box);
if (!start_node)
return PositionWithAffinityTemplate<Strategy>();
return PositionWithAffinityTemplate<Strategy>(
start_node->IsTextNode()
? PositionTemplate<Strategy>(ToText(start_node),
ToInlineTextBox(start_box)->Start())
: PositionTemplate<Strategy>::BeforeNode(*start_node));
}
// Provides start and end of line in logical order for implementing Home and End
// keys.
struct LogicalOrdering {
static std::pair<Node*, InlineBox*> StartNodeAndBoxOf(
const RootInlineBox& root_box) {
InlineBox* start_box;
Node* const start_node = root_box.GetLogicalStartBoxWithNode(start_box);
if (!start_node)
return PositionWithAffinityTemplate<Strategy>();
} else {
return {nullptr, nullptr};
return {start_node, start_box};
}
};
// Provides start end end of line in visual order for implementing expanding
// selection in line granularity.
struct VisualOrdering {
static std::pair<Node*, InlineBox*> StartNodeAndBoxOf(
const RootInlineBox& root_box) {
// Generated content (e.g. list markers and CSS :before and :after
// pseudoelements) have no corresponding DOM element, and so cannot be
// represented by a VisiblePosition. Use whatever follows instead.
// TODO(editing-dev): We should consider text-direction of line to
// find non-pseudo node.
start_box = FindRightNonPseudoNodeInlineBox(*root_box);
InlineBox* const start_box = FindRightNonPseudoNodeInlineBox(root_box);
if (!start_box)
return PositionWithAffinityTemplate<Strategy>();
start_node = start_box->GetLineLayoutItem().NonPseudoNode();
return {nullptr, nullptr};
return {start_box->GetLineLayoutItem().NonPseudoNode(), start_box};
}
return PositionWithAffinityTemplate<Strategy>(
start_node->IsTextNode()
? PositionTemplate<Strategy>(ToText(start_node),
ToInlineTextBox(start_box)->Start())
: PositionTemplate<Strategy>::BeforeNode(*start_node));
}
};
template <typename Strategy>
PositionWithAffinityTemplate<Strategy> StartOfLineAlgorithm(
......@@ -226,7 +242,7 @@ PositionWithAffinityTemplate<Strategy> StartOfLineAlgorithm(
// TODO: this is the current behavior that might need to be fixed.
// Please refer to https://bugs.webkit.org/show_bug.cgi?id=49107 for detail.
PositionWithAffinityTemplate<Strategy> vis_pos =
StartPositionForLine(c, kUseInlineBoxOrdering);
StartPositionForLine<Strategy, VisualOrdering>(c);
return HonorEditingBoundaryAtOrBefore(vis_pos, c.GetPosition());
}
......@@ -351,7 +367,7 @@ static PositionWithAffinityTemplate<Strategy> LogicalStartOfLineAlgorithm(
// TODO: this is the current behavior that might need to be fixed.
// Please refer to https://bugs.webkit.org/show_bug.cgi?id=49107 for detail.
PositionWithAffinityTemplate<Strategy> vis_pos =
StartPositionForLine(c, kUseLogicalOrdering);
StartPositionForLine<Strategy, LogicalOrdering>(c);
if (ContainerNode* editable_root = HighestEditableRoot(c.GetPosition())) {
if (!editable_root->contains(
......
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