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

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

Issue 280123002: Oilpan: move LiveNodeList collections to the heap. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Have NodeRareData clear out NodeListsNodeData instead. Created 6 years, 7 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
« no previous file with comments | « Source/core/dom/ContainerNode.h ('k') | Source/core/dom/Document.h » ('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 Apple Inc. All rights reserv ed. 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv ed.
6 * 6 *
7 * This library is free software; you can redistribute it and/or 7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public 8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either 9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version. 10 * version 2 of the License, or (at your option) any later version.
(...skipping 897 matching lines...) Expand 10 before | Expand all | Expand 10 after
908 else if (isElementNode() && toElement(this)->childrenAffectedByHover()) 908 else if (isElementNode() && toElement(this)->childrenAffectedByHover())
909 document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().sched uleStyleInvalidationForPseudoChange(CSSSelector::PseudoHover, *toElement(this)); 909 document().ensureStyleResolver().ensureUpdatedRuleFeatureSet().sched uleStyleInvalidationForPseudoChange(CSSSelector::PseudoHover, *toElement(this));
910 else if (renderStyle()->affectedByHover()) 910 else if (renderStyle()->affectedByHover())
911 setNeedsStyleRecalc(LocalStyleChange); 911 setNeedsStyleRecalc(LocalStyleChange);
912 } 912 }
913 913
914 if (renderer()->style()->hasAppearance()) 914 if (renderer()->style()->hasAppearance())
915 RenderTheme::theme().stateChanged(renderer(), HoverControlState); 915 RenderTheme::theme().stateChanged(renderer(), HoverControlState);
916 } 916 }
917 917
918 PassRefPtr<HTMLCollection> ContainerNode::children() 918 PassRefPtrWillBeRawPtr<HTMLCollection> ContainerNode::children()
919 { 919 {
920 return ensureRareData().ensureNodeLists().addCache<HTMLCollection>(*this, No deChildren); 920 return ensureRareData().ensureNodeLists().addCache<HTMLCollection>(*this, No deChildren);
921 } 921 }
922 922
923 unsigned ContainerNode::countChildren() const 923 unsigned ContainerNode::countChildren() const
924 { 924 {
925 unsigned count = 0; 925 unsigned count = 0;
926 Node *n; 926 Node *n;
927 for (n = firstChild(); n; n = n->nextSibling()) 927 for (n = firstChild(); n; n = n->nextSibling())
928 count++; 928 count++;
(...skipping 15 matching lines...) Expand all
944 exceptionState.throwDOMException(SyntaxError, "The provided selector is empty."); 944 exceptionState.throwDOMException(SyntaxError, "The provided selector is empty.");
945 return nullptr; 945 return nullptr;
946 } 946 }
947 947
948 SelectorQuery* selectorQuery = document().selectorQueryCache().add(selectors , document(), exceptionState); 948 SelectorQuery* selectorQuery = document().selectorQueryCache().add(selectors , document(), exceptionState);
949 if (!selectorQuery) 949 if (!selectorQuery)
950 return nullptr; 950 return nullptr;
951 return selectorQuery->queryFirst(*this); 951 return selectorQuery->queryFirst(*this);
952 } 952 }
953 953
954 PassRefPtr<NodeList> ContainerNode::querySelectorAll(const AtomicString& selecto rs, ExceptionState& exceptionState) 954 PassRefPtrWillBeRawPtr<NodeList> ContainerNode::querySelectorAll(const AtomicStr ing& selectors, ExceptionState& exceptionState)
955 { 955 {
956 if (selectors.isEmpty()) { 956 if (selectors.isEmpty()) {
957 exceptionState.throwDOMException(SyntaxError, "The provided selector is empty."); 957 exceptionState.throwDOMException(SyntaxError, "The provided selector is empty.");
958 return nullptr; 958 return nullptr;
959 } 959 }
960 960
961 SelectorQuery* selectorQuery = document().selectorQueryCache().add(selectors , document(), exceptionState); 961 SelectorQuery* selectorQuery = document().selectorQueryCache().add(selectors , document(), exceptionState);
962 if (!selectorQuery) 962 if (!selectorQuery)
963 return nullptr; 963 return nullptr;
964 return selectorQuery->queryAll(*this); 964 return selectorQuery->queryAll(*this);
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
1139 } 1139 }
1140 1140
1141 // The + selector. We need to invalidate the first element following the ins ertion point. It is the only possible element 1141 // The + selector. We need to invalidate the first element following the ins ertion point. It is the only possible element
1142 // that could be affected by this DOM change. 1142 // that could be affected by this DOM change.
1143 if (childrenAffectedByDirectAdjacentRules() && afterChange) { 1143 if (childrenAffectedByDirectAdjacentRules() && afterChange) {
1144 if (Node* firstElementAfterInsertion = afterChange->isElementNode() ? af terChange : ElementTraversal::nextSibling(*afterChange)) 1144 if (Node* firstElementAfterInsertion = afterChange->isElementNode() ? af terChange : ElementTraversal::nextSibling(*afterChange))
1145 firstElementAfterInsertion->setNeedsStyleRecalc(SubtreeStyleChange); 1145 firstElementAfterInsertion->setNeedsStyleRecalc(SubtreeStyleChange);
1146 } 1146 }
1147 } 1147 }
1148 1148
1149 PassRefPtr<HTMLCollection> ContainerNode::getElementsByTagName(const AtomicStrin g& localName) 1149 PassRefPtrWillBeRawPtr<HTMLCollection> ContainerNode::getElementsByTagName(const AtomicString& localName)
1150 { 1150 {
1151 if (localName.isNull()) 1151 if (localName.isNull())
1152 return nullptr; 1152 return nullptr;
1153 1153
1154 if (document().isHTMLDocument()) 1154 if (document().isHTMLDocument())
1155 return ensureRareData().ensureNodeLists().addCache<HTMLTagCollection>(*t his, HTMLTagCollectionType, localName); 1155 return ensureRareData().ensureNodeLists().addCache<HTMLTagCollection>(*t his, HTMLTagCollectionType, localName);
1156 return ensureRareData().ensureNodeLists().addCache<TagCollection>(*this, Tag CollectionType, localName); 1156 return ensureRareData().ensureNodeLists().addCache<TagCollection>(*this, Tag CollectionType, localName);
1157 } 1157 }
1158 1158
1159 PassRefPtr<HTMLCollection> ContainerNode::getElementsByTagNameNS(const AtomicStr ing& namespaceURI, const AtomicString& localName) 1159 PassRefPtrWillBeRawPtr<HTMLCollection> ContainerNode::getElementsByTagNameNS(con st AtomicString& namespaceURI, const AtomicString& localName)
1160 { 1160 {
1161 if (localName.isNull()) 1161 if (localName.isNull())
1162 return nullptr; 1162 return nullptr;
1163 1163
1164 if (namespaceURI == starAtom) 1164 if (namespaceURI == starAtom)
1165 return getElementsByTagName(localName); 1165 return getElementsByTagName(localName);
1166 1166
1167 return ensureRareData().ensureNodeLists().addCache(*this, namespaceURI.isEmp ty() ? nullAtom : namespaceURI, localName); 1167 return ensureRareData().ensureNodeLists().addCache(*this, namespaceURI.isEmp ty() ? nullAtom : namespaceURI, localName);
1168 } 1168 }
1169 1169
1170 // Takes an AtomicString in argument because it is common for elements to share the same name attribute. 1170 // Takes an AtomicString in argument because it is common for elements to share the same name attribute.
1171 // Therefore, the NameNodeList factory function expects an AtomicString type. 1171 // Therefore, the NameNodeList factory function expects an AtomicString type.
1172 PassRefPtr<NodeList> ContainerNode::getElementsByName(const AtomicString& elemen tName) 1172 PassRefPtrWillBeRawPtr<NodeList> ContainerNode::getElementsByName(const AtomicSt ring& elementName)
1173 { 1173 {
1174 return ensureRareData().ensureNodeLists().addCache<NameNodeList>(*this, Name NodeListType, elementName); 1174 return ensureRareData().ensureNodeLists().addCache<NameNodeList>(*this, Name NodeListType, elementName);
1175 } 1175 }
1176 1176
1177 // Takes an AtomicString in argument because it is common for elements to share the same set of class names. 1177 // Takes an AtomicString in argument because it is common for elements to share the same set of class names.
1178 // Therefore, the ClassNodeList factory function expects an AtomicString type. 1178 // Therefore, the ClassNodeList factory function expects an AtomicString type.
1179 PassRefPtr<HTMLCollection> ContainerNode::getElementsByClassName(const AtomicStr ing& classNames) 1179 PassRefPtrWillBeRawPtr<HTMLCollection> ContainerNode::getElementsByClassName(con st AtomicString& classNames)
1180 { 1180 {
1181 return ensureRareData().ensureNodeLists().addCache<ClassCollection>(*this, C lassCollectionType, classNames); 1181 return ensureRareData().ensureNodeLists().addCache<ClassCollection>(*this, C lassCollectionType, classNames);
1182 } 1182 }
1183 1183
1184 PassRefPtr<RadioNodeList> ContainerNode::radioNodeList(const AtomicString& name, bool onlyMatchImgElements) 1184 PassRefPtrWillBeRawPtr<RadioNodeList> ContainerNode::radioNodeList(const AtomicS tring& name, bool onlyMatchImgElements)
1185 { 1185 {
1186 ASSERT(isHTMLFormElement(this) || isHTMLFieldSetElement(this)); 1186 ASSERT(isHTMLFormElement(this) || isHTMLFieldSetElement(this));
1187 CollectionType type = onlyMatchImgElements ? RadioImgNodeListType : RadioNod eListType; 1187 CollectionType type = onlyMatchImgElements ? RadioImgNodeListType : RadioNod eListType;
1188 return ensureRareData().ensureNodeLists().addCache<RadioNodeList>(*this, typ e, name); 1188 return ensureRareData().ensureNodeLists().addCache<RadioNodeList>(*this, typ e, name);
1189 } 1189 }
1190 1190
1191 Element* ContainerNode::getElementById(const AtomicString& id) const 1191 Element* ContainerNode::getElementById(const AtomicString& id) const
1192 { 1192 {
1193 if (isInTreeScope()) { 1193 if (isInTreeScope()) {
1194 // Fast path if we are in a tree scope: call getElementById() on tree sc ope 1194 // Fast path if we are in a tree scope: call getElementById() on tree sc ope
(...skipping 23 matching lines...) Expand all
1218 return true; 1218 return true;
1219 1219
1220 if (node->isElementNode() && toElement(node)->shadow()) 1220 if (node->isElementNode() && toElement(node)->shadow())
1221 return true; 1221 return true;
1222 1222
1223 return false; 1223 return false;
1224 } 1224 }
1225 #endif 1225 #endif
1226 1226
1227 } // namespace WebCore 1227 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/dom/ContainerNode.h ('k') | Source/core/dom/Document.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698