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)
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 2007 David Smith (catfish.man@gmail.com)
706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 2007 Eric Seidel (eric@webkit.org)
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Element.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "AXObjectCache.h"
305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "Attr.h"
31231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "CSSParser.h"
32231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "CSSSelectorList.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSStyleSelector.h"
34e14391e94c850b8bd03680c23b38978db68687a8John Reck#include "ClassList.h"
358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "ClientRect.h"
368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "ClientRectList.h"
37bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "DOMTokenList.h"
38ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include "DatasetDOMStringMap.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h"
40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "DocumentFragment.h"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ElementRareData.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ExceptionCode.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FocusController.h"
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameView.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLElement.h"
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h"
48a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "HTMLParserIdioms.h"
49a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "InspectorInstrumentation.h"
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NodeList.h"
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NodeRenderStyle.h"
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h"
53545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "RenderLayer.h"
540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "RenderView.h"
55643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "RenderWidget.h"
56f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include "Settings.h"
572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "ShadowRoot.h"
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TextIterator.h"
592bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "WebKitAnimationList.h"
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "XMLNames.h"
612bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "htmlediting.h"
62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <wtf/text/CString.h>
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(SVG)
65e14391e94c850b8bd03680c23b38978db68687a8John Reck#include "SVGElement.h"
665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "SVGNames.h"
675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif
685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace HTMLNames;
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace XMLNames;
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
742fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockclass StyleSelectorParentPusher {
752fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockpublic:
762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    StyleSelectorParentPusher(Element* parent)
772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        : m_parent(parent)
782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        , m_pushedStyleSelector(0)
792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void push()
822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (m_pushedStyleSelector)
842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return;
852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_pushedStyleSelector = m_parent->document()->styleSelector();
862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_pushedStyleSelector->pushParent(m_parent);
872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ~StyleSelectorParentPusher()
892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (!m_pushedStyleSelector)
922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return;
93d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch
94d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch        // This tells us that our pushed style selector is in a bad state,
95d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch        // so we should just bail out in that scenario.
962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ASSERT(m_pushedStyleSelector == m_parent->document()->styleSelector());
97d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch        if (m_pushedStyleSelector != m_parent->document()->styleSelector())
98d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch            return;
99d0147a863b872ecaa451ab0dce2a348760e99e2cBen Murdoch
1002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_pushedStyleSelector->popParent(m_parent);
1012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
1022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1032fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockprivate:
1042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Element* m_parent;
1052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CSSStyleSelector* m_pushedStyleSelector;
1062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block};
1072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
108231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockPassRefPtr<Element> Element::create(const QualifiedName& tagName, Document* document)
109231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
110231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return adoptRef(new Element(tagName, document, CreateElement));
111231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
112231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectElement::~Element()
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
115ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    removeShadowRoot();
116e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (m_attributeMap)
117e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        m_attributeMap->detachFromElement();
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline ElementRareData* Element::rareData() const
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(hasRareData());
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return static_cast<ElementRareData*>(NodeRareData::rareDataFromMap(this));
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline ElementRareData* Element::ensureRareData()
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return static_cast<ElementRareData*>(Node::ensureRareData());
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNodeRareData* Element::createRareData()
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return new ElementRareData;
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
135dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
136a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochDEFINE_VIRTUAL_ATTRIBUTE_EVENT_LISTENER(Element, blur);
137a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochDEFINE_VIRTUAL_ATTRIBUTE_EVENT_LISTENER(Element, error);
138a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochDEFINE_VIRTUAL_ATTRIBUTE_EVENT_LISTENER(Element, focus);
139a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochDEFINE_VIRTUAL_ATTRIBUTE_EVENT_LISTENER(Element, load);
140a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
141f486d19d62f1bc33246748b14b14a9dfa617b57fIain MerrickPassRefPtr<DocumentFragment> Element::deprecatedCreateContextualFragment(const String& markup, FragmentScriptingPermission scriptingPermission)
142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
14306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    RefPtr<DocumentFragment> fragment = document()->createDocumentFragment();
14406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (document()->isHTMLDocument())
146dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        fragment->parseHTML(markup, this, scriptingPermission);
147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    else {
14806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (!fragment->parseXML(markup, this, scriptingPermission))
149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // FIXME: We should propagate a syntax error exception out here.
150dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return 0;
151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
152f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Exceptions are ignored because none ought to happen here.
154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ExceptionCode ignoredExceptionCode;
155f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // We need to pop <html> and <body> elements and remove <head> to
157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // accommodate folks passing complete HTML documents to make the
158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // child of an element.
159f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RefPtr<Node> nextNode;
161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (RefPtr<Node> node = fragment->firstChild(); node; node = nextNode) {
162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        nextNode = node->nextSibling();
163dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (node->hasTagName(htmlTag) || node->hasTagName(bodyTag)) {
1642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            HTMLElement* element = toHTMLElement(node.get());
165a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            Node* firstChild = element->firstChild();
166dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (firstChild)
167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                nextNode = firstChild;
168dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            RefPtr<Node> nextChild;
169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            for (RefPtr<Node> child = firstChild; child; child = nextChild) {
170dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                nextChild = child->nextSibling();
171a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                element->removeChild(child.get(), ignoredExceptionCode);
172dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                ASSERT(!ignoredExceptionCode);
173a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                fragment->insertBefore(child, element, ignoredExceptionCode);
174dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                ASSERT(!ignoredExceptionCode);
175dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            }
176a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            fragment->removeChild(element, ignoredExceptionCode);
177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ASSERT(!ignoredExceptionCode);
178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        } else if (node->hasTagName(headTag)) {
179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            fragment->removeChild(node.get(), ignoredExceptionCode);
180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ASSERT(!ignoredExceptionCode);
181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return fragment.release();
184dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<Node> Element::cloneNode(bool deep)
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return deep ? cloneElementWithChildren() : cloneElementWithoutChildren();
1898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
1908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianPassRefPtr<Element> Element::cloneElementWithChildren()
1928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
1938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RefPtr<Element> clone = cloneElementWithoutChildren();
1948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    cloneChildNodes(clone.get());
1958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return clone.release();
1968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
1978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianPassRefPtr<Element> Element::cloneElementWithoutChildren()
1998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
2006b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    RefPtr<Element> clone = cloneElementWithoutAttributesAndChildren();
2018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // This will catch HTML elements in the wrong namespace that are not correctly copied.
2028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // This is a sanity check as HTML overloads some of the DOM methods.
2038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    ASSERT(isHTMLElement() == clone->isHTMLElement());
2048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
205ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // Call attributes(true) to force attribute synchronization to occur for SVG and style attributes.
206ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (NamedNodeMap* attributeMap = attributes(true))
207ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        clone->attributes()->setAttributes(*attributeMap);
208ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
20921939df44de1705786c545cd1bf519d47250322dBen Murdoch    clone->copyNonAttributeProperties(this);
21021939df44de1705786c545cd1bf519d47250322dBen Murdoch
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return clone.release();
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell BrennerPassRefPtr<Element> Element::cloneElementWithoutAttributesAndChildren() const
2156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{
2166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    return document()->createElement(tagQName(), false);
2176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner}
2186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::removeAttribute(const QualifiedName& name, ExceptionCode& ec)
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
221e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (m_attributeMap) {
222cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        ec = 0;
223e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        m_attributeMap->removeNamedItem(name, ec);
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (ec == NOT_FOUND_ERR)
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ec = 0;
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::setAttribute(const QualifiedName& name, const AtomicString& value)
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ExceptionCode ec;
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setAttribute(name, value, ec);
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
234643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
235643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid Element::setCStringAttribute(const QualifiedName& name, const char* cStringValue)
236643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
237643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ExceptionCode ec;
238643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    setAttribute(name, AtomicString(cStringValue), ec);
239643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::setBooleanAttribute(const QualifiedName& name, bool b)
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (b)
24406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        setAttribute(name, emptyAtom);
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ExceptionCode ex;
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        removeAttribute(name, ex);
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNode::NodeType Element::nodeType() const
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return ELEMENT_NODE;
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool Element::hasAttribute(const QualifiedName& name) const
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return hasAttributeNS(name.namespaceURI(), name.localName());
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst AtomicString& Element::getAttribute(const QualifiedName& name) const
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2636c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (UNLIKELY(name == styleAttr) && !isStyleAttributeValid())
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        updateStyleAttribute();
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
2676c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (UNLIKELY(!areSVGAttributesValid()))
268d0825bca7fe65beaee391d30da42e937db621564Steve Block        updateAnimatedSVGAttribute(name);
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    return fastGetAttribute(name);
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::scrollIntoView(bool alignToTop)
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->updateLayoutIgnorePendingStylesheets();
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect bounds = getRect();
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (renderer()) {
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Align to the top / bottom and to the closest edge.
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (alignToTop)
2818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            renderer()->enclosingLayer()->scrollRectToVisible(bounds, false, ScrollAlignment::alignToEdgeIfNeeded, ScrollAlignment::alignTopAlways);
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
2838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            renderer()->enclosingLayer()->scrollRectToVisible(bounds, false, ScrollAlignment::alignToEdgeIfNeeded, ScrollAlignment::alignBottomAlways);
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::scrollIntoViewIfNeeded(bool centerIfNeeded)
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->updateLayoutIgnorePendingStylesheets();
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect bounds = getRect();
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (renderer()) {
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (centerIfNeeded)
2938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            renderer()->enclosingLayer()->scrollRectToVisible(bounds, false, ScrollAlignment::alignCenterIfNeeded, ScrollAlignment::alignCenterIfNeeded);
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
2958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            renderer()->enclosingLayer()->scrollRectToVisible(bounds, false, ScrollAlignment::alignToEdgeIfNeeded, ScrollAlignment::alignToEdgeIfNeeded);
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::scrollByUnits(int units, ScrollGranularity granularity)
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->updateLayoutIgnorePendingStylesheets();
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (RenderObject *rend = renderer()) {
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (rend->hasOverflowClip()) {
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ScrollDirection direction = ScrollDown;
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (units < 0) {
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                direction = ScrollUp;
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                units = -units;
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
309635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            toRenderBox(rend)->layer()->scroll(direction, granularity, units);
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::scrollByLines(int lines)
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    scrollByUnits(lines, ScrollByLine);
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::scrollByPages(int pages)
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    scrollByUnits(pages, ScrollByPage);
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic float localZoomForRenderer(RenderObject* renderer)
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: This does the wrong thing if two opposing zooms are in effect and canceled each
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // other out, but the alternative is that we'd have to crawl up the whole render tree every
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // time (or store an additional bit in the RenderStyle to indicate that a zoom was specified).
3295ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    float zoomFactor = 1;
3305ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (renderer->style()->effectiveZoom() != 1) {
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Need to find the nearest enclosing RenderObject that set up
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // a differing zoom, and then we divide our result by it to eliminate the zoom.
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RenderObject* prev = renderer;
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (RenderObject* curr = prev->parent(); curr; curr = curr->parent()) {
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (curr->style()->effectiveZoom() != prev->style()->effectiveZoom()) {
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                zoomFactor = prev->style()->zoom();
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            prev = curr;
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (prev->isRenderView())
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            zoomFactor = prev->style()->zoom();
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return zoomFactor;
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic int adjustForLocalZoom(int value, RenderObject* renderer)
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float zoomFactor = localZoomForRenderer(renderer);
3505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (zoomFactor == 1)
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return value;
3525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // Needed because computeLengthInt truncates (rather than rounds) when scaling up.
3535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (zoomFactor > 1)
3545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        value++;
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return static_cast<int>(value / zoomFactor);
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint Element::offsetLeft()
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->updateLayoutIgnorePendingStylesheets();
3618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (RenderBoxModelObject* rend = renderBoxModelObject())
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return adjustForLocalZoom(rend->offsetLeft(), rend);
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint Element::offsetTop()
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->updateLayoutIgnorePendingStylesheets();
3698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (RenderBoxModelObject* rend = renderBoxModelObject())
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return adjustForLocalZoom(rend->offsetTop(), rend);
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint Element::offsetWidth()
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->updateLayoutIgnorePendingStylesheets();
3778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (RenderBoxModelObject* rend = renderBoxModelObject())
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return adjustForAbsoluteZoom(rend->offsetWidth(), rend);
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint Element::offsetHeight()
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->updateLayoutIgnorePendingStylesheets();
3858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (RenderBoxModelObject* rend = renderBoxModelObject())
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return adjustForAbsoluteZoom(rend->offsetHeight(), rend);
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectElement* Element::offsetParent()
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->updateLayoutIgnorePendingStylesheets();
3938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (RenderObject* rend = renderer())
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (RenderObject* offsetParent = rend->offsetParent())
3958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return static_cast<Element*>(offsetParent->node());
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint Element::clientLeft()
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->updateLayoutIgnorePendingStylesheets();
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
403635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (RenderBox* rend = renderBox())
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return adjustForAbsoluteZoom(rend->clientLeft(), rend);
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint Element::clientTop()
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->updateLayoutIgnorePendingStylesheets();
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
412635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (RenderBox* rend = renderBox())
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return adjustForAbsoluteZoom(rend->clientTop(), rend);
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint Element::clientWidth()
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->updateLayoutIgnorePendingStylesheets();
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // When in strict mode, clientWidth for the document element should return the width of the containing frame.
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // When in quirks mode, clientWidth for the body element should return the width of the containing frame.
4235ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    bool inQuirksMode = document()->inQuirksMode();
4245ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if ((!inQuirksMode && document()->documentElement() == this) ||
4255ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        (inQuirksMode && isHTMLElement() && document()->body() == this)) {
4260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (FrameView* view = document()->view()) {
4270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (RenderView* renderView = document()->renderView())
4280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                return adjustForAbsoluteZoom(view->layoutWidth(), renderView);
4290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (RenderBox* rend = renderBox())
4338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return adjustForAbsoluteZoom(rend->clientWidth(), rend);
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint Element::clientHeight()
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->updateLayoutIgnorePendingStylesheets();
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // When in strict mode, clientHeight for the document element should return the height of the containing frame.
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // When in quirks mode, clientHeight for the body element should return the height of the containing frame.
4435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    bool inQuirksMode = document()->inQuirksMode();
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4455ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if ((!inQuirksMode && document()->documentElement() == this) ||
4465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        (inQuirksMode && isHTMLElement() && document()->body() == this)) {
4470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (FrameView* view = document()->view()) {
4480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (RenderView* renderView = document()->renderView())
4490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                return adjustForAbsoluteZoom(view->layoutHeight(), renderView);
4500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (RenderBox* rend = renderBox())
4548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return adjustForAbsoluteZoom(rend->clientHeight(), rend);
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianint Element::scrollLeft() const
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->updateLayoutIgnorePendingStylesheets();
461635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (RenderBox* rend = renderBox())
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return adjustForAbsoluteZoom(rend->scrollLeft(), rend);
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianint Element::scrollTop() const
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->updateLayoutIgnorePendingStylesheets();
469635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (RenderBox* rend = renderBox())
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return adjustForAbsoluteZoom(rend->scrollTop(), rend);
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::setScrollLeft(int newLeft)
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->updateLayoutIgnorePendingStylesheets();
477635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (RenderBox* rend = renderBox())
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        rend->setScrollLeft(static_cast<int>(newLeft * rend->style()->effectiveZoom()));
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::setScrollTop(int newTop)
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->updateLayoutIgnorePendingStylesheets();
484635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (RenderBox* rend = renderBox())
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        rend->setScrollTop(static_cast<int>(newTop * rend->style()->effectiveZoom()));
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianint Element::scrollWidth() const
4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->updateLayoutIgnorePendingStylesheets();
4918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (RenderBox* rend = renderBox())
4928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return adjustForAbsoluteZoom(rend->scrollWidth(), rend);
4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianint Element::scrollHeight() const
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->updateLayoutIgnorePendingStylesheets();
4998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (RenderBox* rend = renderBox())
5008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return adjustForAbsoluteZoom(rend->scrollHeight(), rend);
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
504e14391e94c850b8bd03680c23b38978db68687a8John ReckIntRect Element::boundsInWindowSpace() const
505e14391e94c850b8bd03680c23b38978db68687a8John Reck{
506e14391e94c850b8bd03680c23b38978db68687a8John Reck    document()->updateLayoutIgnorePendingStylesheets();
507e14391e94c850b8bd03680c23b38978db68687a8John Reck
508e14391e94c850b8bd03680c23b38978db68687a8John Reck    FrameView* view = document()->view();
509e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (!view)
510e14391e94c850b8bd03680c23b38978db68687a8John Reck        return IntRect();
511e14391e94c850b8bd03680c23b38978db68687a8John Reck
512e14391e94c850b8bd03680c23b38978db68687a8John Reck    Vector<FloatQuad> quads;
513e14391e94c850b8bd03680c23b38978db68687a8John Reck#if ENABLE(SVG)
514e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (isSVGElement() && renderer()) {
515e14391e94c850b8bd03680c23b38978db68687a8John Reck        // Get the bounding rectangle from the SVG model.
516e14391e94c850b8bd03680c23b38978db68687a8John Reck        const SVGElement* svgElement = static_cast<const SVGElement*>(this);
517e14391e94c850b8bd03680c23b38978db68687a8John Reck        FloatRect localRect;
518e14391e94c850b8bd03680c23b38978db68687a8John Reck        if (svgElement->boundingBox(localRect))
519e14391e94c850b8bd03680c23b38978db68687a8John Reck            quads.append(renderer()->localToAbsoluteQuad(localRect));
520e14391e94c850b8bd03680c23b38978db68687a8John Reck    } else
521e14391e94c850b8bd03680c23b38978db68687a8John Reck#endif
522e14391e94c850b8bd03680c23b38978db68687a8John Reck    {
523e14391e94c850b8bd03680c23b38978db68687a8John Reck        // Get the bounding rectangle from the box model.
524e14391e94c850b8bd03680c23b38978db68687a8John Reck        if (renderBoxModelObject())
525e14391e94c850b8bd03680c23b38978db68687a8John Reck            renderBoxModelObject()->absoluteQuads(quads);
526e14391e94c850b8bd03680c23b38978db68687a8John Reck    }
527e14391e94c850b8bd03680c23b38978db68687a8John Reck
528e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (quads.isEmpty())
529e14391e94c850b8bd03680c23b38978db68687a8John Reck        return IntRect();
530e14391e94c850b8bd03680c23b38978db68687a8John Reck
531e14391e94c850b8bd03680c23b38978db68687a8John Reck    IntRect result = quads[0].enclosingBoundingBox();
532e14391e94c850b8bd03680c23b38978db68687a8John Reck    for (size_t i = 1; i < quads.size(); ++i)
533e14391e94c850b8bd03680c23b38978db68687a8John Reck        result.unite(quads[i].enclosingBoundingBox());
534e14391e94c850b8bd03680c23b38978db68687a8John Reck
535e14391e94c850b8bd03680c23b38978db68687a8John Reck    result = view->contentsToWindow(result);
536e14391e94c850b8bd03680c23b38978db68687a8John Reck    return result;
537e14391e94c850b8bd03680c23b38978db68687a8John Reck}
538e14391e94c850b8bd03680c23b38978db68687a8John Reck
5398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianPassRefPtr<ClientRectList> Element::getClientRects() const
5408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
5418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    document()->updateLayoutIgnorePendingStylesheets();
5428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
5438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    RenderBoxModelObject* renderBoxModelObject = this->renderBoxModelObject();
5448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (!renderBoxModelObject)
5458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return ClientRectList::create();
5468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
5478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // FIXME: Handle SVG elements.
5488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // FIXME: Handle table/inline-table with a caption.
5498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
5508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    Vector<FloatQuad> quads;
5518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    renderBoxModelObject->absoluteQuads(quads);
5528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
5532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    float pageScale = 1;
5542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (Page* page = document()->page()) {
5552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (Frame* frame = page->mainFrame())
5562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            pageScale = frame->pageScaleFactor();
5572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
5582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (FrameView* view = document()->view()) {
5608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        IntRect visibleContentRect = view->visibleContentRect();
5615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        for (size_t i = 0; i < quads.size(); ++i) {
5628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            quads[i].move(-visibleContentRect.x(), -visibleContentRect.y());
5635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            adjustFloatQuadForAbsoluteZoom(quads[i], renderBoxModelObject);
5642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (pageScale != 1)
5652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                adjustFloatQuadForPageScale(quads[i], pageScale);
5665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
5678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
5688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
5698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return ClientRectList::create(quads);
5708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
5718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
5728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianPassRefPtr<ClientRect> Element::getBoundingClientRect() const
5738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
5748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    document()->updateLayoutIgnorePendingStylesheets();
5758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
5768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    Vector<FloatQuad> quads;
57768513a70bcd92384395513322f1b801e7bf9c729Steve Block#if ENABLE(SVG)
578e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (isSVGElement() && renderer()) {
57968513a70bcd92384395513322f1b801e7bf9c729Steve Block        // Get the bounding rectangle from the SVG model.
58068513a70bcd92384395513322f1b801e7bf9c729Steve Block        const SVGElement* svgElement = static_cast<const SVGElement*>(this);
581e14391e94c850b8bd03680c23b38978db68687a8John Reck        FloatRect localRect;
582e14391e94c850b8bd03680c23b38978db68687a8John Reck        if (svgElement->boundingBox(localRect))
583e14391e94c850b8bd03680c23b38978db68687a8John Reck            quads.append(renderer()->localToAbsoluteQuad(localRect));
58468513a70bcd92384395513322f1b801e7bf9c729Steve Block    } else
58568513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif
58668513a70bcd92384395513322f1b801e7bf9c729Steve Block    {
58768513a70bcd92384395513322f1b801e7bf9c729Steve Block        // Get the bounding rectangle from the box model.
58868513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (renderBoxModelObject())
58968513a70bcd92384395513322f1b801e7bf9c729Steve Block            renderBoxModelObject()->absoluteQuads(quads);
59068513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
5918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
5928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (quads.isEmpty())
5938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return ClientRect::create();
5948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
595f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    FloatRect result = quads[0].boundingBox();
5968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    for (size_t i = 1; i < quads.size(); ++i)
597f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        result.unite(quads[i].boundingBox());
5988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
5998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (FrameView* view = document()->view()) {
6008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        IntRect visibleContentRect = view->visibleContentRect();
6018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        result.move(-visibleContentRect.x(), -visibleContentRect.y());
6028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
6038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
604f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    adjustFloatRectForAbsoluteZoom(result, renderer());
6052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (Page* page = document()->page()) {
6062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (Frame* frame = page->mainFrame())
6072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            adjustFloatRectForPageScale(result, frame->pageScaleFactor());
6082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
6092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return ClientRect::create(result);
6118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
612cad810f21b803229eb11403f9209855525a25d57Steve Block
613cad810f21b803229eb11403f9209855525a25d57Steve BlockIntRect Element::screenRect() const
614cad810f21b803229eb11403f9209855525a25d57Steve Block{
615cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!renderer())
616cad810f21b803229eb11403f9209855525a25d57Steve Block        return IntRect();
617cad810f21b803229eb11403f9209855525a25d57Steve Block    return renderer()->view()->frameView()->contentsToScreen(renderer()->absoluteBoundingBoxRect());
618cad810f21b803229eb11403f9209855525a25d57Steve Block}
6198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline bool shouldIgnoreAttributeCase(const Element* e)
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return e && e->document()->isHTMLDocument() && e->isHTMLElement();
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst AtomicString& Element::getAttribute(const String& name) const
6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
627643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bool ignoreCase = shouldIgnoreAttributeCase(this);
628643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
629643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Update the 'style' attribute if it's invalid and being requested:
63021939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (!isStyleAttributeValid() && equalPossiblyIgnoringCase(name, styleAttr.localName(), ignoreCase))
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        updateStyleAttribute();
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
63421939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (!areSVGAttributesValid()) {
635d0825bca7fe65beaee391d30da42e937db621564Steve Block        // We're not passing a namespace argument on purpose. SVGNames::*Attr are defined w/o namespaces as well.
636d0825bca7fe65beaee391d30da42e937db621564Steve Block        updateAnimatedSVGAttribute(QualifiedName(nullAtom, name, nullAtom));
637d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
640e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (m_attributeMap) {
641e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (Attribute* attribute = m_attributeMap->getAttributeItem(name, ignoreCase))
642643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            return attribute->value();
643545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
644545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return nullAtom;
6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst AtomicString& Element::getAttributeNS(const String& namespaceURI, const String& localName) const
6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return getAttribute(QualifiedName(nullAtom, localName, namespaceURI));
6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::setAttribute(const AtomicString& name, const AtomicString& value, ExceptionCode& ec)
6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!Document::isValidName(name)) {
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ec = INVALID_CHARACTER_ERR;
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6605abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#if ENABLE(INSPECTOR)
6615abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (!isSynchronizingStyleAttribute())
662a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        InspectorInstrumentation::willModifyDOMAttr(document(), this);
6635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#endif
6645abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
665cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    const AtomicString& localName = shouldIgnoreAttributeCase(this) ? name.lower() : name;
6662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QualifiedName attributeName(nullAtom, localName, nullAtom);
6672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
668545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // Allocate attribute map if necessary.
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Attribute* old = attributes(false)->getAttributeItem(localName, false);
6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->incDOMTreeVersion();
6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (isIdAttributeName(old ? old->name() : attributeName))
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        updateId(old ? old->value() : nullAtom, value);
675d0825bca7fe65beaee391d30da42e937db621564Steve Block
6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (old && value.isNull())
677e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        m_attributeMap->removeAttribute(old->name());
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (!old && !value.isNull())
6792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_attributeMap->addAttribute(createAttribute(attributeName, value));
6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (old && !value.isNull()) {
681bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (Attr* attrNode = old->attr())
682bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            attrNode->setValue(value);
683bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        else
684bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            old->setValue(value);
6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        attributeChanged(old);
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
687d0825bca7fe65beaee391d30da42e937db621564Steve Block
688d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(INSPECTOR)
6895abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (!isSynchronizingStyleAttribute())
690a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        InspectorInstrumentation::didModifyDOMAttr(document(), this);
691d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::setAttribute(const QualifiedName& name, const AtomicString& value, ExceptionCode&)
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#if ENABLE(INSPECTOR)
6975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (!isSynchronizingStyleAttribute())
698a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        InspectorInstrumentation::willModifyDOMAttr(document(), this);
6995abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#endif
7005abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->incDOMTreeVersion();
7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
703545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // Allocate attribute map if necessary.
7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Attribute* old = attributes(false)->getAttributeItem(name);
7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
706545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (isIdAttributeName(name))
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        updateId(old ? old->value() : nullAtom, value);
708d0825bca7fe65beaee391d30da42e937db621564Steve Block
7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (old && value.isNull())
710e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        m_attributeMap->removeAttribute(name);
7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (!old && !value.isNull())
712e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        m_attributeMap->addAttribute(createAttribute(name, value));
7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (old) {
714bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (Attr* attrNode = old->attr())
715bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            attrNode->setValue(value);
716bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        else
717bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            old->setValue(value);
7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        attributeChanged(old);
7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
720d0825bca7fe65beaee391d30da42e937db621564Steve Block
721d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(INSPECTOR)
7225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (!isSynchronizingStyleAttribute())
723a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        InspectorInstrumentation::didModifyDOMAttr(document(), this);
724d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<Attribute> Element::createAttribute(const QualifiedName& name, const AtomicString& value)
7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return Attribute::create(name, value);
7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
732635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Element::attributeChanged(Attribute* attr, bool)
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (isIdAttributeName(attr->name()))
7352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        idAttributeChanged(attr);
7360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    recalcStyleIfNeededAfterAttributeChanged(attr);
7370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    updateAfterAttributeChanged(attr);
7380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
7390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid Element::updateAfterAttributeChanged(Attribute* attr)
7410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
742d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!AXObjectCache::accessibilityEnabled())
743635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
744635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const QualifiedName& attrName = attr->name();
7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (attrName == aria_activedescendantAttr) {
7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // any change to aria-activedescendant attribute triggers accessibility focus change, but document focus remains intact
748d0825bca7fe65beaee391d30da42e937db621564Steve Block        document()->axObjectCache()->handleActiveDescendantChanged(renderer());
749635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    } else if (attrName == roleAttr) {
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // the role attribute can change at any time, and the AccessibilityObject must pick up these changes
751d0825bca7fe65beaee391d30da42e937db621564Steve Block        document()->axObjectCache()->handleAriaRoleChanged(renderer());
752231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    } else if (attrName == aria_valuenowAttr) {
753231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // If the valuenow attribute changes, AX clients need to be notified.
754d0825bca7fe65beaee391d30da42e937db621564Steve Block        document()->axObjectCache()->postNotification(renderer(), AXObjectCache::AXValueChanged, true);
755d0825bca7fe65beaee391d30da42e937db621564Steve Block    } else if (attrName == aria_labelAttr || attrName == aria_labeledbyAttr || attrName == altAttr || attrName == titleAttr) {
756d0825bca7fe65beaee391d30da42e937db621564Steve Block        // If the content of an element changes due to an attribute change, notify accessibility.
757d0825bca7fe65beaee391d30da42e937db621564Steve Block        document()->axObjectCache()->contentChanged(renderer());
758dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (attrName == aria_selectedAttr)
759dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        document()->axObjectCache()->selectedChildrenChanged(renderer());
76006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    else if (attrName == aria_expandedAttr)
76106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        document()->axObjectCache()->handleAriaExpandedChange(renderer());
762bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    else if (attrName == aria_hiddenAttr)
763bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        document()->axObjectCache()->childrenChanged(renderer());
764f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    else if (attrName == aria_invalidAttr)
765f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        document()->axObjectCache()->postNotification(renderer(), AXObjectCache::AXInvalidStatusChanged, true);
7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid Element::recalcStyleIfNeededAfterAttributeChanged(Attribute* attr)
7690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
7700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (document()->attached() && document()->styleSelector()->hasSelectorForAttribute(attr->name().localName()))
7710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        setNeedsStyleRecalc();
7720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
773d0825bca7fe65beaee391d30da42e937db621564Steve Block
7742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid Element::idAttributeChanged(Attribute* attr)
7752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
7762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    setHasID(!attr->isNull());
7772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (attributeMap()) {
7782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (attr->isNull())
7792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            attributeMap()->setIdForStyleResolution(nullAtom);
7802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        else if (document()->inQuirksMode())
7812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            attributeMap()->setIdForStyleResolution(attr->value().lower());
7822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        else
7832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            attributeMap()->setIdForStyleResolution(attr->value());
7842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
7852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    setNeedsStyleRecalc();
7862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
7872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
788d0825bca7fe65beaee391d30da42e937db621564Steve Block// Returns true is the given attribute is an event handler.
789d0825bca7fe65beaee391d30da42e937db621564Steve Block// We consider an event handler any attribute that begins with "on".
790d0825bca7fe65beaee391d30da42e937db621564Steve Block// It is a simple solution that has the advantage of not requiring any
791d0825bca7fe65beaee391d30da42e937db621564Steve Block// code or configuration change if a new event handler is defined.
792d0825bca7fe65beaee391d30da42e937db621564Steve Block
793d0825bca7fe65beaee391d30da42e937db621564Steve Blockstatic bool isEventHandlerAttribute(const QualifiedName& name)
794d0825bca7fe65beaee391d30da42e937db621564Steve Block{
795d0825bca7fe65beaee391d30da42e937db621564Steve Block    return name.namespaceURI().isNull() && name.localName().startsWith("on");
796d0825bca7fe65beaee391d30da42e937db621564Steve Block}
797d0825bca7fe65beaee391d30da42e937db621564Steve Block
798d0825bca7fe65beaee391d30da42e937db621564Steve Blockstatic bool isAttributeToRemove(const QualifiedName& name, const AtomicString& value)
799d0825bca7fe65beaee391d30da42e937db621564Steve Block{
800a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return (name.localName().endsWith(hrefAttr.localName()) || name == srcAttr || name == actionAttr) && protocolIsJavaScript(stripLeadingAndTrailingHTMLSpaces(value));
801d0825bca7fe65beaee391d30da42e937db621564Steve Block}
802d0825bca7fe65beaee391d30da42e937db621564Steve Block
803d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid Element::setAttributeMap(PassRefPtr<NamedNodeMap> list, FragmentScriptingPermission scriptingPermission)
8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->incDOMTreeVersion();
8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If setting the whole map changes the id attribute, we need to call updateId.
8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
809545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    const QualifiedName& idName = document()->idAttributeName();
810e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    Attribute* oldId = m_attributeMap ? m_attributeMap->getAttributeItem(idName) : 0;
811d0825bca7fe65beaee391d30da42e937db621564Steve Block    Attribute* newId = list ? list->getAttributeItem(idName) : 0;
8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (oldId || newId)
8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        updateId(oldId ? oldId->value() : nullAtom, newId ? newId->value() : nullAtom);
8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
816e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (m_attributeMap)
817e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        m_attributeMap->m_element = 0;
8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
819e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    m_attributeMap = list;
8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
821e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (m_attributeMap) {
822e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        m_attributeMap->m_element = this;
823d0825bca7fe65beaee391d30da42e937db621564Steve Block        // If the element is created as result of a paste or drag-n-drop operation
824d0825bca7fe65beaee391d30da42e937db621564Steve Block        // we want to remove all the script and event handlers.
825d0825bca7fe65beaee391d30da42e937db621564Steve Block        if (scriptingPermission == FragmentScriptingNotAllowed) {
826d0825bca7fe65beaee391d30da42e937db621564Steve Block            unsigned i = 0;
827e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            while (i < m_attributeMap->length()) {
828e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                const QualifiedName& attributeName = m_attributeMap->m_attributes[i]->name();
829d0825bca7fe65beaee391d30da42e937db621564Steve Block                if (isEventHandlerAttribute(attributeName)) {
830e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                    m_attributeMap->m_attributes.remove(i);
831d0825bca7fe65beaee391d30da42e937db621564Steve Block                    continue;
832d0825bca7fe65beaee391d30da42e937db621564Steve Block                }
833d0825bca7fe65beaee391d30da42e937db621564Steve Block
834e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                if (isAttributeToRemove(attributeName, m_attributeMap->m_attributes[i]->value()))
835e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                    m_attributeMap->m_attributes[i]->setValue(nullAtom);
836d0825bca7fe65beaee391d30da42e937db621564Steve Block                i++;
837d0825bca7fe65beaee391d30da42e937db621564Steve Block            }
838d0825bca7fe65beaee391d30da42e937db621564Steve Block        }
8395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // Store the set of attributes that changed on the stack in case
8405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // attributeChanged mutates m_attributeMap.
8415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        Vector<RefPtr<Attribute> > attributes;
8425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        m_attributeMap->copyAttributesToVector(attributes);
8435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        for (Vector<RefPtr<Attribute> >::iterator iter = attributes.begin(); iter != attributes.end(); ++iter)
8445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            attributeChanged(iter->get());
8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // FIXME: What about attributes that were in the old map that are not in the new map?
8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool Element::hasAttributes() const
8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
85121939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (!isStyleAttributeValid())
8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        updateStyleAttribute();
8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
85521939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (!areSVGAttributesValid())
856d0825bca7fe65beaee391d30da42e937db621564Steve Block        updateAnimatedSVGAttribute(anyQName());
8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
859e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    return m_attributeMap && m_attributeMap->length();
8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString Element::nodeName() const
8638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_tagName.toString();
8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString Element::nodeNamePreservingCase() const
8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_tagName.toString();
8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
872d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid Element::setPrefix(const AtomicString& prefix, ExceptionCode& ec)
8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ec = 0;
875d0825bca7fe65beaee391d30da42e937db621564Steve Block    checkSetPrefix(prefix, ec);
8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (ec)
8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
879d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_tagName.setPrefix(prefix.isEmpty() ? AtomicString() : prefix);
8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectKURL Element::baseURI() const
8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8845e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    const AtomicString& baseAttribute = getAttribute(baseAttr);
8855e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    KURL base(KURL(), baseAttribute);
8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!base.protocol().isEmpty())
8878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return base;
8888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
889a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ContainerNode* parent = parentNode();
8908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!parent)
8918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return base;
8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const KURL& parentBase = parent->baseURI();
8948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (parentBase.isNull())
8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return base;
8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8975e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    return KURL(parentBase, baseAttribute);
8988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::createAttributeMap() const
9018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
902e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    m_attributeMap = NamedNodeMap::create(const_cast<Element*>(this));
9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
905635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool Element::isURLAttribute(Attribute*) const
9068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst QualifiedName& Element::imageSourceAttributeName() const
9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return srcAttr;
9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderObject* Element::createRenderer(RenderArena* arena, RenderStyle* style)
9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (document()->documentElement() == this && style->display() == NONE) {
9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Ignore display: none on root elements.  Force a display of block in that case.
9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RenderBlock* result = new (arena) RenderBlock(this);
9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (result)
9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result->setAnimatableStyle(style);
9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return result;
9238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return RenderObject::createObject(this, style);
9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
92781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochbool Element::wasChangedSinceLastFormControlChangeEvent() const
92881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
92981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return false;
93081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
93181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
93281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid Element::setChangedSinceLastFormControlChangeEvent(bool)
93381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
93481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::insertedIntoDocument()
9378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // need to do superclass processing first so inDocument() is true
9398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // by the time we reach updateId
9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ContainerNode::insertedIntoDocument();
941f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (Node* shadow = shadowRoot())
942f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        shadow->insertedIntoDocument();
9438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (hasID()) {
945e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (m_attributeMap) {
946e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            Attribute* idItem = m_attributeMap->getAttributeItem(document()->idAttributeName());
9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (idItem && !idItem->isNull())
9488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                updateId(nullAtom, idItem->value());
9498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
9508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::removedFromDocument()
9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (hasID()) {
956e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (m_attributeMap) {
957e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            Attribute* idItem = m_attributeMap->getAttributeItem(document()->idAttributeName());
9588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (idItem && !idItem->isNull())
9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                updateId(idItem->value(), nullAtom);
9608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ContainerNode::removedFromDocument();
964f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (Node* shadow = shadowRoot())
965f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        shadow->removedFromDocument();
966f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
967f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
968f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid Element::insertedIntoTree(bool deep)
969f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
970f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    ContainerNode::insertedIntoTree(deep);
971f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!deep)
972f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return;
973f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (Node* shadow = shadowRoot())
974f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        shadow->insertedIntoTree(true);
975f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
976f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
977f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid Element::removedFromTree(bool deep)
978f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
979f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    ContainerNode::removedFromTree(deep);
980f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!deep)
981f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return;
982f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (Node* shadow = shadowRoot())
983f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        shadow->removedFromTree(true);
9848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::attach()
9878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    suspendPostAttachCallbacks();
989643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    RenderWidget::suspendWidgetHierarchyUpdates();
9905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
9918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    createRendererIfNeeded();
9922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    StyleSelectorParentPusher parentPusher(this);
9942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (Node* shadow = shadowRoot()) {
9962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        parentPusher.push();
997f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        shadow->attach();
9982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
9992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (firstChild())
10012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        parentPusher.push();
10022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ContainerNode::attach();
10032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
10048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (hasRareData()) {
10058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ElementRareData* data = rareData();
1006635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (data->needsFocusAppearanceUpdateSoonAfterAttach()) {
10078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (isFocusable() && document()->focusedNode() == this)
10088a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                document()->updateFocusAppearanceSoon(false /* don't restore selection */);
1009635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            data->setNeedsFocusAppearanceUpdateSoonAfterAttach(false);
10108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
10118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1013643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    RenderWidget::resumeWidgetHierarchyUpdates();
10145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    resumePostAttachCallbacks();
10158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::detach()
10188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1019643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    RenderWidget::suspendWidgetHierarchyUpdates();
1020643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
10218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cancelFocusAppearanceUpdate();
10228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (hasRareData())
1023635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        rareData()->resetComputedStyle();
10248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ContainerNode::detach();
1025f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (Node* shadow = shadowRoot())
1026f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        shadow->detach();
1027643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1028643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    RenderWidget::resumeWidgetHierarchyUpdates();
10298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool Element::pseudoStyleCacheIsInvalid(const RenderStyle* currentStyle, RenderStyle* newStyle)
10320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1033643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(currentStyle == renderStyle());
10340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!renderer() || !currentStyle)
10360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
10370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1038dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const PseudoStyleCache* pseudoStyleCache = currentStyle->cachedPseudoStyles();
1039dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!pseudoStyleCache)
1040dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
1041dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1042dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    size_t cacheSize = pseudoStyleCache->size();
10430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    for (size_t i = 0; i < cacheSize; ++i) {
10440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        RefPtr<RenderStyle> newPseudoStyle;
1045dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        PseudoId pseudoId = pseudoStyleCache->at(i)->styleType();
1046dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (pseudoId == VISITED_LINK) {
1047dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            newPseudoStyle =  newStyle->getCachedPseudoStyle(VISITED_LINK); // This pseudo-style was aggressively computed already when we first called styleForElement on the new style.
1048dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (!newPseudoStyle || *newPseudoStyle != *pseudoStyleCache->at(i))
1049dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                return true;
1050dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        } else if (pseudoId == FIRST_LINE || pseudoId == FIRST_LINE_INHERITED)
10510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            newPseudoStyle = renderer()->uncachedFirstLineStyle(newStyle);
10520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        else
10530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            newPseudoStyle = renderer()->getUncachedPseudoStyle(pseudoId, newStyle, newStyle);
1054dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!newPseudoStyle)
1055dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return true;
1056dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (*newPseudoStyle != *pseudoStyleCache->at(i)) {
10570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (pseudoId < FIRST_INTERNAL_PSEUDOID)
10580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                newStyle->setHasPseudoStyle(pseudoId);
10590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            newStyle->addCachedPseudoStyle(newPseudoStyle);
10606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            if (pseudoId == FIRST_LINE || pseudoId == FIRST_LINE_INHERITED) {
10616c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                // FIXME: We should do an actual diff to determine whether a repaint vs. layout
10626c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                // is needed, but for now just assume a layout will be required.  The diff code
10636c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                // in RenderObject::setStyle would need to be factored out so that it could be reused.
10646c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                renderer()->setNeedsLayoutAndPrefWidthsRecalc();
10656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            }
10660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return true;
10670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
10680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
10690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return false;
10700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
10710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::recalcStyle(StyleChange change)
10738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1074231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Ref currentStyle in case it would otherwise be deleted when setRenderStyle() is called.
1075231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    RefPtr<RenderStyle> currentStyle(renderStyle());
10762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool hasParentStyle = parentNodeForRenderingAndStyle() ? parentNodeForRenderingAndStyle()->renderStyle() : false;
10778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool hasDirectAdjacentRules = currentStyle && currentStyle->childrenAffectedByDirectAdjacentRules();
10788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if ((change > NoChange || needsStyleRecalc())) {
10808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (hasRareData())
1081635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            rareData()->resetComputedStyle();
10828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (hasParentStyle && (change >= Inherit || needsStyleRecalc())) {
10848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<RenderStyle> newStyle = document()->styleSelector()->styleForElement(this);
1085231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        StyleChange ch = diff(currentStyle.get(), newStyle.get());
10868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (ch == Detach || !currentStyle) {
10878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (attached())
10888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                detach();
10898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            attach(); // FIXME: The style gets computed twice by calling attach. We could do better if we passed the style along.
10908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // attach recalulates the style for all children. No need to do it twice.
1091db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            clearNeedsStyleRecalc();
109221939df44de1705786c545cd1bf519d47250322dBen Murdoch            clearChildNeedsStyleRecalc();
10938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
10948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
10958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (currentStyle) {
10978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Preserve "affected by" bits that were propagated to us from descendants in the case where we didn't do a full
10988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // style change (e.g., only inline style changed).
10998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (currentStyle->affectedByHoverRules())
11008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                newStyle->setAffectedByHoverRules(true);
11018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (currentStyle->affectedByActiveRules())
11028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                newStyle->setAffectedByActiveRules(true);
11038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (currentStyle->affectedByDragRules())
11048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                newStyle->setAffectedByDragRules(true);
11058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (currentStyle->childrenAffectedByForwardPositionalRules())
11068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                newStyle->setChildrenAffectedByForwardPositionalRules();
11078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (currentStyle->childrenAffectedByBackwardPositionalRules())
11088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                newStyle->setChildrenAffectedByBackwardPositionalRules();
11098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (currentStyle->childrenAffectedByFirstChildRules())
11108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                newStyle->setChildrenAffectedByFirstChildRules();
11118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (currentStyle->childrenAffectedByLastChildRules())
11128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                newStyle->setChildrenAffectedByLastChildRules();
11138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (currentStyle->childrenAffectedByDirectAdjacentRules())
11148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                newStyle->setChildrenAffectedByDirectAdjacentRules();
11158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
11168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11175af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        if (ch != NoChange || pseudoStyleCacheIsInvalid(currentStyle.get(), newStyle.get()) || (change == Force && renderer() && renderer()->requiresForcedStyleRecalcPropagation())) {
11188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            setRenderStyle(newStyle);
111981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        } else if (needsStyleRecalc() && styleChangeType() != SyntheticStyleChange) {
11208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Although no change occurred, we use the new style so that the cousin style sharing code won't get
112181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // fooled into believing this style is the same.
11228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (renderer())
11238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                renderer()->setStyleInternal(newStyle.get());
11248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
11258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                setRenderStyle(newStyle);
1126231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        } else if (styleChangeType() == SyntheticStyleChange)
11278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             setRenderStyle(newStyle);
11288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (change != Force) {
11300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // If "rem" units are used anywhere in the document, and if the document element's font size changes, then go ahead and force font updating
11310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // all the way down the tree.  This is simpler than having to maintain a cache of objects (and such font size changes should be rare anyway).
11320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (document()->usesRemUnits() && ch != NoChange && currentStyle && newStyle && currentStyle->fontSize() != newStyle->fontSize() && document()->documentElement() == this)
11330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                change = Force;
113481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            else if (styleChangeType() >= FullStyleChange)
11358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                change = Force;
11368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
11378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                change = ch;
11388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
11398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    StyleSelectorParentPusher parentPusher(this);
11418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: This check is good enough for :hover + foo, but it is not good enough for :hover + foo + bar.
11428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // For now we will just worry about the common case, since it's a lot trickier to get the second case right
11438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // without doing way too much re-resolution.
11448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool forceCheckOfNextElementSibling = false;
11458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (Node *n = firstChild(); n; n = n->nextSibling()) {
11465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        bool childRulesChanged = n->needsStyleRecalc() && n->styleChangeType() == FullStyleChange;
11478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (forceCheckOfNextElementSibling && n->isElementNode())
11485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            n->setNeedsStyleRecalc();
11492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (change >= Inherit || n->isTextNode() || n->childNeedsStyleRecalc() || n->needsStyleRecalc()) {
11502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            parentPusher.push();
11518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            n->recalcStyle(change);
11522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
11538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (n->isElementNode())
11548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            forceCheckOfNextElementSibling = childRulesChanged && hasDirectAdjacentRules;
11558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1156f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // FIXME: This does not care about sibling combinators. Will be necessary in XBL2 world.
1157f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (Node* shadow = shadowRoot()) {
11582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (change >= Inherit || shadow->childNeedsStyleRecalc() || shadow->needsStyleRecalc()) {
11592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            parentPusher.push();
1160f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            shadow->recalcStyle(change);
11612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
1162f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
11638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1164db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    clearNeedsStyleRecalc();
116521939df44de1705786c545cd1bf519d47250322dBen Murdoch    clearChildNeedsStyleRecalc();
11668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochContainerNode* Element::shadowRoot() const
1169f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
1170ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return hasRareData() ? rareData()->m_shadowRoot : 0;
1171f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
1172f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
11732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochContainerNode* Element::ensureShadowRoot()
1174f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
11752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (ContainerNode* existingRoot = shadowRoot())
11762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return existingRoot;
1177f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
11782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RefPtr<ShadowRoot> newRoot = ShadowRoot::create(document());
1179ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    ensureRareData()->m_shadowRoot = newRoot.get();
1180cad810f21b803229eb11403f9209855525a25d57Steve Block    newRoot->setShadowHost(this);
118181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (inDocument())
118281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        newRoot->insertedIntoDocument();
11832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (attached())
118481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        newRoot->lazyAttach();
11852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return newRoot.get();
1186f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
1187f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
1188cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid Element::removeShadowRoot()
1189f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
1190f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!hasRareData())
1191f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return;
1192f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
1193ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    ElementRareData* data = rareData();
1194ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (RefPtr<Node> oldRoot = data->m_shadowRoot) {
1195ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        data->m_shadowRoot = 0;
1196cad810f21b803229eb11403f9209855525a25d57Steve Block        document()->removeFocusedNodeOfSubtree(oldRoot.get());
1197cad810f21b803229eb11403f9209855525a25d57Steve Block        oldRoot->setShadowHost(0);
1198cad810f21b803229eb11403f9209855525a25d57Steve Block        if (oldRoot->inDocument())
1199cad810f21b803229eb11403f9209855525a25d57Steve Block            oldRoot->removedFromDocument();
1200cad810f21b803229eb11403f9209855525a25d57Steve Block        else
1201cad810f21b803229eb11403f9209855525a25d57Steve Block            oldRoot->removedFromTree(true);
1202cad810f21b803229eb11403f9209855525a25d57Steve Block    }
1203f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
1204f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
12052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool Element::childTypeAllowed(NodeType type) const
12068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (type) {
1208cad810f21b803229eb11403f9209855525a25d57Steve Block    case ELEMENT_NODE:
1209cad810f21b803229eb11403f9209855525a25d57Steve Block    case TEXT_NODE:
1210cad810f21b803229eb11403f9209855525a25d57Steve Block    case COMMENT_NODE:
1211cad810f21b803229eb11403f9209855525a25d57Steve Block    case PROCESSING_INSTRUCTION_NODE:
1212cad810f21b803229eb11403f9209855525a25d57Steve Block    case CDATA_SECTION_NODE:
1213cad810f21b803229eb11403f9209855525a25d57Steve Block    case ENTITY_REFERENCE_NODE:
1214cad810f21b803229eb11403f9209855525a25d57Steve Block        return true;
1215cad810f21b803229eb11403f9209855525a25d57Steve Block    default:
1216cad810f21b803229eb11403f9209855525a25d57Steve Block        break;
12178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1218cad810f21b803229eb11403f9209855525a25d57Steve Block    return false;
12198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12212bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic void checkForEmptyStyleChange(Element* element, RenderStyle* style)
12222bde8e466a4451c7319e3a072d118917957d6554Steve Block{
12232bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!style)
12242bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
12252bde8e466a4451c7319e3a072d118917957d6554Steve Block
12262bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (style->affectedByEmpty() && (!style->emptyState() || element->hasChildNodes()))
12272bde8e466a4451c7319e3a072d118917957d6554Steve Block        element->setNeedsStyleRecalc();
12282bde8e466a4451c7319e3a072d118917957d6554Steve Block}
12292bde8e466a4451c7319e3a072d118917957d6554Steve Block
12308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void checkForSiblingStyleChanges(Element* e, RenderStyle* style, bool finishedParsingCallback,
12318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                        Node* beforeChange, Node* afterChange, int childCountDelta)
12328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (!style || (e->needsStyleRecalc() && style->childrenAffectedByPositionalRules()))
12348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
12358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // :first-child.  In the parser callback case, we don't have to check anything, since we were right the first time.
12378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // In the DOM case, we only need to do something if |afterChange| is not 0.
12388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // |afterChange| is 0 in the parser case, so it works out that we'll skip this block.
12398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->childrenAffectedByFirstChildRules() && afterChange) {
12408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Find our new first child.
12418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Node* newFirstChild = 0;
12428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (newFirstChild = e->firstChild(); newFirstChild && !newFirstChild->isElementNode(); newFirstChild = newFirstChild->nextSibling()) {};
12438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Find the first element node following |afterChange|
12458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Node* firstElementAfterInsertion = 0;
12468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (firstElementAfterInsertion = afterChange;
12478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             firstElementAfterInsertion && !firstElementAfterInsertion->isElementNode();
12488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             firstElementAfterInsertion = firstElementAfterInsertion->nextSibling()) {};
12498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // This is the insert/append case.
12518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (newFirstChild != firstElementAfterInsertion && firstElementAfterInsertion && firstElementAfterInsertion->attached() &&
12528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            firstElementAfterInsertion->renderStyle() && firstElementAfterInsertion->renderStyle()->firstChildState())
12535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            firstElementAfterInsertion->setNeedsStyleRecalc();
12548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // We also have to handle node removal.
12568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (childCountDelta < 0 && newFirstChild == firstElementAfterInsertion && newFirstChild && newFirstChild->renderStyle() && !newFirstChild->renderStyle()->firstChildState())
12575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            newFirstChild->setNeedsStyleRecalc();
12588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // :last-child.  In the parser callback case, we don't have to check anything, since we were right the first time.
12618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // In the DOM case, we only need to do something if |afterChange| is not 0.
12628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->childrenAffectedByLastChildRules() && beforeChange) {
12638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Find our new last child.
12648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Node* newLastChild = 0;
12658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (newLastChild = e->lastChild(); newLastChild && !newLastChild->isElementNode(); newLastChild = newLastChild->previousSibling()) {};
12668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Find the last element node going backwards from |beforeChange|
12688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Node* lastElementBeforeInsertion = 0;
12698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (lastElementBeforeInsertion = beforeChange;
12708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             lastElementBeforeInsertion && !lastElementBeforeInsertion->isElementNode();
12718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             lastElementBeforeInsertion = lastElementBeforeInsertion->previousSibling()) {};
12728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (newLastChild != lastElementBeforeInsertion && lastElementBeforeInsertion && lastElementBeforeInsertion->attached() &&
12748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            lastElementBeforeInsertion->renderStyle() && lastElementBeforeInsertion->renderStyle()->lastChildState())
12755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            lastElementBeforeInsertion->setNeedsStyleRecalc();
12768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // We also have to handle node removal.  The parser callback case is similar to node removal as well in that we need to change the last child
12788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // to match now.
12798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ((childCountDelta < 0 || finishedParsingCallback) && newLastChild == lastElementBeforeInsertion && newLastChild && newLastChild->renderStyle() && !newLastChild->renderStyle()->lastChildState())
12805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            newLastChild->setNeedsStyleRecalc();
12818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The + selector.  We need to invalidate the first element following the insertion point.  It is the only possible element
12848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // that could be affected by this DOM change.
12858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->childrenAffectedByDirectAdjacentRules() && afterChange) {
12868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Node* firstElementAfterInsertion = 0;
12878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (firstElementAfterInsertion = afterChange;
12888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             firstElementAfterInsertion && !firstElementAfterInsertion->isElementNode();
12898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             firstElementAfterInsertion = firstElementAfterInsertion->nextSibling()) {};
12908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (firstElementAfterInsertion && firstElementAfterInsertion->attached())
12915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            firstElementAfterInsertion->setNeedsStyleRecalc();
12928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Forward positional selectors include the ~ selector, nth-child, nth-of-type, first-of-type and only-of-type.
12958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Backward positional selectors include nth-last-child, nth-last-of-type, last-of-type and only-of-type.
12968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We have to invalidate everything following the insertion point in the forward case, and everything before the insertion point in the
12978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // backward case.
12988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // |afterChange| is 0 in the parser callback case, so we won't do any work for the forward case if we don't have to.
12998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // For performance reasons we just mark the parent node as changed, since we don't want to make childrenChanged O(n^2) by crawling all our kids
13008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // here.  recalcStyle will then force a walk of the children when it sees that this has happened.
13018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ((style->childrenAffectedByForwardPositionalRules() && afterChange) ||
13028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        (style->childrenAffectedByBackwardPositionalRules() && beforeChange))
13035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        e->setNeedsStyleRecalc();
13048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // :empty selector.
13062bde8e466a4451c7319e3a072d118917957d6554Steve Block    checkForEmptyStyleChange(e, style);
13078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::childrenChanged(bool changedByParser, Node* beforeChange, Node* afterChange, int childCountDelta)
13108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ContainerNode::childrenChanged(changedByParser, beforeChange, afterChange, childCountDelta);
13122bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (changedByParser)
13132bde8e466a4451c7319e3a072d118917957d6554Steve Block        checkForEmptyStyleChange(this, renderStyle());
13142bde8e466a4451c7319e3a072d118917957d6554Steve Block    else
13158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        checkForSiblingStyleChanges(this, renderStyle(), false, beforeChange, afterChange, childCountDelta);
13168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13172bde8e466a4451c7319e3a072d118917957d6554Steve Block
13182fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid Element::beginParsingChildren()
13192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
13202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    clearIsParsingChildrenFinished();
13212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CSSStyleSelector* styleSelector = document()->styleSelectorIfExists();
13222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (styleSelector && attached())
13232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        styleSelector->pushParent(this);
13242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
13258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::finishParsingChildren()
13278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ContainerNode::finishParsingChildren();
132921939df44de1705786c545cd1bf519d47250322dBen Murdoch    setIsParsingChildrenFinished();
13308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkForSiblingStyleChanges(this, renderStyle(), true, lastChild(), 0, 0);
13312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (CSSStyleSelector* styleSelector = document()->styleSelectorIfExists())
13322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        styleSelector->popParent(this);
13338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::dispatchAttrRemovalEvent(Attribute*)
13368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!eventDispatchForbidden());
1338d0825bca7fe65beaee391d30da42e937db621564Steve Block
13398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if 0
13408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!document()->hasListenerType(Document::DOMATTRMODIFIED_LISTENER))
13418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
13428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ExceptionCode ec = 0;
1343f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    dispatchScopedEvent(MutationEvent::create(DOMAttrModifiedEvent, true, attr, attr->value(),
13448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        attr->value(), document()->attrName(attr->id()), MutationEvent::REMOVAL), ec);
13458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
13468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1348635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Element::dispatchAttrAdditionEvent(Attribute*)
13498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!eventDispatchForbidden());
1351d0825bca7fe65beaee391d30da42e937db621564Steve Block
13528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if 0
13538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!document()->hasListenerType(Document::DOMATTRMODIFIED_LISTENER))
13548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
13558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ExceptionCode ec = 0;
1356f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    dispatchScopedEvent(MutationEvent::create(DOMAttrModifiedEvent, true, attr, attr->value(),
13570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        attr->value(), document()->attrName(attr->id()), MutationEvent::ADDITION), ec);
13588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
13598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString Element::openTagStartToString() const
13628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String result = "<" + nodeName();
13648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    NamedNodeMap* attrMap = attributes(true);
13668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (attrMap) {
13688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned numAttrs = attrMap->length();
13698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (unsigned i = 0; i < numAttrs; i++) {
13708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result += " ";
13718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Attribute *attribute = attrMap->attributeItem(i);
13738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result += attribute->name().toString();
13748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!attribute->value().isNull()) {
13758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                result += "=\"";
13768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // FIXME: substitute entities for any instances of " or '
13778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                result += attribute->value();
13788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                result += "\"";
13798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
13808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
13818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
13828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
13848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
13878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::formatForDebugger(char* buffer, unsigned length) const
13888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String result;
13908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String s;
13918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    s = nodeName();
13938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (s.length() > 0) {
13948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result += s;
13958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
13968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1397545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    s = getIdAttribute();
13988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (s.length() > 0) {
13998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (result.length() > 0)
14008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result += "; ";
14018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result += "id=";
14028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result += s;
14038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
14048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    s = getAttribute(classAttr);
14068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (s.length() > 0) {
14078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (result.length() > 0)
14088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result += "; ";
14098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result += "class=";
14108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result += s;
14118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
14128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    strncpy(buffer, result.utf8().data(), length - 1);
14148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
14158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
14168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<Attr> Element::setAttributeNode(Attr* attr, ExceptionCode& ec)
14188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
14198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!attr) {
14208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ec = TYPE_MISMATCH_ERR;
14218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
14228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
14238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return static_pointer_cast<Attr>(attributes(false)->setNamedItem(attr, ec));
14248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
14258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<Attr> Element::setAttributeNodeNS(Attr* attr, ExceptionCode& ec)
14278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
14288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!attr) {
14298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ec = TYPE_MISMATCH_ERR;
14308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
14318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
14328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return static_pointer_cast<Attr>(attributes(false)->setNamedItem(attr, ec));
14338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
14348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<Attr> Element::removeAttributeNode(Attr* attr, ExceptionCode& ec)
14368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
14378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!attr) {
14388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ec = TYPE_MISMATCH_ERR;
14398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
14408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
14418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (attr->ownerElement() != this) {
14428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ec = NOT_FOUND_ERR;
14438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
14448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
14452bde8e466a4451c7319e3a072d118917957d6554Steve Block
14462bde8e466a4451c7319e3a072d118917957d6554Steve Block    ASSERT(document() == attr->document());
14478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    NamedNodeMap* attrs = attributes(true);
14498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!attrs)
14508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
14518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return static_pointer_cast<Attr>(attrs->removeNamedItem(attr->qualifiedName(), ec));
14538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
14548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1455d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid Element::setAttributeNS(const AtomicString& namespaceURI, const AtomicString& qualifiedName, const AtomicString& value, ExceptionCode& ec, FragmentScriptingPermission scriptingPermission)
14568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
14578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String prefix, localName;
14588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!Document::parseQualifiedName(qualifiedName, prefix, localName, ec))
14598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
14608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1461e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (namespaceURI.isNull() && !prefix.isNull()) {
1462e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        ec = NAMESPACE_ERR;
1463e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        return;
1464e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    }
1465e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
14668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QualifiedName qName(prefix, localName, namespaceURI);
1467d0825bca7fe65beaee391d30da42e937db621564Steve Block
1468d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (scriptingPermission == FragmentScriptingNotAllowed && (isEventHandlerAttribute(qName) || isAttributeToRemove(qName, value)))
1469d0825bca7fe65beaee391d30da42e937db621564Steve Block        return;
1470d0825bca7fe65beaee391d30da42e937db621564Steve Block
14718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setAttribute(qName, value, ec);
14728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
14738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::removeAttribute(const String& name, ExceptionCode& ec)
14758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1476a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    InspectorInstrumentation::willModifyDOMAttr(document(), this);
14775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
14788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String localName = shouldIgnoreAttributeCase(this) ? name.lower() : name;
14798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1480e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (m_attributeMap) {
1481e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        m_attributeMap->removeNamedItem(localName, ec);
14828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (ec == NOT_FOUND_ERR)
14838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ec = 0;
14848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1485d0825bca7fe65beaee391d30da42e937db621564Steve Block
1486a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    InspectorInstrumentation::didModifyDOMAttr(document(), this);
14878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
14888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::removeAttributeNS(const String& namespaceURI, const String& localName, ExceptionCode& ec)
14908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
14918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    removeAttribute(QualifiedName(nullAtom, localName, namespaceURI), ec);
14928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
14938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<Attr> Element::getAttributeNode(const String& name)
14958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
14965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    NamedNodeMap* attrs = attributes(true);
14978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!attrs)
14988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
14998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String localName = shouldIgnoreAttributeCase(this) ? name.lower() : name;
15008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return static_pointer_cast<Attr>(attrs->getNamedItem(localName));
15018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
15028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<Attr> Element::getAttributeNodeNS(const String& namespaceURI, const String& localName)
15048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
15055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    NamedNodeMap* attrs = attributes(true);
15068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!attrs)
15078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
15088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return static_pointer_cast<Attr>(attrs->getNamedItem(QualifiedName(nullAtom, localName, namespaceURI)));
15098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
15108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool Element::hasAttribute(const String& name) const
15128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
15135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    NamedNodeMap* attrs = attributes(true);
15148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!attrs)
15158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
15168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This call to String::lower() seems to be required but
15188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // there may be a way to remove it.
15198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String localName = shouldIgnoreAttributeCase(this) ? name.lower() : name;
15208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return attrs->getAttributeItem(localName, false);
15218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
15228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool Element::hasAttributeNS(const String& namespaceURI, const String& localName) const
15248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
15255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    NamedNodeMap* attrs = attributes(true);
15268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!attrs)
15278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
15288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return attrs->getAttributeItem(QualifiedName(nullAtom, localName, namespaceURI));
15298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
15308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSStyleDeclaration *Element::style()
15328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
15338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
15348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
15358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::focus(bool restorePreviousSelection)
15378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
15382bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!inDocument())
15392bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
15402bde8e466a4451c7319e3a072d118917957d6554Steve Block
15418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Document* doc = document();
15428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (doc->focusedNode() == this)
15438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
15448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1545231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // If the stylesheets have already been loaded we can reliably check isFocusable.
1546231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // If not, we continue and set the focused node on the focus controller below so
1547231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // that it can be updated soon after attach.
1548231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (doc->haveStylesheetsLoaded()) {
1549231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        doc->updateLayoutIgnorePendingStylesheets();
1550231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (!isFocusable())
1551231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            return;
1552231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
1553231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1554e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (!supportsFocus())
1555e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        return;
1556e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
1557545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    RefPtr<Node> protect;
1558545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (Page* page = doc->page()) {
1559545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        // Focus and change event handlers can cause us to lose our last ref.
15605ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        // If a focus event handler changes the focus to a different node it
15615ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        // does not make sense to continue and update appearence.
1562545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        protect = this;
15635ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        if (!page->focusController()->setFocusedNode(this, doc->frame()))
15645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            return;
1565545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
15668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1567231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Setting the focused node above might have invalidated the layout due to scripts.
1568231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    doc->updateLayoutIgnorePendingStylesheets();
1569231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
15708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!isFocusable()) {
1571635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        ensureRareData()->setNeedsFocusAppearanceUpdateSoonAfterAttach(true);
15728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
15738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
15748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cancelFocusAppearanceUpdate();
15768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    updateFocusAppearance(restorePreviousSelection);
15778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
15788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1579635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Element::updateFocusAppearance(bool /*restorePreviousSelection*/)
15808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
15818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (this == rootEditableElement()) {
15828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Frame* frame = document()->frame();
15838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!frame)
15848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
1585db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
1586db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        // When focusing an editable element in an iframe, don't reset the selection if it already contains a selection.
1587db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        if (this == frame->selection()->rootEditableElement())
1588db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            return;
15898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // FIXME: We should restore the previous selection if there is one.
15912bde8e466a4451c7319e3a072d118917957d6554Steve Block        VisibleSelection newSelection = VisibleSelection(firstPositionInOrBeforeNode(this), DOWNSTREAM);
15928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
159368513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (frame->selection()->shouldChangeSelection(newSelection)) {
15948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            frame->selection()->setSelection(newSelection);
159568513a70bcd92384395513322f1b801e7bf9c729Steve Block            frame->selection()->revealSelection();
15968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1597dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (renderer() && !renderer()->isWidget())
15988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        renderer()->enclosingLayer()->scrollRectToVisible(getRect());
15998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
16008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::blur()
16028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
16038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cancelFocusAppearanceUpdate();
16048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Document* doc = document();
16058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (doc->focusedNode() == this) {
16068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (doc->frame())
16078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            doc->frame()->page()->focusController()->setFocusedNode(0, doc->frame());
16088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
16098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            doc->setFocusedNode(0);
16108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
16118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
16128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString Element::innerText() const
16148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
16158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We need to update layout, since plainText uses line boxes in the render tree.
16168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->updateLayoutIgnorePendingStylesheets();
16178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!renderer())
16198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return textContent(true);
16208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return plainText(rangeOfContents(const_cast<Element*>(this)).get());
16228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
16238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString Element::outerText() const
16258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
16268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Getting outerText is the same as getting innerText, only
16278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // setting is different. You would think this should get the plain
16288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // text for the outer range, but this is wrong, <br> for instance
16298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // would return different values for inner and outer text by such
16308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // a rule, but it doesn't in WinIE, and we want to match that.
16318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return innerText();
16328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
16338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString Element::title() const
16358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
16368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return String();
16378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
16388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntSize Element::minimumSizeForResizing() const
16408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
16418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return hasRareData() ? rareData()->m_minimumSizeForResizing : defaultMinimumSizeForResizing();
16428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
16438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::setMinimumSizeForResizing(const IntSize& size)
16458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
16468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (size == defaultMinimumSizeForResizing() && !hasRareData())
16478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
16488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ensureRareData()->m_minimumSizeForResizing = size;
16498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
16508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1651dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockRenderStyle* Element::computedStyle(PseudoId pseudoElementSpecifier)
16528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1653dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // FIXME: Find and use the renderer from the pseudo element instead of the actual element so that the 'length'
1654dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // properties, which are only known by the renderer because it did the layout, will be correct and so that the
1655dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // values returned for the ":selection" pseudo-element will be correct.
16568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (RenderStyle* usedStyle = renderStyle())
1657dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return pseudoElementSpecifier ? usedStyle->getCachedPseudoStyle(pseudoElementSpecifier) : usedStyle;
16588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!attached())
16608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // FIXME: Try to do better than this. Ensure that styleForElement() works for elements that are not in the
16618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // document tree and figure out when to destroy the computed style for such elements.
16628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
16638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ElementRareData* data = ensureRareData();
16658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!data->m_computedStyle)
1666692e5dbf12901edacf14812a6fae25462920af42Steve Block        data->m_computedStyle = document()->styleForElementIgnoringPendingStylesheets(this);
1667dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return pseudoElementSpecifier ? data->m_computedStyle->getCachedPseudoStyle(pseudoElementSpecifier) : data->m_computedStyle.get();
16688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
16698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenAtomicString Element::computeInheritedLanguage() const
16715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
16725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    const Node* n = this;
16735ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    AtomicString value;
16745ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // The language property is inherited, so we iterate over the parents to find the first language.
16755ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    while (n && value.isNull()) {
16765ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        if (n->isElementNode()) {
16775ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            // Spec: xml:lang takes precedence -- http://www.w3.org/TR/xhtml1/#C_7
16785ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            value = static_cast<const Element*>(n)->fastGetAttribute(XMLNames::langAttr);
16795ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            if (value.isNull())
16805ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                value = static_cast<const Element*>(n)->fastGetAttribute(HTMLNames::langAttr);
16815ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        } else if (n->isDocumentNode()) {
16825ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            // checking the MIME content-language
16835ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            value = static_cast<const Document*>(n)->contentLanguage();
16845ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        }
16855ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
16866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        n = n->parentNode();
16875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    }
16885ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
16895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return value;
16905ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
16915ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
16928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::cancelFocusAppearanceUpdate()
16938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
16948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (hasRareData())
1695635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        rareData()->setNeedsFocusAppearanceUpdateSoonAfterAttach(false);
16968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (document()->focusedNode() == this)
16978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        document()->cancelFocusAppearanceUpdate();
16988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
16998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Element::normalizeAttributes()
17018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Normalize attributes.
17035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    NamedNodeMap* attrs = attributes(true);
17048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!attrs)
17058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
17066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
17076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (attrs->isEmpty())
17086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        return;
17096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
17106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    Vector<RefPtr<Attribute> > attributeVector;
17116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    attrs->copyAttributesToVector(attributeVector);
17126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    size_t numAttrs = attributeVector.size();
17136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    for (size_t i = 0; i < numAttrs; ++i) {
17146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        if (Attr* attr = attributeVector[i]->attr())
17158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            attr->normalize();
17168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
17178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ElementTraversal API
17208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectElement* Element::firstElementChild() const
17218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return WebCore::firstElementChild(this);
17238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectElement* Element::lastElementChild() const
17268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Node* n = lastChild();
17288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (n && !n->isElementNode())
17298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        n = n->previousSibling();
17308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return static_cast<Element*>(n);
17318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectElement* Element::previousElementSibling() const
17348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Node* n = previousSibling();
17368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (n && !n->isElementNode())
17378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        n = n->previousSibling();
17388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return static_cast<Element*>(n);
17398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectElement* Element::nextElementSibling() const
17428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Node* n = nextSibling();
17448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (n && !n->isElementNode())
17458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        n = n->nextSibling();
17468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return static_cast<Element*>(n);
17478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectunsigned Element::childElementCount() const
17508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned count = 0;
17528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Node* n = firstChild();
17538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (n) {
17548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        count += n->isElementNode();
17558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        n = n->nextSibling();
17568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
17578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return count;
17588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1760231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool Element::webkitMatchesSelector(const String& selector, ExceptionCode& ec)
1761231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1762231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (selector.isEmpty()) {
1763231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        ec = SYNTAX_ERR;
1764231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return false;
1765231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
1766231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
17675ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    bool strictParsing = !document()->inQuirksMode();
1768231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    CSSParser p(strictParsing);
1769231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1770231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    CSSSelectorList selectorList;
1771231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    p.parseSelector(selector, document(), selectorList);
1772231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1773231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!selectorList.first()) {
1774231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        ec = SYNTAX_ERR;
1775231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return false;
1776231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
1777231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1778231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Throw a NAMESPACE_ERR if the selector includes any namespace prefixes.
1779231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (selectorList.selectorsNeedNamespaceResolution()) {
1780231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        ec = NAMESPACE_ERR;
1781231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return false;
1782231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
1783231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1784231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    CSSStyleSelector::SelectorChecker selectorChecker(document(), strictParsing);
1785231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    for (CSSSelector* selector = selectorList.first(); selector; selector = CSSSelectorList::next(selector)) {
1786231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (selectorChecker.checkSelector(selector, this))
1787231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            return true;
1788231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
1789231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1790231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return false;
1791231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1792231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1793bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenDOMTokenList* Element::classList()
1794bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
1795bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    ElementRareData* data = ensureRareData();
1796bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!data->m_classList)
1797e14391e94c850b8bd03680c23b38978db68687a8John Reck        data->m_classList = ClassList::create(this);
1798bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return data->m_classList.get();
1799bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1800bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1801bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenDOMTokenList* Element::optionalClassList() const
1802bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
1803bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!hasRareData())
1804bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return 0;
1805bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return rareData()->m_classList.get();
1806bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1807bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1808ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve BlockDOMStringMap* Element::dataset()
1809ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
1810ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    ElementRareData* data = ensureRareData();
1811ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (!data->m_datasetDOMStringMap)
1812ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        data->m_datasetDOMStringMap = DatasetDOMStringMap::create(this);
1813ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return data->m_datasetDOMStringMap.get();
1814ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
1815ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
18165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickDOMStringMap* Element::optionalDataset() const
18175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
18185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (!hasRareData())
18195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return 0;
18205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return rareData()->m_datasetDOMStringMap.get();
18215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
18225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
18230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochKURL Element::getURLAttribute(const QualifiedName& name) const
18240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1825d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !ASSERT_DISABLED
1826e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (m_attributeMap) {
1827e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (Attribute* attribute = m_attributeMap->getAttributeItem(name))
18280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            ASSERT(isURLAttribute(attribute));
18290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
18300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
1831a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return document()->completeURL(stripLeadingAndTrailingHTMLSpaces(getAttribute(name)));
18320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
18330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1834e458d70a0d18538346f41b503114c9ebe6b2ce12Leon ClarkeKURL Element::getNonEmptyURLAttribute(const QualifiedName& name) const
1835e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
1836e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if !ASSERT_DISABLED
1837e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (m_attributeMap) {
1838e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (Attribute* attribute = m_attributeMap->getAttributeItem(name))
1839e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            ASSERT(isURLAttribute(attribute));
1840e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    }
1841e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
1842a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    String value = stripLeadingAndTrailingHTMLSpaces(getAttribute(name));
1843e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (value.isEmpty())
1844e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        return KURL();
1845e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    return document()->completeURL(value);
1846e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
1847e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
184806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenint Element::getIntegralAttribute(const QualifiedName& attributeName) const
184906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
185006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return getAttribute(attributeName).string().toInt();
185106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
185206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
185306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid Element::setIntegralAttribute(const QualifiedName& attributeName, int value)
185406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
185506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // FIXME: Need an AtomicString version of String::number.
185606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    ExceptionCode ec;
185706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    setAttribute(attributeName, String::number(value), ec);
185806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
185906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
186006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenunsigned Element::getUnsignedIntegralAttribute(const QualifiedName& attributeName) const
186106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
186206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return getAttribute(attributeName).string().toUInt();
186306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
186406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
186506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid Element::setUnsignedIntegralAttribute(const QualifiedName& attributeName, unsigned value)
186606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
186706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // FIXME: Need an AtomicString version of String::number.
186806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    ExceptionCode ec;
186906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    setAttribute(attributeName, String::number(value), ec);
187006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
187106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
187206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if ENABLE(SVG)
187306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenbool Element::childShouldCreateRenderer(Node* child) const
187406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
187506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // Only create renderers for SVG elements whose parents are SVG elements, or for proper <svg xmlns="svgNS"> subdocuments.
187606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (child->isSVGElement())
187706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return child->hasTagName(SVGNames::svgTag) || isSVGElement();
187806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
187906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return Node::childShouldCreateRenderer(child);
188006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
188106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif
18825ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
18835ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if ENABLE(FULLSCREEN_API)
18845ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid Element::webkitRequestFullScreen(unsigned short flags)
18855ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
18865ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    document()->webkitRequestFullScreenForElement(this, flags);
18875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
18885ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif
188906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
1890e14391e94c850b8bd03680c23b38978db68687a8John ReckSpellcheckAttributeState Element::spellcheckAttributeState() const
1891e14391e94c850b8bd03680c23b38978db68687a8John Reck{
1892e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (!hasAttribute(HTMLNames::spellcheckAttr))
1893e14391e94c850b8bd03680c23b38978db68687a8John Reck        return SpellcheckAttributeDefault;
1894e14391e94c850b8bd03680c23b38978db68687a8John Reck
1895e14391e94c850b8bd03680c23b38978db68687a8John Reck    const AtomicString& value = getAttribute(HTMLNames::spellcheckAttr);
1896e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (equalIgnoringCase(value, "true") || equalIgnoringCase(value, ""))
1897e14391e94c850b8bd03680c23b38978db68687a8John Reck        return SpellcheckAttributeTrue;
1898e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (equalIgnoringCase(value, "false"))
1899e14391e94c850b8bd03680c23b38978db68687a8John Reck        return SpellcheckAttributeFalse;
1900e14391e94c850b8bd03680c23b38978db68687a8John Reck
1901e14391e94c850b8bd03680c23b38978db68687a8John Reck    return SpellcheckAttributeDefault;
1902e14391e94c850b8bd03680c23b38978db68687a8John Reck}
1903e14391e94c850b8bd03680c23b38978db68687a8John Reck
1904e14391e94c850b8bd03680c23b38978db68687a8John Reckbool Element::isSpellCheckingEnabled() const
1905e14391e94c850b8bd03680c23b38978db68687a8John Reck{
1906e14391e94c850b8bd03680c23b38978db68687a8John Reck    const Element* element = this;
1907e14391e94c850b8bd03680c23b38978db68687a8John Reck    while (element) {
1908e14391e94c850b8bd03680c23b38978db68687a8John Reck        switch (element->spellcheckAttributeState()) {
1909e14391e94c850b8bd03680c23b38978db68687a8John Reck        case SpellcheckAttributeTrue:
1910e14391e94c850b8bd03680c23b38978db68687a8John Reck            return true;
1911e14391e94c850b8bd03680c23b38978db68687a8John Reck        case SpellcheckAttributeFalse:
1912e14391e94c850b8bd03680c23b38978db68687a8John Reck            return false;
1913e14391e94c850b8bd03680c23b38978db68687a8John Reck        case SpellcheckAttributeDefault:
1914e14391e94c850b8bd03680c23b38978db68687a8John Reck            break;
1915e14391e94c850b8bd03680c23b38978db68687a8John Reck        }
1916e14391e94c850b8bd03680c23b38978db68687a8John Reck
19174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ContainerNode* parent = const_cast<Element*>(element)->parentOrHostNode();
19184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        element = (parent && parent->isElementNode()) ? toElement(parent) : 0;
1919e14391e94c850b8bd03680c23b38978db68687a8John Reck    }
1920e14391e94c850b8bd03680c23b38978db68687a8John Reck
1921e14391e94c850b8bd03680c23b38978db68687a8John Reck    return true;
1922e14391e94c850b8bd03680c23b38978db68687a8John Reck}
1923e14391e94c850b8bd03680c23b38978db68687a8John Reck
19242bde8e466a4451c7319e3a072d118917957d6554Steve BlockPassRefPtr<WebKitAnimationList> Element::webkitGetAnimations() const
19252bde8e466a4451c7319e3a072d118917957d6554Steve Block{
19262bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!renderer())
19272bde8e466a4451c7319e3a072d118917957d6554Steve Block        return 0;
19282bde8e466a4451c7319e3a072d118917957d6554Steve Block
19292bde8e466a4451c7319e3a072d118917957d6554Steve Block    AnimationController* animController = renderer()->animation();
19302bde8e466a4451c7319e3a072d118917957d6554Steve Block
19312bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!animController)
19322bde8e466a4451c7319e3a072d118917957d6554Steve Block        return 0;
19332bde8e466a4451c7319e3a072d118917957d6554Steve Block
19342bde8e466a4451c7319e3a072d118917957d6554Steve Block    return animController->animationsForRenderer(renderer());
19352bde8e466a4451c7319e3a072d118917957d6554Steve Block}
19362bde8e466a4451c7319e3a072d118917957d6554Steve Block
19375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} // namespace WebCore
1938