Commit b37c505b authored by yosin@chromium.org's avatar yosin@chromium.org

Introduce PositionInComposedTree version of enclosingBlock()

This patch introduces |PositionInComposedTree| version of |enclosingBlock()|
by introducing template function |enclosingBlockAlgorithm()|.

This patch is a preparation of making selection to handle granularity for web
component, http://crrev.com/1277863002

BUG=513568
TEST=webkit_unit_tests --gtest_filter=EditingUtilitiesTest.enclosingBlock

Review URL: https://codereview.chromium.org/1310073006

git-svn-id: svn://svn.chromium.org/blink/trunk@201303 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent a7f37819
...@@ -648,12 +648,23 @@ Element* enclosingBlock(Node* node, EditingBoundaryCrossingRule rule) ...@@ -648,12 +648,23 @@ Element* enclosingBlock(Node* node, EditingBoundaryCrossingRule rule)
return enclosingBlock(firstPositionInOrBeforeNode(node), rule); return enclosingBlock(firstPositionInOrBeforeNode(node), rule);
} }
Element* enclosingBlock(const Position& position, EditingBoundaryCrossingRule rule) template <typename Strategy>
Element* enclosingBlockAlgorithm(const PositionAlgorithm<Strategy>& position, EditingBoundaryCrossingRule rule)
{ {
Node* enclosingNode = enclosingNodeOfType(position, isEnclosingBlock, rule); Node* enclosingNode = enclosingNodeOfType(position, isEnclosingBlock, rule);
return enclosingNode && enclosingNode->isElementNode() ? toElement(enclosingNode) : nullptr; return enclosingNode && enclosingNode->isElementNode() ? toElement(enclosingNode) : nullptr;
} }
Element* enclosingBlock(const Position& position, EditingBoundaryCrossingRule rule)
{
return enclosingBlockAlgorithm<EditingStrategy>(position, rule);
}
Element* enclosingBlock(const PositionInComposedTree& position, EditingBoundaryCrossingRule rule)
{
return enclosingBlockAlgorithm<EditingInComposedTreeStrategy>(position, rule);
}
Element* enclosingBlockFlowElement(Node& node) Element* enclosingBlockFlowElement(Node& node)
{ {
if (isBlockFlowElement(node)) if (isBlockFlowElement(node))
......
...@@ -70,7 +70,8 @@ Node* highestEnclosingNodeOfType(const Position&, bool (*nodeIsOfType)(const Nod ...@@ -70,7 +70,8 @@ Node* highestEnclosingNodeOfType(const Position&, bool (*nodeIsOfType)(const Nod
Node* highestNodeToRemoveInPruning(Node*, Node* excludeNode = nullptr); Node* highestNodeToRemoveInPruning(Node*, Node* excludeNode = nullptr);
Element* enclosingBlock(Node*, EditingBoundaryCrossingRule = CannotCrossEditingBoundary); Element* enclosingBlock(Node*, EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
Element* enclosingBlock(const Position&, EditingBoundaryCrossingRule); CORE_EXPORT Element* enclosingBlock(const Position&, EditingBoundaryCrossingRule);
CORE_EXPORT Element* enclosingBlock(const PositionInComposedTree&, EditingBoundaryCrossingRule);
Element* enclosingBlockFlowElement(Node&); // Deprecated, use enclosingBlock instead. Element* enclosingBlockFlowElement(Node&); // Deprecated, use enclosingBlock instead.
bool inSameContainingBlockFlowElement(Node*, Node*); bool inSameContainingBlockFlowElement(Node*, Node*);
Element* enclosingTableCell(const Position&); Element* enclosingTableCell(const Position&);
......
...@@ -31,6 +31,21 @@ TEST_F(EditingUtilitiesTest, firstEditablePositionAfterPositionInRoot) ...@@ -31,6 +31,21 @@ TEST_F(EditingUtilitiesTest, firstEditablePositionAfterPositionInRoot)
EXPECT_EQ(PositionInComposedTree::afterNode(host), firstEditablePositionAfterPositionInRoot(PositionInComposedTree(three, 0), host)); EXPECT_EQ(PositionInComposedTree::afterNode(host), firstEditablePositionAfterPositionInRoot(PositionInComposedTree(three, 0), host));
} }
TEST_F(EditingUtilitiesTest, enclosingBlock)
{
const char* bodyContent = "<p id='host'><b id='one'>11</b></p>";
const char* shadowContent = "<content select=#two></content><div id='three'><content select=#one></content></div>";
setBodyContent(bodyContent);
RefPtrWillBeRawPtr<ShadowRoot> shadowRoot = setShadowContent(shadowContent);
updateLayoutAndStyleForPainting();
Node* host = document().getElementById("host");
Node* one = document().getElementById("one");
Node* three = shadowRoot->getElementById("three");
EXPECT_EQ(host, enclosingBlock(Position(one, 0), CannotCrossEditingBoundary));
EXPECT_EQ(three, enclosingBlock(PositionInComposedTree(one, 0), CannotCrossEditingBoundary));
}
TEST_F(EditingUtilitiesTest, enclosingNodeOfType) TEST_F(EditingUtilitiesTest, enclosingNodeOfType)
{ {
const char* bodyContent = "<p id='host'><b id='one'>11</b></p>"; const char* bodyContent = "<p id='host'><b id='one'>11</b></p>";
......
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