Changeset 154581 in webkit
- Timestamp:
- Aug 25, 2013, 2:30:10 PM (12 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 2 added
- 13 edited
-
ChangeLog (modified) (1 diff)
-
GNUmakefile.list.am (modified) (2 diffs)
-
Target.pri (modified) (2 diffs)
-
WebCore.vcxproj/WebCore.vcxproj (modified) (3 diffs)
-
WebCore.xcodeproj/project.pbxproj (modified) (6 diffs)
-
accessibility/AccessibilityNodeObject.cpp (modified) (3 diffs)
-
accessibility/AccessibilityRenderObject.cpp (modified) (2 diffs)
-
accessibility/AccessibilityTable.cpp (modified) (2 diffs)
-
dom/ChildIterator.h (added)
-
dom/DescendantIterator.h (added)
-
dom/Document.cpp (modified) (7 diffs)
-
editing/ApplyStyleCommand.cpp (modified) (2 diffs)
-
editing/markup.cpp (modified) (3 diffs)
-
html/HTMLMapElement.cpp (modified) (2 diffs)
-
html/HTMLMediaElement.cpp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r154580 r154581 1 2013-08-25 Antti Koivisto <antti@apple.com> 2 3 Element child and descendant iterators 4 https://bugs.webkit.org/show_bug.cgi?id=120248 5 6 Reviewed by Sam Weinig and Andreas Kling. 7 8 Add iterators for Element children and descendants. 9 10 To iterate over element children: 11 12 #include "ChildIterator.h" 13 14 for (auto it = elementChildren(this).begin(), end = elementChildren(this).end(); it != end; ++it) { 15 Element& element = *it; 16 ... 17 18 for (auto it = childrenOfType<HTMLAreaElement>(this).begin(), end = childrenOfType<HTMLAreaElement>(this).end(); it != end; ++it) { 19 HTMLAreaElement& area = *it; 20 ... 21 22 To iteratate over element descendants in pre-order: 23 24 #include "DescendantIterator.h" 25 26 for (auto it = elementDescendants(this).begin(), end = elementDescendants(this).end(); it != end; ++it) { 27 Element& element = *it; 28 ... 29 30 for (auto it = descendantsOfType<HTMLAreaElement>(this).begin(), end = descendantsOfType<HTMLAreaElement>(this).end(); it != end; ++it) { 31 HTMLAreaElement& area = *it; 32 ... 33 34 The iterators assert against DOM mutations and event dispatch while iterating in debug builds. 35 36 They are compatible with C++11 range-based for loops. In the future we can use 37 38 for (auto& element : elementChildren(this)) 39 ... 40 41 etc. 42 43 The patch all uses the new iterators in a few places. 44 45 * WebCore.xcodeproj/project.pbxproj: 46 * accessibility/AccessibilityNodeObject.cpp: 47 (WebCore::AccessibilityNodeObject::canvasHasFallbackContent): 48 (WebCore::siblingWithAriaRole): 49 * accessibility/AccessibilityRenderObject.cpp: 50 * accessibility/AccessibilityTable.cpp: 51 (WebCore::AccessibilityTable::isDataTable): 52 * dom/ChildIterator.h: Added. 53 (WebCore::ChildIterator::operator*): 54 (WebCore::ChildIterator::operator->): 55 (WebCore::::ChildIterator): 56 (WebCore::::operator): 57 (WebCore::=): 58 (WebCore::::ChildIteratorAdapter): 59 (WebCore::::begin): 60 (WebCore::::end): 61 (WebCore::elementChildren): 62 (WebCore::childrenOfType): 63 * dom/DescendantIterator.h: Added. 64 (WebCore::DescendantIterator::operator*): 65 (WebCore::DescendantIterator::operator->): 66 (WebCore::::DescendantIterator): 67 (WebCore::::operator): 68 (WebCore::=): 69 (WebCore::::DescendantIteratorAdapter): 70 (WebCore::::begin): 71 (WebCore::::end): 72 (WebCore::elementDescendants): 73 (WebCore::descendantsOfType): 74 * dom/Document.cpp: 75 (WebCore::Document::buildAccessKeyMap): 76 (WebCore::Document::childrenChanged): 77 (WebCore::Document::attach): 78 (WebCore::Document::detach): 79 * editing/ApplyStyleCommand.cpp: 80 (WebCore::ApplyStyleCommand::cleanupUnstyledAppleStyleSpans): 81 * editing/markup.cpp: 82 (WebCore::completeURLs): 83 * html/HTMLMapElement.cpp: 84 (WebCore::HTMLMapElement::mapMouseEvent): 85 * html/HTMLMediaElement.cpp: 86 (WebCore::HTMLMediaElement::selectMediaResource): 87 (WebCore::HTMLMediaElement::textTrackModeChanged): 88 1 89 2013-08-25 Andreas Kling <akling@apple.com> 2 90 -
trunk/Source/WebCore/GNUmakefile.list.am
r154462 r154581 2772 2772 Source/WebCore/dom/CheckedRadioButtons.cpp \ 2773 2773 Source/WebCore/dom/CheckedRadioButtons.h \ 2774 Source/WebCore/dom/ChildIterator.h \ 2774 2775 Source/WebCore/dom/ChildListMutationScope.cpp \ 2775 2776 Source/WebCore/dom/ChildListMutationScope.h \ … … 2816 2817 Source/WebCore/dom/default/PlatformMessagePortChannel.cpp \ 2817 2818 Source/WebCore/dom/default/PlatformMessagePortChannel.h \ 2819 Source/WebCore/dom/DescendantIterator.h \ 2818 2820 Source/WebCore/dom/DeviceMotionClient.h \ 2819 2821 Source/WebCore/dom/DeviceMotionController.cpp \ -
trunk/Source/WebCore/Target.pri
r154482 r154581 1576 1576 dom/CharacterData.h \ 1577 1577 dom/CheckedRadioButtons.h \ 1578 dom/ChildIterator.h \ 1578 1579 dom/ChildNodeList.h \ 1579 1580 dom/ClassNodeList.h \ … … 1589 1590 dom/CustomEvent.h \ 1590 1591 dom/default/PlatformMessagePortChannel.h \ 1592 dom/DescendantIterator.h \ 1591 1593 dom/DeviceMotionClient.h \ 1592 1594 dom/DeviceMotionController.h \ -
trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj
r154462 r154581 1 <?xml version="1.0" encoding="utf-8"?>1 <?xml version="1.0" encoding="utf-8"?> 2 2 <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 3 3 <ItemGroup Label="ProjectConfigurations"> … … 20204 20204 <ClInclude Include="..\dom\CharacterData.h" /> 20205 20205 <ClInclude Include="..\dom\CheckedRadioButtons.h" /> 20206 <ClInclude Include="..\dom\ChildIterator.h" /> 20206 20207 <ClInclude Include="..\dom\ChildListMutationScope.h" /> 20207 20208 <ClInclude Include="..\dom\ChildNodeList.h" /> … … 20223 20224 <ClInclude Include="..\dom\DataTransferItemList.h" /> 20224 20225 <ClInclude Include="..\dom\DecodedDataDocumentParser.h" /> 20226 <ClInclude Include="..\dom\DescendantIterator.h" /> 20225 20227 <ClInclude Include="..\dom\DeviceMotionClient.h" /> 20226 20228 <ClInclude Include="..\dom\DeviceMotionController.h" /> -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r154574 r154581 5488 5488 E45390460EAFD637003695C8 /* SharedTimerIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = E45390350EAFD637003695C8 /* SharedTimerIOS.mm */; }; 5489 5489 E462A4A1113E71BE004A4220 /* IntPointHash.h in Headers */ = {isa = PBXBuildFile; fileRef = E462A4A0113E71BE004A4220 /* IntPointHash.h */; settings = {ATTRIBUTES = (Private, ); }; }; 5490 E46A2B1C17CA65B9000DBCD8 /* DescendantIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = E46A2B1B17CA65B9000DBCD8 /* DescendantIterator.h */; }; 5491 E46A2B1E17CA76B1000DBCD8 /* ChildIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = E46A2B1D17CA76B1000DBCD8 /* ChildIterator.h */; }; 5490 5492 E47127CA163438A100ED6F5A /* StyleInvalidationAnalysis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E47A97CE163059FC005DCD99 /* StyleInvalidationAnalysis.cpp */; }; 5491 5493 E47127CB163438AE00ED6F5A /* StyleInvalidationAnalysis.h in Headers */ = {isa = PBXBuildFile; fileRef = E47A97CF163059FC005DCD99 /* StyleInvalidationAnalysis.h */; }; … … 12256 12258 E45390350EAFD637003695C8 /* SharedTimerIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = SharedTimerIOS.mm; path = ios/SharedTimerIOS.mm; sourceTree = "<group>"; }; 12257 12259 E462A4A0113E71BE004A4220 /* IntPointHash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IntPointHash.h; sourceTree = "<group>"; }; 12260 E46A2B1B17CA65B9000DBCD8 /* DescendantIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DescendantIterator.h; sourceTree = "<group>"; }; 12261 E46A2B1D17CA76B1000DBCD8 /* ChildIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChildIterator.h; sourceTree = "<group>"; }; 12258 12262 E4778B7D115A581A00B5D372 /* JSCustomEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSCustomEvent.cpp; sourceTree = "<group>"; }; 12259 12263 E4778B7E115A581A00B5D372 /* JSCustomEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSCustomEvent.h; sourceTree = "<group>"; }; … … 20097 20101 93F925420F7EF5B8007E37C9 /* CheckedRadioButtons.cpp */, 20098 20102 93F925410F7EF5B8007E37C9 /* CheckedRadioButtons.h */, 20103 E46A2B1D17CA76B1000DBCD8 /* ChildIterator.h */, 20099 20104 D619A305144E00BE004BC302 /* ChildListMutationScope.cpp */, 20100 20105 D619A306144E00BE004BC302 /* ChildListMutationScope.h */, … … 20144 20149 A8C228A011D5722E00D5A7D3 /* DecodedDataDocumentParser.cpp */, 20145 20150 A8C2289F11D5722E00D5A7D3 /* DecodedDataDocumentParser.h */, 20151 E46A2B1B17CA65B9000DBCD8 /* DescendantIterator.h */, 20146 20152 31FB1A4F120A5D0600DC02A0 /* DeviceMotionClient.h */, 20147 20153 31FB1A50120A5D0600DC02A0 /* DeviceMotionController.cpp */, … … 21158 21164 E1ED8AC30CC49BE000BFC557 /* CSSPrimitiveValueMappings.h in Headers */, 21159 21165 A80E6CFF0A1989CA007FB8C5 /* CSSProperty.h in Headers */, 21166 E46A2B1E17CA76B1000DBCD8 /* ChildIterator.h in Headers */, 21160 21167 78D02BC6154A18DF00B62D05 /* CSSPropertyAnimation.h in Headers */, 21161 21168 656580F409D12B20000E61D7 /* CSSPropertyNames.h in Headers */, … … 22882 22889 A7197F24175689C4007B9442 /* PageThrottler.h in Headers */, 22883 22890 E1284AE110447D4500EAEB52 /* PageTransitionEvent.h in Headers */, 22891 E46A2B1C17CA65B9000DBCD8 /* DescendantIterator.h in Headers */, 22884 22892 51E1ECC30C91C90400DC255B /* PageURLRecord.h in Headers */, 22885 22893 FFD5B97B135CC97800D5E92A /* PageVisibilityState.h in Headers */, -
trunk/Source/WebCore/accessibility/AccessibilityNodeObject.cpp
r154525 r154581 35 35 #include "AccessibilitySpinButton.h" 36 36 #include "AccessibilityTable.h" 37 #include " ElementTraversal.h"37 #include "ChildIterator.h" 38 38 #include "EventNames.h" 39 39 #include "FloatRect.h" … … 418 418 // content. If it has no children or its only children are not elements 419 419 // (e.g. just text nodes), it doesn't have fallback content. 420 return !!ElementTraversal::firstChild(node);420 return elementChildren(node).begin() != elementChildren(node).end(); 421 421 } 422 422 … … 1122 1122 if (!parent) 1123 1123 return 0; 1124 1125 for ( Element* sibling = ElementTraversal::firstChild(parent); sibling; sibling = ElementTraversal::nextSibling(sibling)) {1124 1125 for (auto sibling = elementChildren(parent).begin(), end = elementChildren(parent).end(); sibling != end; ++sibling) { 1126 1126 const AtomicString& siblingAriaRole = sibling->fastGetAttribute(roleAttr); 1127 1127 if (equalIgnoringCase(siblingAriaRole, role)) 1128 return sibling;1128 return &*sibling; 1129 1129 } 1130 1130 -
trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp
r154580 r154581 38 38 #include "CachedImage.h" 39 39 #include "Chrome.h" 40 #include " ElementTraversal.h"40 #include "DescendantIterator.h" 41 41 #include "EventNames.h" 42 42 #include "FloatRect.h" … … 2738 2738 return; 2739 2739 2740 for ( HTMLAreaElement* current = Traversal<HTMLAreaElement>::firstWithin(map); current; current = Traversal<HTMLAreaElement>::next(current, map)) {2740 for (auto area = descendantsOfType<HTMLAreaElement>(map).begin(), end = descendantsOfType<HTMLAreaElement>(map).end() ; area != end; ++area) { 2741 2741 // add an <area> element for this child if it has a link 2742 if ( current->isLink()) {2743 AccessibilityImageMapLink* areaObject = static_cast<AccessibilityImageMapLink*>(axObjectCache()->getOrCreate(ImageMapLinkRole));2744 areaObject->setHTMLAreaElement(toHTMLAreaElement(current));2745 areaObject->setHTMLMapElement(map);2746 areaObject->setParent(this);2747 if (!areaObject->accessibilityIsIgnored())2748 m_children.append(areaObject);2749 else2750 axObjectCache()->remove(areaObject->axObjectID());2751 }2742 if (!area->isLink()) 2743 continue; 2744 AccessibilityImageMapLink* areaObject = static_cast<AccessibilityImageMapLink*>(axObjectCache()->getOrCreate(ImageMapLinkRole)); 2745 areaObject->setHTMLAreaElement(&*area); 2746 areaObject->setHTMLMapElement(map); 2747 areaObject->setParent(this); 2748 if (!areaObject->accessibilityIsIgnored()) 2749 m_children.append(areaObject); 2750 else 2751 axObjectCache()->remove(areaObject->axObjectID()); 2752 2752 } 2753 2753 } -
trunk/Source/WebCore/accessibility/AccessibilityTable.cpp
r154580 r154581 35 35 #include "AccessibilityTableHeaderContainer.h" 36 36 #include "AccessibilityTableRow.h" 37 #include " ElementTraversal.h"37 #include "ChildIterator.h" 38 38 #include "HTMLNames.h" 39 39 #include "HTMLTableCaptionElement.h" … … 126 126 127 127 // if there's a colgroup or col element, it's probably a data table. 128 for ( Element* child = ElementTraversal::firstChild(tableElement); child; child = ElementTraversal::nextSibling(child)) {128 for (auto child = elementChildren(tableElement).begin(), end = elementChildren(tableElement).end(); child != end; ++child) { 129 129 if (child->hasTagName(colTag) || child->hasTagName(colgroupTag)) 130 130 return true; -
trunk/Source/WebCore/dom/Document.cpp
r154573 r154581 38 38 #include "CachedCSSStyleSheet.h" 39 39 #include "CachedResourceLoader.h" 40 #include "ChildIterator.h" 40 41 #include "Chrome.h" 41 42 #include "ChromeClient.h" … … 50 51 #include "DOMWindow.h" 51 52 #include "DateComponents.h" 53 #include "DescendantIterator.h" 52 54 #include "Dictionary.h" 53 55 #include "DocumentEventQueue.h" … … 60 62 #include "Editor.h" 61 63 #include "Element.h" 62 #include "ElementTraversal.h"63 64 #include "EntityReference.h" 64 65 #include "Event.h" … … 678 679 ASSERT(scope); 679 680 ContainerNode* rootNode = scope->rootNode(); 680 for ( Element* element = ElementTraversal::firstWithin(rootNode); element; element = ElementTraversal::next(element, rootNode)) {681 for (auto element = elementDescendants(rootNode).begin(), end = elementDescendants(rootNode).end(); element != end; ++element) { 681 682 const AtomicString& accessKey = element->fastGetAttribute(accesskeyAttr); 682 683 if (!accessKey.isEmpty()) 683 m_elementsByAccessKey.set(accessKey.impl(), element);684 m_elementsByAccessKey.set(accessKey.impl(), &*element); 684 685 685 686 if (ShadowRoot* root = element->shadowRoot()) … … 777 778 ContainerNode::childrenChanged(changedByParser, beforeChange, afterChange, childCountDelta); 778 779 779 Element* newDocumentElement = ElementTraversal::firstWithin(this);780 Element* newDocumentElement = &*elementChildren(this).begin(); 780 781 if (newDocumentElement == m_documentElement) 781 782 return; … … 1977 1978 recalcStyle(Style::Force); 1978 1979 1979 for ( Element* child = ElementTraversal::firstWithin(this); child; child = ElementTraversal::nextSibling(child))1980 Style::attachRenderTree( child);1980 for (auto child = elementDescendants(this).begin(), end = elementDescendants(this).end(); child != end; ++child) 1981 Style::attachRenderTree(&*child); 1981 1982 1982 1983 setAttached(true); … … 2077 2078 TemporaryChange<bool> change(m_renderTreeBeingDestroyed, true); 2078 2079 2079 for ( Element* child = ElementTraversal::firstWithin(this); child; child = ElementTraversal::nextSibling(child))2080 Style::detachRenderTree( child);2080 for (auto child = elementDescendants(this).begin(), end = elementDescendants(this).end(); child != end; ++child) 2081 Style::detachRenderTree(&*child); 2081 2082 2082 2083 clearChildNeedsStyleRecalc(); -
trunk/Source/WebCore/editing/ApplyStyleCommand.cpp
r154439 r154581 32 32 #include "CSSValueKeywords.h" 33 33 #include "CSSValuePool.h" 34 #include "ChildIterator.h" 34 35 #include "Document.h" 35 36 #include "EditingStyle.h" 36 37 #include "Editor.h" 37 #include "ElementTraversal.h"38 38 #include "Frame.h" 39 39 #include "HTMLFontElement.h" … … 443 443 // cloned/split, the new node is always a sibling of it. Therefore, we scan 444 444 // all the children of the dummy's parent 445 Element* next; 446 for (Element* element = ElementTraversal::firstWithin(dummySpanAncestor); element; element = next) { 447 next = ElementTraversal::nextSibling(element); 448 if (isSpanWithoutAttributesOrUnstyledStyleSpan(element)) 449 removeNodePreservingChildren(element); 450 } 445 446 Vector<Element*> toRemove; 447 for (auto child = elementChildren(dummySpanAncestor).begin(), end = elementChildren(dummySpanAncestor).end(); child != end; ++child) { 448 if (isSpanWithoutAttributesOrUnstyledStyleSpan(&*child)) 449 toRemove.append(&*child); 450 } 451 for (unsigned i = 0; i < toRemove.size(); ++i) 452 removeNodePreservingChildren(toRemove[i]); 451 453 } 452 454 -
trunk/Source/WebCore/editing/markup.cpp
r154575 r154581 37 37 #include "ChildListMutationScope.h" 38 38 #include "ContextFeatures.h" 39 #include "DescendantIterator.h" 39 40 #include "DocumentFragment.h" 40 41 #include "DocumentType.h" 41 42 #include "Editor.h" 42 #include "ElementTraversal.h"43 43 #include "ExceptionCode.h" 44 44 #include "ExceptionCodePlaceholder.h" … … 104 104 KURL parsedBaseURL(ParsedURLString, baseURL); 105 105 106 for ( Element* element = ElementTraversal::firstWithin(fragment); element; element = ElementTraversal::next(element, fragment)) {106 for (auto element = elementDescendants(fragment).begin(), end = elementDescendants(fragment).end(); element != end; ++element) { 107 107 if (!element->hasAttributes()) 108 108 continue; … … 111 111 const Attribute& attribute = element->attributeAt(i); 112 112 if (element->isURLAttribute(attribute) && !attribute.value().isEmpty()) 113 changes.append(AttributeChange( element, attribute.name(), KURL(parsedBaseURL, attribute.value()).string()));113 changes.append(AttributeChange(&*element, attribute.name(), KURL(parsedBaseURL, attribute.value()).string())); 114 114 } 115 115 } -
trunk/Source/WebCore/html/HTMLMapElement.cpp
r154481 r154581 24 24 25 25 #include "Attribute.h" 26 #include "DescendantIterator.h" 26 27 #include "Document.h" 27 #include "ElementTraversal.h"28 28 #include "HTMLAreaElement.h" 29 29 #include "HTMLCollection.h" … … 63 63 { 64 64 HTMLAreaElement* defaultArea = 0; 65 for (HTMLAreaElement* area = Traversal<HTMLAreaElement>::firstWithin(this); area; area = Traversal<HTMLAreaElement>::next(area, this)) { 65 66 for (auto area = descendantsOfType<HTMLAreaElement>(this).begin(), end = descendantsOfType<HTMLAreaElement>(this).end(); area != end; ++area) { 66 67 if (area->isDefault()) { 67 68 if (!defaultArea) 68 defaultArea = area;69 defaultArea = &*area; 69 70 } else if (area->mapMouseEvent(location, size, result)) 70 71 return true; -
trunk/Source/WebCore/html/HTMLMediaElement.cpp
r154546 r154581 31 31 #include "ApplicationCacheResource.h" 32 32 #include "Attribute.h" 33 #include "ChildIterator.h" 33 34 #include "Chrome.h" 34 35 #include "ChromeClient.h" … … 41 42 #include "DiagnosticLoggingKeys.h" 42 43 #include "DocumentLoader.h" 43 #include "ElementTraversal.h"44 44 #include "Event.h" 45 45 #include "EventNames.h" … … 928 928 // element child, then let mode be children and let candidate be the first such 929 929 // source element child in tree order. 930 if (auto sourceElement = Traversal<HTMLSourceElement>::firstChild(this)) { 930 auto source = childrenOfType<HTMLSourceElement>(this).begin(); 931 if (source != childrenOfType<HTMLSourceElement>(this).end()) { 931 932 mode = children; 932 m_nextChildNodeToConsider = sourceElement;933 m_nextChildNodeToConsider = &*source; 933 934 m_currentSourceNode = 0; 934 935 } else { … … 1418 1419 if (track->trackType() == TextTrack::TrackElement) { 1419 1420 trackIsLoaded = false; 1420 for (auto trackElement = Traversal<HTMLTrackElement>::firstChild(this); trackElement; trackElement = Traversal<HTMLTrackElement>::nextSibling(trackElement)) { 1421 auto end = childrenOfType<HTMLTrackElement>(this).end(); 1422 for (auto trackElement = childrenOfType<HTMLTrackElement>(this).begin(); trackElement != end; ++trackElement) { 1421 1423 if (trackElement->track() == track) { 1422 1424 if (trackElement->readyState() == HTMLTrackElement::LOADING || trackElement->readyState() == HTMLTrackElement::LOADED)
Note:
See TracChangeset
for help on using the changeset viewer.