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 Dirk Mueller (mueller@kde.org) 5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 75f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful, 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details. 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB. If not, write to 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA. 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25e431852bff2ca6954b119a8c9471fd676abea029Steve Block#include "config.h" 26e431852bff2ca6954b119a8c9471fd676abea029Steve Block#include "Node.h" 27e431852bff2ca6954b119a8c9471fd676abea029Steve Block 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DOM_LOGGING 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define LOG_TAG "webcore" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "AndroidLog.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "AXObjectCache.h" 345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "Attr.h" 35e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "Attribute.h" 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSParser.h" 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSRule.h" 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSRuleList.h" 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSSelector.h" 40635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "CSSSelectorList.h" 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSStyleRule.h" 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSStyleSelector.h" 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSStyleSheet.h" 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ChildNodeList.h" 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ClassNodeList.h" 46d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "ContextMenuController.h" 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DOMImplementation.h" 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h" 49e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include "DocumentType.h" 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DynamicNodeList.h" 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Element.h" 528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "Event.h" 536b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "EventContext.h" 542bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "EventDispatcher.h" 558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "EventException.h" 568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "EventHandler.h" 578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "EventListener.h" 588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "EventNames.h" 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ExceptionCode.h" 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h" 618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "FrameView.h" 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h" 63a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "InspectorInstrumentation.h" 648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "KeyboardEvent.h" 655af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include "LabelsNodeList.h" 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Logging.h" 678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "MouseEvent.h" 688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "MutationEvent.h" 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NameNodeList.h" 705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "NamedNodeMap.h" 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NodeRareData.h" 728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "Page.h" 738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "PlatformMouseEvent.h" 748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "PlatformWheelEvent.h" 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ProcessingInstruction.h" 768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "ProgressEvent.h" 778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "RegisteredEventListener.h" 78cad810f21b803229eb11403f9209855525a25d57Steve Block#include "RenderBlock.h" 79545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "RenderBox.h" 80cad810f21b803229eb11403f9209855525a25d57Steve Block#include "RenderFullScreen.h" 81cad810f21b803229eb11403f9209855525a25d57Steve Block#include "RenderView.h" 82f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "ScopedEventQueue.h" 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ScriptController.h" 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SelectorNodeList.h" 85e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include "StaticNodeList.h" 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TagNodeList.h" 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Text.h" 888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "TextEvent.h" 898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "UIEvent.h" 908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "UIEventWithKeyState.h" 918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "WebKitAnimationEvent.h" 928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "WebKitTransitionEvent.h" 938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "WheelEvent.h" 946b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "WindowEventContext.h" 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "XMLNames.h" 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "htmlediting.h" 978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include <wtf/HashSet.h> 985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include <wtf/PassOwnPtr.h> 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/RefCountedLeakCounter.h> 1005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include <wtf/UnusedParam.h> 101e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include <wtf/text/CString.h> 102a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include <wtf/text/StringBuilder.h> 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if ENABLE(DOM_STORAGE) 1058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "StorageEvent.h" 1068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 1078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#if ENABLE(SVG) 1098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "SVGElementInstance.h" 1108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "SVGUseElement.h" 1118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 1128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1132bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(WML) 1142bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "WMLNames.h" 1152bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif 1162bde8e466a4451c7319e3a072d118917957d6554Steve Block 1175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(XHTMLMP) 1185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "HTMLNoScriptElement.h" 1195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif 1205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 12121939df44de1705786c545cd1bf519d47250322dBen Murdoch#if USE(JSC) 12221939df44de1705786c545cd1bf519d47250322dBen Murdoch#include <runtime/JSGlobalData.h> 12357a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch#endif 12457a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch 125635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#define DUMP_NODE_STATISTICS 0 126635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 127635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectusing namespace std; 128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace HTMLNames; 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool Node::isSupported(const String& feature, const String& version) 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return DOMImplementation::hasFeature(feature, version); 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 138635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if DUMP_NODE_STATISTICS 139635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic HashSet<Node*> liveNodeSet; 140635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 141635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 142635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Node::dumpStatistics() 143635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 144635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if DUMP_NODE_STATISTICS 145635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t nodesWithRareData = 0; 146635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 147635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t elementNodes = 0; 148635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t attrNodes = 0; 149635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t textNodes = 0; 150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t cdataNodes = 0; 151635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t commentNodes = 0; 152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t entityReferenceNodes = 0; 153635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t entityNodes = 0; 154635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t piNodes = 0; 155635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t documentNodes = 0; 156635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t docTypeNodes = 0; 157635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t fragmentNodes = 0; 158635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t notationNodes = 0; 159635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t xpathNSNodes = 0; 160635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 161635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project HashMap<String, size_t> perTagCount; 162635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 163635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t attributes = 0; 164635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t mappedAttributes = 0; 165635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t mappedAttributesWithStyleDecl = 0; 166635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t attributesWithAttr = 0; 167635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t attrMaps = 0; 168635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 169d0825bca7fe65beaee391d30da42e937db621564Steve Block for (HashSet<Node*>::iterator it = liveNodeSet.begin(); it != liveNodeSet.end(); ++it) { 170635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Node* node = *it; 171635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 172635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (node->hasRareData()) 173635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++nodesWithRareData; 174635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 175635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project switch (node->nodeType()) { 176635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case ELEMENT_NODE: { 177635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++elementNodes; 178635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 179635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Tag stats 180635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Element* element = static_cast<Element*>(node); 181635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project pair<HashMap<String, size_t>::iterator, bool> result = perTagCount.add(element->tagName(), 1); 182635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!result.second) 183635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project result.first->second++; 184635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 185635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // AttributeMap stats 1865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (NamedNodeMap* attrMap = element->attributes(true)) { 187635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project attributes += attrMap->length(); 188635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++attrMaps; 189635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (unsigned i = 0; i < attrMap->length(); ++i) { 190635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Attribute* attr = attrMap->attributeItem(i); 191635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (attr->attr()) 192635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++attributesWithAttr; 193635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (attr->isMappedAttribute()) { 194635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++mappedAttributes; 195635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (attr->style()) 196635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++mappedAttributesWithStyleDecl; 197635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 198635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 199635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 200635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 201635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 202635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case ATTRIBUTE_NODE: { 203635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++attrNodes; 204635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 205635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 206635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case TEXT_NODE: { 207635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++textNodes; 208635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 209635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 210635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case CDATA_SECTION_NODE: { 211635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++cdataNodes; 212635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 213635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 214635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case COMMENT_NODE: { 215635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++commentNodes; 216635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 217635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 218635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case ENTITY_REFERENCE_NODE: { 219635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++entityReferenceNodes; 220635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 221635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 222635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case ENTITY_NODE: { 223635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++entityNodes; 224635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 225635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 226635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case PROCESSING_INSTRUCTION_NODE: { 227635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++piNodes; 228635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 229635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 230635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case DOCUMENT_NODE: { 231635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++documentNodes; 232635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 233635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 234635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case DOCUMENT_TYPE_NODE: { 235635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++docTypeNodes; 236635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 237635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 238635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case DOCUMENT_FRAGMENT_NODE: { 239635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++fragmentNodes; 240635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 241635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 242635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case NOTATION_NODE: { 243635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++notationNodes; 244635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 245635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 246635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case XPATH_NAMESPACE_NODE: { 247635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++xpathNSNodes; 248635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 249635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 250635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 251635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 252635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 253635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("Number of Nodes: %d\n\n", liveNodeSet.size()); 254635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("Number of Nodes with RareData: %zu\n\n", nodesWithRareData); 255635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 256635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("NodeType distrubution:\n"); 257635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" Number of Element nodes: %zu\n", elementNodes); 258635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" Number of Attribute nodes: %zu\n", attrNodes); 259635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" Number of Text nodes: %zu\n", textNodes); 260635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" Number of CDATASection nodes: %zu\n", cdataNodes); 261635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" Number of Comment nodes: %zu\n", commentNodes); 262635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" Number of EntityReference nodes: %zu\n", entityReferenceNodes); 263635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" Number of Entity nodes: %zu\n", entityNodes); 264635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" Number of ProcessingInstruction nodes: %zu\n", piNodes); 265635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" Number of Document nodes: %zu\n", documentNodes); 266635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" Number of DocumentType nodes: %zu\n", docTypeNodes); 267635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" Number of DocumentFragment nodes: %zu\n", fragmentNodes); 268635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" Number of Notation nodes: %zu\n", notationNodes); 269635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" Number of XPathNS nodes: %zu\n", xpathNSNodes); 270635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 271635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("Element tag name distibution:\n"); 272d0825bca7fe65beaee391d30da42e937db621564Steve Block for (HashMap<String, size_t>::iterator it = perTagCount.begin(); it != perTagCount.end(); ++it) 273635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" Number of <%s> tags: %zu\n", it->first.utf8().data(), it->second); 274635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 275635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("Attribute Maps:\n"); 276635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" Number of Attributes (non-Node and Node): %zu [%zu]\n", attributes, sizeof(Attribute)); 277e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block printf(" Number of Attributes that are mapped: %zu\n", mappedAttributes); 278e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block printf(" Number of Attributes with a StyleDeclaration: %zu\n", mappedAttributesWithStyleDecl); 279635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" Number of Attributes with an Attr: %zu\n", attributesWithAttr); 280e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block printf(" Number of NamedNodeMaps: %zu [%zu]\n", attrMaps, sizeof(NamedNodeMap)); 281635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 282635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 283635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic WTF::RefCountedLeakCounter nodeCounter("WebCoreNode"); 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool shouldIgnoreLeaks = false; 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic HashSet<Node*> ignoreSet; 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Node::startIgnoringLeaks() 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project shouldIgnoreLeaks = true; 2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Node::stopIgnoringLeaks() 2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project shouldIgnoreLeaks = false; 3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochNode::StyleChange Node::diff(const RenderStyle* s1, const RenderStyle* s2) 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: The behavior of this function is just totally wrong. It doesn't handle 3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // explicit inheritance of non-inherited properties and so you end up not re-resolving 3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // style in cases where you need to. 3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project StyleChange ch = NoInherit; 3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EDisplay display1 = s1 ? s1->display() : NONE; 3128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian bool fl1 = s1 && s1->hasPseudoStyle(FIRST_LETTER); 3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project EDisplay display2 = s2 ? s2->display() : NONE; 3148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian bool fl2 = s2 && s2->hasPseudoStyle(FIRST_LETTER); 3155af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 3165af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke // We just detach if a renderer acquires or loses a column-span, since spanning elements 3175af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke // typically won't contain much content. 3185af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke bool colSpan1 = s1 && s1->columnSpan(); 3195af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke bool colSpan2 = s2 && s2->columnSpan(); 3205af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 3215af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (display1 != display2 || fl1 != fl2 || colSpan1 != colSpan2 || (s1 && s2 && !s1->contentDataEquivalent(s2))) 3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ch = Detach; 3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (!s1 || !s2) 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ch = Inherit; 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (*s1 == *s2) 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ch = NoChange; 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (s1->inheritedNotEqual(s2)) 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ch = Inherit; 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // For nth-child and other positional rules, treat styles as different if they have 3310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // changed positionally in the DOM. This way subsequent sibling resolutions won't be confused 3320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // by the wrong child index and evaluate to incorrect results. 3330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (ch == NoChange && s1->childIndex() != s2->childIndex()) 3340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ch = NoInherit; 3350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the pseudoStyles have changed, we want any StyleChange that is not NoChange 3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // because setStyle will do the right thing with anything else. 338692e5dbf12901edacf14812a6fae25462920af42Steve Block if (ch == NoChange && s1->hasAnyPublicPseudoStyles()) { 339692e5dbf12901edacf14812a6fae25462920af42Steve Block for (PseudoId pseudoId = FIRST_PUBLIC_PSEUDOID; ch == NoChange && pseudoId < FIRST_INTERNAL_PSEUDOID; pseudoId = static_cast<PseudoId>(pseudoId + 1)) { 340692e5dbf12901edacf14812a6fae25462920af42Steve Block if (s1->hasPseudoStyle(pseudoId)) { 341692e5dbf12901edacf14812a6fae25462920af42Steve Block RenderStyle* ps2 = s2->getCachedPseudoStyle(pseudoId); 342692e5dbf12901edacf14812a6fae25462920af42Steve Block if (!ps2) 343692e5dbf12901edacf14812a6fae25462920af42Steve Block ch = NoInherit; 344692e5dbf12901edacf14812a6fae25462920af42Steve Block else { 345692e5dbf12901edacf14812a6fae25462920af42Steve Block RenderStyle* ps1 = s1->getCachedPseudoStyle(pseudoId); 346692e5dbf12901edacf14812a6fae25462920af42Steve Block ch = ps1 && *ps1 == *ps2 ? NoChange : NoInherit; 347692e5dbf12901edacf14812a6fae25462920af42Steve Block } 348692e5dbf12901edacf14812a6fae25462920af42Steve Block } 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 351692e5dbf12901edacf14812a6fae25462920af42Steve Block 3522bde8e466a4451c7319e3a072d118917957d6554Steve Block // When text-combine property has been changed, we need to prepare a separate renderer object. 3532bde8e466a4451c7319e3a072d118917957d6554Steve Block // When text-combine is on, we use RenderCombineText, otherwise RenderText. 3542bde8e466a4451c7319e3a072d118917957d6554Steve Block // https://bugs.webkit.org/show_bug.cgi?id=55069 3552bde8e466a4451c7319e3a072d118917957d6554Steve Block if ((s1 && s2) && (s1->hasTextCombine() != s2->hasTextCombine())) 3562bde8e466a4451c7319e3a072d118917957d6554Steve Block ch = Detach; 3572bde8e466a4451c7319e3a072d118917957d6554Steve Block 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ch; 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 36121939df44de1705786c545cd1bf519d47250322dBen Murdochvoid Node::trackForDebugging() 362231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (shouldIgnoreLeaks) 3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ignoreSet.add(this); 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project nodeCounter.increment(); 3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 369231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 370635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if DUMP_NODE_STATISTICS 371635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project liveNodeSet.add(this); 372635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNode::~Node() 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HashSet<Node*>::iterator it = ignoreSet.find(this); 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (it != ignoreSet.end()) 3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ignoreSet.remove(it); 3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project nodeCounter.decrement(); 3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 384635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 385635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if DUMP_NODE_STATISTICS 386635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project liveNodeSet.remove(this); 387635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 388635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!hasRareData()) 3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!NodeRareData::rareDataMap().contains(this)); 3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else { 3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_document && rareData()->nodeLists()) 3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_document->removeNodeListCache(); 3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NodeRareData::NodeRareDataMap& dataMap = NodeRareData::rareDataMap(); 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NodeRareData::NodeRareDataMap::iterator it = dataMap.find(this); 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(it != dataMap.end()); 3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete it->second; 3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dataMap.remove(it); 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (renderer()) 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project detach(); 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 405bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (AXObjectCache::accessibilityEnabled() && m_document && m_document->axObjectCacheExists()) 406bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_document->axObjectCache()->removeNodeForUse(this); 407bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_previous) 4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_previous->setNextSibling(0); 4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_next) 4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_next->setPreviousSibling(0); 412231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 413231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (m_document) 4142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch m_document->guardDeref(); 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#ifdef NDEBUG 4185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic inline void setWillMoveToNewOwnerDocumentWasCalled(bool) 4205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 4215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 4225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic inline void setDidMoveToNewOwnerDocumentWasCalled(bool) 4245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 4255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 4265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#else 4285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic bool willMoveToNewOwnerDocumentWasCalled; 4305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic bool didMoveToNewOwnerDocumentWasCalled; 4315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic void setWillMoveToNewOwnerDocumentWasCalled(bool wasCalled) 4335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 4345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian willMoveToNewOwnerDocumentWasCalled = wasCalled; 4355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 4365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic void setDidMoveToNewOwnerDocumentWasCalled(bool wasCalled) 4385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 4395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian didMoveToNewOwnerDocumentWasCalled = wasCalled; 4405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 4415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif 4435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid Node::setDocument(Document* document) 445635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 4466c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen ASSERT(!inDocument() || m_document == document); 4475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (inDocument() || m_document == document) 448635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 449635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 4502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch document->guardRef(); 451231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 4525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian setWillMoveToNewOwnerDocumentWasCalled(false); 453635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project willMoveToNewOwnerDocument(); 4545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ASSERT(willMoveToNewOwnerDocumentWasCalled); 455635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 456d0825bca7fe65beaee391d30da42e937db621564Steve Block if (hasRareData() && rareData()->nodeLists()) { 457d0825bca7fe65beaee391d30da42e937db621564Steve Block if (m_document) 458d0825bca7fe65beaee391d30da42e937db621564Steve Block m_document->removeNodeListCache(); 459d0825bca7fe65beaee391d30da42e937db621564Steve Block document->addNodeListCache(); 460d0825bca7fe65beaee391d30da42e937db621564Steve Block } 461d0825bca7fe65beaee391d30da42e937db621564Steve Block 4624a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch if (m_document) { 4634a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch m_document->moveNodeIteratorsToNewDocument(this, document); 4642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch m_document->guardDeref(); 4654a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch } 466231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 4675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_document = document; 468635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 4695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian setDidMoveToNewOwnerDocumentWasCalled(false); 470635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project didMoveToNewOwnerDocument(); 4715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ASSERT(didMoveToNewOwnerDocumentWasCalled); 472635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 473635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 4742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochTreeScope* Node::treeScope() const 4752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 4762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!hasRareData()) 4772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return document(); 4782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch TreeScope* scope = rareData()->treeScope(); 4792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // FIXME: Until we land shadow scopes, there should be no non-document scopes. 4802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(!scope); 4812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return scope ? scope : document(); 4822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 4832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid Node::setTreeScope(TreeScope* newTreeScope) 4852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 4862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(!isDocumentNode()); 4872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(newTreeScope); 4882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(!inDocument() || treeScope() == newTreeScope); 4892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 4902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (newTreeScope->isDocumentNode()) { 4912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (hasRareData()) 4922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch rareData()->setTreeScope(0); 4932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // Setting the new document scope will be handled implicitly 4942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // by setDocument() below. 4952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } else { 4962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // FIXME: Until we land shadow scopes, this branch should be inert. 4972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT_NOT_REACHED(); 4982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ensureRareData()->setTreeScope(newTreeScope); 4992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 5002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 5012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch setDocument(newTreeScope->document()); 5022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 5032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 5042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid Node::setTreeScopeRecursively(TreeScope* newTreeScope) 5052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 5062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(!isDocumentNode()); 5072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(newTreeScope); 5082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (treeScope() == newTreeScope) 5092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 5102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 5112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch Document* currentDocument = document(); 5122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch Document* newDocument = newTreeScope->document(); 5132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // If an element is moved from a document and then eventually back again the collection cache for 5142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // that element may contain stale data as changes made to it will have updated the DOMTreeVersion 5152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // of the document it was moved to. By increasing the DOMTreeVersion of the donating document here 5162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // we ensure that the collection cache will be invalidated as needed when the element is moved back. 5172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (currentDocument && currentDocument != newDocument) 5182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch currentDocument->incDOMTreeVersion(); 5192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 5202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch for (Node* node = this; node; node = node->traverseNextNode(this)) { 5212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch node->setTreeScope(newTreeScope); 5222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // FIXME: Once shadow scopes are landed, update parent scope, etc. 5232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 5242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 5252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 526635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectNodeRareData* Node::rareData() const 5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(hasRareData()); 5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return NodeRareData::rareDataFromMap(this); 5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNodeRareData* Node::ensureRareData() 5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (hasRareData()) 5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return rareData(); 5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!NodeRareData::rareDataMap().contains(this)); 5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NodeRareData* data = createRareData(); 5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NodeRareData::rareDataMap().set(this, data); 54021939df44de1705786c545cd1bf519d47250322dBen Murdoch setFlag(HasRareDataFlag); 5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return data; 5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNodeRareData* Node::createRareData() 5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return new NodeRareData; 5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 548f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 549f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochElement* Node::shadowHost() const 550f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 551cad810f21b803229eb11403f9209855525a25d57Steve Block return toElement(getFlag(IsShadowRootFlag) ? parent() : 0); 552f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 553f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 554f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid Node::setShadowHost(Element* host) 555f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 5562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(!parentNode() && !isSVGShadowRoot()); 557f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (host) 558f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch setFlag(IsShadowRootFlag); 559f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch else 560f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch clearFlag(IsShadowRootFlag); 561f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 562f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch setParent(host); 563f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 564f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 5652bde8e466a4451c7319e3a072d118917957d6554Steve BlockInputElement* Node::toInputElement() 5662bde8e466a4451c7319e3a072d118917957d6554Steve Block{ 5672bde8e466a4451c7319e3a072d118917957d6554Steve Block // If one of the below ASSERTs trigger, you are calling this function 5682bde8e466a4451c7319e3a072d118917957d6554Steve Block // directly or indirectly from a constructor or destructor of this object. 5692bde8e466a4451c7319e3a072d118917957d6554Steve Block // Don't do this! 5702bde8e466a4451c7319e3a072d118917957d6554Steve Block ASSERT(!(isHTMLElement() && hasTagName(inputTag))); 5712bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(WML) 5722bde8e466a4451c7319e3a072d118917957d6554Steve Block ASSERT(!(isWMLElement() && hasTagName(WMLNames::inputTag))); 5732bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif 5742bde8e466a4451c7319e3a072d118917957d6554Steve Block return 0; 5752bde8e466a4451c7319e3a072d118917957d6554Steve Block} 5762bde8e466a4451c7319e3a072d118917957d6554Steve Block 5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectshort Node::tabIndex() const 5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return hasRareData() ? rareData()->tabIndex() : 0; 5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Node::setTabIndexExplicitly(short i) 5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ensureRareData()->setTabIndexExplicitly(i); 5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 58781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid Node::clearTabIndexExplicitly() 58881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 58981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ensureRareData()->clearTabIndexExplicitly(); 59081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 59181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString Node::nodeValue() const 5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return String(); 5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Node::setNodeValue(const String& /*nodeValue*/, ExceptionCode& ec) 5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly 6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isReadOnlyNode()) { 6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ec = NO_MODIFICATION_ALLOWED_ERR; 6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // By default, setting nodeValue has no effect. 6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<NodeList> Node::childNodes() 6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NodeRareData* data = ensureRareData(); 6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!data->nodeLists()) { 6125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian data->setNodeLists(NodeListsNodeData::create()); 613231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (document()) 614231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block document()->addNodeListCache(); 6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return ChildNodeList::create(this, data->nodeLists()->m_childNodeListCaches.get()); 6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNode *Node::lastDescendant() const 6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node *n = const_cast<Node *>(this); 6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (n && n->lastChild()) 6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project n = n->lastChild(); 6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return n; 6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNode* Node::firstDescendant() const 6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node *n = const_cast<Node *>(this); 6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (n && n->firstChild()) 6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project n = n->firstChild(); 6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return n; 6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 636a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochbool Node::insertBefore(PassRefPtr<Node> newChild, Node* refChild, ExceptionCode& ec, bool shouldLazyAttach) 6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 638a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (!isContainerNode()) { 639a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch ec = HIERARCHY_REQUEST_ERR; 640a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return false; 641a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch } 642a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return toContainerNode(this)->insertBefore(newChild, refChild, ec, shouldLazyAttach); 6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 645a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochbool Node::replaceChild(PassRefPtr<Node> newChild, Node* oldChild, ExceptionCode& ec, bool shouldLazyAttach) 6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 647a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (!isContainerNode()) { 648a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch ec = HIERARCHY_REQUEST_ERR; 649a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return false; 650a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch } 651a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return toContainerNode(this)->replaceChild(newChild, oldChild, ec, shouldLazyAttach); 6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 654a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochbool Node::removeChild(Node* oldChild, ExceptionCode& ec) 6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 656a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (!isContainerNode()) { 657a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch ec = NOT_FOUND_ERR; 658a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return false; 659a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch } 660a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return toContainerNode(this)->removeChild(oldChild, ec); 6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 663a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochbool Node::appendChild(PassRefPtr<Node> newChild, ExceptionCode& ec, bool shouldLazyAttach) 6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 665a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (!isContainerNode()) { 666a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch ec = HIERARCHY_REQUEST_ERR; 667a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return false; 668a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch } 669a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return toContainerNode(this)->appendChild(newChild, ec, shouldLazyAttach); 6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Node::remove(ExceptionCode& ec) 6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 674a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (ContainerNode* parent = parentNode()) 675a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch parent->removeChild(this, ec); 6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ec = HIERARCHY_REQUEST_ERR; 6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Node::normalize() 6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Go through the subtree beneath us, normalizing all nodes. This means that 6835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // any two adjacent text nodes are merged and any empty text nodes are removed. 6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Node> node = this; 6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (Node* firstChild = node->firstChild()) 6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project node = firstChild; 6885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian while (node) { 6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NodeType type = node->nodeType(); 6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (type == ELEMENT_NODE) 6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static_cast<Element*>(node.get())->normalizeAttributes(); 6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (node == this) 6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (type != TEXT_NODE) { 6975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian node = node->traverseNextNodePostOrder(); 6985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian continue; 6995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 7005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 7015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian Text* text = static_cast<Text*>(node.get()); 7025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 7035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Remove empty text nodes. 7045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!text->length()) { 7055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Care must be taken to get the next node before removing the current node. 7065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian node = node->traverseNextNodePostOrder(); 7075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ExceptionCode ec; 7085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian text->remove(ec); 7095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian continue; 7105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 7115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 7125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Merge text nodes. 7135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian while (Node* nextSibling = node->nextSibling()) { 714d0825bca7fe65beaee391d30da42e937db621564Steve Block if (nextSibling->nodeType() != TEXT_NODE) 7155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian break; 7165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian RefPtr<Text> nextText = static_cast<Text*>(nextSibling); 7175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 7185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Remove empty text nodes. 7195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!nextText->length()) { 7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ExceptionCode ec; 7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project nextText->remove(ec); 7225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian continue; 7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 7255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Both non-empty text nodes. Merge them. 7265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian unsigned offset = text->length(); 7275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ExceptionCode ec; 7285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian text->appendData(nextText->data(), ec); 7295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian document()->textNodesMerged(nextText.get(), offset); 7305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian nextText->remove(ec); 7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 7335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian node = node->traverseNextNodePostOrder(); 7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst AtomicString& Node::virtualPrefix() const 7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For nodes other than elements and attributes, the prefix is always null 7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nullAtom; 7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Node::setPrefix(const AtomicString& /*prefix*/, ExceptionCode& ec) 7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The spec says that for nodes other than elements and attributes, prefix is always null. 7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // It does not say what to do when the user tries to set the prefix on another type of 7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // node, however Mozilla throws a NAMESPACE_ERR exception. 7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ec = NAMESPACE_ERR; 7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst AtomicString& Node::virtualLocalName() const 7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nullAtom; 7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst AtomicString& Node::virtualNamespaceURI() const 7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nullAtom; 7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 761e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockvoid Node::deprecatedParserAddChild(PassRefPtr<Node>) 7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 763ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block} 764ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 7652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool Node::isContentEditable() const 7662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 7672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch document()->updateLayoutIgnorePendingStylesheets(); 7682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return rendererIsEditable(Editable); 7692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 7702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 7712bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool Node::rendererIsEditable(EditableLevel editableLevel) const 7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 77395217a662a9bdf75bcd22acb92bccce312ea974bTeng-Hui Zhu if (document()->frame() && document()->frame()->page() && document()->frame()->page()->isEditable()) 7742bde8e466a4451c7319e3a072d118917957d6554Steve Block return true; 7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7762bde8e466a4451c7319e3a072d118917957d6554Steve Block // Ideally we'd call ASSERT(!needsStyleRecalc()) here, but 7772bde8e466a4451c7319e3a072d118917957d6554Steve Block // ContainerNode::setFocus() calls setNeedsStyleRecalc(), so the assertion 7782bde8e466a4451c7319e3a072d118917957d6554Steve Block // would fire in the middle of Document::setFocusedNode(). 7792bde8e466a4451c7319e3a072d118917957d6554Steve Block 7802bde8e466a4451c7319e3a072d118917957d6554Steve Block for (const Node* node = this; node; node = node->parentNode()) { 7812bde8e466a4451c7319e3a072d118917957d6554Steve Block if ((node->isHTMLElement() || node->isDocumentNode()) && node->renderer()) { 7822bde8e466a4451c7319e3a072d118917957d6554Steve Block switch (node->renderer()->style()->userModify()) { 7832bde8e466a4451c7319e3a072d118917957d6554Steve Block case READ_ONLY: 7842bde8e466a4451c7319e3a072d118917957d6554Steve Block return false; 7852bde8e466a4451c7319e3a072d118917957d6554Steve Block case READ_WRITE: 7862bde8e466a4451c7319e3a072d118917957d6554Steve Block return true; 7872bde8e466a4451c7319e3a072d118917957d6554Steve Block case READ_WRITE_PLAINTEXT_ONLY: 7882bde8e466a4451c7319e3a072d118917957d6554Steve Block return editableLevel != RichlyEditable; 7892bde8e466a4451c7319e3a072d118917957d6554Steve Block } 7902bde8e466a4451c7319e3a072d118917957d6554Steve Block ASSERT_NOT_REACHED(); 7912bde8e466a4451c7319e3a072d118917957d6554Steve Block return false; 7922bde8e466a4451c7319e3a072d118917957d6554Steve Block } 7932bde8e466a4451c7319e3a072d118917957d6554Steve Block } 7942bde8e466a4451c7319e3a072d118917957d6554Steve Block 7952bde8e466a4451c7319e3a072d118917957d6554Steve Block return false; 7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool Node::shouldUseInputMethod() const 7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return isContentEditable(); 8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 803635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectRenderBox* Node::renderBox() const 8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return m_renderer && m_renderer->isBox() ? toRenderBox(m_renderer) : 0; 8068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 8078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 8088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianRenderBoxModelObject* Node::renderBoxModelObject() const 8098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 8108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return m_renderer && m_renderer->isBoxModelObject() ? toRenderBoxModelObject(m_renderer) : 0; 811635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 813635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectIntRect Node::getRect() const 814635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 815635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (renderer()) 816967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch return renderer()->absoluteBoundingBoxRect(true); 8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return IntRect(); 8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 81906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 82006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenIntRect Node::renderRect(bool* isReplaced) 82106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 82206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen RenderObject* hitRenderer = this->renderer(); 82306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(hitRenderer); 82406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen RenderObject* renderer = hitRenderer; 82506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen while (renderer && !renderer->isBody() && !renderer->isRoot()) { 82606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (renderer->isRenderBlock() || renderer->isInlineBlockOrInlineTable() || renderer->isReplaced()) { 82706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *isReplaced = renderer->isReplaced(); 82806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return renderer->absoluteBoundingBoxRect(true); 82906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 83006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen renderer = renderer->parent(); 83106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 83206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return IntRect(); 83306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 83521939df44de1705786c545cd1bf519d47250322dBen Murdochbool Node::hasNonEmptyBoundingBox() const 83621939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 83721939df44de1705786c545cd1bf519d47250322dBen Murdoch // Before calling absoluteRects, check for the common case where the renderer 83821939df44de1705786c545cd1bf519d47250322dBen Murdoch // is non-empty, since this is a faster check and almost always returns true. 83921939df44de1705786c545cd1bf519d47250322dBen Murdoch RenderBoxModelObject* box = renderBoxModelObject(); 84021939df44de1705786c545cd1bf519d47250322dBen Murdoch if (!box) 84121939df44de1705786c545cd1bf519d47250322dBen Murdoch return false; 84221939df44de1705786c545cd1bf519d47250322dBen Murdoch if (!box->borderBoundingBox().isEmpty()) 84321939df44de1705786c545cd1bf519d47250322dBen Murdoch return true; 84421939df44de1705786c545cd1bf519d47250322dBen Murdoch 84521939df44de1705786c545cd1bf519d47250322dBen Murdoch Vector<IntRect> rects; 84621939df44de1705786c545cd1bf519d47250322dBen Murdoch FloatPoint absPos = renderer()->localToAbsolute(); 84721939df44de1705786c545cd1bf519d47250322dBen Murdoch renderer()->absoluteRects(rects, absPos.x(), absPos.y()); 84821939df44de1705786c545cd1bf519d47250322dBen Murdoch size_t n = rects.size(); 84921939df44de1705786c545cd1bf519d47250322dBen Murdoch for (size_t i = 0; i < n; ++i) 85021939df44de1705786c545cd1bf519d47250322dBen Murdoch if (!rects[i].isEmpty()) 85121939df44de1705786c545cd1bf519d47250322dBen Murdoch return true; 85221939df44de1705786c545cd1bf519d47250322dBen Murdoch 85321939df44de1705786c545cd1bf519d47250322dBen Murdoch return false; 85421939df44de1705786c545cd1bf519d47250322dBen Murdoch} 85521939df44de1705786c545cd1bf519d47250322dBen Murdoch 8562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochinline static ContainerNode* shadowRoot(Node* node) 85765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 8582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return node->isElementNode() ? toElement(node)->shadowRoot() : 0; 8592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 86065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 8612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid Node::setDocumentRecursively(Document* newDocument) 8622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 8632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(document() != newDocument); 8642bde8e466a4451c7319e3a072d118917957d6554Steve Block 86565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (Node* node = this; node; node = node->traverseNextNode(this)) { 8662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch node->setDocument(newDocument); 86765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!node->isElementNode()) 86865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch continue; 8692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (Node* shadow = shadowRoot(node)) 8702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch shadow->setDocumentRecursively(newDocument); 87165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 87265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 87365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 87421939df44de1705786c545cd1bf519d47250322dBen Murdochinline void Node::setStyleChange(StyleChangeType changeType) 87521939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 87621939df44de1705786c545cd1bf519d47250322dBen Murdoch m_nodeFlags = (m_nodeFlags & ~StyleChangeMask) | changeType; 87721939df44de1705786c545cd1bf519d47250322dBen Murdoch} 87821939df44de1705786c545cd1bf519d47250322dBen Murdoch 87968513a70bcd92384395513322f1b801e7bf9c729Steve Blockinline void Node::markAncestorsWithChildNeedsStyleRecalc() 88068513a70bcd92384395513322f1b801e7bf9c729Steve Block{ 8816b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner for (ContainerNode* p = parentOrHostNode(); p && !p->childNeedsStyleRecalc(); p = p->parentOrHostNode()) 88268513a70bcd92384395513322f1b801e7bf9c729Steve Block p->setChildNeedsStyleRecalc(); 8836b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 88468513a70bcd92384395513322f1b801e7bf9c729Steve Block if (document()->childNeedsStyleRecalc()) 88568513a70bcd92384395513322f1b801e7bf9c729Steve Block document()->scheduleStyleRecalc(); 88668513a70bcd92384395513322f1b801e7bf9c729Steve Block} 88768513a70bcd92384395513322f1b801e7bf9c729Steve Block 888a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid Node::refEventTarget() 889a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{ 890a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch ref(); 891a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch} 892a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 893a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid Node::derefEventTarget() 894a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{ 895a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch deref(); 896a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch} 897a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 8985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid Node::setNeedsStyleRecalc(StyleChangeType changeType) 8998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 900db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block ASSERT(changeType != NoStyleChange); 901db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block if (!attached()) // changed compared to what? 9028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 904db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block StyleChangeType existingChangeType = styleChangeType(); 905db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block if (changeType > existingChangeType) 90621939df44de1705786c545cd1bf519d47250322dBen Murdoch setStyleChange(changeType); 9078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 90868513a70bcd92384395513322f1b801e7bf9c729Steve Block if (existingChangeType == NoStyleChange) 90968513a70bcd92384395513322f1b801e7bf9c729Steve Block markAncestorsWithChildNeedsStyleRecalc(); 9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 91268513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid Node::lazyAttach(ShouldSetAttached shouldSetAttached) 9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Node* n = this; n; n = n->traverseNextNode(this)) { 9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (n->firstChild()) 91621939df44de1705786c545cd1bf519d47250322dBen Murdoch n->setChildNeedsStyleRecalc(); 91721939df44de1705786c545cd1bf519d47250322dBen Murdoch n->setStyleChange(FullStyleChange); 91868513a70bcd92384395513322f1b801e7bf9c729Steve Block if (shouldSetAttached == SetAttached) 91968513a70bcd92384395513322f1b801e7bf9c729Steve Block n->setAttached(); 9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 92168513a70bcd92384395513322f1b801e7bf9c729Steve Block markAncestorsWithChildNeedsStyleRecalc(); 9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Node::setFocus(bool b) 9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (b || hasRareData()) 927635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ensureRareData()->setFocused(b); 9288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool Node::rareDataFocused() const 9318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(hasRareData()); 933635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return rareData()->isFocused(); 9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 935231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 936231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool Node::supportsFocus() const 937231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 938231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return hasRareData() && rareData()->tabIndexSetExplicitly(); 939231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool Node::isFocusable() const 9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 943231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!inDocument() || !supportsFocus()) 944231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; 945231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 946231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (renderer()) 947231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(!renderer()->needsLayout()); 948231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block else 949231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // If the node is in a display:none tree it might say it needs style recalc but 950d0825bca7fe65beaee391d30da42e937db621564Steve Block // the whole document is actually up to date. 951231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(!document()->childNeedsStyleRecalc()); 952231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 953231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // FIXME: Even if we are not visible, we might have a child that is visible. 954231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Hyatt wants to fix that some day with a "has visible content" flag or the like. 955231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!renderer() || renderer()->style()->visibility() != VISIBLE) 956231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; 957231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 958231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return true; 9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool Node::isKeyboardFocusable(KeyboardEvent*) const 9628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return isFocusable() && tabIndex() >= 0; 9648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool Node::isMouseFocusable() const 9678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return isFocusable(); 9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectunsigned Node::nodeIndex() const 9728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node *_tempNode = previousSibling(); 9748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned count=0; 9750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch for ( count=0; _tempNode; count++ ) 9768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _tempNode = _tempNode->previousSibling(); 9778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return count; 9788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Node::registerDynamicNodeList(DynamicNodeList* list) 9818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NodeRareData* data = ensureRareData(); 9838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!data->nodeLists()) { 9845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian data->setNodeLists(NodeListsNodeData::create()); 9858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project document()->addNodeListCache(); 986231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } else if (!m_document || !m_document->hasNodeListCaches()) { 9878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We haven't been receiving notifications while there were no registered lists, so the cache is invalid now. 9888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project data->nodeLists()->invalidateCaches(); 9898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (list->hasOwnCaches()) 9928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project data->nodeLists()->m_listsWithCaches.add(list); 9938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Node::unregisterDynamicNodeList(DynamicNodeList* list) 9968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(rareData()); 9988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(rareData()->nodeLists()); 9998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (list->hasOwnCaches()) { 10008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NodeRareData* data = rareData(); 10018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project data->nodeLists()->m_listsWithCaches.remove(list); 10028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (data->nodeLists()->isEmpty()) { 10038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project data->clearNodeLists(); 1004231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (document()) 1005231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block document()->removeNodeListCache(); 10068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Node::notifyLocalNodeListsAttributeChanged() 10118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!hasRareData()) 10138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 10148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NodeRareData* data = rareData(); 10158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!data->nodeLists()) 10168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 10178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1018d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!isAttributeNode()) 1019d0825bca7fe65beaee391d30da42e937db621564Steve Block data->nodeLists()->invalidateCachesThatDependOnAttributes(); 1020d0825bca7fe65beaee391d30da42e937db621564Steve Block else 1021d0825bca7fe65beaee391d30da42e937db621564Steve Block data->nodeLists()->invalidateCaches(); 10228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (data->nodeLists()->isEmpty()) { 10248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project data->clearNodeLists(); 10258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project document()->removeNodeListCache(); 10268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Node::notifyNodeListsAttributeChanged() 10308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Node *n = this; n; n = n->parentNode()) 10328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project n->notifyLocalNodeListsAttributeChanged(); 10338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Node::notifyLocalNodeListsChildrenChanged() 10368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!hasRareData()) 10388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 10398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NodeRareData* data = rareData(); 10408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!data->nodeLists()) 10418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 10428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project data->nodeLists()->invalidateCaches(); 10448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NodeListsNodeData::NodeListSet::iterator end = data->nodeLists()->m_listsWithCaches.end(); 10468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (NodeListsNodeData::NodeListSet::iterator i = data->nodeLists()->m_listsWithCaches.begin(); i != end; ++i) 10478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (*i)->invalidateCache(); 10488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (data->nodeLists()->isEmpty()) { 10508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project data->clearNodeLists(); 10518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project document()->removeNodeListCache(); 10528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Node::notifyNodeListsChildrenChanged() 10568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Node* n = this; n; n = n->parentNode()) 10588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project n->notifyLocalNodeListsChildrenChanged(); 10598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10615af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkevoid Node::notifyLocalNodeListsLabelChanged() 10625af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{ 10635af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (!hasRareData()) 10645af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return; 10655af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke NodeRareData* data = rareData(); 10665af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (!data->nodeLists()) 10675af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return; 10685af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 10695af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (data->nodeLists()->m_labelsNodeListCache) 10705af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke data->nodeLists()->m_labelsNodeListCache->invalidateCache(); 10715af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke} 10725af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 107321939df44de1705786c545cd1bf519d47250322dBen Murdochvoid Node::removeCachedClassNodeList(ClassNodeList* list, const String& className) 107421939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 107521939df44de1705786c545cd1bf519d47250322dBen Murdoch ASSERT(rareData()); 107621939df44de1705786c545cd1bf519d47250322dBen Murdoch ASSERT(rareData()->nodeLists()); 107721939df44de1705786c545cd1bf519d47250322dBen Murdoch ASSERT_UNUSED(list, list->hasOwnCaches()); 107821939df44de1705786c545cd1bf519d47250322dBen Murdoch 107921939df44de1705786c545cd1bf519d47250322dBen Murdoch NodeListsNodeData* data = rareData()->nodeLists(); 108021939df44de1705786c545cd1bf519d47250322dBen Murdoch ASSERT_UNUSED(list, list == data->m_classNodeListCache.get(className)); 108121939df44de1705786c545cd1bf519d47250322dBen Murdoch data->m_classNodeListCache.remove(className); 108221939df44de1705786c545cd1bf519d47250322dBen Murdoch} 108321939df44de1705786c545cd1bf519d47250322dBen Murdoch 108421939df44de1705786c545cd1bf519d47250322dBen Murdochvoid Node::removeCachedNameNodeList(NameNodeList* list, const String& nodeName) 108521939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 108621939df44de1705786c545cd1bf519d47250322dBen Murdoch ASSERT(rareData()); 108721939df44de1705786c545cd1bf519d47250322dBen Murdoch ASSERT(rareData()->nodeLists()); 108821939df44de1705786c545cd1bf519d47250322dBen Murdoch ASSERT_UNUSED(list, list->hasOwnCaches()); 108921939df44de1705786c545cd1bf519d47250322dBen Murdoch 109021939df44de1705786c545cd1bf519d47250322dBen Murdoch NodeListsNodeData* data = rareData()->nodeLists(); 109121939df44de1705786c545cd1bf519d47250322dBen Murdoch ASSERT_UNUSED(list, list == data->m_nameNodeListCache.get(nodeName)); 109221939df44de1705786c545cd1bf519d47250322dBen Murdoch data->m_nameNodeListCache.remove(nodeName); 109321939df44de1705786c545cd1bf519d47250322dBen Murdoch} 109421939df44de1705786c545cd1bf519d47250322dBen Murdoch 109521939df44de1705786c545cd1bf519d47250322dBen Murdochvoid Node::removeCachedTagNodeList(TagNodeList* list, const QualifiedName& name) 109621939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 109721939df44de1705786c545cd1bf519d47250322dBen Murdoch ASSERT(rareData()); 109821939df44de1705786c545cd1bf519d47250322dBen Murdoch ASSERT(rareData()->nodeLists()); 109921939df44de1705786c545cd1bf519d47250322dBen Murdoch ASSERT_UNUSED(list, list->hasOwnCaches()); 110021939df44de1705786c545cd1bf519d47250322dBen Murdoch 110121939df44de1705786c545cd1bf519d47250322dBen Murdoch NodeListsNodeData* data = rareData()->nodeLists(); 11026c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen ASSERT_UNUSED(list, list == data->m_tagNodeListCache.get(name.impl())); 11036c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen data->m_tagNodeListCache.remove(name.impl()); 110421939df44de1705786c545cd1bf519d47250322dBen Murdoch} 110521939df44de1705786c545cd1bf519d47250322dBen Murdoch 11065af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkevoid Node::removeCachedLabelsNodeList(DynamicNodeList* list) 11075af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{ 11085af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke ASSERT(rareData()); 11095af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke ASSERT(rareData()->nodeLists()); 11105af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke ASSERT_UNUSED(list, list->hasOwnCaches()); 11115af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 11125af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke NodeListsNodeData* data = rareData()->nodeLists(); 11135af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke data->m_labelsNodeListCache = 0; 11145af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke} 11155af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 111665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNode* Node::traverseNextNode(const Node* stayWithin) const 11178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (firstChild()) 11198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return firstChild(); 11208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (this == stayWithin) 11218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 11228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (nextSibling()) 11238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nextSibling(); 11248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const Node *n = this; 11258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (n && !n->nextSibling() && (!stayWithin || n->parentNode() != stayWithin)) 11268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project n = n->parentNode(); 11278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (n) 11288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return n->nextSibling(); 11298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 11308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 113265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNode* Node::traverseNextSibling(const Node* stayWithin) const 11338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (this == stayWithin) 11358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 11368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (nextSibling()) 11378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nextSibling(); 11388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const Node *n = this; 11398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (n && !n->nextSibling() && (!stayWithin || n->parentNode() != stayWithin)) 11408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project n = n->parentNode(); 11418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (n) 11428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return n->nextSibling(); 11438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 11448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNode* Node::traverseNextNodePostOrder() const 11478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* next = nextSibling(); 11498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!next) 11508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return parentNode(); 11518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (Node* firstChild = next->firstChild()) 11528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project next = firstChild; 11538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return next; 11548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 115665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNode* Node::traversePreviousNode(const Node* stayWithin) const 11578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (this == stayWithin) 11598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 11608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (previousSibling()) { 11618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node *n = previousSibling(); 11628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (n->lastChild()) 11638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project n = n->lastChild(); 11648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return n; 11658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return parentNode(); 11678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 116965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNode* Node::traversePreviousNodePostOrder(const Node* stayWithin) const 11708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (lastChild()) 11728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return lastChild(); 11738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (this == stayWithin) 11748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 11758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (previousSibling()) 11768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return previousSibling(); 11778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const Node *n = this; 11788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (n && !n->previousSibling() && (!stayWithin || n->parentNode() != stayWithin)) 11798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project n = n->parentNode(); 11808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (n) 11818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return n->previousSibling(); 11828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 11838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNode* Node::traversePreviousSiblingPostOrder(const Node* stayWithin) const 11868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (this == stayWithin) 11888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 11898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (previousSibling()) 11908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return previousSibling(); 11918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const Node *n = this; 11928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (n && !n->previousSibling() && (!stayWithin || n->parentNode() != stayWithin)) 11938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project n = n->parentNode(); 11948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (n) 11958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return n->previousSibling(); 11968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 11978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1199d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid Node::checkSetPrefix(const AtomicString& prefix, ExceptionCode& ec) 12008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Perform error checking as required by spec for setting Node.prefix. Used by 12028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Element::setPrefix() and Attr::setPrefix() 12038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Implement support for INVALID_CHARACTER_ERR: Raised if the specified prefix contains an illegal character. 12058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isReadOnlyNode()) { 12078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ec = NO_MODIFICATION_ALLOWED_ERR; 12088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 12098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1211d0825bca7fe65beaee391d30da42e937db621564Steve Block // FIXME: Raise NAMESPACE_ERR if prefix is malformed per the Namespaces in XML specification. 1212d0825bca7fe65beaee391d30da42e937db621564Steve Block 1213d0825bca7fe65beaee391d30da42e937db621564Steve Block const AtomicString& nodeNamespaceURI = namespaceURI(); 1214d0825bca7fe65beaee391d30da42e937db621564Steve Block if ((nodeNamespaceURI.isEmpty() && !prefix.isEmpty()) 1215d0825bca7fe65beaee391d30da42e937db621564Steve Block || (prefix == xmlAtom && nodeNamespaceURI != XMLNames::xmlNamespaceURI)) { 12168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ec = NAMESPACE_ERR; 12178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1218d0825bca7fe65beaee391d30da42e937db621564Steve Block } 1219d0825bca7fe65beaee391d30da42e937db621564Steve Block // Attribute-specific checks are in Attr::setPrefix(). 12208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12225ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenstatic bool isChildTypeAllowed(Node* newParent, Node* child) 12238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12245ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (child->nodeType() != Node::DOCUMENT_FRAGMENT_NODE) { 12255ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (!newParent->childTypeAllowed(child->nodeType())) 12268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1227e14391e94c850b8bd03680c23b38978db68687a8John Reck return true; 12288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12295ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 12305ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen for (Node *n = child->firstChild(); n; n = n->nextSibling()) { 12315ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (!newParent->childTypeAllowed(n->nodeType())) 12325ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return false; 12335ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 12348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 12358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12375ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenbool Node::canReplaceChild(Node* newChild, Node*) 12385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 12395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return isChildTypeAllowed(this, newChild); 12405ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 12415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 12425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenstatic void checkAcceptChild(Node* newParent, Node* newChild, ExceptionCode& ec) 12438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Not mentioned in spec: throw NOT_FOUND_ERR if newChild is null 12458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!newChild) { 12468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ec = NOT_FOUND_ERR; 12478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 12488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12505ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (newParent->isReadOnlyNode()) { 12518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ec = NO_MODIFICATION_ALLOWED_ERR; 12528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 12538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12542bde8e466a4451c7319e3a072d118917957d6554Steve Block 12552bde8e466a4451c7319e3a072d118917957d6554Steve Block if (newChild->inDocument() && newChild->nodeType() == Node::DOCUMENT_TYPE_NODE) { 12562bde8e466a4451c7319e3a072d118917957d6554Steve Block ec = HIERARCHY_REQUEST_ERR; 12575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return; 12588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12592bde8e466a4451c7319e3a072d118917957d6554Steve Block 12608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // HIERARCHY_REQUEST_ERR: Raised if this node is of a type that does not allow children of the type of the 12618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // newChild node, or if the node to append is one of this node's ancestors. 12625ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 12635ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (newChild == newParent || newParent->isDescendantOf(newChild)) { 12648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ec = HIERARCHY_REQUEST_ERR; 12658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 12668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12695ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid Node::checkReplaceChild(Node* newChild, Node* oldChild, ExceptionCode& ec) 12705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 12712bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!oldChild) { 12722bde8e466a4451c7319e3a072d118917957d6554Steve Block ec = NOT_FOUND_ERR; 12732bde8e466a4451c7319e3a072d118917957d6554Steve Block return; 12742bde8e466a4451c7319e3a072d118917957d6554Steve Block } 12752bde8e466a4451c7319e3a072d118917957d6554Steve Block 12765ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen checkAcceptChild(this, newChild, ec); 12775ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (ec) 12788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 12798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12805ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (!canReplaceChild(newChild, oldChild)) { 12815ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen ec = HIERARCHY_REQUEST_ERR; 12825ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return; 12838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12845ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 12858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12865ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid Node::checkAddChild(Node *newChild, ExceptionCode& ec) 12875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 12885ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen checkAcceptChild(this, newChild, ec); 12895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (ec) 12908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 12918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12925ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (!isChildTypeAllowed(this, newChild)) { 12935ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen ec = HIERARCHY_REQUEST_ERR; 12945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return; 12958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 12968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool Node::isDescendantOf(const Node *other) const 12998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Return true if other is an ancestor of this, otherwise false 13018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!other) 13028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1303a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch for (const ContainerNode* n = parentNode(); n; n = n->parentNode()) { 13048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (n == other) 13058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 13068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 13088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1310635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool Node::contains(const Node* node) const 1311635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 1312635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!node) 1313635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return false; 1314635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return this == node || node->isDescendantOf(this); 1315635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1316635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 13174a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdochbool Node::containsIncludingShadowDOM(Node* node) 13184a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch{ 13194a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch if (!node) 13204a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch return false; 13214a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch for (Node* n = node; n; n = n->parentOrHostNode()) { 13224a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch if (n == this) 13234a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch return true; 13244a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch } 13254a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch return false; 13264a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch} 13274a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch 13288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Node::attach() 13298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!attached()); 13318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!renderer() || (renderer()->style() && renderer()->parent())); 13328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 133381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // FIXME: This is O(N^2) for the innerHTML case, where all children are replaced at once (and not attached). 13348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If this node got a renderer it may be the previousRenderer() of sibling text nodes and thus affect the 13358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // result of Text::rendererIsNeeded() for those nodes. 13368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (renderer()) { 13378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Node* next = nextSibling(); next; next = next->nextSibling()) { 13388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (next->renderer()) 13398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 13408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!next->attached()) 13418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; // Assume this means none of the following siblings are attached. 13428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (next->isTextNode()) 13438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project next->createRendererIfNeeded(); 13448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 134721939df44de1705786c545cd1bf519d47250322dBen Murdoch setAttached(); 1348db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block clearNeedsStyleRecalc(); 13498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Node::willRemove() 13528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Node::detach() 13568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 135721939df44de1705786c545cd1bf519d47250322dBen Murdoch setFlag(InDetachFlag); 13588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (renderer()) 13608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project renderer()->destroy(); 13618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setRenderer(0); 13628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Document* doc = document(); 136421939df44de1705786c545cd1bf519d47250322dBen Murdoch if (hovered()) 13658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project doc->hoveredNodeDetached(this); 136621939df44de1705786c545cd1bf519d47250322dBen Murdoch if (inActiveChain()) 13678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project doc->activeChainNodeDetached(this); 13688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 136921939df44de1705786c545cd1bf519d47250322dBen Murdoch clearFlag(IsActiveFlag); 137021939df44de1705786c545cd1bf519d47250322dBen Murdoch clearFlag(IsHoveredFlag); 137121939df44de1705786c545cd1bf519d47250322dBen Murdoch clearFlag(InActiveChainFlag); 137221939df44de1705786c545cd1bf519d47250322dBen Murdoch clearFlag(IsAttachedFlag); 137321939df44de1705786c545cd1bf519d47250322dBen Murdoch 137421939df44de1705786c545cd1bf519d47250322dBen Murdoch clearFlag(InDetachFlag); 13758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 137781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochRenderObject* Node::previousRenderer() 13788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 137981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // FIXME: We should have the same O(N^2) avoidance as nextRenderer does 138081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // however, when I tried adding it, several tests failed. 138181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch for (Node* n = previousSibling(); n; n = n->previousSibling()) { 13828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (n->renderer()) 13838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return n->renderer(); 13848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 13868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 138881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochRenderObject* Node::nextRenderer() 13898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 139081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // Avoid an O(n^2) problem with this function by not checking for 139181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // nextRenderer() when the parent element hasn't attached yet. 1392f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (parentOrHostNode() && !parentOrHostNode()->attached()) 13938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 13948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 139581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch for (Node* n = nextSibling(); n; n = n->nextSibling()) { 13968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (n->renderer()) 13978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return n->renderer(); 13988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 14008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// FIXME: This code is used by editing. Seems like it could move over there and not pollute Node. 14038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNode *Node::previousNodeConsideringAtomicNodes() const 14048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (previousSibling()) { 14068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node *n = previousSibling(); 14078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (!isAtomicNode(n) && n->lastChild()) 14088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project n = n->lastChild(); 14098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return n; 14108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (parentNode()) { 14128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return parentNode(); 14138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else { 14158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 14168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNode *Node::nextNodeConsideringAtomicNodes() const 14208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!isAtomicNode(this) && firstChild()) 14228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return firstChild(); 14238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (nextSibling()) 14248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nextSibling(); 14258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const Node *n = this; 14268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (n && !n->nextSibling()) 14278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project n = n->parentNode(); 14288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (n) 14298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return n->nextSibling(); 14308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 14318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNode *Node::previousLeafNode() const 14348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node *node = previousNodeConsideringAtomicNodes(); 14368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (node) { 14378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isAtomicNode(node)) 14388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return node; 14398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project node = node->previousNodeConsideringAtomicNodes(); 14408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 14428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNode *Node::nextLeafNode() const 14458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node *node = nextNodeConsideringAtomicNodes(); 14478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (node) { 14488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isAtomicNode(node)) 14498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return node; 14508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project node = node->nextNodeConsideringAtomicNodes(); 14518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 14538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochContainerNode* Node::parentNodeForRenderingAndStyle() const 14562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 14572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ContainerNode* parent = parentOrHostNode(); 14582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return parent && parent->isShadowBoundary() ? parent->shadowHost() : parent; 14592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 14602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 14612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic bool shouldCreateRendererFor(Node* node, ContainerNode* parentForRenderingAndStyle) 14622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 14632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch RenderObject* parentRenderer = parentForRenderingAndStyle->renderer(); 14642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!parentRenderer) 14652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return false; 14662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 14672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch bool atShadowBoundary = node->parentOrHostNode()->isShadowBoundary(); 14682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 14692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // FIXME: Ignoring canHaveChildren() in a case of isShadowRoot() might be wrong. 14702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // See https://bugs.webkit.org/show_bug.cgi?id=52423 14712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!parentRenderer->canHaveChildren() && !(node->isShadowRoot() || atShadowBoundary)) 14722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return false; 14732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 14742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (shadowRoot(parentForRenderingAndStyle) && !atShadowBoundary 14752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch && !parentForRenderingAndStyle->canHaveLightChildRendererWithShadow()) 14762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return false; 14772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 14782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!parentForRenderingAndStyle->childShouldCreateRenderer(node)) 14792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return false; 14802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 14812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return true; 14822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 14832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 148481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochRenderObject* Node::createRendererAndStyle() 148581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 148681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(!renderer()); 148781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(document()->shouldCreateRenderers()); 148881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 14892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ContainerNode* parent = parentNodeForRenderingAndStyle(); 149081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(parent); 149181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 14922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!shouldCreateRendererFor(this, parent)) 149381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return 0; 149481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 149581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch RefPtr<RenderStyle> style = styleForRenderer(); 149681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!rendererIsNeeded(style.get())) 149781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return 0; 149881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 149981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch RenderObject* newRenderer = createRenderer(document()->renderArena(), style.get()); 150081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!newRenderer) 150181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return 0; 150281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 15032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!parent->renderer()->isChildAllowed(newRenderer, style.get())) { 150481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch newRenderer->destroy(); 150581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return 0; 150681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 150781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch setRenderer(newRenderer); 150881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch newRenderer->setAnimatableStyle(style.release()); // setAnimatableStyle() can depend on renderer() already being set. 150981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return newRenderer; 151081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 151181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 151281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if ENABLE(FULLSCREEN_API) 151381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic RenderFullScreen* wrapWithRenderFullScreen(RenderObject* object, Document* document) 151481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 151581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch RenderFullScreen* fullscreenRenderer = new (document->renderArena()) RenderFullScreen(document); 151681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch fullscreenRenderer->setStyle(RenderFullScreen::createFullScreenStyle()); 151781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // It's possible that we failed to create the new render and end up wrapping nothing. 151881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // We'll end up displaying a black screen, but Jer says this is expected. 151981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (object) 152081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch fullscreenRenderer->addChild(object); 152181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch document->setFullScreenRenderer(fullscreenRenderer); 152281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return fullscreenRenderer; 152381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 152481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 152581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 15268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Node::createRendererIfNeeded() 15278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!document()->shouldCreateRenderers()) 15298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 15308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!renderer()); 153281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 153381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch RenderObject* newRenderer = createRendererAndStyle(); 153481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 1535cad810f21b803229eb11403f9209855525a25d57Steve Block#if ENABLE(FULLSCREEN_API) 153681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (document()->webkitIsFullScreen() && document()->webkitCurrentFullScreenElement() == this) 153781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch newRenderer = wrapWithRenderFullScreen(newRenderer, document()); 1538cad810f21b803229eb11403f9209855525a25d57Steve Block#endif 153965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 154081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!newRenderer) 154181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 154281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 154381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // Note: Adding newRenderer instead of renderer(). renderer() may be a child of newRenderer. 15442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch parentNodeForRenderingAndStyle()->renderer()->addChild(newRenderer, nextRenderer()); 15458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<RenderStyle> Node::styleForRenderer() 15488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (isElementNode()) { 15505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian bool allowSharing = true; 15515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(XHTMLMP) 15525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // noscript needs the display property protected - it's a special case 15535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian allowSharing = localName() != HTMLNames::noscriptTag.localName(); 15545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif 15555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return document()->styleSelector()->styleForElement(static_cast<Element*>(this), 0, allowSharing); 15565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 15578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return parentNode() && parentNode()->renderer() ? parentNode()->renderer()->style() : 0; 15588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool Node::rendererIsNeeded(RenderStyle *style) 15618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return (document()->documentElement() == this) || (style->display() != NONE); 15638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1565635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectRenderObject* Node::createRenderer(RenderArena*, RenderStyle*) 15668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(false); 15688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 15698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderStyle* Node::nonRendererRenderStyle() const 15728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 15748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Node::setRenderStyle(PassRefPtr<RenderStyle> s) 15778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_renderer) 15798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_renderer->setAnimatableStyle(s); 15808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1582dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockRenderStyle* Node::virtualComputedStyle(PseudoId pseudoElementSpecifier) 15838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1584f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return parentOrHostNode() ? parentOrHostNode()->computedStyle(pseudoElementSpecifier) : 0; 15858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint Node::maxCharacterOffset() const 15888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT_NOT_REACHED(); 15908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 15918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// FIXME: Shouldn't these functions be in the editing code? Code that asks questions about HTML in the core DOM class 15948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// is obviously misplaced. 15958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool Node::canStartSelection() const 15968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15972bde8e466a4451c7319e3a072d118917957d6554Steve Block if (rendererIsEditable()) 15988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 15990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 16000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (renderer()) { 16010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch RenderStyle* style = renderer()->style(); 16020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // We allow selections to begin within an element that has -webkit-user-select: none set, 16030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // but if the element is draggable then dragging should take priority over selection. 16040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (style->userDrag() == DRAG_ELEMENT && style->userSelect() == SELECT_NONE) 16050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return false; 16060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 1607f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return parentOrHostNode() ? parentOrHostNode()->canStartSelection() : true; 16088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if ENABLE(SVG) 16112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochSVGUseElement* Node::svgShadowHost() const 16122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 16132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return isSVGShadowRoot() ? static_cast<SVGUseElement*>(parent()) : 0; 16142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 16152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif 16162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1617aee2a095ee4baa61c2e8b86cfa8076967a7f34acSteve BlockNode* Node::shadowAncestorNode() const 16188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG) 1620d0825bca7fe65beaee391d30da42e937db621564Steve Block // SVG elements living in a shadow tree only occur when <use> created them. 16218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For these cases we do NOT want to return the shadowParentNode() here 16228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // but the actual shadow tree element - as main difference to the HTML forms 16238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // shadow tree concept. (This function _could_ be made virtual - opinions?) 16248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isSVGElement()) 1625aee2a095ee4baa61c2e8b86cfa8076967a7f34acSteve Block return const_cast<Node*>(this); 16268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 16278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* root = shadowTreeRootNode(); 16298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (root) 1630cad810f21b803229eb11403f9209855525a25d57Steve Block return root->shadowHost(); 1631aee2a095ee4baa61c2e8b86cfa8076967a7f34acSteve Block return const_cast<Node*>(this); 16328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1634aee2a095ee4baa61c2e8b86cfa8076967a7f34acSteve BlockNode* Node::shadowTreeRootNode() const 16358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1636aee2a095ee4baa61c2e8b86cfa8076967a7f34acSteve Block Node* root = const_cast<Node*>(this); 16378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (root) { 16382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (root->isShadowRoot() || root->isSVGShadowRoot()) 16398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return root; 1640f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch root = root->parentNodeGuaranteedHostFree(); 16418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 16438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool Node::isInShadowTree() 16468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Node* n = this; n; n = n->parentNode()) 1648f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (n->isShadowRoot()) 16498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 16508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 16518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool Node::isBlockFlow() const 16548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return renderer() && renderer()->isBlockFlow(); 16568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool Node::isBlockFlowOrBlockTable() const 16598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return renderer() && (renderer()->isBlockFlow() || (renderer()->isTable() && !renderer()->isInline())); 16618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectElement *Node::enclosingBlockFlowElement() const 16648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node *n = const_cast<Node *>(this); 16668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isBlockFlow()) 16678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return static_cast<Element *>(n); 16688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (1) { 16708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project n = n->parentNode(); 16718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!n) 16728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 16738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (n->isBlockFlow() || n->hasTagName(bodyTag)) 16748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return static_cast<Element *>(n); 16758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 16778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectElement* Node::rootEditableElement() const 16808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Element* result = 0; 16822bde8e466a4451c7319e3a072d118917957d6554Steve Block for (Node* n = const_cast<Node*>(this); n && n->rendererIsEditable(); n = n->parentNode()) { 16838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (n->isElementNode()) 16848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = static_cast<Element*>(n); 16858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (n->hasTagName(bodyTag)) 16868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 16878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 16898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool Node::inSameContainingBlockFlowElement(Node *n) 16928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return n ? enclosingBlockFlowElement() == n->enclosingBlockFlowElement() : false; 16948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// FIXME: End of obviously misplaced HTML editing functions. Try to move these out of Node. 16978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16985af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkePassRefPtr<NodeList> Node::getElementsByTagName(const AtomicString& name) 16998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1700635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return getElementsByTagNameNS(starAtom, name); 17018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17035af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkePassRefPtr<NodeList> Node::getElementsByTagNameNS(const AtomicString& namespaceURI, const AtomicString& localName) 17048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 17058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (localName.isNull()) 17068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 1707635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1708635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project NodeRareData* data = ensureRareData(); 1709635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!data->nodeLists()) { 17105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian data->setNodeLists(NodeListsNodeData::create()); 1711635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project document()->addNodeListCache(); 1712635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 17138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String name = localName; 17158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (document()->isHTMLDocument()) 17168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project name = localName.lower(); 1717635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1718635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project AtomicString localNameAtom = name; 1719635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 17206c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen pair<NodeListsNodeData::TagNodeListCache::iterator, bool> result = data->nodeLists()->m_tagNodeListCache.add(QualifiedName(nullAtom, localNameAtom, namespaceURI).impl(), 0); 172121939df44de1705786c545cd1bf519d47250322dBen Murdoch if (!result.second) 172221939df44de1705786c545cd1bf519d47250322dBen Murdoch return PassRefPtr<TagNodeList>(result.first->second); 1723635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 172421939df44de1705786c545cd1bf519d47250322dBen Murdoch RefPtr<TagNodeList> list = TagNodeList::create(this, namespaceURI.isEmpty() ? nullAtom : namespaceURI, localNameAtom); 172521939df44de1705786c545cd1bf519d47250322dBen Murdoch result.first->second = list.get(); 172621939df44de1705786c545cd1bf519d47250322dBen Murdoch return list.release(); 17278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<NodeList> Node::getElementsByName(const String& elementName) 17308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 17318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NodeRareData* data = ensureRareData(); 17328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!data->nodeLists()) { 17335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian data->setNodeLists(NodeListsNodeData::create()); 17348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project document()->addNodeListCache(); 17358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 17368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 173721939df44de1705786c545cd1bf519d47250322dBen Murdoch pair<NodeListsNodeData::NameNodeListCache::iterator, bool> result = data->nodeLists()->m_nameNodeListCache.add(elementName, 0); 173821939df44de1705786c545cd1bf519d47250322dBen Murdoch if (!result.second) 173921939df44de1705786c545cd1bf519d47250322dBen Murdoch return PassRefPtr<NodeList>(result.first->second); 174021939df44de1705786c545cd1bf519d47250322dBen Murdoch 174121939df44de1705786c545cd1bf519d47250322dBen Murdoch RefPtr<NameNodeList> list = NameNodeList::create(this, elementName); 174221939df44de1705786c545cd1bf519d47250322dBen Murdoch result.first->second = list.get(); 174321939df44de1705786c545cd1bf519d47250322dBen Murdoch return list.release(); 17448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<NodeList> Node::getElementsByClassName(const String& classNames) 17478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 17488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NodeRareData* data = ensureRareData(); 17498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!data->nodeLists()) { 17505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian data->setNodeLists(NodeListsNodeData::create()); 17518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project document()->addNodeListCache(); 17528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 17538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 175421939df44de1705786c545cd1bf519d47250322dBen Murdoch pair<NodeListsNodeData::ClassNodeListCache::iterator, bool> result = data->nodeLists()->m_classNodeListCache.add(classNames, 0); 175521939df44de1705786c545cd1bf519d47250322dBen Murdoch if (!result.second) 175621939df44de1705786c545cd1bf519d47250322dBen Murdoch return PassRefPtr<NodeList>(result.first->second); 175721939df44de1705786c545cd1bf519d47250322dBen Murdoch 175821939df44de1705786c545cd1bf519d47250322dBen Murdoch RefPtr<ClassNodeList> list = ClassNodeList::create(this, classNames); 175921939df44de1705786c545cd1bf519d47250322dBen Murdoch result.first->second = list.get(); 176021939df44de1705786c545cd1bf519d47250322dBen Murdoch return list.release(); 17618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<Element> Node::querySelector(const String& selectors, ExceptionCode& ec) 17648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 17658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (selectors.isEmpty()) { 17668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ec = SYNTAX_ERR; 17678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 17688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 17695ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen bool strictParsing = !document()->inQuirksMode(); 17708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CSSParser p(strictParsing); 17718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1772635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project CSSSelectorList querySelectorList; 1773635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project p.parseSelector(selectors, document(), querySelectorList); 1774635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 177565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!querySelectorList.first() || querySelectorList.hasUnknownPseudoElements()) { 17768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ec = SYNTAX_ERR; 17778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 17788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 17798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // throw a NAMESPACE_ERR if the selector includes any namespace prefixes. 1781231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (querySelectorList.selectorsNeedNamespaceResolution()) { 17828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ec = NAMESPACE_ERR; 17838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 17848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 17858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CSSStyleSelector::SelectorChecker selectorChecker(document(), strictParsing); 17878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: we could also optimize for the the [id="foo"] case 1789635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (strictParsing && inDocument() && querySelectorList.hasOneSelector() && querySelectorList.first()->m_match == CSSSelector::Id) { 17902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block Element* element = document()->getElementById(querySelectorList.first()->value()); 1791635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (element && (isDocumentNode() || element->isDescendantOf(this)) && selectorChecker.checkSelector(querySelectorList.first(), element)) 17928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return element; 17938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 17948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 17958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: We can speed this up by implementing caching similar to the one use by getElementById 17978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Node* n = firstChild(); n; n = n->traverseNextNode(this)) { 17988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (n->isElementNode()) { 17998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Element* element = static_cast<Element*>(n); 1800635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (CSSSelector* selector = querySelectorList.first(); selector; selector = CSSSelectorList::next(selector)) { 18018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (selectorChecker.checkSelector(selector, element)) 18028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return element; 18038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 18088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<NodeList> Node::querySelectorAll(const String& selectors, ExceptionCode& ec) 18118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (selectors.isEmpty()) { 18138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ec = SYNTAX_ERR; 18148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 18158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18165ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen bool strictParsing = !document()->inQuirksMode(); 18178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CSSParser p(strictParsing); 18188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1819635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project CSSSelectorList querySelectorList; 1820635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project p.parseSelector(selectors, document(), querySelectorList); 18218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 182265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!querySelectorList.first() || querySelectorList.hasUnknownPseudoElements()) { 18238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ec = SYNTAX_ERR; 18248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 18258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Throw a NAMESPACE_ERR if the selector includes any namespace prefixes. 1828231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (querySelectorList.selectorsNeedNamespaceResolution()) { 18298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ec = NAMESPACE_ERR; 18308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 18318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1833635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return createSelectorNodeList(this, querySelectorList); 18348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectDocument *Node::ownerDocument() const 18378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Document *doc = document(); 18398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return doc == this ? 0 : doc; 18408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectKURL Node::baseURI() const 18438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return parentNode() ? parentNode()->baseURI() : KURL(); 18458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1847e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkebool Node::isEqualNode(Node* other) const 18488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!other) 18508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 18518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1852e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke NodeType nodeType = this->nodeType(); 1853e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (nodeType != other->nodeType()) 18548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 18558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (nodeName() != other->nodeName()) 18578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 18588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (localName() != other->localName()) 18608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 18618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (namespaceURI() != other->namespaceURI()) 18638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 18648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (prefix() != other->prefix()) 18668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 18678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (nodeValue() != other->nodeValue()) 18698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 18708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1871e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke NamedNodeMap* attributes = this->attributes(); 1872e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke NamedNodeMap* otherAttributes = other->attributes(); 18738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1874e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (!attributes && otherAttributes) 18758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 18768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1877e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (attributes && !attributes->mapsEquivalent(otherAttributes)) 18788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 18798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1880e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke Node* child = firstChild(); 1881e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke Node* otherChild = other->firstChild(); 18828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (child) { 18848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!child->isEqualNode(otherChild)) 18858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 18868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project child = child->nextSibling(); 18888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project otherChild = otherChild->nextSibling(); 18898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (otherChild) 18928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 18938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1894e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (nodeType == DOCUMENT_TYPE_NODE) { 1895e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke const DocumentType* documentTypeThis = static_cast<const DocumentType*>(this); 1896e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke const DocumentType* documentTypeOther = static_cast<const DocumentType*>(other); 1897e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 1898e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (documentTypeThis->publicId() != documentTypeOther->publicId()) 1899e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return false; 1900e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 1901e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (documentTypeThis->systemId() != documentTypeOther->systemId()) 1902e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return false; 1903e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 1904e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (documentTypeThis->internalSubset() != documentTypeOther->internalSubset()) 1905e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return false; 1906e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 1907e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke NamedNodeMap* entities = documentTypeThis->entities(); 1908e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke NamedNodeMap* otherEntities = documentTypeOther->entities(); 1909e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (!entities && otherEntities) 1910e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return false; 1911e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (entities && !entities->mapsEquivalent(otherEntities)) 1912e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return false; 1913e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 1914e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke NamedNodeMap* notations = documentTypeThis->notations(); 1915e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke NamedNodeMap* otherNotations = documentTypeOther->notations(); 1916e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (!notations && otherNotations) 1917e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return false; 1918e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (notations && !notations->mapsEquivalent(otherNotations)) 1919e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return false; 1920e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke } 19218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 19238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 19248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1925643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool Node::isDefaultNamespace(const AtomicString& namespaceURIMaybeEmpty) const 19268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1927643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const AtomicString& namespaceURI = namespaceURIMaybeEmpty.isEmpty() ? nullAtom : namespaceURIMaybeEmpty; 1928643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 19298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (nodeType()) { 19308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case ELEMENT_NODE: { 1931643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const Element* elem = static_cast<const Element*>(this); 19328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (elem->prefix().isNull()) 19348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return elem->namespaceURI() == namespaceURI; 19358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (elem->hasAttributes()) { 1937643ca7872b450ea4efacab6188849e5aac2ba161Steve Block NamedNodeMap* attrs = elem->attributes(); 19388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned i = 0; i < attrs->length(); i++) { 1940643ca7872b450ea4efacab6188849e5aac2ba161Steve Block Attribute* attr = attrs->attributeItem(i); 19418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1942d0825bca7fe65beaee391d30da42e937db621564Steve Block if (attr->localName() == xmlnsAtom) 19438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return attr->value() == namespaceURI; 19448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 19458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 19468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Element* ancestor = ancestorElement()) 19488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ancestor->isDefaultNamespace(namespaceURI); 19498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 19518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 19528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DOCUMENT_NODE: 19538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Element* de = static_cast<const Document*>(this)->documentElement()) 19548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return de->isDefaultNamespace(namespaceURI); 19558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 19568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case ENTITY_NODE: 19578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case NOTATION_NODE: 19588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DOCUMENT_TYPE_NODE: 19598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DOCUMENT_FRAGMENT_NODE: 19608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 19618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case ATTRIBUTE_NODE: { 1962643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const Attr* attr = static_cast<const Attr*>(this); 19638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (attr->ownerElement()) 19648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return attr->ownerElement()->isDefaultNamespace(namespaceURI); 19658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 19668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 19678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: 19688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Element* ancestor = ancestorElement()) 19698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ancestor->isDefaultNamespace(namespaceURI); 19708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 19718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 19728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 19738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1974635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectString Node::lookupPrefix(const AtomicString &namespaceURI) const 19758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 19768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Implemented according to 19778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/namespaces-algorithms.html#lookupNamespacePrefixAlgo 19788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (namespaceURI.isEmpty()) 19808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return String(); 19818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (nodeType()) { 19838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case ELEMENT_NODE: 19848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return lookupNamespacePrefix(namespaceURI, static_cast<const Element *>(this)); 19858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DOCUMENT_NODE: 19868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Element* de = static_cast<const Document*>(this)->documentElement()) 19878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return de->lookupPrefix(namespaceURI); 19888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return String(); 19898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case ENTITY_NODE: 19908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case NOTATION_NODE: 19918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DOCUMENT_FRAGMENT_NODE: 19928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DOCUMENT_TYPE_NODE: 19938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return String(); 19948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case ATTRIBUTE_NODE: { 19958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const Attr *attr = static_cast<const Attr *>(this); 19968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (attr->ownerElement()) 19978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return attr->ownerElement()->lookupPrefix(namespaceURI); 19988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return String(); 19998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 20008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: 20018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Element* ancestor = ancestorElement()) 20028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ancestor->lookupPrefix(namespaceURI); 20038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return String(); 20048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 20058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 20068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString Node::lookupNamespaceURI(const String &prefix) const 20088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 20098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Implemented according to 20108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/namespaces-algorithms.html#lookupNamespaceURIAlgo 20118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!prefix.isNull() && prefix.isEmpty()) 20138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return String(); 20148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (nodeType()) { 20168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case ELEMENT_NODE: { 20178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const Element *elem = static_cast<const Element *>(this); 20188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!elem->namespaceURI().isNull() && elem->prefix() == prefix) 20208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return elem->namespaceURI(); 20218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (elem->hasAttributes()) { 20235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian NamedNodeMap *attrs = elem->attributes(); 20248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned i = 0; i < attrs->length(); i++) { 20268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Attribute *attr = attrs->attributeItem(i); 20278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2028d0825bca7fe65beaee391d30da42e937db621564Steve Block if (attr->prefix() == xmlnsAtom && attr->localName() == prefix) { 20298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!attr->value().isEmpty()) 20308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return attr->value(); 20318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return String(); 2033d0825bca7fe65beaee391d30da42e937db621564Steve Block } else if (attr->localName() == xmlnsAtom && prefix.isNull()) { 20348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!attr->value().isEmpty()) 20358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return attr->value(); 20368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return String(); 20388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 20398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 20408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 20418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Element* ancestor = ancestorElement()) 20428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ancestor->lookupNamespaceURI(prefix); 20438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return String(); 20448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 20458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DOCUMENT_NODE: 20468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Element* de = static_cast<const Document*>(this)->documentElement()) 20478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return de->lookupNamespaceURI(prefix); 20488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return String(); 20498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case ENTITY_NODE: 20508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case NOTATION_NODE: 20518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DOCUMENT_TYPE_NODE: 20528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DOCUMENT_FRAGMENT_NODE: 20538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return String(); 20548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case ATTRIBUTE_NODE: { 20558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const Attr *attr = static_cast<const Attr *>(this); 20568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (attr->ownerElement()) 20588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return attr->ownerElement()->lookupNamespaceURI(prefix); 20598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 20608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return String(); 20618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 20628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: 20638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Element* ancestor = ancestorElement()) 20648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ancestor->lookupNamespaceURI(prefix); 20658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return String(); 20668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 20678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 20688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2069635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectString Node::lookupNamespacePrefix(const AtomicString &_namespaceURI, const Element *originalElement) const 20708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 20718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (_namespaceURI.isNull()) 20728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return String(); 20738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (originalElement->lookupNamespaceURI(prefix()) == _namespaceURI) 20758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return prefix(); 20768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (hasAttributes()) { 20785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian NamedNodeMap *attrs = attributes(); 20798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned i = 0; i < attrs->length(); i++) { 20818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Attribute *attr = attrs->attributeItem(i); 20828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2083d0825bca7fe65beaee391d30da42e937db621564Steve Block if (attr->prefix() == xmlnsAtom && 20848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project attr->value() == _namespaceURI && 20858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project originalElement->lookupNamespaceURI(attr->localName()) == _namespaceURI) 20868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return attr->localName(); 20878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 20888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 20898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Element* ancestor = ancestorElement()) 20918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ancestor->lookupNamespacePrefix(_namespaceURI, originalElement); 20928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return String(); 20938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 20948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2095a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochstatic void appendTextContent(const Node* node, bool convertBRsToNewlines, bool& isNullString, StringBuilder& content) 20968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2097a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch switch (node->nodeType()) { 2098a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch case Node::TEXT_NODE: 2099a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch case Node::CDATA_SECTION_NODE: 2100a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch case Node::COMMENT_NODE: 2101a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch isNullString = false; 2102a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch content.append(static_cast<const CharacterData*>(node)->data()); 2103a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch break; 21048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2105a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch case Node::PROCESSING_INSTRUCTION_NODE: 2106a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch isNullString = false; 2107a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch content.append(static_cast<const ProcessingInstruction*>(node)->data()); 2108a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch break; 2109a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 2110a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch case Node::ELEMENT_NODE: 2111a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (node->hasTagName(brTag) && convertBRsToNewlines) { 2112a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch isNullString = false; 2113a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch content.append('\n'); 21148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 21158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2116a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // Fall through. 2117a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch case Node::ATTRIBUTE_NODE: 2118a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch case Node::ENTITY_NODE: 2119a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch case Node::ENTITY_REFERENCE_NODE: 2120a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch case Node::DOCUMENT_FRAGMENT_NODE: 2121a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch isNullString = false; 2122a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch for (Node* child = node->firstChild(); child; child = child->nextSibling()) { 2123a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (child->nodeType() == Node::COMMENT_NODE || child->nodeType() == Node::PROCESSING_INSTRUCTION_NODE) 2124a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch continue; 2125a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch appendTextContent(child, convertBRsToNewlines, isNullString, content); 2126a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch } 2127a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch break; 21288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2129a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch case Node::DOCUMENT_NODE: 2130a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch case Node::DOCUMENT_TYPE_NODE: 2131a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch case Node::NOTATION_NODE: 2132a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch case Node::XPATH_NAMESPACE_NODE: 2133a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch break; 21348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 21358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString Node::textContent(bool convertBRsToNewlines) const 21388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project StringBuilder content; 2140a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch bool isNullString = true; 2141a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch appendTextContent(this, convertBRsToNewlines, isNullString, content); 2142a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return isNullString ? String() : content.toString(); 21438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2145a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid Node::setTextContent(const String& text, ExceptionCode& ec) 21468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (nodeType()) { 21488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case TEXT_NODE: 21498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case CDATA_SECTION_NODE: 21508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case COMMENT_NODE: 21518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case PROCESSING_INSTRUCTION_NODE: 21528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setNodeValue(text, ec); 2153a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return; 21548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case ELEMENT_NODE: 21558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case ATTRIBUTE_NODE: 21568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case ENTITY_NODE: 21578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case ENTITY_REFERENCE_NODE: 21588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DOCUMENT_FRAGMENT_NODE: { 2159a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch ContainerNode* container = toContainerNode(this); 21608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project container->removeChildren(); 21618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!text.isEmpty()) 2162a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch container->appendChild(document()->createTextNode(text), ec); 2163a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return; 21648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 21658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DOCUMENT_NODE: 21668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case DOCUMENT_TYPE_NODE: 21678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case NOTATION_NODE: 2168a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch case XPATH_NAMESPACE_NODE: 2169a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // Do nothing. 2170a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return; 21718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2172a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch ASSERT_NOT_REACHED(); 21738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectElement* Node::ancestorElement() const 21768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // In theory, there can be EntityReference nodes between elements, but this is currently not supported. 2178a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch for (ContainerNode* n = parentNode(); n; n = n->parentNode()) { 21798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (n->isElementNode()) 21808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return static_cast<Element*>(n); 21818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 21828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 21838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool Node::offsetInCharacters() const 21868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 21888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectunsigned short Node::compareDocumentPosition(Node* otherNode) 21918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // It is not clear what should be done if |otherNode| is 0. 21938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!otherNode) 21948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return DOCUMENT_POSITION_DISCONNECTED; 21958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (otherNode == this) 21978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return DOCUMENT_POSITION_EQUIVALENT; 21988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Attr* attr1 = nodeType() == ATTRIBUTE_NODE ? static_cast<Attr*>(this) : 0; 22008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Attr* attr2 = otherNode->nodeType() == ATTRIBUTE_NODE ? static_cast<Attr*>(otherNode) : 0; 22018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* start1 = attr1 ? attr1->ownerElement() : this; 22038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* start2 = attr2 ? attr2->ownerElement() : otherNode; 22048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If either of start1 or start2 is null, then we are disconnected, since one of the nodes is 22068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // an orphaned attribute node. 22078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!start1 || !start2) 22088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return DOCUMENT_POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC; 22098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<Node*, 16> chain1; 22118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<Node*, 16> chain2; 22128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (attr1) 22138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project chain1.append(attr1); 22148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (attr2) 22158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project chain2.append(attr2); 22168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (attr1 && attr2 && start1 == start2 && start1) { 22188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We are comparing two attributes on the same node. Crawl our attribute map 22198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // and see which one we hit first. 22205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian NamedNodeMap* map = attr1->ownerElement()->attributes(true); 22218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned length = map->length(); 22228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned i = 0; i < length; ++i) { 22238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If neither of the two determining nodes is a child node and nodeType is the same for both determining nodes, then an 22248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // implementation-dependent order between the determining nodes is returned. This order is stable as long as no nodes of 22258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the same nodeType are inserted into or removed from the direct container. This would be the case, for example, 22268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // when comparing two attributes of the same element, and inserting or removing additional attributes might change 22278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the order between existing attributes. 22288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Attribute* attr = map->attributeItem(i); 22298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (attr1->attr() == attr) 22308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | DOCUMENT_POSITION_FOLLOWING; 22318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (attr2->attr() == attr) 22328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | DOCUMENT_POSITION_PRECEDING; 22338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 22348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT_NOT_REACHED(); 22368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return DOCUMENT_POSITION_DISCONNECTED; 22378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 22388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If one node is in the document and the other is not, we must be disconnected. 22408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the nodes have different owning documents, they must be disconnected. Note that we avoid 22418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // comparing Attr nodes here, since they return false from inDocument() all the time (which seems like a bug). 22428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (start1->inDocument() != start2->inDocument() || 22438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project start1->document() != start2->document()) 22448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return DOCUMENT_POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC; 22458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We need to find a common ancestor container, and then compare the indices of the two immediate children. 22478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* current; 22488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (current = start1; current; current = current->parentNode()) 22498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project chain1.append(current); 22508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (current = start2; current; current = current->parentNode()) 22518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project chain2.append(current); 22528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Walk the two chains backwards and look for the first difference. 22548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned index1 = chain1.size(); 22558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned index2 = chain2.size(); 2256635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (unsigned i = min(index1, index2); i; --i) { 22578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* child1 = chain1[--index1]; 22588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* child2 = chain2[--index2]; 22598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (child1 != child2) { 22608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If one of the children is an attribute, it wins. 22618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (child1->nodeType() == ATTRIBUTE_NODE) 22628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return DOCUMENT_POSITION_FOLLOWING; 22638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (child2->nodeType() == ATTRIBUTE_NODE) 22648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return DOCUMENT_POSITION_PRECEDING; 22658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!child2->nextSibling()) 22678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return DOCUMENT_POSITION_FOLLOWING; 22688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!child1->nextSibling()) 22698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return DOCUMENT_POSITION_PRECEDING; 22708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Otherwise we need to see which node occurs first. Crawl backwards from child2 looking for child1. 22728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Node* child = child2->previousSibling(); child; child = child->previousSibling()) { 22738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (child == child1) 22748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return DOCUMENT_POSITION_FOLLOWING; 22758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 22768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return DOCUMENT_POSITION_PRECEDING; 22778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 22788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 22798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // There was no difference between the two parent chains, i.e., one was a subset of the other. The shorter 22818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // chain is the ancestor. 22828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return index1 < index2 ? 22838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DOCUMENT_POSITION_FOLLOWING | DOCUMENT_POSITION_CONTAINED_BY : 22848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DOCUMENT_POSITION_PRECEDING | DOCUMENT_POSITION_CONTAINS; 22858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianFloatPoint Node::convertToPage(const FloatPoint& p) const 22888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 22898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // If there is a renderer, just ask it to do the conversion 22908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (renderer()) 22918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return renderer()->localToAbsolute(p, false, true); 22928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 22938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Otherwise go up the tree looking for a renderer 22948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Element *parent = ancestorElement(); 22958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (parent) 22968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return parent->convertToPage(p); 22978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 22988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // No parent - no conversion needed 22998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return p; 23008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 23018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 23028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianFloatPoint Node::convertFromPage(const FloatPoint& p) const 23038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 23048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // If there is a renderer, just ask it to do the conversion 23058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (renderer()) 23068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return renderer()->absoluteToLocal(p, false, true); 23078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 23088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Otherwise go up the tree looking for a renderer 23098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Element *parent = ancestorElement(); 23108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (parent) 23118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return parent->convertFromPage(p); 23128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 23138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // No parent - no conversion needed 23148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return p; 23158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 23168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 23178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if !defined(NDEBUG) || defined(ANDROID_DOM_LOGGING) 23188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void appendAttributeDesc(const Node* node, String& string, const QualifiedName& name, const char* attrDesc) 23208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (node->isElementNode()) { 23228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String attr = static_cast<const Element*>(node)->getAttribute(name); 23238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!attr.isEmpty()) { 23248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project string += attrDesc; 23258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project string += attr; 23268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Node::showNode(const char* prefix) const 23318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!prefix) 23338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project prefix = ""; 23348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isTextNode()) { 23358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String value = nodeValue(); 23368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DOM_LOGGING 23378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool hasNoneWhitespace = false; 23388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (int i = value.length()-1; i >= 0; i--) 23398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!isSpaceOrNewline(value[i])) { 23408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hasNoneWhitespace = true; 23418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 23428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 23448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project value.replace('\\', "\\\\"); 23458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project value.replace('\n', "\\n"); 23468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DOM_LOGGING 23478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (hasNoneWhitespace) 23488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DUMP_DOM_LOGD("%s%s\t%p \"%s\"\n", prefix, nodeName().utf8().data(), this, value.utf8().data()); 23498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 23508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fprintf(stderr, "%s%s\t%p \"%s\"\n", prefix, nodeName().utf8().data(), this, value.utf8().data()); 23518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 23528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 23538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String attrs = ""; 23548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project appendAttributeDesc(this, attrs, classAttr, " CLASS="); 23558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project appendAttributeDesc(this, attrs, styleAttr, " STYLE="); 23568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DOM_LOGGING 23578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project appendAttributeDesc(this, attrs, idAttr, " ID="); 23588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project appendAttributeDesc(this, attrs, nameAttr, " NAME="); 23598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DUMP_DOM_LOGD("%s%s\t%p%s\n", prefix, nodeName().utf8().data(), this, attrs.utf8().data()); 23608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 23618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fprintf(stderr, "%s%s\t%p%s\n", prefix, nodeName().utf8().data(), this, attrs.utf8().data()); 23628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 23638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Node::showTreeForThis() const 23678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project showTreeAndMark(this, "*"); 23698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Node::showTreeAndMark(const Node* markedNode1, const char* markedLabel1, const Node* markedNode2, const char * markedLabel2) const 23728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const Node* rootNode; 23748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const Node* node = this; 23758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while (node->parentNode() && !node->hasTagName(bodyTag)) 23768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project node = node->parentNode(); 23778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rootNode = node; 23788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (node = rootNode; node; node = node->traverseNextNode()) { 23808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DOM_LOGGING 23818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String prefix = ""; 23828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 23838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (node == markedNode1) 23848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DOM_LOGGING 23858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project prefix.append(markedLabel1); 23868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 23878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fprintf(stderr, "%s", markedLabel1); 23888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 23898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (node == markedNode2) 23908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DOM_LOGGING 23918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project prefix.append(markedLabel2); 23928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 23938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fprintf(stderr, "%s", markedLabel2); 23948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 23958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_DOM_LOGGING 23978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (const Node* tmpNode = node; tmpNode && tmpNode != rootNode; tmpNode = tmpNode->parentNode()) 23988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project prefix.append("\t"); 23998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project node->showNode(prefix.utf8().data()); 24008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 24018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (const Node* tmpNode = node; tmpNode && tmpNode != rootNode; tmpNode = tmpNode->parentNode()) 24028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fprintf(stderr, "\t"); 24038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project node->showNode(); 24048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 24058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Node::formatForDebugger(char* buffer, unsigned length) const 24098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 24108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String result; 24118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String s; 24128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s = nodeName(); 24148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (s.length() == 0) 24158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result += "<none>"; 24168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 24178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result += s; 24188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project strncpy(buffer, result.utf8().data(), length - 1); 24208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 24238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// -------- 24258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid NodeListsNodeData::invalidateCaches() 24278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 24280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_childNodeListCaches->reset(); 24295af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 24305af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (m_labelsNodeListCache) 24315af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke m_labelsNodeListCache->invalidateCache(); 243221939df44de1705786c545cd1bf519d47250322dBen Murdoch TagNodeListCache::const_iterator tagCacheEnd = m_tagNodeListCache.end(); 243321939df44de1705786c545cd1bf519d47250322dBen Murdoch for (TagNodeListCache::const_iterator it = m_tagNodeListCache.begin(); it != tagCacheEnd; ++it) 243421939df44de1705786c545cd1bf519d47250322dBen Murdoch it->second->invalidateCache(); 24358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project invalidateCachesThatDependOnAttributes(); 24368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid NodeListsNodeData::invalidateCachesThatDependOnAttributes() 24398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 244021939df44de1705786c545cd1bf519d47250322dBen Murdoch ClassNodeListCache::iterator classCacheEnd = m_classNodeListCache.end(); 244121939df44de1705786c545cd1bf519d47250322dBen Murdoch for (ClassNodeListCache::iterator it = m_classNodeListCache.begin(); it != classCacheEnd; ++it) 244221939df44de1705786c545cd1bf519d47250322dBen Murdoch it->second->invalidateCache(); 24438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 244421939df44de1705786c545cd1bf519d47250322dBen Murdoch NameNodeListCache::iterator nameCacheEnd = m_nameNodeListCache.end(); 244521939df44de1705786c545cd1bf519d47250322dBen Murdoch for (NameNodeListCache::iterator it = m_nameNodeListCache.begin(); it != nameCacheEnd; ++it) 244621939df44de1705786c545cd1bf519d47250322dBen Murdoch it->second->invalidateCache(); 24475af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (m_labelsNodeListCache) 24485af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke m_labelsNodeListCache->invalidateCache(); 24498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool NodeListsNodeData::isEmpty() const 24528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 24538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_listsWithCaches.isEmpty()) 24548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 24558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (m_childNodeListCaches->refCount()) 24578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 2458635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 245921939df44de1705786c545cd1bf519d47250322dBen Murdoch TagNodeListCache::const_iterator tagCacheEnd = m_tagNodeListCache.end(); 246021939df44de1705786c545cd1bf519d47250322dBen Murdoch for (TagNodeListCache::const_iterator it = m_tagNodeListCache.begin(); it != tagCacheEnd; ++it) { 24610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (it->second->refCount()) 2462635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return false; 2463635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 24648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 246521939df44de1705786c545cd1bf519d47250322dBen Murdoch ClassNodeListCache::const_iterator classCacheEnd = m_classNodeListCache.end(); 246621939df44de1705786c545cd1bf519d47250322dBen Murdoch for (ClassNodeListCache::const_iterator it = m_classNodeListCache.begin(); it != classCacheEnd; ++it) { 24670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (it->second->refCount()) 24688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 24698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 247121939df44de1705786c545cd1bf519d47250322dBen Murdoch NameNodeListCache::const_iterator nameCacheEnd = m_nameNodeListCache.end(); 247221939df44de1705786c545cd1bf519d47250322dBen Murdoch for (NameNodeListCache::const_iterator it = m_nameNodeListCache.begin(); it != nameCacheEnd; ++it) { 24730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (it->second->refCount()) 24748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 24758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24775af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (m_labelsNodeListCache) 24785af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return false; 24795af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 24808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 24818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2483635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Node::getSubresourceURLs(ListHashSet<KURL>& urls) const 24848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2485635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project addSubresourceAttributeURLs(urls); 2486635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 2487635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2488dcc410eb4478d3f36781fd2325cafd27c883d686Steve BlockNode* Node::enclosingLinkEventParentOrSelf() 2489dcc410eb4478d3f36781fd2325cafd27c883d686Steve Block{ 24906b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner for (Node* node = this; node; node = node->parentOrHostNode()) { 2491dcc410eb4478d3f36781fd2325cafd27c883d686Steve Block // For imagemaps, the enclosing link node is the associated area element not the image itself. 2492dcc410eb4478d3f36781fd2325cafd27c883d686Steve Block // So we don't let images be the enclosingLinkNode, even though isLink sometimes returns true 2493dcc410eb4478d3f36781fd2325cafd27c883d686Steve Block // for them. 2494dcc410eb4478d3f36781fd2325cafd27c883d686Steve Block if (node->isLink() && !node->hasTagName(imgTag)) 2495dcc410eb4478d3f36781fd2325cafd27c883d686Steve Block return node; 2496dcc410eb4478d3f36781fd2325cafd27c883d686Steve Block } 2497dcc410eb4478d3f36781fd2325cafd27c883d686Steve Block 2498dcc410eb4478d3f36781fd2325cafd27c883d686Steve Block return 0; 2499dcc410eb4478d3f36781fd2325cafd27c883d686Steve Block} 2500dcc410eb4478d3f36781fd2325cafd27c883d686Steve Block 25018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// -------- 25028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianScriptExecutionContext* Node::scriptExecutionContext() const 25048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 25058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return document(); 25068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 25078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid Node::insertedIntoDocument() 25098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 251021939df44de1705786c545cd1bf519d47250322dBen Murdoch setInDocument(); 25118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 25128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid Node::removedFromDocument() 25148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 251521939df44de1705786c545cd1bf519d47250322dBen Murdoch clearInDocument(); 25168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 25178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid Node::willMoveToNewOwnerDocument() 25198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 25205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ASSERT(!willMoveToNewOwnerDocumentWasCalled); 25215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian setWillMoveToNewOwnerDocumentWasCalled(true); 25228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 25238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid Node::didMoveToNewOwnerDocument() 25258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 25265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ASSERT(!didMoveToNewOwnerDocumentWasCalled); 25275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian setDidMoveToNewOwnerDocumentWasCalled(true); 25288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 25298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2530d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(SVG) 2531d0825bca7fe65beaee391d30da42e937db621564Steve Blockstatic inline HashSet<SVGElementInstance*> instancesForSVGElement(Node* node) 2532d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 2533d0825bca7fe65beaee391d30da42e937db621564Steve Block HashSet<SVGElementInstance*> instances; 2534d0825bca7fe65beaee391d30da42e937db621564Steve Block 2535d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT(node); 2536d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!node->isSVGElement() || node->shadowTreeRootNode()) 2537d0825bca7fe65beaee391d30da42e937db621564Steve Block return HashSet<SVGElementInstance*>(); 2538d0825bca7fe65beaee391d30da42e937db621564Steve Block 2539d0825bca7fe65beaee391d30da42e937db621564Steve Block SVGElement* element = static_cast<SVGElement*>(node); 2540d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!element->isStyled()) 2541d0825bca7fe65beaee391d30da42e937db621564Steve Block return HashSet<SVGElementInstance*>(); 2542d0825bca7fe65beaee391d30da42e937db621564Steve Block 2543d0825bca7fe65beaee391d30da42e937db621564Steve Block SVGStyledElement* styledElement = static_cast<SVGStyledElement*>(element); 2544d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT(!styledElement->instanceUpdatesBlocked()); 2545d0825bca7fe65beaee391d30da42e937db621564Steve Block 2546d0825bca7fe65beaee391d30da42e937db621564Steve Block return styledElement->instancesForElement(); 2547d0825bca7fe65beaee391d30da42e937db621564Steve Block} 2548d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 2549d0825bca7fe65beaee391d30da42e937db621564Steve Block 2550d0825bca7fe65beaee391d30da42e937db621564Steve Blockstatic inline bool tryAddEventListener(Node* targetNode, const AtomicString& eventType, PassRefPtr<EventListener> listener, bool useCapture) 2551d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 2552d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!targetNode->EventTarget::addEventListener(eventType, listener, useCapture)) 2553d0825bca7fe65beaee391d30da42e937db621564Steve Block return false; 2554d0825bca7fe65beaee391d30da42e937db621564Steve Block 2555d0825bca7fe65beaee391d30da42e937db621564Steve Block if (Document* document = targetNode->document()) 2556d0825bca7fe65beaee391d30da42e937db621564Steve Block document->addListenerTypeIfNeeded(eventType); 2557d0825bca7fe65beaee391d30da42e937db621564Steve Block 2558d0825bca7fe65beaee391d30da42e937db621564Steve Block return true; 2559d0825bca7fe65beaee391d30da42e937db621564Steve Block} 2560d0825bca7fe65beaee391d30da42e937db621564Steve Block 2561d0825bca7fe65beaee391d30da42e937db621564Steve Blockbool Node::addEventListener(const AtomicString& eventType, PassRefPtr<EventListener> listener, bool useCapture) 25628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 25635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if !ENABLE(SVG) 2564d0825bca7fe65beaee391d30da42e937db621564Steve Block return tryAddEventListener(this, eventType, listener, useCapture); 25655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#else 2566d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!isSVGElement()) 2567d0825bca7fe65beaee391d30da42e937db621564Steve Block return tryAddEventListener(this, eventType, listener, useCapture); 25688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2569d0825bca7fe65beaee391d30da42e937db621564Steve Block HashSet<SVGElementInstance*> instances = instancesForSVGElement(this); 2570d0825bca7fe65beaee391d30da42e937db621564Steve Block if (instances.isEmpty()) 2571d0825bca7fe65beaee391d30da42e937db621564Steve Block return tryAddEventListener(this, eventType, listener, useCapture); 25728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2573d0825bca7fe65beaee391d30da42e937db621564Steve Block RefPtr<EventListener> listenerForRegularTree = listener; 2574d0825bca7fe65beaee391d30da42e937db621564Steve Block RefPtr<EventListener> listenerForShadowTree = listenerForRegularTree; 25758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2576d0825bca7fe65beaee391d30da42e937db621564Steve Block // Add event listener to regular DOM element 2577d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!tryAddEventListener(this, eventType, listenerForRegularTree.release(), useCapture)) 2578d0825bca7fe65beaee391d30da42e937db621564Steve Block return false; 2579d0825bca7fe65beaee391d30da42e937db621564Steve Block 2580d0825bca7fe65beaee391d30da42e937db621564Steve Block // Add event listener to all shadow tree DOM element instances 2581d0825bca7fe65beaee391d30da42e937db621564Steve Block const HashSet<SVGElementInstance*>::const_iterator end = instances.end(); 2582d0825bca7fe65beaee391d30da42e937db621564Steve Block for (HashSet<SVGElementInstance*>::const_iterator it = instances.begin(); it != end; ++it) { 2583d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT((*it)->shadowTreeElement()); 2584d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT((*it)->correspondingElement() == this); 2585d0825bca7fe65beaee391d30da42e937db621564Steve Block 2586d0825bca7fe65beaee391d30da42e937db621564Steve Block RefPtr<EventListener> listenerForCurrentShadowTreeElement = listenerForShadowTree; 2587d0825bca7fe65beaee391d30da42e937db621564Steve Block bool result = tryAddEventListener((*it)->shadowTreeElement(), eventType, listenerForCurrentShadowTreeElement.release(), useCapture); 2588d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT_UNUSED(result, result); 25898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 2590d0825bca7fe65beaee391d30da42e937db621564Steve Block 2591d0825bca7fe65beaee391d30da42e937db621564Steve Block return true; 25928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 25938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 25948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2595d0825bca7fe65beaee391d30da42e937db621564Steve Blockstatic inline bool tryRemoveEventListener(Node* targetNode, const AtomicString& eventType, EventListener* listener, bool useCapture) 25968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 2597d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!targetNode->EventTarget::removeEventListener(eventType, listener, useCapture)) 2598231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; 25998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2600d0825bca7fe65beaee391d30da42e937db621564Steve Block // FIXME: Notify Document that the listener has vanished. We need to keep track of a number of 2601d0825bca7fe65beaee391d30da42e937db621564Steve Block // listeners for each type, not just a bool - see https://bugs.webkit.org/show_bug.cgi?id=33861 2602d0825bca7fe65beaee391d30da42e937db621564Steve Block 2603231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return true; 26048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 26058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2606231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool Node::removeEventListener(const AtomicString& eventType, EventListener* listener, bool useCapture) 26078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 2608d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !ENABLE(SVG) 2609d0825bca7fe65beaee391d30da42e937db621564Steve Block return tryRemoveEventListener(this, eventType, listener, useCapture); 2610d0825bca7fe65beaee391d30da42e937db621564Steve Block#else 2611d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!isSVGElement()) 2612d0825bca7fe65beaee391d30da42e937db621564Steve Block return tryRemoveEventListener(this, eventType, listener, useCapture); 2613d0825bca7fe65beaee391d30da42e937db621564Steve Block 2614d0825bca7fe65beaee391d30da42e937db621564Steve Block HashSet<SVGElementInstance*> instances = instancesForSVGElement(this); 2615d0825bca7fe65beaee391d30da42e937db621564Steve Block if (instances.isEmpty()) 2616d0825bca7fe65beaee391d30da42e937db621564Steve Block return tryRemoveEventListener(this, eventType, listener, useCapture); 2617d0825bca7fe65beaee391d30da42e937db621564Steve Block 2618d0825bca7fe65beaee391d30da42e937db621564Steve Block // EventTarget::removeEventListener creates a PassRefPtr around the given EventListener 2619d0825bca7fe65beaee391d30da42e937db621564Steve Block // object when creating a temporary RegisteredEventListener object used to look up the 2620d0825bca7fe65beaee391d30da42e937db621564Steve Block // event listener in a cache. If we want to be able to call removeEventListener() multiple 2621d0825bca7fe65beaee391d30da42e937db621564Steve Block // times on different nodes, we have to delay its immediate destruction, which would happen 2622d0825bca7fe65beaee391d30da42e937db621564Steve Block // after the first call below. 2623d0825bca7fe65beaee391d30da42e937db621564Steve Block RefPtr<EventListener> protector(listener); 2624d0825bca7fe65beaee391d30da42e937db621564Steve Block 2625d0825bca7fe65beaee391d30da42e937db621564Steve Block // Remove event listener from regular DOM element 2626d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!tryRemoveEventListener(this, eventType, listener, useCapture)) 2627231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; 26288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2629d0825bca7fe65beaee391d30da42e937db621564Steve Block // Remove event listener from all shadow tree DOM element instances 2630d0825bca7fe65beaee391d30da42e937db621564Steve Block const HashSet<SVGElementInstance*>::const_iterator end = instances.end(); 2631d0825bca7fe65beaee391d30da42e937db621564Steve Block for (HashSet<SVGElementInstance*>::const_iterator it = instances.begin(); it != end; ++it) { 2632d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT((*it)->correspondingElement() == this); 2633d0825bca7fe65beaee391d30da42e937db621564Steve Block 2634d0825bca7fe65beaee391d30da42e937db621564Steve Block SVGElement* shadowTreeElement = (*it)->shadowTreeElement(); 2635d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT(shadowTreeElement); 2636d0825bca7fe65beaee391d30da42e937db621564Steve Block 2637d0825bca7fe65beaee391d30da42e937db621564Steve Block if (tryRemoveEventListener(shadowTreeElement, eventType, listener, useCapture)) 2638d0825bca7fe65beaee391d30da42e937db621564Steve Block continue; 2639d0825bca7fe65beaee391d30da42e937db621564Steve Block 2640d0825bca7fe65beaee391d30da42e937db621564Steve Block // This case can only be hit for event listeners created from markup 2641d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT(listener->wasCreatedFromMarkup()); 2642d0825bca7fe65beaee391d30da42e937db621564Steve Block 2643d0825bca7fe65beaee391d30da42e937db621564Steve Block // If the event listener 'listener' has been created from markup and has been fired before 2644d0825bca7fe65beaee391d30da42e937db621564Steve Block // then JSLazyEventListener::parseCode() has been called and m_jsFunction of that listener 2645d0825bca7fe65beaee391d30da42e937db621564Steve Block // has been created (read: it's not 0 anymore). During shadow tree creation, the event 2646d0825bca7fe65beaee391d30da42e937db621564Steve Block // listener DOM attribute has been cloned, and another event listener has been setup in 2647d0825bca7fe65beaee391d30da42e937db621564Steve Block // the shadow tree. If that event listener has not been used yet, m_jsFunction is still 0, 2648d0825bca7fe65beaee391d30da42e937db621564Steve Block // and tryRemoveEventListener() above will fail. Work around that very seldom problem. 2649d0825bca7fe65beaee391d30da42e937db621564Steve Block EventTargetData* data = shadowTreeElement->eventTargetData(); 2650d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT(data); 2651d0825bca7fe65beaee391d30da42e937db621564Steve Block 2652d0825bca7fe65beaee391d30da42e937db621564Steve Block EventListenerMap::iterator result = data->eventListenerMap.find(eventType); 2653d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT(result != data->eventListenerMap.end()); 2654d0825bca7fe65beaee391d30da42e937db621564Steve Block 2655d0825bca7fe65beaee391d30da42e937db621564Steve Block EventListenerVector* entry = result->second; 2656d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT(entry); 2657d0825bca7fe65beaee391d30da42e937db621564Steve Block 2658d0825bca7fe65beaee391d30da42e937db621564Steve Block unsigned int index = 0; 2659d0825bca7fe65beaee391d30da42e937db621564Steve Block bool foundListener = false; 2660d0825bca7fe65beaee391d30da42e937db621564Steve Block 2661d0825bca7fe65beaee391d30da42e937db621564Steve Block EventListenerVector::iterator end = entry->end(); 2662d0825bca7fe65beaee391d30da42e937db621564Steve Block for (EventListenerVector::iterator it = entry->begin(); it != end; ++it) { 2663d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!(*it).listener->wasCreatedFromMarkup()) { 2664d0825bca7fe65beaee391d30da42e937db621564Steve Block ++index; 2665d0825bca7fe65beaee391d30da42e937db621564Steve Block continue; 2666d0825bca7fe65beaee391d30da42e937db621564Steve Block } 2667d0825bca7fe65beaee391d30da42e937db621564Steve Block 2668d0825bca7fe65beaee391d30da42e937db621564Steve Block foundListener = true; 2669d0825bca7fe65beaee391d30da42e937db621564Steve Block entry->remove(index); 2670d0825bca7fe65beaee391d30da42e937db621564Steve Block break; 2671d0825bca7fe65beaee391d30da42e937db621564Steve Block } 2672d0825bca7fe65beaee391d30da42e937db621564Steve Block 2673d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT(foundListener); 2674d0825bca7fe65beaee391d30da42e937db621564Steve Block 2675d0825bca7fe65beaee391d30da42e937db621564Steve Block if (entry->isEmpty()) { 2676d0825bca7fe65beaee391d30da42e937db621564Steve Block delete entry; 2677d0825bca7fe65beaee391d30da42e937db621564Steve Block data->eventListenerMap.remove(result); 2678d0825bca7fe65beaee391d30da42e937db621564Steve Block } 2679d0825bca7fe65beaee391d30da42e937db621564Steve Block } 26803f252f84468859d129a8c6a9302412d2e6e5a3faSteve Block 2681231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return true; 2682d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 26838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 26848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2685231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockEventTargetData* Node::eventTargetData() 26868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 2687231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return hasRareData() ? rareData()->eventTargetData() : 0; 2688231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 26898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2690231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockEventTargetData* Node::ensureEventTargetData() 2691231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 2692231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return ensureRareData()->ensureEventTargetData(); 26938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 26948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2695231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid Node::handleLocalEvents(Event* event) 26968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 2697231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!hasRareData() || !rareData()->eventTargetData()) 2698231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 2699231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 27008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (disabled() && event->isMouseEvent()) 27018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 27028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2703231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block fireEventListeners(event); 27048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 27058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2706f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid Node::dispatchScopedEvent(PassRefPtr<Event> event) 27076b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 27082bde8e466a4451c7319e3a072d118917957d6554Steve Block EventDispatcher::dispatchScopedEvent(this, event); 27098a26975f9657a07318a10d481d7f332dad759325Ben Murdoch} 27108a26975f9657a07318a10d481d7f332dad759325Ben Murdoch 27112bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool Node::dispatchEvent(PassRefPtr<Event> event) 271265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 27132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return EventDispatcher::dispatchEvent(this, EventDispatchMediator(event)); 27148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 27158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 27165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid Node::dispatchSubtreeModifiedEvent() 27178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 27188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(!eventDispatchForbidden()); 27198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 27208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian document()->incDOMTreeVersion(); 27218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 27228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian notifyNodeListsAttributeChanged(); // FIXME: Can do better some day. Really only care about the name attribute changing. 27238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 27248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!document()->hasListenerType(Document::DOMSUBTREEMODIFIED_LISTENER)) 27255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return; 27268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2727f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch dispatchScopedEvent(MutationEvent::create(eventNames().DOMSubtreeModifiedEvent, true)); 27288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 27298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 27305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid Node::dispatchUIEvent(const AtomicString& eventType, int detail, PassRefPtr<Event> underlyingEvent) 27318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 27328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(!eventDispatchForbidden()); 2733dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(eventType == eventNames().focusinEvent || eventType == eventNames().focusoutEvent || 2734dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block eventType == eventNames().DOMFocusInEvent || eventType == eventNames().DOMFocusOutEvent || eventType == eventNames().DOMActivateEvent); 27358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 27368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian bool cancelable = eventType == eventNames().DOMActivateEvent; 2737f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 2738231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block RefPtr<UIEvent> event = UIEvent::create(eventType, true, cancelable, document()->defaultView(), detail); 2739231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block event->setUnderlyingEvent(underlyingEvent); 2740f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch dispatchScopedEvent(event.release()); 27418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 27428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 27432bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool Node::dispatchKeyEvent(const PlatformKeyboardEvent& event) 27448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 27452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return EventDispatcher::dispatchEvent(this, KeyboardEventDispatchMediator(KeyboardEvent::create(event, document()->defaultView()))); 27468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 27478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 27488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianbool Node::dispatchMouseEvent(const PlatformMouseEvent& event, const AtomicString& eventType, 27498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int detail, Node* relatedTarget) 27508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 27512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return EventDispatcher::dispatchEvent(this, MouseEventDispatchMediator(MouseEvent::create(eventType, document()->defaultView(), event, detail, relatedTarget))); 27528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 27538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 27548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid Node::dispatchSimulatedClick(PassRefPtr<Event> event, bool sendMouseEvents, bool showPressedLook) 27558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 27562bde8e466a4451c7319e3a072d118917957d6554Steve Block EventDispatcher::dispatchSimulatedClick(this, event, sendMouseEvents, showPressedLook); 27578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 27588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 27592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool Node::dispatchWheelEvent(const PlatformWheelEvent& event) 27608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 27612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return EventDispatcher::dispatchEvent(this, WheelEventDispatchMediator(event, document()->defaultView())); 27628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 27638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 27645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid Node::dispatchFocusEvent() 27658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 2766231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block dispatchEvent(Event::create(eventNames().focusEvent, false, false)); 27678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 27688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 27695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid Node::dispatchBlurEvent() 27708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 2771231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block dispatchEvent(Event::create(eventNames().blurEvent, false, false)); 27728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 27738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 27742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid Node::dispatchChangeEvent() 2775ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{ 2776ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch dispatchEvent(Event::create(eventNames().changeEvent, true, false)); 2777ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} 2778ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 27792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid Node::dispatchInputEvent() 2780ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{ 2781ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch dispatchEvent(Event::create(eventNames().inputEvent, true, false)); 2782ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} 2783ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 27848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianbool Node::disabled() const 27858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 27868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return false; 27878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 27888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 27898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid Node::defaultEventHandler(Event* event) 27908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 27918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (event->target() != this) 27928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 27938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian const AtomicString& eventType = event->type(); 27948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (eventType == eventNames().keydownEvent || eventType == eventNames().keypressEvent) { 27958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (event->isKeyboardEvent()) 27968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (Frame* frame = document()->frame()) 27978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian frame->eventHandler()->defaultKeyboardEventHandler(static_cast<KeyboardEvent*>(event)); 27988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } else if (eventType == eventNames().clickEvent) { 27998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian int detail = event->isUIEvent() ? static_cast<UIEvent*>(event)->detail() : 0; 28008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian dispatchUIEvent(eventNames().DOMActivateEvent, detail, event); 2801231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(CONTEXT_MENUS) 28028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } else if (eventType == eventNames().contextmenuEvent) { 28038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (Frame* frame = document()->frame()) 28048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (Page* page = frame->page()) 28058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian page->contextMenuController()->handleContextMenuEvent(event); 2806231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 28078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } else if (eventType == eventNames().textInputEvent) { 28088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (event->isTextEvent()) 28098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (Frame* frame = document()->frame()) 28108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian frame->eventHandler()->defaultTextInputEventHandler(static_cast<TextEvent*>(event)); 2811d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(PAN_SCROLLING) 2812e14391e94c850b8bd03680c23b38978db68687a8John Reck } else if (eventType == eventNames().mousedownEvent && event->isMouseEvent()) { 2813d0825bca7fe65beaee391d30da42e937db621564Steve Block MouseEvent* mouseEvent = static_cast<MouseEvent*>(event); 2814d0825bca7fe65beaee391d30da42e937db621564Steve Block if (mouseEvent->button() == MiddleButton) { 2815d0825bca7fe65beaee391d30da42e937db621564Steve Block if (enclosingLinkEventParentOrSelf()) 2816d0825bca7fe65beaee391d30da42e937db621564Steve Block return; 2817d0825bca7fe65beaee391d30da42e937db621564Steve Block 2818d0825bca7fe65beaee391d30da42e937db621564Steve Block RenderObject* renderer = this->renderer(); 2819d0825bca7fe65beaee391d30da42e937db621564Steve Block while (renderer && (!renderer->isBox() || !toRenderBox(renderer)->canBeScrolledAndHasScrollableArea())) 2820d0825bca7fe65beaee391d30da42e937db621564Steve Block renderer = renderer->parent(); 2821d0825bca7fe65beaee391d30da42e937db621564Steve Block 2822d0825bca7fe65beaee391d30da42e937db621564Steve Block if (renderer) { 2823d0825bca7fe65beaee391d30da42e937db621564Steve Block if (Frame* frame = document()->frame()) 2824d0825bca7fe65beaee391d30da42e937db621564Steve Block frame->eventHandler()->startPanScrolling(renderer); 2825d0825bca7fe65beaee391d30da42e937db621564Steve Block } 2826d0825bca7fe65beaee391d30da42e937db621564Steve Block } 2827d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 2828dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } else if (eventType == eventNames().mousewheelEvent && event->isWheelEvent()) { 2829dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WheelEvent* wheelEvent = static_cast<WheelEvent*>(event); 2830dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 2831dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // If we don't have a renderer, send the wheel event to the first node we find with a renderer. 2832dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // This is needed for <option> and <optgroup> elements so that <select>s get a wheel scroll. 2833dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Node* startNode = this; 2834dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block while (startNode && !startNode->renderer()) 2835f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch startNode = startNode->parentOrHostNode(); 2836dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 2837dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (startNode && startNode->renderer()) 2838dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (Frame* frame = document()->frame()) 2839dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block frame->eventHandler()->defaultWheelEventHandler(startNode, wheelEvent); 2840e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke } else if (event->type() == eventNames().webkitEditableContentChangedEvent) { 28412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch dispatchInputEvent(); 28428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 28438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 28448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 28458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore 28468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 28488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid showTree(const WebCore::Node* node) 28508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 28518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (node) 28528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project node->showTreeForThis(); 28538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 28548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 2856