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

Side by Side Diff: sky/engine/core/dom/Element.cpp

Issue 697773002: Remove Element#attributes. (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: fix template binding. Created 6 years, 1 month 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 | « sky/engine/core/dom/Element.h ('k') | sky/engine/core/dom/Element.idl » ('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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 #include "core/css/resolver/StyleResolver.h" 42 #include "core/css/resolver/StyleResolver.h"
43 #include "core/dom/Attr.h" 43 #include "core/dom/Attr.h"
44 #include "core/dom/ClientRect.h" 44 #include "core/dom/ClientRect.h"
45 #include "core/dom/ClientRectList.h" 45 #include "core/dom/ClientRectList.h"
46 #include "core/dom/ElementDataCache.h" 46 #include "core/dom/ElementDataCache.h"
47 #include "core/dom/ElementRareData.h" 47 #include "core/dom/ElementRareData.h"
48 #include "core/dom/ElementTraversal.h" 48 #include "core/dom/ElementTraversal.h"
49 #include "core/dom/ExceptionCode.h" 49 #include "core/dom/ExceptionCode.h"
50 #include "core/dom/MutationObserverInterestGroup.h" 50 #include "core/dom/MutationObserverInterestGroup.h"
51 #include "core/dom/MutationRecord.h" 51 #include "core/dom/MutationRecord.h"
52 #include "core/dom/NamedNodeMap.h"
53 #include "core/dom/NodeRenderStyle.h" 52 #include "core/dom/NodeRenderStyle.h"
54 #include "core/dom/RenderTreeBuilder.h" 53 #include "core/dom/RenderTreeBuilder.h"
55 #include "core/dom/SelectorQuery.h" 54 #include "core/dom/SelectorQuery.h"
56 #include "core/dom/StyleEngine.h" 55 #include "core/dom/StyleEngine.h"
57 #include "core/dom/Text.h" 56 #include "core/dom/Text.h"
58 #include "core/dom/custom/CustomElement.h" 57 #include "core/dom/custom/CustomElement.h"
59 #include "core/dom/custom/CustomElementRegistrationContext.h" 58 #include "core/dom/custom/CustomElementRegistrationContext.h"
60 #include "core/dom/shadow/InsertionPoint.h" 59 #include "core/dom/shadow/InsertionPoint.h"
61 #include "core/dom/shadow/ShadowRoot.h" 60 #include "core/dom/shadow/ShadowRoot.h"
62 #include "core/editing/FrameSelection.h" 61 #include "core/editing/FrameSelection.h"
(...skipping 25 matching lines...) Expand all
88 #include "platform/UserGestureIndicator.h" 87 #include "platform/UserGestureIndicator.h"
89 #include "platform/scroll/ScrollableArea.h" 88 #include "platform/scroll/ScrollableArea.h"
90 #include "wtf/BitVector.h" 89 #include "wtf/BitVector.h"
91 #include "wtf/HashFunctions.h" 90 #include "wtf/HashFunctions.h"
92 #include "wtf/text/CString.h" 91 #include "wtf/text/CString.h"
93 #include "wtf/text/StringBuilder.h" 92 #include "wtf/text/StringBuilder.h"
94 #include "wtf/text/TextPosition.h" 93 #include "wtf/text/TextPosition.h"
95 94
96 namespace blink { 95 namespace blink {
97 96
98 typedef Vector<RefPtr<Attr> > AttrNodeList;
99
100 static Attr* findAttrNodeInList(const AttrNodeList& attrNodeList, const Qualifie dName& name)
101 {
102 AttrNodeList::const_iterator end = attrNodeList.end();
103 for (AttrNodeList::const_iterator it = attrNodeList.begin(); it != end; ++it ) {
104 if ((*it)->name() == name.localName())
105 return it->get();
106 }
107 return 0;
108 }
109
110 PassRefPtr<Element> Element::create(const QualifiedName& tagName, Document* docu ment) 97 PassRefPtr<Element> Element::create(const QualifiedName& tagName, Document* docu ment)
111 { 98 {
112 return adoptRef(new Element(tagName, document, CreateElement)); 99 return adoptRef(new Element(tagName, document, CreateElement));
113 } 100 }
114 101
115 Element::Element(const QualifiedName& tagName, Document* document, ConstructionT ype type) 102 Element::Element(const QualifiedName& tagName, Document* document, ConstructionT ype type)
116 : ContainerNode(document, type) 103 : ContainerNode(document, type)
117 , m_tagName(tagName) 104 , m_tagName(tagName)
118 { 105 {
119 ScriptWrappable::init(this); 106 ScriptWrappable::init(this);
120 } 107 }
121 108
122 Element::~Element() 109 Element::~Element()
123 { 110 {
124 ASSERT(needsAttach()); 111 ASSERT(needsAttach());
125 112
126 #if !ENABLE(OILPAN) 113 #if !ENABLE(OILPAN)
127 if (hasRareData()) 114 if (hasRareData())
128 elementRareData()->clearShadow(); 115 elementRareData()->clearShadow();
129 116
130 if (isCustomElement()) 117 if (isCustomElement())
131 CustomElement::wasDestroyed(this); 118 CustomElement::wasDestroyed(this);
132
133 if (hasSyntheticAttrChildNodes())
134 detachAllAttrNodesFromElement();
135 #endif 119 #endif
136 } 120 }
137 121
138 inline ElementRareData* Element::elementRareData() const 122 inline ElementRareData* Element::elementRareData() const
139 { 123 {
140 ASSERT(hasRareData()); 124 ASSERT(hasRareData());
141 return static_cast<ElementRareData*>(rareData()); 125 return static_cast<ElementRareData*>(rareData());
142 } 126 }
143 127
144 inline ElementRareData& Element::ensureElementRareData() 128 inline ElementRareData& Element::ensureElementRareData()
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 } 235 }
252 236
253 void Element::setBooleanAttribute(const QualifiedName& name, bool value) 237 void Element::setBooleanAttribute(const QualifiedName& name, bool value)
254 { 238 {
255 if (value) 239 if (value)
256 setAttribute(name, emptyAtom); 240 setAttribute(name, emptyAtom);
257 else 241 else
258 removeAttribute(name); 242 removeAttribute(name);
259 } 243 }
260 244
261 NamedNodeMap* Element::attributesForBindings() const
262 {
263 ElementRareData& rareData = const_cast<Element*>(this)->ensureElementRareDat a();
264 if (NamedNodeMap* attributeMap = rareData.attributeMap())
265 return attributeMap;
266
267 rareData.setAttributeMap(NamedNodeMap::create(const_cast<Element*>(this)));
268 return rareData.attributeMap();
269 }
270
271 ActiveAnimations* Element::activeAnimations() const 245 ActiveAnimations* Element::activeAnimations() const
272 { 246 {
273 if (hasRareData()) 247 if (hasRareData())
274 return elementRareData()->activeAnimations(); 248 return elementRareData()->activeAnimations();
275 return 0; 249 return 0;
276 } 250 }
277 251
278 ActiveAnimations& Element::ensureActiveAnimations() 252 ActiveAnimations& Element::ensureActiveAnimations()
279 { 253 {
280 ElementRareData& rareData = ensureElementRareData(); 254 ElementRareData& rareData = ensureElementRareData();
(...skipping 943 matching lines...) Expand 10 before | Expand all | Expand 10 after
1224 if (result.length() > 0) 1198 if (result.length() > 0)
1225 result.appendLiteral("; "); 1199 result.appendLiteral("; ");
1226 result.appendLiteral("class="); 1200 result.appendLiteral("class=");
1227 result.append(s); 1201 result.append(s);
1228 } 1202 }
1229 1203
1230 strncpy(buffer, result.toString().utf8().data(), length - 1); 1204 strncpy(buffer, result.toString().utf8().data(), length - 1);
1231 } 1205 }
1232 #endif 1206 #endif
1233 1207
1234 Vector<RefPtr<Attr> >* Element::attrNodeList()
1235 {
1236 return hasRareData() ? elementRareData()->attrNodeList() : 0;
1237 }
1238
1239 Vector<RefPtr<Attr> >& Element::ensureAttrNodeList()
1240 {
1241 setHasSyntheticAttrChildNodes(true);
1242 return ensureElementRareData().ensureAttrNodeList();
1243 }
1244
1245 void Element::removeAttrNodeList()
1246 {
1247 ASSERT(hasSyntheticAttrChildNodes());
1248 if (hasRareData())
1249 elementRareData()->removeAttrNodeList();
1250 setHasSyntheticAttrChildNodes(false);
1251 }
1252
1253 void Element::parseAttribute(const QualifiedName& name, const AtomicString& valu e) 1208 void Element::parseAttribute(const QualifiedName& name, const AtomicString& valu e)
1254 { 1209 {
1255 if (name == HTMLNames::tabindexAttr) { 1210 if (name == HTMLNames::tabindexAttr) {
1256 int tabindex = 0; 1211 int tabindex = 0;
1257 if (value.isEmpty()) { 1212 if (value.isEmpty()) {
1258 clearTabIndexExplicitlyIfNeeded(); 1213 clearTabIndexExplicitlyIfNeeded();
1259 if (treeScope().adjustedFocusedElement() == this) { 1214 if (treeScope().adjustedFocusedElement() == this) {
1260 // We might want to call blur(), but it's dangerous to dispatch 1215 // We might want to call blur(), but it's dangerous to dispatch
1261 // events here. 1216 // events here.
1262 document().setNeedsFocusedElementCheck(); 1217 document().setNeedsFocusedElementCheck();
(...skipping 23 matching lines...) Expand all
1286 ASSERT_WITH_SECURITY_IMPLICATION(index < attributes.size()); 1241 ASSERT_WITH_SECURITY_IMPLICATION(index < attributes.size());
1287 1242
1288 QualifiedName name = attributes[index].name(); 1243 QualifiedName name = attributes[index].name();
1289 AtomicString valueBeingRemoved = attributes[index].value(); 1244 AtomicString valueBeingRemoved = attributes[index].value();
1290 1245
1291 if (!inSynchronizationOfLazyAttribute) { 1246 if (!inSynchronizationOfLazyAttribute) {
1292 if (!valueBeingRemoved.isNull()) 1247 if (!valueBeingRemoved.isNull())
1293 willModifyAttribute(name, valueBeingRemoved, nullAtom); 1248 willModifyAttribute(name, valueBeingRemoved, nullAtom);
1294 } 1249 }
1295 1250
1296 if (RefPtr<Attr> attrNode = attrIfExists(name))
1297 attrNode->detachFromElement();
1298
1299 attributes.remove(index); 1251 attributes.remove(index);
1300 1252
1301 if (!inSynchronizationOfLazyAttribute) 1253 if (!inSynchronizationOfLazyAttribute)
1302 attributeChanged(name, nullAtom); 1254 attributeChanged(name, nullAtom);
1303 } 1255 }
1304 1256
1305 void Element::appendAttributeInternal(const QualifiedName& name, const AtomicStr ing& value, SynchronizationOfLazyAttribute inSynchronizationOfLazyAttribute) 1257 void Element::appendAttributeInternal(const QualifiedName& name, const AtomicStr ing& value, SynchronizationOfLazyAttribute inSynchronizationOfLazyAttribute)
1306 { 1258 {
1307 if (!inSynchronizationOfLazyAttribute) 1259 if (!inSynchronizationOfLazyAttribute)
1308 willModifyAttribute(name, nullAtom, value); 1260 willModifyAttribute(name, nullAtom, value);
(...skipping 17 matching lines...) Expand all
1326 removeAttributeInternal(index, NotInSynchronizationOfLazyAttribute); 1278 removeAttributeInternal(index, NotInSynchronizationOfLazyAttribute);
1327 } 1279 }
1328 1280
1329 Vector<RefPtr<Attr>> Element::getAttributes() 1281 Vector<RefPtr<Attr>> Element::getAttributes()
1330 { 1282 {
1331 if (!elementData()) 1283 if (!elementData())
1332 return Vector<RefPtr<Attr>>(); 1284 return Vector<RefPtr<Attr>>();
1333 synchronizeAllAttributes(); 1285 synchronizeAllAttributes();
1334 Vector<RefPtr<Attr>> attributes; 1286 Vector<RefPtr<Attr>> attributes;
1335 for (const Attribute& attribute : elementData()->attributes()) 1287 for (const Attribute& attribute : elementData()->attributes())
1336 attributes.append(ensureAttr(attribute.name())); 1288 attributes.append(Attr::create(attribute.name(), attribute.value()));
1337 return attributes; 1289 return attributes;
1338 } 1290 }
1339 1291
1340 PassRefPtr<Attr> Element::getAttributeNode(const AtomicString& localName)
1341 {
1342 if (!elementData())
1343 return nullptr;
1344 synchronizeAttribute(localName);
1345 const Attribute* attribute = elementData()->attributes().find(localName);
1346 if (!attribute)
1347 return nullptr;
1348 return ensureAttr(attribute->name());
1349 }
1350
1351 void Element::focus(bool restorePreviousSelection, FocusType type) 1292 void Element::focus(bool restorePreviousSelection, FocusType type)
1352 { 1293 {
1353 if (!inDocument()) 1294 if (!inDocument())
1354 return; 1295 return;
1355 1296
1356 if (document().focusedElement() == this) 1297 if (document().focusedElement() == this)
1357 return; 1298 return;
1358 1299
1359 if (!document().isActive()) 1300 if (!document().isActive())
1360 return; 1301 return;
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
1609 } while (n && value.isNull()); 1550 } while (n && value.isNull());
1610 1551
1611 return value; 1552 return value;
1612 } 1553 }
1613 1554
1614 Locale& Element::locale() const 1555 Locale& Element::locale() const
1615 { 1556 {
1616 return document().getCachedLocale(computeInheritedLanguage()); 1557 return document().getCachedLocale(computeInheritedLanguage());
1617 } 1558 }
1618 1559
1619 void Element::normalizeAttributes()
1620 {
1621 if (!hasAttributes())
1622 return;
1623 Vector<RefPtr<Attr> >* attrNodes = attrNodeList();
1624 if (!attrNodes)
1625 return;
1626 // Copy the Attr Vector because Node::normalize() can fire synchronous JS
1627 // events (e.g. DOMSubtreeModified) and a JS listener could add / remove
1628 // attributes while we are iterating.
1629 Vector<RefPtr<Attr> > attrNodesCopy(*attrNodes);
1630 for (size_t i = 0; i < attrNodesCopy.size(); ++i)
1631 attrNodesCopy[i]->normalize();
1632 }
1633
1634 bool Element::matches(const String& selectors, ExceptionState& exceptionState) 1560 bool Element::matches(const String& selectors, ExceptionState& exceptionState)
1635 { 1561 {
1636 SelectorQuery* selectorQuery = document().selectorQueryCache().add(AtomicStr ing(selectors), document(), exceptionState); 1562 SelectorQuery* selectorQuery = document().selectorQueryCache().add(AtomicStr ing(selectors), document(), exceptionState);
1637 if (!selectorQuery) 1563 if (!selectorQuery)
1638 return false; 1564 return false;
1639 return selectorQuery->matches(*this); 1565 return selectorQuery->matches(*this);
1640 } 1566 }
1641 1567
1642 DOMTokenList& Element::classList() 1568 DOMTokenList& Element::classList()
1643 { 1569 {
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
1738 case SpellcheckAttributeFalse: 1664 case SpellcheckAttributeFalse:
1739 return false; 1665 return false;
1740 case SpellcheckAttributeDefault: 1666 case SpellcheckAttributeDefault:
1741 break; 1667 break;
1742 } 1668 }
1743 } 1669 }
1744 1670
1745 return true; 1671 return true;
1746 } 1672 }
1747 1673
1748 #ifdef DUMP_NODE_STATISTICS
1749 bool Element::hasNamedNodeMap() const
1750 {
1751 return hasRareData() && elementRareData()->attributeMap();
1752 }
1753 #endif
1754
1755 inline void Element::updateId(const AtomicString& oldId, const AtomicString& new Id) 1674 inline void Element::updateId(const AtomicString& oldId, const AtomicString& new Id)
1756 { 1675 {
1757 if (!isInTreeScope()) 1676 if (!isInTreeScope())
1758 return; 1677 return;
1759 1678
1760 if (oldId == newId) 1679 if (oldId == newId)
1761 return; 1680 return;
1762 1681
1763 updateId(treeScope(), oldId, newId); 1682 updateId(treeScope(), oldId, newId);
1764 } 1683 }
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1832 return hasRareData() ? elementRareData()->savedLayerScrollOffset() : IntSize (); 1751 return hasRareData() ? elementRareData()->savedLayerScrollOffset() : IntSize ();
1833 } 1752 }
1834 1753
1835 void Element::setSavedLayerScrollOffset(const IntSize& size) 1754 void Element::setSavedLayerScrollOffset(const IntSize& size)
1836 { 1755 {
1837 if (size.isZero() && !hasRareData()) 1756 if (size.isZero() && !hasRareData())
1838 return; 1757 return;
1839 ensureElementRareData().setSavedLayerScrollOffset(size); 1758 ensureElementRareData().setSavedLayerScrollOffset(size);
1840 } 1759 }
1841 1760
1842 PassRefPtr<Attr> Element::attrIfExists(const QualifiedName& name)
1843 {
1844 if (AttrNodeList* attrNodeList = this->attrNodeList())
1845 return findAttrNodeInList(*attrNodeList, name);
1846 return nullptr;
1847 }
1848
1849 PassRefPtr<Attr> Element::ensureAttr(const QualifiedName& name)
1850 {
1851 AttrNodeList& attrNodeList = ensureAttrNodeList();
1852 RefPtr<Attr> attrNode = findAttrNodeInList(attrNodeList, name);
1853 if (!attrNode) {
1854 attrNode = Attr::create(*this, name);
1855 treeScope().adoptIfNeeded(*attrNode);
1856 attrNodeList.append(attrNode);
1857 }
1858 return attrNode.release();
1859 }
1860
1861 void Element::detachAllAttrNodesFromElement()
1862 {
1863 AttrNodeList* list = this->attrNodeList();
1864 ASSERT(list);
1865
1866 for (unsigned i = 0; i < list->size(); ++i)
1867 list->at(i)->detachFromElement();
1868 removeAttrNodeList();
1869 }
1870
1871 void Element::willRecalcStyle(StyleRecalcChange) 1761 void Element::willRecalcStyle(StyleRecalcChange)
1872 { 1762 {
1873 ASSERT(hasCustomStyleCallbacks()); 1763 ASSERT(hasCustomStyleCallbacks());
1874 } 1764 }
1875 1765
1876 void Element::didRecalcStyle(StyleRecalcChange) 1766 void Element::didRecalcStyle(StyleRecalcChange)
1877 { 1767 {
1878 ASSERT(hasCustomStyleCallbacks()); 1768 ASSERT(hasCustomStyleCallbacks());
1879 } 1769 }
1880 1770
1881 1771
1882 PassRefPtr<RenderStyle> Element::customStyleForRenderer() 1772 PassRefPtr<RenderStyle> Element::customStyleForRenderer()
1883 { 1773 {
1884 ASSERT(hasCustomStyleCallbacks()); 1774 ASSERT(hasCustomStyleCallbacks());
1885 return nullptr; 1775 return nullptr;
1886 } 1776 }
1887 1777
1888 void Element::cloneAttributesFromElement(const Element& other) 1778 void Element::cloneAttributesFromElement(const Element& other)
1889 { 1779 {
1890 if (hasSyntheticAttrChildNodes())
1891 detachAllAttrNodesFromElement();
1892
1893 other.synchronizeAllAttributes(); 1780 other.synchronizeAllAttributes();
1894 if (!other.m_elementData) { 1781 if (!other.m_elementData) {
1895 m_elementData.clear(); 1782 m_elementData.clear();
1896 return; 1783 return;
1897 } 1784 }
1898 1785
1899 const AtomicString& oldID = getIdAttribute(); 1786 const AtomicString& oldID = getIdAttribute();
1900 const AtomicString& newID = other.getIdAttribute(); 1787 const AtomicString& newID = other.getIdAttribute();
1901 1788
1902 if (!oldID.isNull() || !newID.isNull()) 1789 if (!oldID.isNull() || !newID.isNull())
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
2103 { 1990 {
2104 #if ENABLE(OILPAN) 1991 #if ENABLE(OILPAN)
2105 if (hasRareData()) 1992 if (hasRareData())
2106 visitor->trace(elementRareData()); 1993 visitor->trace(elementRareData());
2107 visitor->trace(m_elementData); 1994 visitor->trace(m_elementData);
2108 #endif 1995 #endif
2109 ContainerNode::trace(visitor); 1996 ContainerNode::trace(visitor);
2110 } 1997 }
2111 1998
2112 } // namespace blink 1999 } // namespace blink
OLDNEW
« no previous file with comments | « sky/engine/core/dom/Element.h ('k') | sky/engine/core/dom/Element.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698