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