Commit 3bf815f2 authored by yosin@chromium.org's avatar yosin@chromium.org

Introduce composed tree version of enclosingNodeOfType()

This patch introduces composed tree version of |enclosingNodeOfType()| as a
preparation of introducing composed tree version of |enclosingBlock()| for
templatizing |VisiblePosition| class.

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_fitler=EditingUtilitiesTest.enclosingNodeOfType

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

git-svn-id: svn://svn.chromium.org/blink/trunk@201201 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent f98a635c
...@@ -943,15 +943,16 @@ Element* enclosingElementWithTag(const Position& p, const QualifiedName& tagName ...@@ -943,15 +943,16 @@ Element* enclosingElementWithTag(const Position& p, const QualifiedName& tagName
return 0; return 0;
} }
Node* enclosingNodeOfType(const Position& p, bool (*nodeIsOfType)(const Node*), EditingBoundaryCrossingRule rule) template <typename Strategy>
static Node* enclosingNodeOfTypeAlgorithm(const PositionAlgorithm<Strategy>& p, bool (*nodeIsOfType)(const Node*), EditingBoundaryCrossingRule rule)
{ {
// FIXME: support CanSkipCrossEditingBoundary // TODO(yosin) support CanSkipCrossEditingBoundary
ASSERT(rule == CanCrossEditingBoundary || rule == CannotCrossEditingBoundary); ASSERT(rule == CanCrossEditingBoundary || rule == CannotCrossEditingBoundary);
if (p.isNull()) if (p.isNull())
return 0; return nullptr;
ContainerNode* root = rule == CannotCrossEditingBoundary ? highestEditableRoot(p) : 0; ContainerNode* const root = rule == CannotCrossEditingBoundary ? highestEditableRoot(p) : nullptr;
for (Node* n = p.anchorNode(); n; n = n->parentNode()) { for (Node* n = p.anchorNode(); n; n = Strategy::parent(*n)) {
// Don't return a non-editable node if the input position was editable, since // Don't return a non-editable node if the input position was editable, since
// the callers from editing will no doubt want to perform editing inside the returned node. // the callers from editing will no doubt want to perform editing inside the returned node.
if (root && !n->hasEditableStyle()) if (root && !n->hasEditableStyle())
...@@ -959,10 +960,20 @@ Node* enclosingNodeOfType(const Position& p, bool (*nodeIsOfType)(const Node*), ...@@ -959,10 +960,20 @@ Node* enclosingNodeOfType(const Position& p, bool (*nodeIsOfType)(const Node*),
if (nodeIsOfType(n)) if (nodeIsOfType(n))
return n; return n;
if (n == root) if (n == root)
return 0; return nullptr;
} }
return 0; return nullptr;
}
Node* enclosingNodeOfType(const Position& p, bool (*nodeIsOfType)(const Node*), EditingBoundaryCrossingRule rule)
{
return enclosingNodeOfTypeAlgorithm<EditingStrategy>(p, nodeIsOfType, rule);
}
Node* enclosingNodeOfType(const PositionInComposedTree& p, bool (*nodeIsOfType)(const Node*), EditingBoundaryCrossingRule rule)
{
return enclosingNodeOfTypeAlgorithm<EditingInComposedTreeStrategy>(p, nodeIsOfType, rule);
} }
Node* highestEnclosingNodeOfType(const Position& p, bool (*nodeIsOfType)(const Node*), EditingBoundaryCrossingRule rule, Node* stayWithin) Node* highestEnclosingNodeOfType(const Position& p, bool (*nodeIsOfType)(const Node*), EditingBoundaryCrossingRule rule, Node* stayWithin)
......
...@@ -78,7 +78,8 @@ Element* associatedElementOf(const Position&); ...@@ -78,7 +78,8 @@ Element* associatedElementOf(const Position&);
Node* enclosingEmptyListItem(const VisiblePosition&); Node* enclosingEmptyListItem(const VisiblePosition&);
Element* enclosingAnchorElement(const Position&); Element* enclosingAnchorElement(const Position&);
Element* enclosingElementWithTag(const Position&, const QualifiedName&); Element* enclosingElementWithTag(const Position&, const QualifiedName&);
Node* enclosingNodeOfType(const Position&, bool (*nodeIsOfType)(const Node*), EditingBoundaryCrossingRule = CannotCrossEditingBoundary); CORE_EXPORT Node* enclosingNodeOfType(const Position&, bool (*nodeIsOfType)(const Node*), EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
CORE_EXPORT Node* enclosingNodeOfType(const PositionInComposedTree&, bool (*nodeIsOfType)(const Node*), EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
HTMLSpanElement* tabSpanElement(const Node*); HTMLSpanElement* tabSpanElement(const Node*);
Element* isLastPositionBeforeTable(const VisiblePosition&); Element* isLastPositionBeforeTable(const VisiblePosition&);
...@@ -128,7 +129,7 @@ inline bool canHaveChildrenForEditing(const Node* node) ...@@ -128,7 +129,7 @@ inline bool canHaveChildrenForEditing(const Node* node)
} }
bool isAtomicNode(const Node*); bool isAtomicNode(const Node*);
bool isBlock(const Node*); CORE_EXPORT bool isBlock(const Node*);
bool isInline(const Node*); bool isInline(const Node*);
bool isTabHTMLSpanElement(const Node*); bool isTabHTMLSpanElement(const Node*);
bool isTabHTMLSpanElementTextNode(const Node*); bool isTabHTMLSpanElementTextNode(const Node*);
......
...@@ -12,6 +12,21 @@ namespace blink { ...@@ -12,6 +12,21 @@ namespace blink {
class EditingUtilitiesTest : public EditingTestBase { class EditingUtilitiesTest : public EditingTestBase {
}; };
TEST_F(EditingUtilitiesTest, enclosingNodeOfType)
{
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></div></content>";
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, enclosingNodeOfType(Position(one, 0), isBlock));
EXPECT_EQ(three, enclosingNodeOfType(PositionInComposedTree(one, 0), isBlock));
}
TEST_F(EditingUtilitiesTest, NextNodeIndex) TEST_F(EditingUtilitiesTest, NextNodeIndex)
{ {
const char* bodyContent = "<p id='host'>00<b id='one'>11</b><b id='two'>22</b>33</p>"; const char* bodyContent = "<p id='host'>00<b id='one'>11</b><b id='two'>22</b>33</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