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