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

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

Issue 22508006: Refactor adding and removing named and IDed elements (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Address review comments Created 7 years, 4 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.h ('k') | Source/core/dom/TreeScope.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 Peter Kelly (pmk@post.com) 4 * (C) 2001 Peter Kelly (pmk@post.com)
5 * (C) 2001 Dirk Mueller (mueller@kde.org) 5 * (C) 2001 Dirk Mueller (mueller@kde.org)
6 * (C) 2007 David Smith (catfish.man@gmail.com) 6 * (C) 2007 David Smith (catfish.man@gmail.com)
7 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc. All rights reserved. 7 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc. All rights reserved.
8 * (C) 2007 Eric Seidel (eric@webkit.org) 8 * (C) 2007 Eric Seidel (eric@webkit.org)
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 1220 matching lines...) Expand 10 before | Expand all | Expand 10 after
1231 1231
1232 if (!insertionPoint->isInTreeScope()) 1232 if (!insertionPoint->isInTreeScope())
1233 return InsertionDone; 1233 return InsertionDone;
1234 1234
1235 if (hasRareData()) 1235 if (hasRareData())
1236 elementRareData()->clearClassListValueForQuirksMode(); 1236 elementRareData()->clearClassListValueForQuirksMode();
1237 1237
1238 if (isUpgradedCustomElement() && inDocument()) 1238 if (isUpgradedCustomElement() && inDocument())
1239 CustomElement::didEnterDocument(this, document()); 1239 CustomElement::didEnterDocument(this, document());
1240 1240
1241 TreeScope* scope = insertionPoint->treeScope(); 1241 if (insertionPoint->treeScope() != treeScope())
1242 if (scope != treeScope())
1243 return InsertionDone; 1242 return InsertionDone;
1244 1243
1244 HTMLDocument* newDocument = inDocument() && !isInShadowTree() && document()- >isHTMLDocument() ? toHTMLDocument(document()) : 0;
1245
1245 const AtomicString& idValue = getIdAttribute(); 1246 const AtomicString& idValue = getIdAttribute();
1246 if (!idValue.isNull()) 1247 if (!idValue.isNull()) {
1247 updateId(scope, nullAtom, idValue); 1248 updateIdForTreeScope(treeScope(), nullAtom, idValue);
1249 if (newDocument)
1250 updateIdForDocument(newDocument, nullAtom, idValue);
1251 }
1248 1252
1249 const AtomicString& nameValue = getNameAttribute(); 1253 const AtomicString& nameValue = getNameAttribute();
1250 if (!nameValue.isNull()) 1254 if (!nameValue.isNull()) {
1251 updateName(nullAtom, nameValue); 1255 updateNameForTreeScope(treeScope(), nullAtom, nameValue);
1256 if (newDocument)
1257 updateNameForDocument(newDocument, nullAtom, nameValue);
1258 }
1252 1259
1253 if (hasTagName(labelTag)) { 1260 if (hasTagName(labelTag)) {
1254 if (scope->shouldCacheLabelsByForAttribute()) 1261 if (treeScope()->shouldCacheLabelsByForAttribute())
1255 updateLabel(scope, nullAtom, fastGetAttribute(forAttr)); 1262 updateLabel(treeScope(), nullAtom, fastGetAttribute(forAttr));
1256 } 1263 }
1257 1264
1258 if (parentElement() && parentElement()->isInCanvasSubtree()) 1265 if (parentElement() && parentElement()->isInCanvasSubtree())
1259 setIsInCanvasSubtree(true); 1266 setIsInCanvasSubtree(true);
1260 1267
1261 return InsertionDone; 1268 return InsertionDone;
1262 } 1269 }
1263 1270
1264 void Element::removedFrom(ContainerNode* insertionPoint) 1271 void Element::removedFrom(ContainerNode* insertionPoint)
1265 { 1272 {
1266 bool wasInDocument = insertionPoint->inDocument(); 1273 bool wasInDocument = insertionPoint->inDocument();
1274 bool wasInShadowTree = isInShadowTree(); // Of course, we might still be in a shadow tree...
1267 1275
1268 if (Element* before = pseudoElement(BEFORE)) 1276 if (Element* before = pseudoElement(BEFORE))
1269 before->removedFrom(insertionPoint); 1277 before->removedFrom(insertionPoint);
1270 1278
1271 if (Element* after = pseudoElement(AFTER)) 1279 if (Element* after = pseudoElement(AFTER))
1272 after->removedFrom(insertionPoint); 1280 after->removedFrom(insertionPoint);
1273 1281
1274 if (Element* backdrop = pseudoElement(BACKDROP)) 1282 if (Element* backdrop = pseudoElement(BACKDROP))
1275 backdrop->removedFrom(insertionPoint); 1283 backdrop->removedFrom(insertionPoint);
1276 document()->removeFromTopLayer(this); 1284 document()->removeFromTopLayer(this);
1277 1285
1278 if (containsFullScreenElement()) 1286 if (containsFullScreenElement())
1279 setContainsFullScreenElementOnAncestorsCrossingFrameBoundaries(false); 1287 setContainsFullScreenElementOnAncestorsCrossingFrameBoundaries(false);
1280 1288
1281 if (document()->page()) 1289 if (document()->page())
1282 document()->page()->pointerLockController()->elementRemoved(this); 1290 document()->page()->pointerLockController()->elementRemoved(this);
1283 1291
1284 setSavedLayerScrollOffset(IntSize()); 1292 setSavedLayerScrollOffset(IntSize());
1285 1293
1286 if (insertionPoint->isInTreeScope() && treeScope() == document()) { 1294 if (insertionPoint->isInTreeScope() && treeScope() == document()) {
1295 TreeScope* oldScope = insertionPoint->treeScope();
1296 HTMLDocument* oldDocument = wasInDocument && !wasInShadowTree && oldScop e->documentScope()->isHTMLDocument() ? toHTMLDocument(oldScope->documentScope()) : 0;
1297
1287 const AtomicString& idValue = getIdAttribute(); 1298 const AtomicString& idValue = getIdAttribute();
1288 if (!idValue.isNull()) 1299 if (!idValue.isNull()) {
1289 updateId(insertionPoint->treeScope(), idValue, nullAtom); 1300 updateIdForTreeScope(oldScope, idValue, nullAtom);
1301 if (oldDocument)
1302 updateIdForDocument(oldDocument, idValue, nullAtom);
1303 }
1290 1304
1291 const AtomicString& nameValue = getNameAttribute(); 1305 const AtomicString& nameValue = getNameAttribute();
1292 if (!nameValue.isNull()) 1306 if (!nameValue.isNull()) {
1293 updateName(nameValue, nullAtom); 1307 updateNameForTreeScope(oldScope, nameValue, nullAtom);
1308 if (oldDocument)
1309 updateNameForDocument(oldDocument, nameValue, nullAtom);
1310 }
1294 1311
1295 if (hasTagName(labelTag)) { 1312 if (hasTagName(labelTag)) {
1296 TreeScope* treeScope = insertionPoint->treeScope(); 1313 if (oldScope->shouldCacheLabelsByForAttribute())
1297 if (treeScope->shouldCacheLabelsByForAttribute()) 1314 updateLabel(oldScope, fastGetAttribute(forAttr), nullAtom);
1298 updateLabel(treeScope, fastGetAttribute(forAttr), nullAtom);
1299 } 1315 }
1300 } 1316 }
1301 1317
1302 ContainerNode::removedFrom(insertionPoint); 1318 ContainerNode::removedFrom(insertionPoint);
1319
1303 if (wasInDocument) { 1320 if (wasInDocument) {
1304 if (hasPendingResources()) 1321 if (hasPendingResources())
1305 document()->accessSVGExtensions()->removeElementFromPendingResources (this); 1322 document()->accessSVGExtensions()->removeElementFromPendingResources (this);
1306 1323
1307 if (isUpgradedCustomElement()) 1324 if (isUpgradedCustomElement())
1308 CustomElement::didLeaveDocument(this, insertionPoint->document()); 1325 CustomElement::didLeaveDocument(this, insertionPoint->document());
1309 } 1326 }
1310 1327
1311 if (hasRareData()) 1328 if (hasRareData())
1312 elementRareData()->setIsInCanvasSubtree(false); 1329 elementRareData()->setIsInCanvasSubtree(false);
(...skipping 1440 matching lines...) Expand 10 before | Expand all | Expand 10 after
2753 } 2770 }
2754 #endif 2771 #endif
2755 2772
2756 #ifdef DUMP_NODE_STATISTICS 2773 #ifdef DUMP_NODE_STATISTICS
2757 bool Element::hasNamedNodeMap() const 2774 bool Element::hasNamedNodeMap() const
2758 { 2775 {
2759 return hasRareData() && elementRareData()->attributeMap(); 2776 return hasRareData() && elementRareData()->attributeMap();
2760 } 2777 }
2761 #endif 2778 #endif
2762 2779
2763 inline void Element::updateName(const AtomicString& oldName, const AtomicString& newName) 2780 void Element::updateName(const AtomicString& oldName, const AtomicString& newNam e)
2764 { 2781 {
2765 if (!inDocument() || isInShadowTree()) 2782 if (!isInTreeScope())
2766 return; 2783 return;
2767 2784
2768 if (oldName == newName) 2785 if (oldName == newName)
2769 return; 2786 return;
2770 2787
2788 updateNameForTreeScope(treeScope(), oldName, newName);
2789
2790 if (!inDocument() || isInShadowTree())
2791 return;
2792
2793 Document* htmlDocument = document();
2794 if (!htmlDocument->isHTMLDocument())
2795 return;
2796
2797 updateNameForDocument(toHTMLDocument(htmlDocument), oldName, newName);
2798 }
2799
2800 void Element::updateNameForTreeScope(TreeScope* scope, const AtomicString& oldNa me, const AtomicString& newName)
2801 {
2802 ASSERT(isInTreeScope());
2803 ASSERT(oldName != newName);
2804
2805 if (!oldName.isEmpty())
2806 scope->removeElementByName(oldName, this);
2807 if (!newName.isEmpty())
2808 scope->addElementByName(newName, this);
2809 }
2810
2811 void Element::updateNameForDocument(HTMLDocument* document, const AtomicString& oldName, const AtomicString& newName)
2812 {
2813 ASSERT(inDocument() && !isInShadowTree());
2814 ASSERT(oldName != newName);
2815
2771 if (shouldRegisterAsNamedItem()) 2816 if (shouldRegisterAsNamedItem())
2772 updateNamedItemRegistration(oldName, newName); 2817 updateNamedItemRegistration(oldName, newName);
2773 } 2818 }
2774 2819
2775 inline void Element::updateId(const AtomicString& oldId, const AtomicString& new Id) 2820 void Element::updateId(const AtomicString& oldId, const AtomicString& newId)
2776 { 2821 {
2777 if (!isInTreeScope()) 2822 if (!isInTreeScope())
2778 return; 2823 return;
2779 2824
2780 if (oldId == newId) 2825 if (oldId == newId)
2781 return; 2826 return;
2782 2827
2783 updateId(treeScope(), oldId, newId); 2828 updateIdForTreeScope(treeScope(), oldId, newId);
2829
2830 if (!inDocument() || isInShadowTree())
2831 return;
2832
2833 Document* htmlDocument = document();
2834 if (!htmlDocument->isHTMLDocument())
2835 return;
2836
2837 updateIdForDocument(toHTMLDocument(htmlDocument), oldId, newId);
2784 } 2838 }
2785 2839
2786 inline void Element::updateId(TreeScope* scope, const AtomicString& oldId, const AtomicString& newId) 2840 void Element::updateIdForTreeScope(TreeScope* scope, const AtomicString& oldId, const AtomicString& newId)
2787 { 2841 {
2788 ASSERT(isInTreeScope()); 2842 ASSERT(isInTreeScope());
2789 ASSERT(oldId != newId); 2843 ASSERT(oldId != newId);
2790 2844
2791 if (!oldId.isEmpty()) 2845 if (!oldId.isEmpty())
2792 scope->removeElementById(oldId, this); 2846 scope->removeElementById(oldId, this);
2793 if (!newId.isEmpty()) 2847 if (!newId.isEmpty())
2794 scope->addElementById(newId, this); 2848 scope->addElementById(newId, this);
2849 }
2850
2851 void Element::updateIdForDocument(HTMLDocument* document, const AtomicString& ol dId, const AtomicString& newId)
2852 {
2853 ASSERT(inDocument() && !isInShadowTree());
2854 ASSERT(oldId != newId);
2795 2855
2796 if (shouldRegisterAsExtraNamedItem()) 2856 if (shouldRegisterAsExtraNamedItem())
2797 updateExtraNamedItemRegistration(oldId, newId); 2857 updateExtraNamedItemRegistration(oldId, newId);
2798 } 2858 }
2799 2859
2800 void Element::updateLabel(TreeScope* scope, const AtomicString& oldForAttributeV alue, const AtomicString& newForAttributeValue) 2860 void Element::updateLabel(TreeScope* scope, const AtomicString& oldForAttributeV alue, const AtomicString& newForAttributeValue)
2801 { 2861 {
2802 ASSERT(hasTagName(labelTag)); 2862 ASSERT(hasTagName(labelTag));
2803 2863
2804 if (!inDocument()) 2864 if (!inDocument())
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
2875 if (oldDocument->inQuirksMode() != document()->inQuirksMode()) { 2935 if (oldDocument->inQuirksMode() != document()->inQuirksMode()) {
2876 if (hasID()) 2936 if (hasID())
2877 setIdAttribute(getIdAttribute()); 2937 setIdAttribute(getIdAttribute());
2878 if (hasClass()) 2938 if (hasClass())
2879 setAttribute(HTMLNames::classAttr, getClassAttribute()); 2939 setAttribute(HTMLNames::classAttr, getClassAttribute());
2880 } 2940 }
2881 } 2941 }
2882 2942
2883 void Element::updateNamedItemRegistration(const AtomicString& oldName, const Ato micString& newName) 2943 void Element::updateNamedItemRegistration(const AtomicString& oldName, const Ato micString& newName)
2884 { 2944 {
2885 if (!document()->isHTMLDocument()) 2945 ASSERT(document()->isHTMLDocument());
2886 return;
2887 2946
2888 if (!oldName.isEmpty()) 2947 if (!oldName.isEmpty())
2889 toHTMLDocument(document())->removeNamedItem(oldName); 2948 toHTMLDocument(document())->removeNamedItem(oldName);
2890 2949
2891 if (!newName.isEmpty()) 2950 if (!newName.isEmpty())
2892 toHTMLDocument(document())->addNamedItem(newName); 2951 toHTMLDocument(document())->addNamedItem(newName);
2893 } 2952 }
2894 2953
2895 void Element::updateExtraNamedItemRegistration(const AtomicString& oldId, const AtomicString& newId) 2954 void Element::updateExtraNamedItemRegistration(const AtomicString& oldId, const AtomicString& newId)
2896 { 2955 {
2897 if (!document()->isHTMLDocument()) 2956 ASSERT(document()->isHTMLDocument());
2898 return;
2899 2957
2900 if (!oldId.isEmpty()) 2958 if (!oldId.isEmpty())
2901 toHTMLDocument(document())->removeExtraNamedItem(oldId); 2959 toHTMLDocument(document())->removeExtraNamedItem(oldId);
2902 2960
2903 if (!newId.isEmpty()) 2961 if (!newId.isEmpty())
2904 toHTMLDocument(document())->addExtraNamedItem(newId); 2962 toHTMLDocument(document())->addExtraNamedItem(newId);
2905 } 2963 }
2906 2964
2907 PassRefPtr<HTMLCollection> Element::ensureCachedHTMLCollection(CollectionType ty pe) 2965 PassRefPtr<HTMLCollection> Element::ensureCachedHTMLCollection(CollectionType ty pe)
2908 { 2966 {
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
3026 { 3084 {
3027 if (hasSyntheticAttrChildNodes()) 3085 if (hasSyntheticAttrChildNodes())
3028 detachAllAttrNodesFromElement(); 3086 detachAllAttrNodesFromElement();
3029 3087
3030 other.synchronizeAllAttributes(); 3088 other.synchronizeAllAttributes();
3031 if (!other.m_elementData) { 3089 if (!other.m_elementData) {
3032 m_elementData.clear(); 3090 m_elementData.clear();
3033 return; 3091 return;
3034 } 3092 }
3035 3093
3094 // We can't update window and document's named item maps since the presence of image and object elements depend on other attributes and children.
3095 // Fortunately, those named item maps are only updated when this element is in the document, which should never be the case.
3096 ASSERT(!inDocument());
3097
3036 const AtomicString& oldID = getIdAttribute(); 3098 const AtomicString& oldID = getIdAttribute();
3037 const AtomicString& newID = other.getIdAttribute(); 3099 const AtomicString& newID = other.getIdAttribute();
3038 3100
3039 if (!oldID.isNull() || !newID.isNull()) 3101 if (!oldID.isNull() || !newID.isNull())
3040 updateId(oldID, newID); 3102 updateId(oldID, newID);
3041 3103
3042 const AtomicString& oldName = getNameAttribute(); 3104 const AtomicString& oldName = getNameAttribute();
3043 const AtomicString& newName = other.getNameAttribute(); 3105 const AtomicString& newName = other.getNameAttribute();
3044 3106
3045 if (!oldName.isNull() || !newName.isNull()) 3107 if (!oldName.isNull() || !newName.isNull())
(...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after
3642 return 0; 3704 return 0;
3643 } 3705 }
3644 3706
3645 Attribute* UniqueElementData::attributeItem(unsigned index) 3707 Attribute* UniqueElementData::attributeItem(unsigned index)
3646 { 3708 {
3647 ASSERT_WITH_SECURITY_IMPLICATION(index < length()); 3709 ASSERT_WITH_SECURITY_IMPLICATION(index < length());
3648 return &m_attributeVector.at(index); 3710 return &m_attributeVector.at(index);
3649 } 3711 }
3650 3712
3651 } // namespace WebCore 3713 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/dom/Element.h ('k') | Source/core/dom/TreeScope.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698