Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(195)

Side by Side Diff: sky/engine/core/dom/Node.cpp

Issue 697773002: Remove Element#attributes. (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: fix template binding. Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « sky/engine/core/dom/Node.h ('k') | sky/engine/core/dom/Range.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 return *set; 117 return *set;
118 } 118 }
119 #endif 119 #endif
120 120
121 void Node::dumpStatistics() 121 void Node::dumpStatistics()
122 { 122 {
123 #if DUMP_NODE_STATISTICS 123 #if DUMP_NODE_STATISTICS
124 size_t nodesWithRareData = 0; 124 size_t nodesWithRareData = 0;
125 125
126 size_t elementNodes = 0; 126 size_t elementNodes = 0;
127 size_t attrNodes = 0;
128 size_t textNodes = 0; 127 size_t textNodes = 0;
129 size_t piNodes = 0; 128 size_t piNodes = 0;
130 size_t documentNodes = 0; 129 size_t documentNodes = 0;
131 size_t docTypeNodes = 0; 130 size_t docTypeNodes = 0;
132 size_t fragmentNodes = 0; 131 size_t fragmentNodes = 0;
133 size_t shadowRootNodes = 0; 132 size_t shadowRootNodes = 0;
134 133
135 HashMap<String, size_t> perTagCount; 134 HashMap<String, size_t> perTagCount;
136 135
137 size_t attributes = 0; 136 size_t attributes = 0;
138 size_t elementsWithAttributeStorage = 0; 137 size_t elementsWithAttributeStorage = 0;
139 size_t elementsWithRareData = 0; 138 size_t elementsWithRareData = 0;
140 size_t elementsWithNamedNodeMap = 0;
141 139
142 for (WeakNodeSet::iterator it = liveNodeSet().begin(); it != liveNodeSet().e nd(); ++it) { 140 for (WeakNodeSet::iterator it = liveNodeSet().begin(); it != liveNodeSet().e nd(); ++it) {
143 Node* node = *it; 141 Node* node = *it;
144 142
145 if (node->hasRareData()) { 143 if (node->hasRareData()) {
146 ++nodesWithRareData; 144 ++nodesWithRareData;
147 if (node->isElementNode()) { 145 if (node->isElementNode()) {
148 ++elementsWithRareData; 146 ++elementsWithRareData;
149 if (toElement(node)->hasNamedNodeMap())
150 ++elementsWithNamedNodeMap;
151 } 147 }
152 } 148 }
153 149
154 switch (node->nodeType()) { 150 switch (node->nodeType()) {
155 case ELEMENT_NODE: { 151 case ELEMENT_NODE: {
156 ++elementNodes; 152 ++elementNodes;
157 153
158 // Tag stats 154 // Tag stats
159 Element* element = toElement(node); 155 Element* element = toElement(node);
160 HashMap<String, size_t>::AddResult result = perTagCount.add(elem ent->tagName(), 1); 156 HashMap<String, size_t>::AddResult result = perTagCount.add(elem ent->tagName(), 1);
161 if (!result.isNewEntry) 157 if (!result.isNewEntry)
162 result.storedValue->value++; 158 result.storedValue->value++;
163 159
164 if (const ElementData* elementData = element->elementData()) { 160 if (const ElementData* elementData = element->elementData()) {
165 attributes += elementData->attributes().size(); 161 attributes += elementData->attributes().size();
166 ++elementsWithAttributeStorage; 162 ++elementsWithAttributeStorage;
167 } 163 }
168 break; 164 break;
169 } 165 }
170 case ATTRIBUTE_NODE: {
171 ++attrNodes;
172 break;
173 }
174 case TEXT_NODE: { 166 case TEXT_NODE: {
175 ++textNodes; 167 ++textNodes;
176 break; 168 break;
177 } 169 }
178 case DOCUMENT_NODE: { 170 case DOCUMENT_NODE: {
179 ++documentNodes; 171 ++documentNodes;
180 break; 172 break;
181 } 173 }
182 case DOCUMENT_FRAGMENT_NODE: { 174 case DOCUMENT_FRAGMENT_NODE: {
183 if (node->isShadowRoot()) 175 if (node->isShadowRoot())
184 ++shadowRootNodes; 176 ++shadowRootNodes;
185 else 177 else
186 ++fragmentNodes; 178 ++fragmentNodes;
187 break; 179 break;
188 } 180 }
189 } 181 }
190 } 182 }
191 183
192 printf("Number of Nodes: %d\n\n", liveNodeSet().size()); 184 printf("Number of Nodes: %d\n\n", liveNodeSet().size());
193 printf("Number of Nodes with RareData: %zu\n\n", nodesWithRareData); 185 printf("Number of Nodes with RareData: %zu\n\n", nodesWithRareData);
194 186
195 printf("NodeType distribution:\n"); 187 printf("NodeType distribution:\n");
196 printf(" Number of Element nodes: %zu\n", elementNodes); 188 printf(" Number of Element nodes: %zu\n", elementNodes);
197 printf(" Number of Attribute nodes: %zu\n", attrNodes);
198 printf(" Number of Text nodes: %zu\n", textNodes); 189 printf(" Number of Text nodes: %zu\n", textNodes);
199 printf(" Number of Document nodes: %zu\n", documentNodes); 190 printf(" Number of Document nodes: %zu\n", documentNodes);
200 printf(" Number of DocumentType nodes: %zu\n", docTypeNodes); 191 printf(" Number of DocumentType nodes: %zu\n", docTypeNodes);
201 printf(" Number of DocumentFragment nodes: %zu\n", fragmentNodes); 192 printf(" Number of DocumentFragment nodes: %zu\n", fragmentNodes);
202 printf(" Number of ShadowRoot nodes: %zu\n", shadowRootNodes); 193 printf(" Number of ShadowRoot nodes: %zu\n", shadowRootNodes);
203 194
204 printf("Element tag name distibution:\n"); 195 printf("Element tag name distibution:\n");
205 for (HashMap<String, size_t>::iterator it = perTagCount.begin(); it != perTa gCount.end(); ++it) 196 for (HashMap<String, size_t>::iterator it = perTagCount.begin(); it != perTa gCount.end(); ++it)
206 printf(" Number of <%s> tags: %zu\n", it->key.utf8().data(), it->value) ; 197 printf(" Number of <%s> tags: %zu\n", it->key.utf8().data(), it->value) ;
207 198
208 printf("Attributes:\n"); 199 printf("Attributes:\n");
209 printf(" Number of Attributes (non-Node and Node): %zu [%zu]\n", attributes , sizeof(Attribute)); 200 printf(" Number of Attributes (non-Node and Node): %zu [%zu]\n", attributes , sizeof(Attribute));
210 printf(" Number of Elements with attribute storage: %zu [%zu]\n", elementsW ithAttributeStorage, sizeof(ElementData)); 201 printf(" Number of Elements with attribute storage: %zu [%zu]\n", elementsW ithAttributeStorage, sizeof(ElementData));
211 printf(" Number of Elements with RareData: %zu\n", elementsWithRareData); 202 printf(" Number of Elements with RareData: %zu\n", elementsWithRareData);
212 printf(" Number of Elements with NamedNodeMap: %zu [%zu]\n", elementsWithNa medNodeMap, sizeof(NamedNodeMap));
213 #endif 203 #endif
214 } 204 }
215 205
216 DEFINE_DEBUG_ONLY_GLOBAL(WTF::RefCountedLeakCounter, nodeCounter, ("WebCoreNode" )); 206 DEFINE_DEBUG_ONLY_GLOBAL(WTF::RefCountedLeakCounter, nodeCounter, ("WebCoreNode" ));
217 207
218 void Node::trackForDebugging() 208 void Node::trackForDebugging()
219 { 209 {
220 #ifndef NDEBUG 210 #ifndef NDEBUG
221 nodeCounter.increment(); 211 nodeCounter.increment();
222 #endif 212 #endif
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
405 395
406 void Node::normalize() 396 void Node::normalize()
407 { 397 {
408 // Go through the subtree beneath us, normalizing all nodes. This means that 398 // Go through the subtree beneath us, normalizing all nodes. This means that
409 // any two adjacent text nodes are merged and any empty text nodes are remov ed. 399 // any two adjacent text nodes are merged and any empty text nodes are remov ed.
410 400
411 RefPtr<Node> node = this; 401 RefPtr<Node> node = this;
412 while (Node* firstChild = node->firstChild()) 402 while (Node* firstChild = node->firstChild())
413 node = firstChild; 403 node = firstChild;
414 while (node) { 404 while (node) {
415 if (node->isElementNode())
416 toElement(node)->normalizeAttributes();
417
418 if (node == this) 405 if (node == this)
419 break; 406 break;
420 407
421 if (node->nodeType() == TEXT_NODE) 408 if (node->nodeType() == TEXT_NODE)
422 node = toText(node)->mergeNextSiblingNodesIfPossible(); 409 node = toText(node)->mergeNextSiblingNodesIfPossible();
423 else 410 else
424 node = NodeTraversal::nextPostOrder(*node); 411 node = NodeTraversal::nextPostOrder(*node);
425 } 412 }
426 } 413 }
427 414
(...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after
1111 return content.toString(); 1098 return content.toString();
1112 } 1099 }
1113 1100
1114 void Node::setTextContent(const String& text) 1101 void Node::setTextContent(const String& text)
1115 { 1102 {
1116 switch (nodeType()) { 1103 switch (nodeType()) {
1117 case TEXT_NODE: 1104 case TEXT_NODE:
1118 setNodeValue(text); 1105 setNodeValue(text);
1119 return; 1106 return;
1120 case ELEMENT_NODE: 1107 case ELEMENT_NODE:
1121 case ATTRIBUTE_NODE:
1122 case DOCUMENT_FRAGMENT_NODE: { 1108 case DOCUMENT_FRAGMENT_NODE: {
1123 // FIXME: Merge this logic into replaceChildrenWithText. 1109 // FIXME: Merge this logic into replaceChildrenWithText.
1124 RefPtr<ContainerNode> container = toContainerNode(this); 1110 RefPtr<ContainerNode> container = toContainerNode(this);
1125 1111
1126 // Note: This is an intentional optimization. 1112 // Note: This is an intentional optimization.
1127 // See crbug.com/352836 also. 1113 // See crbug.com/352836 also.
1128 // No need to do anything if the text is identical. 1114 // No need to do anything if the text is identical.
1129 if (container->hasOneTextChild() && toText(container->firstChild())- >data() == text) 1115 if (container->hasOneTextChild() && toText(container->firstChild())- >data() == text)
1130 return; 1116 return;
1131 1117
(...skipping 19 matching lines...) Expand all
1151 1137
1152 unsigned short Node::compareDocumentPosition(const Node* otherNode, ShadowTreesT reatment treatment) const 1138 unsigned short Node::compareDocumentPosition(const Node* otherNode, ShadowTreesT reatment treatment) const
1153 { 1139 {
1154 // It is not clear what should be done if |otherNode| is 0. 1140 // It is not clear what should be done if |otherNode| is 0.
1155 if (!otherNode) 1141 if (!otherNode)
1156 return DOCUMENT_POSITION_DISCONNECTED; 1142 return DOCUMENT_POSITION_DISCONNECTED;
1157 1143
1158 if (otherNode == this) 1144 if (otherNode == this)
1159 return DOCUMENT_POSITION_EQUIVALENT; 1145 return DOCUMENT_POSITION_EQUIVALENT;
1160 1146
1161 const Attr* attr1 = nodeType() == ATTRIBUTE_NODE ? toAttr(this) : 0; 1147 const Node* start1 = this;
1162 const Attr* attr2 = otherNode->nodeType() == ATTRIBUTE_NODE ? toAttr(otherNo de) : 0; 1148 const Node* start2 = otherNode;
1163
1164 const Node* start1 = attr1 ? attr1->ownerElement() : this;
1165 const Node* start2 = attr2 ? attr2->ownerElement() : otherNode;
1166 1149
1167 // If either of start1 or start2 is null, then we are disconnected, since on e of the nodes is 1150 // If either of start1 or start2 is null, then we are disconnected, since on e of the nodes is
1168 // an orphaned attribute node. 1151 // an orphaned attribute node.
1169 if (!start1 || !start2) { 1152 if (!start1 || !start2) {
1170 unsigned short direction = (this > otherNode) ? DOCUMENT_POSITION_PRECED ING : DOCUMENT_POSITION_FOLLOWING; 1153 unsigned short direction = (this > otherNode) ? DOCUMENT_POSITION_PRECED ING : DOCUMENT_POSITION_FOLLOWING;
1171 return DOCUMENT_POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION _SPECIFIC | direction; 1154 return DOCUMENT_POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION _SPECIFIC | direction;
1172 } 1155 }
1173 1156
1174 Vector<const Node*, 16> chain1; 1157 Vector<const Node*, 16> chain1;
1175 Vector<const Node*, 16> chain2; 1158 Vector<const Node*, 16> chain2;
1176 if (attr1)
1177 chain1.append(attr1);
1178 if (attr2)
1179 chain2.append(attr2);
1180
1181 // FIXME(sky): Attrs are not nodes, remove all this code.
1182 if (attr1 && attr2 && start1 == start2 && start1) {
1183 // We are comparing two attributes on the same node. Crawl our attribute map and see which one we hit first.
1184 const Element* owner1 = attr1->ownerElement();
1185 AttributeCollection attributes = owner1->attributes();
1186 AttributeCollection::iterator end = attributes.end();
1187 for (AttributeCollection::iterator it = attributes.begin(); it != end; + +it) {
1188 // If neither of the two determining nodes is a child node and nodeT ype is the same for both determining nodes, then an
1189 // implementation-dependent order between the determining nodes is r eturned. This order is stable as long as no nodes of
1190 // the same nodeType are inserted into or removed from the direct co ntainer. This would be the case, for example,
1191 // when comparing two attributes of the same element, and inserting or removing additional attributes might change
1192 // the order between existing attributes.
1193 if (attr1->name() == it->localName())
1194 return DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | DOCUMENT_POSI TION_FOLLOWING;
1195 if (attr2->name() == it->localName())
1196 return DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | DOCUMENT_POSI TION_PRECEDING;
1197 }
1198
1199 ASSERT_NOT_REACHED();
1200 return DOCUMENT_POSITION_DISCONNECTED;
1201 }
1202 1159
1203 // If one node is in the document and the other is not, we must be disconnec ted. 1160 // If one node is in the document and the other is not, we must be disconnec ted.
1204 // If the nodes have different owning documents, they must be disconnected. Note that we avoid 1161 // If the nodes have different owning documents, they must be disconnected. Note that we avoid
1205 // comparing Attr nodes here, since they return false from inDocument() all the time (which seems like a bug). 1162 // comparing Attr nodes here, since they return false from inDocument() all the time (which seems like a bug).
1206 if (start1->inDocument() != start2->inDocument() || (treatment == TreatShado wTreesAsDisconnected && start1->treeScope() != start2->treeScope())) { 1163 if (start1->inDocument() != start2->inDocument() || (treatment == TreatShado wTreesAsDisconnected && start1->treeScope() != start2->treeScope())) {
1207 unsigned short direction = (this > otherNode) ? DOCUMENT_POSITION_PRECED ING : DOCUMENT_POSITION_FOLLOWING; 1164 unsigned short direction = (this > otherNode) ? DOCUMENT_POSITION_PRECED ING : DOCUMENT_POSITION_FOLLOWING;
1208 return DOCUMENT_POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION _SPECIFIC | direction; 1165 return DOCUMENT_POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION _SPECIFIC | direction;
1209 } 1166 }
1210 1167
1211 // We need to find a common ancestor container, and then compare the indices of the two immediate children. 1168 // We need to find a common ancestor container, and then compare the indices of the two immediate children.
(...skipping 12 matching lines...) Expand all
1224 return DOCUMENT_POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION _SPECIFIC | direction; 1181 return DOCUMENT_POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION _SPECIFIC | direction;
1225 } 1182 }
1226 1183
1227 unsigned connection = start1->treeScope() != start2->treeScope() ? DOCUMENT_ POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC : 0; 1184 unsigned connection = start1->treeScope() != start2->treeScope() ? DOCUMENT_ POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC : 0;
1228 1185
1229 // Walk the two chains backwards and look for the first difference. 1186 // Walk the two chains backwards and look for the first difference.
1230 for (unsigned i = std::min(index1, index2); i; --i) { 1187 for (unsigned i = std::min(index1, index2); i; --i) {
1231 const Node* child1 = chain1[--index1]; 1188 const Node* child1 = chain1[--index1];
1232 const Node* child2 = chain2[--index2]; 1189 const Node* child2 = chain2[--index2];
1233 if (child1 != child2) { 1190 if (child1 != child2) {
1234 // If one of the children is an attribute, it wins.
1235 if (child1->nodeType() == ATTRIBUTE_NODE)
1236 return DOCUMENT_POSITION_FOLLOWING | connection;
1237 if (child2->nodeType() == ATTRIBUTE_NODE)
1238 return DOCUMENT_POSITION_PRECEDING | connection;
1239
1240 // If one of the children is a shadow root, 1191 // If one of the children is a shadow root,
1241 if (child1->isShadowRoot() || child2->isShadowRoot()) { 1192 if (child1->isShadowRoot() || child2->isShadowRoot()) {
1242 if (!child2->isShadowRoot()) 1193 if (!child2->isShadowRoot())
1243 return Node::DOCUMENT_POSITION_FOLLOWING | connection; 1194 return Node::DOCUMENT_POSITION_FOLLOWING | connection;
1244 if (!child1->isShadowRoot()) 1195 if (!child1->isShadowRoot())
1245 return Node::DOCUMENT_POSITION_PRECEDING | connection; 1196 return Node::DOCUMENT_POSITION_PRECEDING | connection;
1246 1197
1247 for (ShadowRoot* child = toShadowRoot(child2)->olderShadowRoot() ; child; child = child->olderShadowRoot()) 1198 for (ShadowRoot* child = toShadowRoot(child2)->olderShadowRoot() ; child; child = child->olderShadowRoot())
1248 if (child == child1) 1199 if (child == child1)
1249 return Node::DOCUMENT_POSITION_FOLLOWING | connection; 1200 return Node::DOCUMENT_POSITION_FOLLOWING | connection;
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
1374 else 1325 else
1375 fprintf(stderr, "[%d]", count); 1326 fprintf(stderr, "[%d]", count);
1376 } else if (hasIdAttr) { 1327 } else if (hasIdAttr) {
1377 fprintf(stderr, "[@id=\"%s\"]", idattr.utf8().data()); 1328 fprintf(stderr, "[@id=\"%s\"]", idattr.utf8().data());
1378 } 1329 }
1379 break; 1330 break;
1380 } 1331 }
1381 case TEXT_NODE: 1332 case TEXT_NODE:
1382 fprintf(stderr, "/text()"); 1333 fprintf(stderr, "/text()");
1383 break; 1334 break;
1384 case ATTRIBUTE_NODE:
1385 fprintf(stderr, "/@%s", node->nodeName().utf8().data());
1386 break;
1387 default: 1335 default:
1388 break; 1336 break;
1389 } 1337 }
1390 } 1338 }
1391 fprintf(stderr, "\n"); 1339 fprintf(stderr, "\n");
1392 } 1340 }
1393 1341
1394 static void traverseTreeAndMark(const String& baseIndent, const Node* rootNode, const Node* markedNode1, const char* markedLabel1, const Node* markedNode2, cons t char* markedLabel2) 1342 static void traverseTreeAndMark(const String& baseIndent, const Node* rootNode, const Node* markedNode1, const char* markedLabel1, const Node* markedNode2, cons t char* markedLabel2)
1395 { 1343 {
1396 for (const Node* node = rootNode; node; node = NodeTraversal::next(*node)) { 1344 for (const Node* node = rootNode; node; node = NodeTraversal::next(*node)) {
(...skipping 603 matching lines...) Expand 10 before | Expand all | Expand 10 after
2000 EventTarget::trace(visitor); 1948 EventTarget::trace(visitor);
2001 } 1949 }
2002 1950
2003 unsigned Node::lengthOfContents() const 1951 unsigned Node::lengthOfContents() const
2004 { 1952 {
2005 // This switch statement must be consistent with that of Range::processConte ntsBetweenOffsets. 1953 // This switch statement must be consistent with that of Range::processConte ntsBetweenOffsets.
2006 switch (nodeType()) { 1954 switch (nodeType()) {
2007 case Node::TEXT_NODE: 1955 case Node::TEXT_NODE:
2008 return toCharacterData(this)->length(); 1956 return toCharacterData(this)->length();
2009 case Node::ELEMENT_NODE: 1957 case Node::ELEMENT_NODE:
2010 case Node::ATTRIBUTE_NODE:
2011 case Node::DOCUMENT_NODE: 1958 case Node::DOCUMENT_NODE:
2012 case Node::DOCUMENT_FRAGMENT_NODE: 1959 case Node::DOCUMENT_FRAGMENT_NODE:
2013 return toContainerNode(this)->countChildren(); 1960 return toContainerNode(this)->countChildren();
2014 return 0; 1961 return 0;
2015 } 1962 }
2016 ASSERT_NOT_REACHED(); 1963 ASSERT_NOT_REACHED();
2017 return 0; 1964 return 0;
2018 } 1965 }
2019 1966
2020 v8::Handle<v8::Object> Node::wrap(v8::Handle<v8::Object> creationContext, v8::Is olate* isolate) 1967 v8::Handle<v8::Object> Node::wrap(v8::Handle<v8::Object> creationContext, v8::Is olate* isolate)
(...skipping 27 matching lines...) Expand all
2048 node->showTreeForThis(); 1995 node->showTreeForThis();
2049 } 1996 }
2050 1997
2051 void showNodePath(const blink::Node* node) 1998 void showNodePath(const blink::Node* node)
2052 { 1999 {
2053 if (node) 2000 if (node)
2054 node->showNodePathForThis(); 2001 node->showNodePathForThis();
2055 } 2002 }
2056 2003
2057 #endif 2004 #endif
OLDNEW
« no previous file with comments | « sky/engine/core/dom/Node.h ('k') | sky/engine/core/dom/Range.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698