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

Side by Side Diff: Source/core/inspector/InspectorDOMAgent.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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/inspector/DOMPatchSupport.cpp ('k') | Source/core/page/PageSerializer.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) 2009 Apple Inc. All rights reserved. 2 * Copyright (C) 2009 Apple Inc. All rights reserved.
3 * Copyright (C) 2011 Google Inc. All rights reserved. 3 * Copyright (C) 2011 Google Inc. All rights reserved.
4 * Copyright (C) 2009 Joseph Pecoraro 4 * Copyright (C) 2009 Joseph Pecoraro
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions 7 * modification, are permitted provided that the following conditions
8 * are met: 8 * are met:
9 * 9 *
10 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
(...skipping 703 matching lines...) Expand 10 before | Expand all | Expand 10 after
714 } 714 }
715 715
716 String caseAdjustedName = name ? (shouldIgnoreCase ? name->lower() : *name) : String(); 716 String caseAdjustedName = name ? (shouldIgnoreCase ? name->lower() : *name) : String();
717 717
718 if (!parsedElement->hasAttributes() && name) { 718 if (!parsedElement->hasAttributes() && name) {
719 m_domEditor->removeAttribute(element, caseAdjustedName, errorString); 719 m_domEditor->removeAttribute(element, caseAdjustedName, errorString);
720 return; 720 return;
721 } 721 }
722 722
723 bool foundOriginalAttribute = false; 723 bool foundOriginalAttribute = false;
724 unsigned numAttrs = parsedElement->attributeCount(); 724 AttributeIteratorAccessor attributes = parsedElement->attributesIterator();
725 for (unsigned i = 0; i < numAttrs; ++i) { 725 AttributeConstIterator end = attributes.end();
726 for (AttributeConstIterator it = attributes.begin(); it != end; ++it) {
726 // Add attribute pair 727 // Add attribute pair
727 const Attribute& attribute = parsedElement->attributeItem(i); 728 String attributeName = it->name().toString();
728 String attributeName = attribute.name().toString();
729 if (shouldIgnoreCase) 729 if (shouldIgnoreCase)
730 attributeName = attributeName.lower(); 730 attributeName = attributeName.lower();
731 foundOriginalAttribute |= name && attributeName == caseAdjustedName; 731 foundOriginalAttribute |= name && attributeName == caseAdjustedName;
732 if (!m_domEditor->setAttribute(element, attributeName, attribute.value() , errorString)) 732 if (!m_domEditor->setAttribute(element, attributeName, it->value(), erro rString))
733 return; 733 return;
734 } 734 }
735 735
736 if (!foundOriginalAttribute && name && !name->stripWhiteSpace().isEmpty()) 736 if (!foundOriginalAttribute && name && !name->stripWhiteSpace().isEmpty())
737 m_domEditor->removeAttribute(element, caseAdjustedName, errorString); 737 m_domEditor->removeAttribute(element, caseAdjustedName, errorString);
738 } 738 }
739 739
740 void InspectorDOMAgent::removeAttribute(ErrorString* errorString, int elementId, const String& name) 740 void InspectorDOMAgent::removeAttribute(ErrorString* errorString, int elementId, const String& name)
741 { 741 {
742 Element* element = assertEditableElement(errorString, elementId); 742 Element* element = assertEditableElement(errorString, elementId);
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
974 || (startTagFound && !endTagFound && node->nodeName().starts With(tagNameQuery, false)) 974 || (startTagFound && !endTagFound && node->nodeName().starts With(tagNameQuery, false))
975 || (!startTagFound && endTagFound && node->nodeName().endsWi th(tagNameQuery, false))) { 975 || (!startTagFound && endTagFound && node->nodeName().endsWi th(tagNameQuery, false))) {
976 resultCollector.add(node); 976 resultCollector.add(node);
977 break; 977 break;
978 } 978 }
979 // Go through all attributes and serialize them. 979 // Go through all attributes and serialize them.
980 const Element* element = toElement(node); 980 const Element* element = toElement(node);
981 if (!element->hasAttributes()) 981 if (!element->hasAttributes())
982 break; 982 break;
983 983
984 unsigned numAttrs = element->attributeCount(); 984 AttributeIteratorAccessor attributes = element->attributesIterat or();
985 for (unsigned i = 0; i < numAttrs; ++i) { 985 AttributeConstIterator end = attributes.end();
986 for (AttributeConstIterator it = attributes.begin(); it != end; ++it) {
986 // Add attribute pair 987 // Add attribute pair
987 const Attribute& attribute = element->attributeItem(i); 988 if (it->localName().find(whitespaceTrimmedQuery, 0, false) ! = kNotFound) {
988 if (attribute.localName().find(whitespaceTrimmedQuery, 0, fa lse) != kNotFound) {
989 resultCollector.add(node); 989 resultCollector.add(node);
990 break; 990 break;
991 } 991 }
992 size_t foundPosition = attribute.value().find(attributeQuery , 0, false); 992 size_t foundPosition = it->value().find(attributeQuery, 0, f alse);
993 if (foundPosition != kNotFound) { 993 if (foundPosition != kNotFound) {
994 if (!exactAttributeMatch || (!foundPosition && attribute .value().length() == attributeQuery.length())) { 994 if (!exactAttributeMatch || (!foundPosition && it->value ().length() == attributeQuery.length())) {
995 resultCollector.add(node); 995 resultCollector.add(node);
996 break; 996 break;
997 } 997 }
998 } 998 }
999 } 999 }
1000 break; 1000 break;
1001 } 1001 }
1002 default: 1002 default:
1003 break; 1003 break;
1004 } 1004 }
(...skipping 585 matching lines...) Expand 10 before | Expand all | Expand 10 after
1590 1590
1591 return value.release(); 1591 return value.release();
1592 } 1592 }
1593 1593
1594 PassRefPtr<TypeBuilder::Array<String> > InspectorDOMAgent::buildArrayForElementA ttributes(Element* element) 1594 PassRefPtr<TypeBuilder::Array<String> > InspectorDOMAgent::buildArrayForElementA ttributes(Element* element)
1595 { 1595 {
1596 RefPtr<TypeBuilder::Array<String> > attributesValue = TypeBuilder::Array<Str ing>::create(); 1596 RefPtr<TypeBuilder::Array<String> > attributesValue = TypeBuilder::Array<Str ing>::create();
1597 // Go through all attributes and serialize them. 1597 // Go through all attributes and serialize them.
1598 if (!element->hasAttributes()) 1598 if (!element->hasAttributes())
1599 return attributesValue.release(); 1599 return attributesValue.release();
1600 unsigned numAttrs = element->attributeCount(); 1600 AttributeIteratorAccessor attributes = element->attributesIterator();
1601 for (unsigned i = 0; i < numAttrs; ++i) { 1601 AttributeConstIterator end = attributes.end();
1602 for (AttributeConstIterator it = attributes.begin(); it != end; ++it) {
1602 // Add attribute pair 1603 // Add attribute pair
1603 const Attribute& attribute = element->attributeItem(i); 1604 attributesValue->addItem(it->name().toString());
1604 attributesValue->addItem(attribute.name().toString()); 1605 attributesValue->addItem(it->value());
1605 attributesValue->addItem(attribute.value());
1606 } 1606 }
1607 return attributesValue.release(); 1607 return attributesValue.release();
1608 } 1608 }
1609 1609
1610 PassRefPtr<TypeBuilder::Array<TypeBuilder::DOM::Node> > InspectorDOMAgent::build ArrayForContainerChildren(Node* container, int depth, NodeToIdMap* nodesMap) 1610 PassRefPtr<TypeBuilder::Array<TypeBuilder::DOM::Node> > InspectorDOMAgent::build ArrayForContainerChildren(Node* container, int depth, NodeToIdMap* nodesMap)
1611 { 1611 {
1612 RefPtr<TypeBuilder::Array<TypeBuilder::DOM::Node> > children = TypeBuilder:: Array<TypeBuilder::DOM::Node>::create(); 1612 RefPtr<TypeBuilder::Array<TypeBuilder::DOM::Node> > children = TypeBuilder:: Array<TypeBuilder::DOM::Node>::create();
1613 if (depth == 0) { 1613 if (depth == 0) {
1614 // Special-case the only text child - pretend that container's children have been requested. 1614 // Special-case the only text child - pretend that container's children have been requested.
1615 Node* firstChild = container->firstChild(); 1615 Node* firstChild = container->firstChild();
(...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after
2092 if (!m_documentNodeToIdMap.contains(m_document)) { 2092 if (!m_documentNodeToIdMap.contains(m_document)) {
2093 RefPtr<TypeBuilder::DOM::Node> root; 2093 RefPtr<TypeBuilder::DOM::Node> root;
2094 getDocument(errorString, root); 2094 getDocument(errorString, root);
2095 return errorString->isEmpty(); 2095 return errorString->isEmpty();
2096 } 2096 }
2097 return true; 2097 return true;
2098 } 2098 }
2099 2099
2100 } // namespace WebCore 2100 } // namespace WebCore
2101 2101
OLDNEW
« no previous file with comments | « Source/core/inspector/DOMPatchSupport.cpp ('k') | Source/core/page/PageSerializer.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698