| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 4 * (C) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
| 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ights reserved. | 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ights reserved. |
| 6 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) | 6 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) |
| 7 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo
bile.com/) | 7 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo
bile.com/) |
| 8 * | 8 * |
| 9 * This library is free software; you can redistribute it and/or | 9 * This library is free software; you can redistribute it and/or |
| 10 * modify it under the terms of the GNU Library General Public | 10 * modify it under the terms of the GNU Library General Public |
| (...skipping 892 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 903 return; | 903 return; |
| 904 } | 904 } |
| 905 // Attribute-specific checks are in Attr::setPrefix(). | 905 // Attribute-specific checks are in Attr::setPrefix(). |
| 906 } | 906 } |
| 907 | 907 |
| 908 bool Node::isDescendantOf(const Node *other) const | 908 bool Node::isDescendantOf(const Node *other) const |
| 909 { | 909 { |
| 910 // Return true if other is an ancestor of this, otherwise false | 910 // Return true if other is an ancestor of this, otherwise false |
| 911 if (!other || !other->hasChildNodes() || inDocument() != other->inDocument()
) | 911 if (!other || !other->hasChildNodes() || inDocument() != other->inDocument()
) |
| 912 return false; | 912 return false; |
| 913 if (&other->treeScope() != &treeScope()) | 913 if (other->treeScope() != treeScope()) |
| 914 return false; | 914 return false; |
| 915 if (other->isTreeScope()) | 915 if (other->isTreeScope()) |
| 916 return !isTreeScope(); | 916 return !isTreeScope(); |
| 917 for (const ContainerNode* n = parentNode(); n; n = n->parentNode()) { | 917 for (const ContainerNode* n = parentNode(); n; n = n->parentNode()) { |
| 918 if (n == other) | 918 if (n == other) |
| 919 return true; | 919 return true; |
| 920 } | 920 } |
| 921 return false; | 921 return false; |
| 922 } | 922 } |
| 923 | 923 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 941 | 941 |
| 942 if (inDocument() != node->inDocument()) | 942 if (inDocument() != node->inDocument()) |
| 943 return false; | 943 return false; |
| 944 | 944 |
| 945 bool hasChildren = isContainerNode() && toContainerNode(this)->hasChildNodes
(); | 945 bool hasChildren = isContainerNode() && toContainerNode(this)->hasChildNodes
(); |
| 946 bool hasShadow = isElementNode() && toElement(this)->shadow(); | 946 bool hasShadow = isElementNode() && toElement(this)->shadow(); |
| 947 if (!hasChildren && !hasShadow) | 947 if (!hasChildren && !hasShadow) |
| 948 return false; | 948 return false; |
| 949 | 949 |
| 950 for (; node; node = node->shadowHost()) { | 950 for (; node; node = node->shadowHost()) { |
| 951 if (&treeScope() == &node->treeScope()) | 951 if (treeScope() == node->treeScope()) |
| 952 return contains(node); | 952 return contains(node); |
| 953 } | 953 } |
| 954 | 954 |
| 955 return false; | 955 return false; |
| 956 } | 956 } |
| 957 | 957 |
| 958 bool Node::containsIncludingHostElements(const Node* node) const | 958 bool Node::containsIncludingHostElements(const Node* node) const |
| 959 { | 959 { |
| 960 while (node) { | 960 while (node) { |
| 961 if (node == this) | 961 if (node == this) |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1152 Node* Node::deprecatedShadowAncestorNode() const | 1152 Node* Node::deprecatedShadowAncestorNode() const |
| 1153 { | 1153 { |
| 1154 if (ShadowRoot* root = containingShadowRoot()) | 1154 if (ShadowRoot* root = containingShadowRoot()) |
| 1155 return root->host(); | 1155 return root->host(); |
| 1156 | 1156 |
| 1157 return const_cast<Node*>(this); | 1157 return const_cast<Node*>(this); |
| 1158 } | 1158 } |
| 1159 | 1159 |
| 1160 ShadowRoot* Node::containingShadowRoot() const | 1160 ShadowRoot* Node::containingShadowRoot() const |
| 1161 { | 1161 { |
| 1162 Node* root = treeScope().rootNode(); | 1162 Node* root = treeScope()->rootNode(); |
| 1163 return root && root->isShadowRoot() ? toShadowRoot(root) : 0; | 1163 return root && root->isShadowRoot() ? toShadowRoot(root) : 0; |
| 1164 } | 1164 } |
| 1165 | 1165 |
| 1166 Node* Node::nonBoundaryShadowTreeRootNode() | 1166 Node* Node::nonBoundaryShadowTreeRootNode() |
| 1167 { | 1167 { |
| 1168 ASSERT(!isShadowRoot()); | 1168 ASSERT(!isShadowRoot()); |
| 1169 Node* root = this; | 1169 Node* root = this; |
| 1170 while (root) { | 1170 while (root) { |
| 1171 if (root->isShadowRoot()) | 1171 if (root->isShadowRoot()) |
| 1172 return root; | 1172 return root; |
| (...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1700 return DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | DOCUMENT_POSI
TION_PRECEDING; | 1700 return DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | DOCUMENT_POSI
TION_PRECEDING; |
| 1701 } | 1701 } |
| 1702 | 1702 |
| 1703 ASSERT_NOT_REACHED(); | 1703 ASSERT_NOT_REACHED(); |
| 1704 return DOCUMENT_POSITION_DISCONNECTED; | 1704 return DOCUMENT_POSITION_DISCONNECTED; |
| 1705 } | 1705 } |
| 1706 | 1706 |
| 1707 // If one node is in the document and the other is not, we must be disconnec
ted. | 1707 // If one node is in the document and the other is not, we must be disconnec
ted. |
| 1708 // If the nodes have different owning documents, they must be disconnected.
Note that we avoid | 1708 // If the nodes have different owning documents, they must be disconnected.
Note that we avoid |
| 1709 // comparing Attr nodes here, since they return false from inDocument() all
the time (which seems like a bug). | 1709 // comparing Attr nodes here, since they return false from inDocument() all
the time (which seems like a bug). |
| 1710 if (start1->inDocument() != start2->inDocument() || (treatment == TreatShado
wTreesAsDisconnected && &start1->treeScope() != &start2->treeScope())) { | 1710 if (start1->inDocument() != start2->inDocument() || (treatment == TreatShado
wTreesAsDisconnected && start1->treeScope() != start2->treeScope())) { |
| 1711 unsigned short direction = (this > otherNode) ? DOCUMENT_POSITION_PRECED
ING : DOCUMENT_POSITION_FOLLOWING; | 1711 unsigned short direction = (this > otherNode) ? DOCUMENT_POSITION_PRECED
ING : DOCUMENT_POSITION_FOLLOWING; |
| 1712 return DOCUMENT_POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION
_SPECIFIC | direction; | 1712 return DOCUMENT_POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION
_SPECIFIC | direction; |
| 1713 } | 1713 } |
| 1714 | 1714 |
| 1715 // We need to find a common ancestor container, and then compare the indices
of the two immediate children. | 1715 // We need to find a common ancestor container, and then compare the indices
of the two immediate children. |
| 1716 const Node* current; | 1716 const Node* current; |
| 1717 for (current = start1; current; current = current->parentOrShadowHostNode()) | 1717 for (current = start1; current; current = current->parentOrShadowHostNode()) |
| 1718 chain1.append(current); | 1718 chain1.append(current); |
| 1719 for (current = start2; current; current = current->parentOrShadowHostNode()) | 1719 for (current = start2; current; current = current->parentOrShadowHostNode()) |
| 1720 chain2.append(current); | 1720 chain2.append(current); |
| 1721 | 1721 |
| 1722 unsigned index1 = chain1.size(); | 1722 unsigned index1 = chain1.size(); |
| 1723 unsigned index2 = chain2.size(); | 1723 unsigned index2 = chain2.size(); |
| 1724 | 1724 |
| 1725 // If the two elements don't have a common root, they're not in the same tre
e. | 1725 // If the two elements don't have a common root, they're not in the same tre
e. |
| 1726 if (chain1[index1 - 1] != chain2[index2 - 1]) { | 1726 if (chain1[index1 - 1] != chain2[index2 - 1]) { |
| 1727 unsigned short direction = (this > otherNode) ? DOCUMENT_POSITION_PRECED
ING : DOCUMENT_POSITION_FOLLOWING; | 1727 unsigned short direction = (this > otherNode) ? DOCUMENT_POSITION_PRECED
ING : DOCUMENT_POSITION_FOLLOWING; |
| 1728 return DOCUMENT_POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION
_SPECIFIC | direction; | 1728 return DOCUMENT_POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION
_SPECIFIC | direction; |
| 1729 } | 1729 } |
| 1730 | 1730 |
| 1731 unsigned connection = &start1->treeScope() != &start2->treeScope() ? DOCUMEN
T_POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC : 0; | 1731 unsigned connection = start1->treeScope() != start2->treeScope() ? DOCUMENT_
POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC : 0; |
| 1732 | 1732 |
| 1733 // Walk the two chains backwards and look for the first difference. | 1733 // Walk the two chains backwards and look for the first difference. |
| 1734 for (unsigned i = min(index1, index2); i; --i) { | 1734 for (unsigned i = min(index1, index2); i; --i) { |
| 1735 const Node* child1 = chain1[--index1]; | 1735 const Node* child1 = chain1[--index1]; |
| 1736 const Node* child2 = chain2[--index2]; | 1736 const Node* child2 = chain2[--index2]; |
| 1737 if (child1 != child2) { | 1737 if (child1 != child2) { |
| 1738 // If one of the children is an attribute, it wins. | 1738 // If one of the children is an attribute, it wins. |
| 1739 if (child1->nodeType() == ATTRIBUTE_NODE) | 1739 if (child1->nodeType() == ATTRIBUTE_NODE) |
| 1740 return DOCUMENT_POSITION_FOLLOWING | connection; | 1740 return DOCUMENT_POSITION_FOLLOWING | connection; |
| 1741 if (child2->nodeType() == ATTRIBUTE_NODE) | 1741 if (child2->nodeType() == ATTRIBUTE_NODE) |
| (...skipping 758 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2500 } | 2500 } |
| 2501 | 2501 |
| 2502 // It's important not to inline removedLastRef, because we don't want to inline
the code to | 2502 // It's important not to inline removedLastRef, because we don't want to inline
the code to |
| 2503 // delete a Node at each deref call site. | 2503 // delete a Node at each deref call site. |
| 2504 void Node::removedLastRef() | 2504 void Node::removedLastRef() |
| 2505 { | 2505 { |
| 2506 // An explicit check for Document here is better than a virtual function sin
ce it is | 2506 // An explicit check for Document here is better than a virtual function sin
ce it is |
| 2507 // faster for non-Document nodes, and because the call to removedLastRef tha
t is inlined | 2507 // faster for non-Document nodes, and because the call to removedLastRef tha
t is inlined |
| 2508 // at all deref call sites is smaller if it's a non-virtual function. | 2508 // at all deref call sites is smaller if it's a non-virtual function. |
| 2509 if (isTreeScope()) { | 2509 if (isTreeScope()) { |
| 2510 treeScope().removedLastRefToScope(); | 2510 treeScope()->removedLastRefToScope(); |
| 2511 return; | 2511 return; |
| 2512 } | 2512 } |
| 2513 | 2513 |
| 2514 #ifndef NDEBUG | 2514 #ifndef NDEBUG |
| 2515 m_deletionHasBegun = true; | 2515 m_deletionHasBegun = true; |
| 2516 #endif | 2516 #endif |
| 2517 delete this; | 2517 delete this; |
| 2518 } | 2518 } |
| 2519 | 2519 |
| 2520 void Node::textRects(Vector<IntRect>& rects) const | 2520 void Node::textRects(Vector<IntRect>& rects) const |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2678 node->showTreeForThis(); | 2678 node->showTreeForThis(); |
| 2679 } | 2679 } |
| 2680 | 2680 |
| 2681 void showNodePath(const WebCore::Node* node) | 2681 void showNodePath(const WebCore::Node* node) |
| 2682 { | 2682 { |
| 2683 if (node) | 2683 if (node) |
| 2684 node->showNodePathForThis(); | 2684 node->showNodePathForThis(); |
| 2685 } | 2685 } |
| 2686 | 2686 |
| 2687 #endif | 2687 #endif |
| OLD | NEW |