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

Unified 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: Rebase 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/dom/ElementData.cpp ('k') | Source/core/dom/PresentationAttributeStyle.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/dom/Node.cpp
diff --git a/Source/core/dom/Node.cpp b/Source/core/dom/Node.cpp
index cdb557ac433202ef70e15166dc450cbf66b69be0..43aadde596cb0c388ab7d3bdede6a592b50675fe 100644
--- a/Source/core/dom/Node.cpp
+++ b/Source/core/dom/Node.cpp
@@ -1323,18 +1323,17 @@ bool Node::isDefaultNamespace(const AtomicString& namespaceURIMaybeEmpty) const
switch (nodeType()) {
case ELEMENT_NODE: {
- const Element* elem = toElement(this);
+ const Element& element = toElement(*this);
- if (elem->prefix().isNull())
- return elem->namespaceURI() == namespaceURI;
+ if (element.prefix().isNull())
+ return element.namespaceURI() == namespaceURI;
- if (elem->hasAttributes()) {
- unsigned attributeCount = elem->attributeCount();
- for (unsigned i = 0; i < attributeCount; ++i) {
- const Attribute& attr = elem->attributeItem(i);
-
- if (attr.localName() == xmlnsAtom)
- return attr.value() == namespaceURI;
+ if (element.hasAttributes()) {
+ AttributeIteratorAccessor attributes = element.attributesIterator();
+ AttributeConstIterator end = attributes.end();
+ for (AttributeConstIterator it = attributes.begin(); it != end; ++it) {
+ if (it->localName() == xmlnsAtom)
+ return it->value() == namespaceURI;
}
}
@@ -1409,26 +1408,23 @@ const AtomicString& Node::lookupNamespaceURI(const String& prefix) const
switch (nodeType()) {
case ELEMENT_NODE: {
- const Element *elem = toElement(this);
-
- if (!elem->namespaceURI().isNull() && elem->prefix() == prefix)
- return elem->namespaceURI();
-
- if (elem->hasAttributes()) {
- unsigned attributeCount = elem->attributeCount();
- for (unsigned i = 0; i < attributeCount; ++i) {
- const Attribute& attr = elem->attributeItem(i);
-
- if (attr.prefix() == xmlnsAtom && attr.localName() == prefix) {
- if (!attr.value().isEmpty())
- return attr.value();
-
+ const Element& element = toElement(*this);
+
+ if (!element.namespaceURI().isNull() && element.prefix() == prefix)
+ return element.namespaceURI();
+
+ if (element.hasAttributes()) {
+ AttributeIteratorAccessor attributes = element.attributesIterator();
+ AttributeConstIterator end = attributes.end();
+ for (AttributeConstIterator it = attributes.begin(); it != end; ++it) {
+ if (it->prefix() == xmlnsAtom && it->localName() == prefix) {
+ if (!it->value().isEmpty())
+ return it->value();
return nullAtom;
}
- if (attr.localName() == xmlnsAtom && prefix.isNull()) {
- if (!attr.value().isEmpty())
- return attr.value();
-
+ if (it->localName() == xmlnsAtom && prefix.isNull()) {
+ if (!it->value().isEmpty())
+ return it->value();
return nullAtom;
}
}
@@ -1581,17 +1577,17 @@ unsigned short Node::compareDocumentPositionInternal(const Node* otherNode, Shad
// We are comparing two attributes on the same node. Crawl our attribute map and see which one we hit first.
const Element* owner1 = attr1->ownerElement();
owner1->synchronizeAllAttributes();
- unsigned length = owner1->attributeCount();
- for (unsigned i = 0; i < length; ++i) {
+ AttributeIteratorAccessor attributes = owner1->attributesIterator();
+ AttributeConstIterator end = attributes.end();
+ for (AttributeConstIterator it = attributes.begin(); it != end; ++it) {
// If neither of the two determining nodes is a child node and nodeType is the same for both determining nodes, then an
// implementation-dependent order between the determining nodes is returned. This order is stable as long as no nodes of
// the same nodeType are inserted into or removed from the direct container. This would be the case, for example,
// when comparing two attributes of the same element, and inserting or removing additional attributes might change
// the order between existing attributes.
- const Attribute& attribute = owner1->attributeItem(i);
- if (attr1->qualifiedName() == attribute.name())
+ if (attr1->qualifiedName() == it->name())
return DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | DOCUMENT_POSITION_FOLLOWING;
- if (attr2->qualifiedName() == attribute.name())
+ if (attr2->qualifiedName() == it->name())
return DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | DOCUMENT_POSITION_PRECEDING;
}
« no previous file with comments | « Source/core/dom/ElementData.cpp ('k') | Source/core/dom/PresentationAttributeStyle.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698