18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (C) 1999 Antti Koivisto (koivisto@kde.org) 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (C) 2001 Peter Kelly (pmk@post.com) 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (C) 2001 Dirk Mueller (mueller@kde.org) 6545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch * Copyright (C) 2004, 2005, 2006, 2008, 2010 Apple Inc. All rights reserved. 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful, 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details. 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB. If not, write to 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA. 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "StyledElement.h" 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "Attribute.h" 2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "CSSMutableStyleDeclaration.h" 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSStyleSelector.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSStyleSheet.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSValueKeywords.h" 3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ClassList.h" 33bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "DOMTokenList.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h" 36a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "HTMLParserIdioms.h" 37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/HashFunctions.h> 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace std; 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace HTMLNames; 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct MappedAttributeKey { 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project uint16_t type; 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project StringImpl* name; 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project StringImpl* value; 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project MappedAttributeKey(MappedAttributeEntry t = eNone, StringImpl* n = 0, StringImpl* v = 0) 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : type(t), name(n), value(v) { } 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline bool operator==(const MappedAttributeKey& a, const MappedAttributeKey& b) 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { return a.type == b.type && a.name == b.name && a.value == b.value; } 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct MappedAttributeKeyTraits : WTF::GenericHashTraits<MappedAttributeKey> { 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static const bool emptyValueIsZero = true; 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static const bool needsDestruction = false; 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static void constructDeletedValue(MappedAttributeKey& slot) { slot.type = eLastEntry; } 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static bool isDeletedValue(const MappedAttributeKey& value) { return value.type == eLastEntry; } 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct MappedAttributeHash { 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static unsigned hash(const MappedAttributeKey&); 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static bool equal(const MappedAttributeKey& a, const MappedAttributeKey& b) { return a == b; } 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static const bool safeToCompareToEmptyOrDeleted = true; 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttypedef HashMap<MappedAttributeKey, CSSMappedAttributeDeclaration*, MappedAttributeHash, MappedAttributeKeyTraits> MappedAttributeDecls; 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic MappedAttributeDecls* mappedAttributeDecls = 0; 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSMappedAttributeDeclaration* StyledElement::getMappedAttributeDecl(MappedAttributeEntry entryType, Attribute* attr) 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!mappedAttributeDecls) 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return mappedAttributeDecls->get(MappedAttributeKey(entryType, attr->name().localName().impl(), attr->value().impl())); 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSMappedAttributeDeclaration* StyledElement::getMappedAttributeDecl(MappedAttributeEntry type, const QualifiedName& name, const AtomicString& value) 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!mappedAttributeDecls) 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return mappedAttributeDecls->get(MappedAttributeKey(type, name.localName().impl(), value.impl())); 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid StyledElement::setMappedAttributeDecl(MappedAttributeEntry entryType, Attribute* attr, CSSMappedAttributeDeclaration* decl) 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!mappedAttributeDecls) 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mappedAttributeDecls = new MappedAttributeDecls; 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mappedAttributeDecls->set(MappedAttributeKey(entryType, attr->name().localName().impl(), attr->value().impl()), decl); 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid StyledElement::setMappedAttributeDecl(MappedAttributeEntry entryType, const QualifiedName& name, const AtomicString& value, CSSMappedAttributeDeclaration* decl) 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!mappedAttributeDecls) 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mappedAttributeDecls = new MappedAttributeDecls; 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mappedAttributeDecls->set(MappedAttributeKey(entryType, name.localName().impl(), value.impl()), decl); 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid StyledElement::removeMappedAttributeDecl(MappedAttributeEntry entryType, const QualifiedName& attrName, const AtomicString& attrValue) 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!mappedAttributeDecls) 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mappedAttributeDecls->remove(MappedAttributeKey(entryType, attrName.localName().impl(), attrValue.impl())); 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid StyledElement::updateStyleAttribute() const 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11021939df44de1705786c545cd1bf519d47250322dBen Murdoch ASSERT(!isStyleAttributeValid()); 11121939df44de1705786c545cd1bf519d47250322dBen Murdoch setIsStyleAttributeValid(); 11221939df44de1705786c545cd1bf519d47250322dBen Murdoch setIsSynchronizingStyleAttribute(); 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_inlineStyleDecl) 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const_cast<StyledElement*>(this)->setAttribute(styleAttr, m_inlineStyleDecl->cssText()); 11521939df44de1705786c545cd1bf519d47250322dBen Murdoch clearIsSynchronizingStyleAttribute(); 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectStyledElement::~StyledElement() 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project destroyInlineStyleDecl(); 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<Attribute> StyledElement::createAttribute(const QualifiedName& name, const AtomicString& value) 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 125e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block return Attribute::createMapped(name, value); 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid StyledElement::createInlineStyleDecl() 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_inlineStyleDecl = CSSMutableStyleDeclaration::create(); 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_inlineStyleDecl->setParent(document()->elementSheet()); 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_inlineStyleDecl->setNode(this); 1335ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen m_inlineStyleDecl->setStrictParsing(isHTMLElement() && !document()->inQuirksMode()); 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid StyledElement::destroyInlineStyleDecl() 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_inlineStyleDecl) { 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_inlineStyleDecl->setNode(0); 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_inlineStyleDecl->setParent(0); 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_inlineStyleDecl = 0; 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid StyledElement::attributeChanged(Attribute* attr, bool preserveDecls) 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!attr->isMappedAttribute()) { 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Element::attributeChanged(attr, preserveDecls); 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 152e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block if (attr->decl() && !preserveDecls) { 153e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block attr->setDecl(0); 1545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian setNeedsStyleRecalc(); 155e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (attributeMap()) 156e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke attributeMap()->declRemoved(); 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool checkDecl = true; 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project MappedAttributeEntry entry; 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool needToParse = mapToEntry(attr->name(), entry); 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (preserveDecls) { 163e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block if (attr->decl()) { 1645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian setNeedsStyleRecalc(); 165e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (attributeMap()) 166e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke attributeMap()->declAdded(); 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkDecl = false; 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 169e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block } else if (!attr->isNull() && entry != eNone) { 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CSSMappedAttributeDeclaration* decl = getMappedAttributeDecl(entry, attr); 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (decl) { 172e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block attr->setDecl(decl); 1735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian setNeedsStyleRecalc(); 174e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (attributeMap()) 175e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke attributeMap()->declAdded(); 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkDecl = false; 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project needToParse = true; 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // parseMappedAttribute() might create a CSSMappedAttributeDeclaration on the attribute. 1825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Normally we would be concerned about reseting the parent of those declarations in StyledElement::didMoveToNewOwnerDocument(). 1835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // But currently we always clear its parent and node below when adding it to the decl table. 1845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // If that changes for some reason moving between documents will be buggy. 1855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // webarchive/adopt-attribute-styled-node-webarchive.html should catch any resulting crashes. 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (needToParse) 187e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block parseMappedAttribute(attr); 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (entry == eNone) 1900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch recalcStyleIfNeededAfterAttributeChanged(attr); 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 192e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block if (checkDecl && attr->decl()) { 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Add the decl to the table in the appropriate spot. 194e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block setMappedAttributeDecl(entry, attr, attr->decl()); 195e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block attr->decl()->setMappedState(entry, attr->name(), attr->value()); 196e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block attr->decl()->setParent(0); 197e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block attr->decl()->setNode(0); 198e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (attributeMap()) 199e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke attributeMap()->declAdded(); 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 201545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch 2020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch updateAfterAttributeChanged(attr); 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool StyledElement::mapToEntry(const QualifiedName& attrName, MappedAttributeEntry& result) const 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = eNone; 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (attrName == styleAttr) 20921939df44de1705786c545cd1bf519d47250322dBen Murdoch return !isSynchronizingStyleAttribute(); 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid StyledElement::classAttributeChanged(const AtomicString& newClassString) 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const UChar* characters = newClassString.characters(); 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned length = newClassString.length(); 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned i; 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (i = 0; i < length; ++i) { 219a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (isNotHTMLSpace(characters[i])) 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 222e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke bool hasClass = i < length; 223e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke setHasClass(hasClass); 224bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (hasClass) { 225e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke attributes()->setClass(newClassString); 226bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (DOMTokenList* classList = optionalClassList()) 227e14391e94c850b8bd03680c23b38978db68687a8John Reck static_cast<ClassList*>(classList)->reset(newClassString); 228bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen } else if (attributeMap()) 229bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen attributeMap()->clearClass(); 2305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian setNeedsStyleRecalc(); 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dispatchSubtreeModifiedEvent(); 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 234e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockvoid StyledElement::parseMappedAttribute(Attribute* attr) 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (isIdAttributeName(attr->name())) 2372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch idAttributeChanged(attr); 2382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch else if (attr->name() == classAttr) 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project classAttributeChanged(attr->value()); 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (attr->name() == styleAttr) { 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (attr->isNull()) 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project destroyInlineStyleDecl(); 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getInlineStyleDecl()->parseDeclaration(attr->value()); 24521939df44de1705786c545cd1bf519d47250322dBen Murdoch setIsStyleAttributeValid(); 2465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian setNeedsStyleRecalc(); 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSMutableStyleDeclaration* StyledElement::getInlineStyleDecl() 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_inlineStyleDecl) 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project createInlineStyleDecl(); 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_inlineStyleDecl.get(); 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSStyleDeclaration* StyledElement::style() 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return getInlineStyleDecl(); 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2626b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid StyledElement::addCSSProperty(Attribute* attribute, int id, const String &value) 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (!attribute->decl()) 2656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner createMappedDecl(attribute); 2666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner attribute->decl()->setProperty(id, value, false); 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid StyledElement::addCSSProperty(Attribute* attribute, int id, int value) 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (!attribute->decl()) 2726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner createMappedDecl(attribute); 2736b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner attribute->decl()->setProperty(id, value, false); 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2766b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid StyledElement::addCSSImageProperty(Attribute* attribute, int id, const String& url) 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2786b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (!attribute->decl()) 2796b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner createMappedDecl(attribute); 2806b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner attribute->decl()->setImageProperty(id, url, false); 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 283e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockvoid StyledElement::addCSSLength(Attribute* attr, int id, const String &value) 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: This function should not spin up the CSS parser, but should instead just figure out the correct 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // length unit and make the appropriate parsed value. 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!attr->decl()) 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project createMappedDecl(attr); 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // strip attribute garbage.. 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project StringImpl* v = value.impl(); 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (v) { 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned int l = 0; 2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (l < v->length() && (*v)[l] <= ' ') 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project l++; 2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (; l < v->length(); l++) { 2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project UChar cc = (*v)[l]; 3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (cc > '9') 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (cc < '0') { 3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (cc == '%' || cc == '*') 3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project l++; 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (cc != '.') 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (l != v->length()) { 3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project attr->decl()->setLengthProperty(id, v->substring(0, l), false); 3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project attr->decl()->setLengthProperty(id, value, false); 3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* color parsing that tries to match as close as possible IE 6. */ 320e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockvoid StyledElement::addCSSColor(Attribute* attr, int id, const String& c) 3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // this is the only case no color gets applied in IE. 3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!c.length()) 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!attr->decl()) 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project createMappedDecl(attr); 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (attr->decl()->setProperty(id, c, false)) 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String color = c; 3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // not something that fits the specs. 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we're emulating IEs color parser here. It maps transparent to black, otherwise it tries to build a rgb value 336d0825bca7fe65beaee391d30da42e937db621564Steve Block // out of everything you put in. The algorithm is experimentally determined, but seems to work for all test cases I have. 3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the length of the color value is rounded up to the next 3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // multiple of 3. each part of the rgb triple then gets one third 3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // of the length. 3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // 3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Each triplet is parsed byte by byte, mapping 3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // each number to a hex value (0-9a-fA-F to their values 3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // everything else to 0). 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The highest non zero digit in all triplets is remembered, and 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // used as a normalization point to normalize to values between 0 3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // and 255. 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!equalIgnoringCase(color, "transparent")) { 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (color[0] == '#') 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project color.remove(0, 1); 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int basicLength = (color.length() + 2) / 3; 3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (basicLength > 1) { 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // IE ignores colors with three digits or less 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int colors[3] = { 0, 0, 0 }; 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int component = 0; 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int pos = 0; 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int maxDigit = basicLength-1; 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (component < 3) { 3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // search forward for digits in the string 3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int numDigits = 0; 3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (pos < (int)color.length() && numDigits < basicLength) { 364231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block colors[component] <<= 4; 365231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (isASCIIHexDigit(color[pos])) { 366231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block colors[component] += toASCIIHexValue(color[pos]); 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project maxDigit = min(maxDigit, numDigits); 3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project numDigits++; 3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pos++; 3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (numDigits++ < basicLength) 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project colors[component] <<= 4; 3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project component++; 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project maxDigit = basicLength - maxDigit; 3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // normalize to 00-ff. The highest filled digit counts, minimum is 2 digits 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project maxDigit -= 2; 380231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block colors[0] >>= 4 * maxDigit; 381231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block colors[1] >>= 4 * maxDigit; 382231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block colors[2] >>= 4 * maxDigit; 3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project color = String::format("#%02x%02x%02x", colors[0], colors[1], colors[2]); 3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (attr->decl()->setProperty(id, color, false)) 3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project attr->decl()->setProperty(id, CSSValueBlack, false); 3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 392e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockvoid StyledElement::createMappedDecl(Attribute* attr) 3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<CSSMappedAttributeDeclaration> decl = CSSMappedAttributeDeclaration::create(); 3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project attr->setDecl(decl); 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project decl->setParent(document()->elementSheet()); 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project decl->setNode(this); 3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project decl->setStrictParsing(false); // Mapped attributes are just always quirky. 3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectunsigned MappedAttributeHash::hash(const MappedAttributeKey& key) 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 403a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch COMPILE_ASSERT(sizeof(key.name) == 4 || sizeof(key.name) == 8, key_name_size); 404a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch COMPILE_ASSERT(sizeof(key.value) == 4 || sizeof(key.value) == 8, key_value_size); 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4062bde8e466a4451c7319e3a072d118917957d6554Steve Block StringHasher hasher; 407a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch const UChar* data; 408a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 409a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch data = reinterpret_cast<const UChar*>(&key.name); 410a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch hasher.addCharacters(data[0], data[1]); 411a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (sizeof(key.name) == 8) 412a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch hasher.addCharacters(data[2], data[3]); 413a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 414a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch data = reinterpret_cast<const UChar*>(&key.value); 415a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch hasher.addCharacters(data[0], data[1]); 416a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (sizeof(key.value) == 8) 417a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch hasher.addCharacters(data[2], data[3]); 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 419a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return hasher.hash(); 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid StyledElement::copyNonAttributeProperties(const Element *sourceElement) 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const StyledElement* source = static_cast<const StyledElement*>(sourceElement); 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!source->m_inlineStyleDecl) 4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *getInlineStyleDecl() = *source->m_inlineStyleDecl; 42921939df44de1705786c545cd1bf519d47250322dBen Murdoch setIsStyleAttributeValid(source->isStyleAttributeValid()); 43021939df44de1705786c545cd1bf519d47250322dBen Murdoch setIsSynchronizingStyleAttribute(source->isSynchronizingStyleAttribute()); 4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Element::copyNonAttributeProperties(sourceElement); 4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 435635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid StyledElement::addSubresourceAttributeURLs(ListHashSet<KURL>& urls) const 436635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 437635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (CSSMutableStyleDeclaration* style = inlineStyleDecl()) 438635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project style->addSubresourceStyleURLs(urls); 439635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 440635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 4415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid StyledElement::didMoveToNewOwnerDocument() 4435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 4445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_inlineStyleDecl) 4455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_inlineStyleDecl->setParent(document()->elementSheet()); 4465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian Element::didMoveToNewOwnerDocument(); 4485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 4495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 451