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

Side by Side Diff: Source/core/dom/Node.cpp

Issue 298253009: Add iterator object to iterate efficiently over an Element's attributes (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 6 months 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 | Annotate | Revision Log
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 1289 matching lines...) Expand 10 before | Expand all | Expand 10 after
1300 1300
1301 return true; 1301 return true;
1302 } 1302 }
1303 1303
1304 bool Node::isDefaultNamespace(const AtomicString& namespaceURIMaybeEmpty) const 1304 bool Node::isDefaultNamespace(const AtomicString& namespaceURIMaybeEmpty) const
1305 { 1305 {
1306 const AtomicString& namespaceURI = namespaceURIMaybeEmpty.isEmpty() ? nullAt om : namespaceURIMaybeEmpty; 1306 const AtomicString& namespaceURI = namespaceURIMaybeEmpty.isEmpty() ? nullAt om : namespaceURIMaybeEmpty;
1307 1307
1308 switch (nodeType()) { 1308 switch (nodeType()) {
1309 case ELEMENT_NODE: { 1309 case ELEMENT_NODE: {
1310 const Element* elem = toElement(this); 1310 const Element& element = toElement(*this);
1311 1311
1312 if (elem->prefix().isNull()) 1312 if (element.prefix().isNull())
1313 return elem->namespaceURI() == namespaceURI; 1313 return element.namespaceURI() == namespaceURI;
1314 1314
1315 if (elem->hasAttributes()) { 1315 if (element.hasAttributes()) {
1316 unsigned attributeCount = elem->attributeCount(); 1316 AttributeIteratorAccessor attributes = element.attributesIterato r();
1317 for (unsigned i = 0; i < attributeCount; ++i) { 1317 AttributeConstIterator end = attributes.end();
1318 const Attribute& attr = elem->attributeItem(i); 1318 for (AttributeConstIterator it = attributes.begin(); it != end; ++it) {
1319 1319 if (it->localName() == xmlnsAtom)
1320 if (attr.localName() == xmlnsAtom) 1320 return it->value() == namespaceURI;
1321 return attr.value() == namespaceURI;
1322 } 1321 }
1323 } 1322 }
1324 1323
1325 if (Element* parent = parentElement()) 1324 if (Element* parent = parentElement())
1326 return parent->isDefaultNamespace(namespaceURI); 1325 return parent->isDefaultNamespace(namespaceURI);
1327 1326
1328 return false; 1327 return false;
1329 } 1328 }
1330 case DOCUMENT_NODE: 1329 case DOCUMENT_NODE:
1331 if (Element* de = toDocument(this)->documentElement()) 1330 if (Element* de = toDocument(this)->documentElement())
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1386 const AtomicString& Node::lookupNamespaceURI(const String& prefix) const 1385 const AtomicString& Node::lookupNamespaceURI(const String& prefix) const
1387 { 1386 {
1388 // Implemented according to 1387 // Implemented according to
1389 // http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/namespaces-algori thms.html#lookupNamespaceURIAlgo 1388 // http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/namespaces-algori thms.html#lookupNamespaceURIAlgo
1390 1389
1391 if (!prefix.isNull() && prefix.isEmpty()) 1390 if (!prefix.isNull() && prefix.isEmpty())
1392 return nullAtom; 1391 return nullAtom;
1393 1392
1394 switch (nodeType()) { 1393 switch (nodeType()) {
1395 case ELEMENT_NODE: { 1394 case ELEMENT_NODE: {
1396 const Element *elem = toElement(this); 1395 const Element& element = toElement(*this);
1397 1396
1398 if (!elem->namespaceURI().isNull() && elem->prefix() == prefix) 1397 if (!element.namespaceURI().isNull() && element.prefix() == prefix)
1399 return elem->namespaceURI(); 1398 return element.namespaceURI();
1400 1399
1401 if (elem->hasAttributes()) { 1400 if (element.hasAttributes()) {
1402 unsigned attributeCount = elem->attributeCount(); 1401 AttributeIteratorAccessor attributes = element.attributesIterato r();
1403 for (unsigned i = 0; i < attributeCount; ++i) { 1402 AttributeConstIterator end = attributes.end();
1404 const Attribute& attr = elem->attributeItem(i); 1403 for (AttributeConstIterator it = attributes.begin(); it != end; ++it) {
1405 1404 if (it->prefix() == xmlnsAtom && it->localName() == prefix) {
1406 if (attr.prefix() == xmlnsAtom && attr.localName() == prefix ) { 1405 if (!it->value().isEmpty())
1407 if (!attr.value().isEmpty()) 1406 return it->value();
1408 return attr.value();
1409
1410 return nullAtom; 1407 return nullAtom;
1411 } 1408 }
1412 if (attr.localName() == xmlnsAtom && prefix.isNull()) { 1409 if (it->localName() == xmlnsAtom && prefix.isNull()) {
1413 if (!attr.value().isEmpty()) 1410 if (!it->value().isEmpty())
1414 return attr.value(); 1411 return it->value();
1415
1416 return nullAtom; 1412 return nullAtom;
1417 } 1413 }
1418 } 1414 }
1419 } 1415 }
1420 if (Element* parent = parentElement()) 1416 if (Element* parent = parentElement())
1421 return parent->lookupNamespaceURI(prefix); 1417 return parent->lookupNamespaceURI(prefix);
1422 return nullAtom; 1418 return nullAtom;
1423 } 1419 }
1424 case DOCUMENT_NODE: 1420 case DOCUMENT_NODE:
1425 if (Element* de = toDocument(this)->documentElement()) 1421 if (Element* de = toDocument(this)->documentElement())
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
1557 Vector<const Node*, 16> chain2; 1553 Vector<const Node*, 16> chain2;
1558 if (attr1) 1554 if (attr1)
1559 chain1.append(attr1); 1555 chain1.append(attr1);
1560 if (attr2) 1556 if (attr2)
1561 chain2.append(attr2); 1557 chain2.append(attr2);
1562 1558
1563 if (attr1 && attr2 && start1 == start2 && start1) { 1559 if (attr1 && attr2 && start1 == start2 && start1) {
1564 // We are comparing two attributes on the same node. Crawl our attribute map and see which one we hit first. 1560 // We are comparing two attributes on the same node. Crawl our attribute map and see which one we hit first.
1565 const Element* owner1 = attr1->ownerElement(); 1561 const Element* owner1 = attr1->ownerElement();
1566 owner1->synchronizeAllAttributes(); 1562 owner1->synchronizeAllAttributes();
1567 unsigned length = owner1->attributeCount(); 1563 AttributeIteratorAccessor attributes = owner1->attributesIterator();
1568 for (unsigned i = 0; i < length; ++i) { 1564 AttributeConstIterator end = attributes.end();
1565 for (AttributeConstIterator it = attributes.begin(); it != end; ++it) {
1569 // If neither of the two determining nodes is a child node and nodeT ype is the same for both determining nodes, then an 1566 // If neither of the two determining nodes is a child node and nodeT ype is the same for both determining nodes, then an
1570 // implementation-dependent order between the determining nodes is r eturned. This order is stable as long as no nodes of 1567 // implementation-dependent order between the determining nodes is r eturned. This order is stable as long as no nodes of
1571 // the same nodeType are inserted into or removed from the direct co ntainer. This would be the case, for example, 1568 // the same nodeType are inserted into or removed from the direct co ntainer. This would be the case, for example,
1572 // when comparing two attributes of the same element, and inserting or removing additional attributes might change 1569 // when comparing two attributes of the same element, and inserting or removing additional attributes might change
1573 // the order between existing attributes. 1570 // the order between existing attributes.
1574 const Attribute& attribute = owner1->attributeItem(i); 1571 if (attr1->qualifiedName() == it->name())
1575 if (attr1->qualifiedName() == attribute.name())
1576 return DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | DOCUMENT_POSI TION_FOLLOWING; 1572 return DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | DOCUMENT_POSI TION_FOLLOWING;
1577 if (attr2->qualifiedName() == attribute.name()) 1573 if (attr2->qualifiedName() == it->name())
1578 return DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | DOCUMENT_POSI TION_PRECEDING; 1574 return DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | DOCUMENT_POSI TION_PRECEDING;
1579 } 1575 }
1580 1576
1581 ASSERT_NOT_REACHED(); 1577 ASSERT_NOT_REACHED();
1582 return DOCUMENT_POSITION_DISCONNECTED; 1578 return DOCUMENT_POSITION_DISCONNECTED;
1583 } 1579 }
1584 1580
1585 // If one node is in the document and the other is not, we must be disconnec ted. 1581 // If one node is in the document and the other is not, we must be disconnec ted.
1586 // If the nodes have different owning documents, they must be disconnected. Note that we avoid 1582 // If the nodes have different owning documents, they must be disconnected. Note that we avoid
1587 // comparing Attr nodes here, since they return false from inDocument() all the time (which seems like a bug). 1583 // comparing Attr nodes here, since they return false from inDocument() all the time (which seems like a bug).
(...skipping 990 matching lines...) Expand 10 before | Expand all | Expand 10 after
2578 node->showTreeForThis(); 2574 node->showTreeForThis();
2579 } 2575 }
2580 2576
2581 void showNodePath(const WebCore::Node* node) 2577 void showNodePath(const WebCore::Node* node)
2582 { 2578 {
2583 if (node) 2579 if (node)
2584 node->showNodePathForThis(); 2580 node->showNodePathForThis();
2585 } 2581 }
2586 2582
2587 #endif 2583 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698