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

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

Issue 26852004: Have NodeRareData's ensureNodeLists() / ensureMutationObserverData() return a reference (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 2 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/dom/Element.cpp ('k') | Source/core/dom/NodeRareData.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, 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 362 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 return String(); 373 return String();
374 } 374 }
375 375
376 void Node::setNodeValue(const String&) 376 void Node::setNodeValue(const String&)
377 { 377 {
378 // By default, setting nodeValue has no effect. 378 // By default, setting nodeValue has no effect.
379 } 379 }
380 380
381 PassRefPtr<NodeList> Node::childNodes() 381 PassRefPtr<NodeList> Node::childNodes()
382 { 382 {
383 return ensureRareData().ensureNodeLists()->ensureChildNodeList(this); 383 return ensureRareData().ensureNodeLists().ensureChildNodeList(this);
384 } 384 }
385 385
386 Node *Node::lastDescendant() const 386 Node *Node::lastDescendant() const
387 { 387 {
388 Node *n = const_cast<Node *>(this); 388 Node *n = const_cast<Node *>(this);
389 while (n && n->lastChild()) 389 while (n && n->lastChild())
390 n = n->lastChild(); 390 n = n->lastChild();
391 return n; 391 return n;
392 } 392 }
393 393
(...skipping 802 matching lines...) Expand 10 before | Expand all | Expand 10 after
1196 } 1196 }
1197 1197
1198 // FIXME: End of obviously misplaced HTML editing functions. Try to move these out of Node. 1198 // FIXME: End of obviously misplaced HTML editing functions. Try to move these out of Node.
1199 1199
1200 PassRefPtr<NodeList> Node::getElementsByTagName(const AtomicString& localName) 1200 PassRefPtr<NodeList> Node::getElementsByTagName(const AtomicString& localName)
1201 { 1201 {
1202 if (localName.isNull()) 1202 if (localName.isNull())
1203 return 0; 1203 return 0;
1204 1204
1205 if (document().isHTMLDocument()) 1205 if (document().isHTMLDocument())
1206 return ensureRareData().ensureNodeLists()->addCacheWithAtomicName<HTMLTa gNodeList>(this, HTMLTagNodeListType, localName); 1206 return ensureRareData().ensureNodeLists().addCacheWithAtomicName<HTMLTag NodeList>(this, HTMLTagNodeListType, localName);
1207 return ensureRareData().ensureNodeLists()->addCacheWithAtomicName<TagNodeLis t>(this, TagNodeListType, localName); 1207 return ensureRareData().ensureNodeLists().addCacheWithAtomicName<TagNodeList >(this, TagNodeListType, localName);
1208 } 1208 }
1209 1209
1210 PassRefPtr<NodeList> Node::getElementsByTagNameNS(const AtomicString& namespaceU RI, const AtomicString& localName) 1210 PassRefPtr<NodeList> Node::getElementsByTagNameNS(const AtomicString& namespaceU RI, const AtomicString& localName)
1211 { 1211 {
1212 if (localName.isNull()) 1212 if (localName.isNull())
1213 return 0; 1213 return 0;
1214 1214
1215 if (namespaceURI == starAtom) 1215 if (namespaceURI == starAtom)
1216 return getElementsByTagName(localName); 1216 return getElementsByTagName(localName);
1217 1217
1218 return ensureRareData().ensureNodeLists()->addCacheWithQualifiedName(this, n amespaceURI.isEmpty() ? nullAtom : namespaceURI, localName); 1218 return ensureRareData().ensureNodeLists().addCacheWithQualifiedName(this, na mespaceURI.isEmpty() ? nullAtom : namespaceURI, localName);
1219 } 1219 }
1220 1220
1221 PassRefPtr<NodeList> Node::getElementsByName(const String& elementName) 1221 PassRefPtr<NodeList> Node::getElementsByName(const String& elementName)
1222 { 1222 {
1223 return ensureRareData().ensureNodeLists()->addCacheWithAtomicName<NameNodeLi st>(this, NameNodeListType, elementName); 1223 return ensureRareData().ensureNodeLists().addCacheWithAtomicName<NameNodeLis t>(this, NameNodeListType, elementName);
1224 } 1224 }
1225 1225
1226 PassRefPtr<NodeList> Node::getElementsByClassName(const String& classNames) 1226 PassRefPtr<NodeList> Node::getElementsByClassName(const String& classNames)
1227 { 1227 {
1228 return ensureRareData().ensureNodeLists()->addCacheWithName<ClassNodeList>(t his, ClassNodeListType, classNames); 1228 return ensureRareData().ensureNodeLists().addCacheWithName<ClassNodeList>(th is, ClassNodeListType, classNames);
1229 } 1229 }
1230 1230
1231 PassRefPtr<RadioNodeList> Node::radioNodeList(const AtomicString& name) 1231 PassRefPtr<RadioNodeList> Node::radioNodeList(const AtomicString& name)
1232 { 1232 {
1233 ASSERT(hasTagName(formTag) || hasTagName(fieldsetTag)); 1233 ASSERT(hasTagName(formTag) || hasTagName(fieldsetTag));
1234 return ensureRareData().ensureNodeLists()->addCacheWithAtomicName<RadioNodeL ist>(this, RadioNodeListType, name); 1234 return ensureRareData().ensureNodeLists().addCacheWithAtomicName<RadioNodeLi st>(this, RadioNodeListType, name);
1235 } 1235 }
1236 1236
1237 PassRefPtr<Element> Node::querySelector(const AtomicString& selectors, Exception State& es) 1237 PassRefPtr<Element> Node::querySelector(const AtomicString& selectors, Exception State& es)
1238 { 1238 {
1239 if (selectors.isEmpty()) { 1239 if (selectors.isEmpty()) {
1240 es.throwDOMException(SyntaxError, ExceptionMessages::failedToExecute("qu erySelector", "Node", "The provided selector is empty.")); 1240 es.throwDOMException(SyntaxError, ExceptionMessages::failedToExecute("qu erySelector", "Node", "The provided selector is empty."));
1241 return 0; 1241 return 0;
1242 } 1242 }
1243 1243
1244 SelectorQuery* selectorQuery = document().selectorQueryCache()->add(selector s, document(), es); 1244 SelectorQuery* selectorQuery = document().selectorQueryCache()->add(selector s, document(), es);
(...skipping 908 matching lines...) Expand 10 before | Expand all | Expand 10 after
2153 collectMatchingObserversForMutation(observers, transientMutationObserverRegi stry(), this, type, attributeName); 2153 collectMatchingObserversForMutation(observers, transientMutationObserverRegi stry(), this, type, attributeName);
2154 for (Node* node = parentNode(); node; node = node->parentNode()) { 2154 for (Node* node = parentNode(); node; node = node->parentNode()) {
2155 collectMatchingObserversForMutation(observers, node->mutationObserverReg istry(), this, type, attributeName); 2155 collectMatchingObserversForMutation(observers, node->mutationObserverReg istry(), this, type, attributeName);
2156 collectMatchingObserversForMutation(observers, node->transientMutationOb serverRegistry(), this, type, attributeName); 2156 collectMatchingObserversForMutation(observers, node->transientMutationOb serverRegistry(), this, type, attributeName);
2157 } 2157 }
2158 } 2158 }
2159 2159
2160 void Node::registerMutationObserver(MutationObserver* observer, MutationObserver Options options, const HashSet<AtomicString>& attributeFilter) 2160 void Node::registerMutationObserver(MutationObserver* observer, MutationObserver Options options, const HashSet<AtomicString>& attributeFilter)
2161 { 2161 {
2162 MutationObserverRegistration* registration = 0; 2162 MutationObserverRegistration* registration = 0;
2163 Vector<OwnPtr<MutationObserverRegistration> >& registry = ensureRareData().e nsureMutationObserverData()->registry; 2163 Vector<OwnPtr<MutationObserverRegistration> >& registry = ensureRareData().e nsureMutationObserverData().registry;
2164 for (size_t i = 0; i < registry.size(); ++i) { 2164 for (size_t i = 0; i < registry.size(); ++i) {
2165 if (registry[i]->observer() == observer) { 2165 if (registry[i]->observer() == observer) {
2166 registration = registry[i].get(); 2166 registration = registry[i].get();
2167 registration->resetObservation(options, attributeFilter); 2167 registration->resetObservation(options, attributeFilter);
2168 } 2168 }
2169 } 2169 }
2170 2170
2171 if (!registration) { 2171 if (!registration) {
2172 registry.append(MutationObserverRegistration::create(observer, this, opt ions, attributeFilter)); 2172 registry.append(MutationObserverRegistration::create(observer, this, opt ions, attributeFilter));
2173 registration = registry.last().get(); 2173 registration = registry.last().get();
(...skipping 16 matching lines...) Expand all
2190 2190
2191 // Deleting the registration may cause this node to be derefed, so we must m ake sure the Vector operation completes 2191 // Deleting the registration may cause this node to be derefed, so we must m ake sure the Vector operation completes
2192 // before that, in case |this| is destroyed (see MutationObserverRegistratio n::m_registrationNodeKeepAlive). 2192 // before that, in case |this| is destroyed (see MutationObserverRegistratio n::m_registrationNodeKeepAlive).
2193 // FIXME: Simplify the registration/transient registration logic to make thi s understandable by humans. 2193 // FIXME: Simplify the registration/transient registration logic to make thi s understandable by humans.
2194 RefPtr<Node> protect(this); 2194 RefPtr<Node> protect(this);
2195 registry->remove(index); 2195 registry->remove(index);
2196 } 2196 }
2197 2197
2198 void Node::registerTransientMutationObserver(MutationObserverRegistration* regis tration) 2198 void Node::registerTransientMutationObserver(MutationObserverRegistration* regis tration)
2199 { 2199 {
2200 ensureRareData().ensureMutationObserverData()->transientRegistry.add(registr ation); 2200 ensureRareData().ensureMutationObserverData().transientRegistry.add(registra tion);
2201 } 2201 }
2202 2202
2203 void Node::unregisterTransientMutationObserver(MutationObserverRegistration* reg istration) 2203 void Node::unregisterTransientMutationObserver(MutationObserverRegistration* reg istration)
2204 { 2204 {
2205 HashSet<MutationObserverRegistration*>* transientRegistry = transientMutatio nObserverRegistry(); 2205 HashSet<MutationObserverRegistration*>* transientRegistry = transientMutatio nObserverRegistry();
2206 ASSERT(transientRegistry); 2206 ASSERT(transientRegistry);
2207 if (!transientRegistry) 2207 if (!transientRegistry)
2208 return; 2208 return;
2209 2209
2210 ASSERT(transientRegistry->contains(registration)); 2210 ASSERT(transientRegistry->contains(registration));
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after
2624 node->showTreeForThis(); 2624 node->showTreeForThis();
2625 } 2625 }
2626 2626
2627 void showNodePath(const WebCore::Node* node) 2627 void showNodePath(const WebCore::Node* node)
2628 { 2628 {
2629 if (node) 2629 if (node)
2630 node->showNodePathForThis(); 2630 node->showNodePathForThis();
2631 } 2631 }
2632 2632
2633 #endif 2633 #endif
OLDNEW
« no previous file with comments | « Source/core/dom/Element.cpp ('k') | Source/core/dom/NodeRareData.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698