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