15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 1999 Antti Koivisto (koivisto@kde.org)
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 2001 Dirk Mueller (mueller@kde.org)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Node.h"
2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "HTMLNames.h"
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "XMLNames.h"
30df95704c49daea886ddad70775bda23618d6274dBen Murdoch#include "bindings/v8/ExceptionState.h"
31e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)#include "bindings/v8/ScriptCallStackFactory.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/accessibility/AXObjectCache.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Attr.h"
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Attribute.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ChildListMutationScope.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ChildNodeList.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ClassNodeList.h"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DOMImplementation.h"
3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h"
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DocumentFragment.h"
41a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "core/dom/DocumentMarkerController.h"
4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DocumentType.h"
4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Element.h"
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ElementRareData.h"
4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ExceptionCode.h"
4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/LiveNodeList.h"
4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/NameNodeList.h"
4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/NodeRareData.h"
4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/NodeTraversal.h"
5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ProcessingInstruction.h"
51f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "core/dom/Range.h"
5253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/SelectorQuery.h"
5353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/TagNodeList.h"
5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/TemplateContentDocumentFragment.h"
5553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Text.h"
5653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/TreeScopeAdopter.h"
5753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/UserActionElementSet.h"
588abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include "core/dom/WheelController.h"
59e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/shadow/ElementShadow.h"
60f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)#include "core/dom/shadow/InsertionPoint.h"
61e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/shadow/ShadowRoot.h"
6253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/htmlediting.h"
631e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/BeforeLoadEvent.h"
641e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/Event.h"
651e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/EventDispatchMediator.h"
661e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/EventDispatcher.h"
671e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/EventListener.h"
681e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/GestureEvent.h"
691e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/KeyboardEvent.h"
701e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/MouseEvent.h"
711e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/MutationEvent.h"
721e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/TextEvent.h"
731e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/ThreadLocalEventNames.h"
741e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/TouchEvent.h"
751e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/UIEvent.h"
761e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/WheelEvent.h"
77e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/html/HTMLAnchorElement.h"
78c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "core/html/HTMLDialogElement.h"
7953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFrameOwnerElement.h"
8053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLStyleElement.h"
8153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/RadioNodeList.h"
8253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/ContextMenuController.h"
8353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/EventHandler.h"
841e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/frame/Frame.h"
8553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h"
86e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)#include "core/frame/Settings.h"
87591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "core/rendering/FlowThreadController.h"
8853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderBox.h"
89e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/svg/graphics/SVGImage.h"
901e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/Partitions.h"
915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "wtf/HashSet.h"
925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "wtf/PassOwnPtr.h"
935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "wtf/RefCountedLeakCounter.h"
945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "wtf/Vector.h"
955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "wtf/text/CString.h"
965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "wtf/text/StringBuilder.h"
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace std;
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames;
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)void* Node::operator new(size_t size)
1055267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
1061fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    ASSERT(isMainThread());
107591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    return partitionAlloc(Partitions::getObjectModelPartition(), size);
1085267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
1095267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1105267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)void Node::operator delete(void* ptr)
1115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
1121fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    ASSERT(isMainThread());
1135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    partitionFree(ptr);
1145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
1155267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::isSupported(const String& feature, const String& version)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return DOMImplementation::hasFeature(feature, version);
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if DUMP_NODE_STATISTICS
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static HashSet<Node*> liveNodeSet;
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::dumpStatistics()
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if DUMP_NODE_STATISTICS
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t nodesWithRareData = 0;
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t elementNodes = 0;
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t attrNodes = 0;
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t textNodes = 0;
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t cdataNodes = 0;
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t commentNodes = 0;
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t entityNodes = 0;
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t piNodes = 0;
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t documentNodes = 0;
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t docTypeNodes = 0;
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t fragmentNodes = 0;
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t notationNodes = 0;
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t xpathNSNodes = 0;
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t shadowRootNodes = 0;
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HashMap<String, size_t> perTagCount;
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t attributes = 0;
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t attributesWithAttr = 0;
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t elementsWithAttributeStorage = 0;
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t elementsWithRareData = 0;
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t elementsWithNamedNodeMap = 0;
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (HashSet<Node*>::iterator it = liveNodeSet.begin(); it != liveNodeSet.end(); ++it) {
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Node* node = *it;
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (node->hasRareData()) {
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ++nodesWithRareData;
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (node->isElementNode()) {
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ++elementsWithRareData;
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (toElement(node)->hasNamedNodeMap())
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    ++elementsWithNamedNodeMap;
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        switch (node->nodeType()) {
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case ELEMENT_NODE: {
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ++elementNodes;
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Tag stats
169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                Element* element = toElement(node);
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                HashMap<String, size_t>::AddResult result = perTagCount.add(element->tagName(), 1);
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (!result.isNewEntry)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    result.iterator->value++;
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                if (ElementData* elementData = element->elementData()) {
175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    attributes += elementData->length();
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    ++elementsWithAttributeStorage;
177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    for (unsigned i = 0; i < elementData->length(); ++i) {
178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                        Attribute* attr = elementData->attributeItem(i);
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if (attr->attr())
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            ++attributesWithAttr;
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    }
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case ATTRIBUTE_NODE: {
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ++attrNodes;
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case TEXT_NODE: {
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ++textNodes;
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case CDATA_SECTION_NODE: {
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ++cdataNodes;
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case COMMENT_NODE: {
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ++commentNodes;
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case ENTITY_NODE: {
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ++entityNodes;
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case PROCESSING_INSTRUCTION_NODE: {
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ++piNodes;
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case DOCUMENT_NODE: {
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ++documentNodes;
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case DOCUMENT_TYPE_NODE: {
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ++docTypeNodes;
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case DOCUMENT_FRAGMENT_NODE: {
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (node->isShadowRoot())
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    ++shadowRootNodes;
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                else
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    ++fragmentNodes;
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case NOTATION_NODE: {
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ++notationNodes;
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case XPATH_NAMESPACE_NODE: {
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ++xpathNSNodes;
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printf("Number of Nodes: %d\n\n", liveNodeSet.size());
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printf("Number of Nodes with RareData: %zu\n\n", nodesWithRareData);
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printf("NodeType distribution:\n");
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printf("  Number of Element nodes: %zu\n", elementNodes);
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printf("  Number of Attribute nodes: %zu\n", attrNodes);
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printf("  Number of Text nodes: %zu\n", textNodes);
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printf("  Number of CDATASection nodes: %zu\n", cdataNodes);
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printf("  Number of Comment nodes: %zu\n", commentNodes);
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printf("  Number of Entity nodes: %zu\n", entityNodes);
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printf("  Number of ProcessingInstruction nodes: %zu\n", piNodes);
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printf("  Number of Document nodes: %zu\n", documentNodes);
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printf("  Number of DocumentType nodes: %zu\n", docTypeNodes);
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printf("  Number of DocumentFragment nodes: %zu\n", fragmentNodes);
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printf("  Number of Notation nodes: %zu\n", notationNodes);
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printf("  Number of XPathNS nodes: %zu\n", xpathNSNodes);
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printf("  Number of ShadowRoot nodes: %zu\n", shadowRootNodes);
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printf("Element tag name distibution:\n");
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (HashMap<String, size_t>::iterator it = perTagCount.begin(); it != perTagCount.end(); ++it)
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        printf("  Number of <%s> tags: %zu\n", it->key.utf8().data(), it->value);
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printf("Attributes:\n");
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printf("  Number of Attributes (non-Node and Node): %zu [%zu]\n", attributes, sizeof(Attribute));
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printf("  Number of Attributes with an Attr: %zu\n", attributesWithAttr);
260926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    printf("  Number of Elements with attribute storage: %zu [%zu]\n", elementsWithAttributeStorage, sizeof(ElementData));
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printf("  Number of Elements with RareData: %zu\n", elementsWithRareData);
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    printf("  Number of Elements with NamedNodeMap: %zu [%zu]\n", elementsWithNamedNodeMap, sizeof(NamedNodeMap));
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DEFINE_DEBUG_ONLY_GLOBAL(WTF::RefCountedLeakCounter, nodeCounter, ("WebCoreNode"));
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::trackForDebugging()
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
271e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    nodeCounter.increment();
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if DUMP_NODE_STATISTICS
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    liveNodeSet.add(this);
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node::~Node()
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
282e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    nodeCounter.decrement();
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if DUMP_NODE_STATISTICS
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    liveNodeSet.remove(this);
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (hasRareData())
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        clearRareData();
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2928abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    RELEASE_ASSERT(!renderer());
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
294f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (!isContainerNode())
295f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        willBeDeletedFromDocument();
29653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_previous)
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_previous->setNextSibling(0);
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_next)
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_next->setPreviousSibling(0);
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
302e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    if (m_treeScope)
303e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        m_treeScope->guardDeref();
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InspectorCounters::decrementCounter(InspectorCounters::NodeCounter);
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
308f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void Node::willBeDeletedFromDocument()
30953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
310e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    if (!isTreeScopeInitialized())
311f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return;
312f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
313e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    Document& document = this->document();
314e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)
31553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (hasEventTargetData()) {
316e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        document.didRemoveEventTargetNode(this);
31753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        clearEventTargetData();
31853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
31953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
320e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    if (AXObjectCache* cache = document.existingAXObjectCache())
321f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        cache->remove(this);
322a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
323e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    document.markers()->removeMarkers(this);
32453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
32553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)NodeRareData* Node::rareData() const
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
328c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    ASSERT_WITH_SECURITY_IMPLICATION(hasRareData());
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return static_cast<NodeRareData*>(m_data.m_rareData);
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
332bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)NodeRareData& Node::ensureRareData()
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (hasRareData())
335bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return *rareData();
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
337926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    NodeRareData* data;
338926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (isElementNode())
339926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        data = ElementRareData::create(m_data.m_renderer).leakPtr();
340926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else
341926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        data = NodeRareData::create(m_data.m_renderer).leakPtr();
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(data);
343926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_data.m_rareData = data;
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setFlag(HasRareDataFlag);
346bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return *data;
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::clearRareData()
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(hasRareData());
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!transientMutationObserverRegistry() || transientMutationObserverRegistry()->isEmpty());
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* renderer = m_data.m_rareData->renderer();
355926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (isElementNode())
356926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        delete static_cast<ElementRareData*>(m_data.m_rareData);
357926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else
358926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        delete static_cast<NodeRareData*>(m_data.m_rareData);
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_data.m_renderer = renderer;
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clearFlag(HasRareDataFlag);
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node* Node::toNode()
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this;
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)short Node::tabIndex() const
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
370926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return 0;
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String Node::nodeValue() const
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return String();
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
378e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochvoid Node::setNodeValue(const String&)
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // By default, setting nodeValue has no effect.
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<NodeList> Node::childNodes()
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
385f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return ensureRareData().ensureNodeLists().ensureChildNodeList(this);
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)Node& Node::lastDescendant() const
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
39019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    Node* n = const_cast<Node*>(this);
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (n && n->lastChild())
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        n = n->lastChild();
39319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    ASSERT(n);
39419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    return *n;
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)Node* Node::pseudoAwarePreviousSibling() const
39853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
39953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (parentElement() && !previousSibling()) {
40053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        Element* parent = parentElement();
40153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (isAfterPseudoElement() && parent->lastChild())
40253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            return parent->lastChild();
40353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (!isBeforePseudoElement())
40453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            return parent->pseudoElement(BEFORE);
40553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
40653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return previousSibling();
40753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
40853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
40953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)Node* Node::pseudoAwareNextSibling() const
41053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
41153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (parentElement() && !nextSibling()) {
41253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        Element* parent = parentElement();
41353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (isBeforePseudoElement() && parent->firstChild())
41453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            return parent->firstChild();
41553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (!isAfterPseudoElement())
41653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            return parent->pseudoElement(AFTER);
41753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
41853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return nextSibling();
41953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
42053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
42153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)Node* Node::pseudoAwareFirstChild() const
42253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
42353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (isElementNode()) {
42453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        const Element* currentElement = toElement(this);
42553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        Node* first = currentElement->pseudoElement(BEFORE);
42653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (first)
42753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            return first;
42853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        first = currentElement->firstChild();
42953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (!first)
43053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            first = currentElement->pseudoElement(AFTER);
43153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return first;
43253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
43353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
43453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return firstChild();
43553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
43653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
43753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)Node* Node::pseudoAwareLastChild() const
43853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
43953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (isElementNode()) {
44053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        const Element* currentElement = toElement(this);
44153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        Node* last = currentElement->pseudoElement(AFTER);
44253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (last)
44353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            return last;
44453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        last = currentElement->lastChild();
44553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (!last)
44653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            last = currentElement->pseudoElement(BEFORE);
44753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return last;
44853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
44953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
45053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return lastChild();
45153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
45253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
45351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Node::insertBefore(PassRefPtr<Node> newChild, Node* refChild, ExceptionState& exceptionState)
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
455e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (isContainerNode())
45651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        toContainerNode(this)->insertBefore(newChild, refChild, exceptionState);
457e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    else
458a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(HierarchyRequestError, "This node type does not support this method.");
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Node::replaceChild(PassRefPtr<Node> newChild, Node* oldChild, ExceptionState& exceptionState)
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
463e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (isContainerNode())
46451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        toContainerNode(this)->replaceChild(newChild, oldChild, exceptionState);
465e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    else
466a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(HierarchyRequestError,  "This node type does not support this method.");
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Node::removeChild(Node* oldChild, ExceptionState& exceptionState)
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
471e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (isContainerNode())
47251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        toContainerNode(this)->removeChild(oldChild, exceptionState);
473e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    else
474a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(NotFoundError, "This node type does not support this method.");
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Node::appendChild(PassRefPtr<Node> newChild, ExceptionState& exceptionState)
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
479e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (isContainerNode())
48051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        toContainerNode(this)->appendChild(newChild, exceptionState);
481e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    else
482a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(HierarchyRequestError, "This node type does not support this method.");
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Node::remove(ExceptionState& exceptionState)
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (ContainerNode* parent = parentNode())
48851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        parent->removeChild(this, exceptionState);
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::normalize()
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Go through the subtree beneath us, normalizing all nodes. This means that
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // any two adjacent text nodes are merged and any empty text nodes are removed.
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<Node> node = this;
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (Node* firstChild = node->firstChild())
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        node = firstChild;
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (node) {
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NodeType type = node->nodeType();
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (type == ELEMENT_NODE)
502f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            toElement(node)->normalizeAttributes();
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (node == this)
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        if (type == TEXT_NODE)
508f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            node = toText(node)->mergeNextSiblingNodesIfPossible();
50906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        else
51051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            node = NodeTraversal::nextPostOrder(*node);
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)const AtomicString& Node::prefix() const
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // For nodes other than elements and attributes, the prefix is always null
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return nullAtom;
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Node::setPrefix(const AtomicString& /*prefix*/, ExceptionState& exceptionState)
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The spec says that for nodes other than elements and attributes, prefix is always null.
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // It does not say what to do when the user tries to set the prefix on another type of
524e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // node, however Mozilla throws a NamespaceError exception.
525a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    exceptionState.throwDOMException(NamespaceError, "Prefixes are only supported on element and attribute nodes.");
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)const AtomicString& Node::localName() const
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return nullAtom;
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)const AtomicString& Node::namespaceURI() const
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return nullAtom;
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::isContentEditable(UserSelectAllTreatment treatment)
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5408abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    document().updateStyleIfNeeded();
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return rendererIsEditable(Editable, treatment);
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::isContentRichlyEditable()
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5468abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    document().updateStyleIfNeeded();
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return rendererIsEditable(RichlyEditable, UserSelectAllIsAlwaysNonEditable);
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::rendererIsEditable(EditableLevel editableLevel, UserSelectAllTreatment treatment) const
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
552926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (isPseudoElement())
553926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
554926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Ideally we'd call ASSERT(!needsStyleRecalc()) here, but
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // ContainerNode::setFocus() calls setNeedsStyleRecalc(), so the assertion
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // would fire in the middle of Document::setFocusedNode().
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (const Node* node = this; node; node = node->parentNode()) {
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ((node->isHTMLElement() || node->isDocumentNode()) && node->renderer()) {
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Elements with user-select: all style are considered atomic
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // therefore non editable.
5633c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            if (Position::nodeIsUserSelectAll(node) && treatment == UserSelectAllIsAlwaysNonEditable)
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return false;
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            switch (node->renderer()->style()->userModify()) {
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case READ_ONLY:
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return false;
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case READ_WRITE:
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return true;
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case READ_WRITE_PLAINTEXT_ONLY:
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return editableLevel != RichlyEditable;
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ASSERT_NOT_REACHED();
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::isEditableToAccessibility(EditableLevel editableLevel) const
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (rendererIsEditable(editableLevel))
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Respect editableLevel for ARIA editable elements.
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (editableLevel == RichlyEditable)
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(AXObjectCache::accessibilityEnabled());
5918abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    ASSERT(document().existingAXObjectCache());
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (AXObjectCache* cache = document().existingAXObjectCache())
5948abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return cache->rootAXEditableElement(this);
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::shouldUseInputMethod()
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return isContentEditable(UserSelectAllIsAlwaysNonEditable);
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderBox* Node::renderBox() const
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* renderer = this->renderer();
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return renderer && renderer->isBox() ? toRenderBox(renderer) : 0;
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderBoxModelObject* Node::renderBoxModelObject() const
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* renderer = this->renderer();
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return renderer && renderer->isBoxModelObject() ? toRenderBoxModelObject(renderer) : 0;
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LayoutRect Node::boundingBox() const
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (renderer())
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return renderer()->absoluteBoundingBoxRect();
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutRect();
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
62202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::hasNonEmptyBoundingBox() const
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Before calling absoluteRects, check for the common case where the renderer
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // is non-empty, since this is a faster check and almost always returns true.
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderBoxModelObject* box = renderBoxModelObject();
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!box)
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!box->borderBoundingBox().isEmpty())
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<IntRect> rects;
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FloatPoint absPos = renderer()->localToAbsolute();
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    renderer()->absoluteRects(rects, flooredLayoutPoint(absPos));
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t n = rects.size();
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < n; ++i)
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!rects[i].isEmpty())
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
64451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#ifndef NDEBUG
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline static ShadowRoot* oldestShadowRootFor(const Node* node)
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!node->isElementNode())
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (ElementShadow* shadow = toElement(node)->shadow())
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return shadow->oldestShadowRoot();
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
65351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#endif
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
655f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void Node::recalcDistribution()
656f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles){
657f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    if (isElementNode()) {
658f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        if (ElementShadow* shadow = toElement(this)->shadow())
659f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            shadow->distributeIfNeeded();
660f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    }
661f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
662f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    for (Node* child = firstChild(); child; child = child->nextSibling()) {
663f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        if (child->childNeedsDistributionRecalc())
664f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            child->recalcDistribution();
665f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    }
666f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
667f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    for (ShadowRoot* root = youngestShadowRoot(); root; root = root->olderShadowRoot()) {
668f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        if (root->childNeedsDistributionRecalc())
669f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            root->recalcDistribution();
670f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    }
671f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
672f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    clearChildNeedsDistributionRecalc();
673f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)}
674f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
675e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)void Node::setIsLink(bool isLink)
676e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
677e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    setFlag(isLink && !SVGImage::isInSVGImage(toElement(this)), IsLinkFlag);
678e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
679e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
680f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void Node::markAncestorsWithChildNeedsDistributionRecalc()
681f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles){
682f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    for (Node* node = this; node && !node->childNeedsDistributionRecalc(); node = node->parentOrShadowHostNode())
683f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        node->setChildNeedsDistributionRecalc();
6848abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (document().childNeedsDistributionRecalc())
6858abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        document().scheduleStyleRecalc();
686f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)}
687f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
688e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)namespace {
689e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)
690e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)unsigned styledSubtreeSize(const Node*);
691e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)
692e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)unsigned styledSubtreeSizeIgnoringSelfAndShadowRoots(const Node* rootNode)
693e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles){
694e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    unsigned nodeCount = 0;
695e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    for (Node* child = rootNode->firstChild(); child; child = child->nextSibling())
696e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        nodeCount += styledSubtreeSize(child);
697e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    return nodeCount;
698e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)}
699e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)
700e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)unsigned styledSubtreeSize(const Node* rootNode)
701e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles){
702e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    if (rootNode->isTextNode())
703e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        return 1;
704e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    if (!rootNode->isElementNode())
705e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        return 0;
706e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)
707e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    // FIXME: We should use a shadow-tree aware node-iterator when such exists.
708e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    unsigned nodeCount = 1 + styledSubtreeSizeIgnoringSelfAndShadowRoots(rootNode);
709e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)
710e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    // ShadowRoots don't have style (so don't count them), but their children might.
711e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    for (ShadowRoot* shadowRoot = rootNode->youngestShadowRoot(); shadowRoot; shadowRoot = shadowRoot->olderShadowRoot())
712e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        nodeCount += styledSubtreeSizeIgnoringSelfAndShadowRoots(shadowRoot);
713e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)
714e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    return nodeCount;
715e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)}
716e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)
717e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)PassRefPtr<JSONArray> jsStackAsJSONArray()
718e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles){
719e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    RefPtr<JSONArray> jsonArray = JSONArray::create();
720e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    RefPtr<ScriptCallStack> stack = createScriptCallStack(10);
721e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    if (!stack)
722e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        return jsonArray.release();
723e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    for (size_t i = 0; i < stack->size(); i++)
724e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        jsonArray->pushString(stack->at(i).functionName());
725e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    return jsonArray.release();
726e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)}
727e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)
728e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)PassRefPtr<JSONObject> jsonObjectForStyleInvalidation(unsigned nodeCount, const Node* rootNode)
729e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles){
730e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    RefPtr<JSONObject> jsonObject = JSONObject::create();
731e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    jsonObject->setNumber("node_count", nodeCount);
732e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    jsonObject->setString("root_node", rootNode->debugName());
733e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    jsonObject->setArray("js_stack", jsStackAsJSONArray());
734e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    return jsonObject.release();
735e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)}
736e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)
737e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)} // anonymous namespace'd functions supporting traceStyleChange
738e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)
739e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)void Node::traceStyleChange(StyleChangeType changeType)
740e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles){
741e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    static const unsigned kMinLoggedSize = 100;
742e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    unsigned nodeCount = styledSubtreeSize(this);
743e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    if (nodeCount < kMinLoggedSize)
744e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        return;
745e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)
746e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("style.debug"),
747e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        "Node::setNeedsStyleRecalc",
748e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        "data", jsonObjectForStyleInvalidation(nodeCount, this)->toJSONString().ascii()
749e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    );
750e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)}
751e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)
752e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)void Node::traceStyleChangeIfNeeded(StyleChangeType changeType)
753e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles){
754e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    // TRACE_EVENT_CATEGORY_GROUP_ENABLED macro loads a global static bool into our local bool.
755e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    bool styleTracingEnabled;
756e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("style.debug"), &styleTracingEnabled);
757e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    if (UNLIKELY(styleTracingEnabled))
758e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        traceStyleChange(changeType);
759e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)}
760e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void Node::setStyleChange(StyleChangeType changeType)
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_nodeFlags = (m_nodeFlags & ~StyleChangeMask) | changeType;
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
76651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Node::markAncestorsWithChildNeedsStyleRecalc()
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
768926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (ContainerNode* p = parentOrShadowHostNode(); p && !p->childNeedsStyleRecalc(); p = p->parentOrShadowHostNode())
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        p->setChildNeedsStyleRecalc();
7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7718abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (document().needsStyleRecalc() || document().childNeedsStyleRecalc())
7728abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        document().scheduleStyleRecalc();
7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
775e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochvoid Node::setNeedsStyleRecalc(StyleChangeType changeType, StyleChangeSource source)
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(changeType != NoStyleChange);
77819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    if (!inActiveDocument())
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
781e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (source == StyleChangeFromRenderer)
782e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        setFlag(NotifyRendererWithIdenticalStyles);
783591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StyleChangeType existingChangeType = styleChangeType();
785e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    if (changeType > existingChangeType) {
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setStyleChange(changeType);
787e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        if (changeType >= SubtreeStyleChange)
788e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)            traceStyleChangeIfNeeded(changeType);
789e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    }
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (existingChangeType == NoStyleChange)
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        markAncestorsWithChildNeedsStyleRecalc();
7939243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)
7949243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)    if (isElementNode() && hasRareData())
7959243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)        toElement(*this).setAnimationStyleChange(false);
7969243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)}
7979243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)
7989243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)void Node::clearNeedsStyleRecalc()
7999243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles){
8009243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)    m_nodeFlags &= ~StyleChangeMask;
8019243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)    clearFlag(NotifyRendererWithIdenticalStyles);
8029243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)
8039243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)    if (isElementNode() && hasRareData())
8049243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)        toElement(*this).setAnimationStyleChange(false);
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
807f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)bool Node::inActiveDocument() const
808f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles){
809f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return inDocument() && document().isActive();
810f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)}
811f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node* Node::focusDelegate()
8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this;
8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
817591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochbool Node::shouldHaveFocusAppearance() const
818591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
819591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    ASSERT(focused());
820591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    return true;
821591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
822591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
823e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)bool Node::isInert() const
824e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
8258abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    const HTMLDialogElement* dialog = document().activeModalDialog();
826e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (dialog && !containsIncludingShadowDOM(dialog) && !dialog->containsIncludingShadowDOM(this))
827e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return true;
8288abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return document().ownerElement() && document().ownerElement()->isInert();
829e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
830e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned Node::nodeIndex() const
8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node *_tempNode = previousSibling();
8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned count=0;
8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for ( count=0; _tempNode; count++ )
8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        _tempNode = _tempNode->previousSibling();
8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return count;
8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<unsigned type>
8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool shouldInvalidateNodeListCachesForAttr(const unsigned nodeListCounts[], const QualifiedName& attrName)
8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
843926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (nodeListCounts[type] && LiveNodeListBase::shouldInvalidateTypeOnAttributeChange(static_cast<NodeListInvalidationType>(type), attrName))
8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return shouldInvalidateNodeListCachesForAttr<type + 1>(nodeListCounts, attrName);
8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<>
8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool shouldInvalidateNodeListCachesForAttr<numNodeListInvalidationTypes>(const unsigned[], const QualifiedName&)
8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Document::shouldInvalidateNodeListCaches(const QualifiedName* attrName) const
8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (attrName)
8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return shouldInvalidateNodeListCachesForAttr<DoNotInvalidateOnAttributeChanges + 1>(m_nodeListCounts, *attrName);
8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (int type = 0; type < numNodeListInvalidationTypes; type++) {
8605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_nodeListCounts[type])
8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Document::invalidateNodeListCaches(const QualifiedName* attrName)
8685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
869926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    HashSet<LiveNodeListBase*>::iterator end = m_listsInvalidatedAtDocument.end();
870926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (HashSet<LiveNodeListBase*>::iterator it = m_listsInvalidatedAtDocument.begin(); it != end; ++it)
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        (*it)->invalidateCache(attrName);
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::invalidateNodeListCachesInAncestors(const QualifiedName* attrName, Element* attributeOwnerElement)
8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
876926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (hasRareData() && (!attrName || isAttributeNode())) {
877926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (NodeListsNodeData* lists = rareData()->nodeLists())
878926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            lists->clearChildNodeListCache();
879926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
8805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Modifications to attributes that are not associated with an Element can't invalidate NodeList caches.
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (attrName && !attributeOwnerElement)
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8858abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!document().shouldInvalidateNodeListCaches(attrName))
8865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    document().invalidateNodeListCaches(attrName);
8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (Node* node = this; node; node = node->parentNode()) {
8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!node->hasRareData())
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NodeRareData* data = node->rareData();
8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (data->nodeLists())
8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            data->nodeLists()->invalidateCaches(attrName);
8965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)NodeListsNodeData* Node::nodeLists()
9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return hasRareData() ? rareData()->nodeLists() : 0;
9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
904926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void Node::clearNodeLists()
9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
906926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    rareData()->clearNodeLists();
9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
90951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Node::checkSetPrefix(const AtomicString& prefix, ExceptionState& exceptionState)
9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Perform error checking as required by spec for setting Node.prefix. Used by
9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Element::setPrefix() and Attr::setPrefix()
9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!prefix.isEmpty() && !Document::isValidName(prefix)) {
915a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidCharacterError, "The prefix '" + prefix + "' is not a valid name.");
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
9175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
919e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // FIXME: Raise NamespaceError if prefix is malformed per the Namespaces in XML specification.
9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const AtomicString& nodeNamespaceURI = namespaceURI();
9229bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (nodeNamespaceURI.isEmpty() && !prefix.isEmpty()) {
923a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(NamespaceError, "No namespace is set, so a namespace prefix may not be set.");
9249bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return;
9259bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
9269bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
9279bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (prefix == xmlAtom && nodeNamespaceURI != XMLNames::xmlNamespaceURI) {
928a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(NamespaceError, "The prefix '" + xmlAtom + "' may not be set on namespace '" + nodeNamespaceURI + "'.");
9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Attribute-specific checks are in Attr::setPrefix().
9325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::isDescendantOf(const Node *other) const
9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Return true if other is an ancestor of this, otherwise false
9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!other || !other->hasChildNodes() || inDocument() != other->inDocument())
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
9391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (other->treeScope() != treeScope())
940591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return false;
941591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (other->isTreeScope())
942591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return !isTreeScope();
9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (const ContainerNode* n = parentNode(); n; n = n->parentNode()) {
9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (n == other)
9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::contains(const Node* node) const
9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!node)
9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this == node || node->isDescendantOf(this);
9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
957926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool Node::containsIncludingShadowDOM(const Node* node) const
9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
959f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    if (!node)
960f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        return false;
961f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
962f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    if (this == node)
963f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        return true;
964f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
9651e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (document() != node->document())
966f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        return false;
967f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
968f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    if (inDocument() != node->inDocument())
969f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        return false;
970f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
971f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    bool hasChildren = isContainerNode() && toContainerNode(this)->hasChildNodes();
972f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    bool hasShadow = isElementNode() && toElement(this)->shadow();
973f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    if (!hasChildren && !hasShadow)
974f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        return false;
975f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
976f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    for (; node; node = node->shadowHost()) {
9771e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        if (treeScope() == node->treeScope())
978f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            return contains(node);
9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
980f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
98419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)bool Node::containsIncludingHostElements(const Node& node) const
985926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
98619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    const Node* current = &node;
98719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    do {
98819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        if (current == this)
989926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return true;
99019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        if (current->isDocumentFragment() && toDocumentFragment(current)->isTemplateContent())
99119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            current = static_cast<const TemplateContentDocumentFragment*>(current)->host();
992926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        else
99319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            current = current->parentOrShadowHostNode();
99419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    } while (current);
995926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return false;
996926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
997926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
9989243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)Node* Node::commonAncestor(const Node& other, Node* (*parent)(const Node&))
99951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
100051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (this == other)
100151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return this;
100251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (document() != other.document())
100351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return 0;
100451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    int thisDepth = 0;
10059243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)    for (Node* node = this; node; node = parent(*node)) {
100651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (node == &other)
100751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            return node;
100851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        thisDepth++;
100951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
101051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    int otherDepth = 0;
10119243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)    for (const Node* node = &other; node; node = parent(*node)) {
101251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (node == this)
101351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            return this;
101451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        otherDepth++;
101551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
101651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    Node* thisIterator = this;
101751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    const Node* otherIterator = &other;
101851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (thisDepth > otherDepth) {
101951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        for (int i = thisDepth; i > otherDepth; --i)
10209243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)            thisIterator = parent(*thisIterator);
102151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    } else if (otherDepth > thisDepth) {
102251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        for (int i = otherDepth; i > thisDepth; --i)
10239243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)            otherIterator = parent(*otherIterator);
102451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
102551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    while (thisIterator) {
102651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (thisIterator == otherIterator)
102751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            return thisIterator;
10289243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)        thisIterator = parent(*thisIterator);
10299243a84568938a3b2704146d90a71e1405b822e4Torne (Richard Coles)        otherIterator = parent(*otherIterator);
103051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
103151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ASSERT(!otherIterator);
103251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return 0;
103351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
103451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
1035e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochvoid Node::reattach(const AttachContext& context)
1036e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
1037e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    AttachContext reattachContext(context);
1038e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    reattachContext.performingReattach = true;
1039e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
10401e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    // We only need to detach if the node has already been through attach().
10411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (styleChangeType() < NeedsReattachStyleChange)
10421e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        detach(reattachContext);
1043e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    attach(reattachContext);
1044e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
1045e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1046521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void Node::attach(const AttachContext&)
10475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10488abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    ASSERT(document().inStyleRecalc() || isDocumentNode());
10491e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ASSERT(needsAttach());
105093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    ASSERT(!renderer() || (renderer()->style() && (renderer()->parent() || renderer()->isRenderView())));
10515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clearNeedsStyleRecalc();
10535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1054926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (Document* doc = documentInternal()) {
1055926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (AXObjectCache* cache = doc->axObjectCache())
1056926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            cache->updateCacheAfterNodeIsAttached(this);
1057926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
10585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
10615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static Node* detachingNode;
10625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::inDetach() const
10645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return detachingNode == this;
10665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
10685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1069521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void Node::detach(const AttachContext& context)
10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!detachingNode);
10735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    detachingNode = this;
10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
10755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1076926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (renderer())
10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        renderer()->destroyAndCleanupAnonymousWrappers();
1078926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setRenderer(0);
10795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1080521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // Do not remove the element's hovered and active status
1081521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    // if performing a reattach.
1082521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (!context.performingReattach) {
10838abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        Document& doc = document();
1084521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        if (isUserActionElement()) {
1085521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            if (hovered())
10868abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)                doc.hoveredNodeDetached(this);
1087521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)            if (inActiveChain())
10888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)                doc.activeChainNodeDetached(this);
10898abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            doc.userActionElements().didDetach(this);
1090521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        }
1091926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
1092926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
109351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    setStyleChange(NeedsReattachStyleChange);
109451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    setChildNeedsStyleRecalc();
10955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
10975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    detachingNode = 0;
10985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
10995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
110151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Node::reattachWhitespaceSiblings(Text* start)
110251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
110351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    for (Node* sibling = start; sibling; sibling = sibling->nextSibling()) {
110451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (sibling->isTextNode() && toText(sibling)->containsOnlyWhitespace()) {
110551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            bool hadRenderer = sibling->hasRenderer();
110651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            sibling->reattach();
110751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            // If the reattach didn't toggle the visibility of the whitespace we don't
110851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            // need to continue reattaching siblings since they won't toggle visibility
110951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            // either.
111051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            if (hadRenderer == sibling->hasRenderer())
111151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)                return;
111251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        } else if (sibling->renderer()) {
111351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            return;
111451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        }
111551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
111651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
111751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
11185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: This code is used by editing.  Seems like it could move over there and not pollute Node.
11195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node *Node::previousNodeConsideringAtomicNodes() const
11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (previousSibling()) {
11225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Node *n = previousSibling();
11235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while (!isAtomicNode(n) && n->lastChild())
11245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            n = n->lastChild();
11255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return n;
11265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (parentNode()) {
11285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return parentNode();
11295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else {
11315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
11325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node *Node::nextNodeConsideringAtomicNodes() const
11365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!isAtomicNode(this) && firstChild())
11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return firstChild();
11395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (nextSibling())
11405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return nextSibling();
11415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Node *n = this;
11425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (n && !n->nextSibling())
11435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        n = n->parentNode();
11445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (n)
11455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return n->nextSibling();
11465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
11475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node *Node::previousLeafNode() const
11505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node *node = previousNodeConsideringAtomicNodes();
11525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (node) {
11535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isAtomicNode(node))
11545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return node;
11555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        node = node->previousNodeConsideringAtomicNodes();
11565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
11585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node *Node::nextLeafNode() const
11615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node *node = nextNodeConsideringAtomicNodes();
11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (node) {
11645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isAtomicNode(node))
11655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return node;
11665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        node = node->nextNodeConsideringAtomicNodes();
11675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
11695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderStyle* Node::virtualComputedStyle(PseudoId pseudoElementSpecifier)
11725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1173926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return parentOrShadowHostNode() ? parentOrShadowHostNode()->computedStyle(pseudoElementSpecifier) : 0;
11745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int Node::maxCharacterOffset() const
11775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_NOT_REACHED();
11795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
11805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: Shouldn't these functions be in the editing code?  Code that asks questions about HTML in the core DOM class
11835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// is obviously misplaced.
11845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::canStartSelection() const
11855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (rendererIsEditable())
11875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
11885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (renderer()) {
11905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderStyle* style = renderer()->style();
11915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We allow selections to begin within an element that has -webkit-user-select: none set,
11925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // but if the element is draggable then dragging should take priority over selection.
11935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (style->userDrag() == DRAG_ELEMENT && style->userSelect() == SELECT_NONE)
11945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
11955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1196926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return parentOrShadowHostNode() ? parentOrShadowHostNode()->canStartSelection() : true;
11975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1199591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochbool Node::isRegisteredWithNamedFlow() const
1200591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
12018abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return document().renderView()->flowThreadController()->isContentNodeRegisteredWithAnyNamedFlow(this);
1202591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
1203591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
12045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element* Node::shadowHost() const
12055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1206926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (ShadowRoot* root = containingShadowRoot())
12075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return root->host();
12085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
12095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1211926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Node* Node::deprecatedShadowAncestorNode() const
12125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (ShadowRoot* root = containingShadowRoot())
12145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return root->host();
12155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return const_cast<Node*>(this);
12175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1219926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)ShadowRoot* Node::containingShadowRoot() const
12205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12218abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Node* root = treeScope().rootNode();
1222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return root && root->isShadowRoot() ? toShadowRoot(root) : 0;
12235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node* Node::nonBoundaryShadowTreeRootNode()
12265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!isShadowRoot());
12285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* root = this;
12295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (root) {
12305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (root->isShadowRoot())
12315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return root;
1232a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        Node* parent = root->parentOrShadowHostNode();
12335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (parent && parent->isShadowRoot())
12345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return root;
12355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        root = parent;
12365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
12385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ContainerNode* Node::nonShadowBoundaryParentNode() const
12415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ContainerNode* parent = parentNode();
12435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return parent && !parent->isShadowRoot() ? parent : 0;
12445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1246926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Element* Node::parentOrShadowHostElement() const
12475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ContainerNode* parent = parentOrShadowHostNode();
12495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!parent)
12505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
12515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (parent->isShadowRoot())
12535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return toShadowRoot(parent)->host();
12545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!parent->isElementNode())
12565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
12575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return toElement(parent);
12595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
126151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)ContainerNode* Node::parentOrShadowHostOrTemplateHostNode() const
126251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
126351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (isDocumentFragment() && toDocumentFragment(this)->isTemplateContent())
126451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return static_cast<const TemplateContentDocumentFragment*>(this)->host();
126551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return parentOrShadowHostNode();
126651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
126751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
126853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool Node::isBlockFlowElement() const
12695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12708abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return isElementNode() && renderer() && renderer()->isRenderBlockFlow();
12715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element *Node::enclosingBlockFlowElement() const
12745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node *n = const_cast<Node *>(this);
127653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (isBlockFlowElement())
127753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return toElement(n);
12785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (1) {
12805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        n = n->parentNode();
12815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!n)
12825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
128353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (n->isBlockFlowElement() || n->hasTagName(bodyTag))
128453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            return toElement(n);
12855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
12875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::isRootEditableElement() const
12905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return rendererIsEditable() && isElementNode() && (!parentNode() || !parentNode()->rendererIsEditable()
12925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || !parentNode()->isElementNode() || hasTagName(bodyTag));
12935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element* Node::rootEditableElement(EditableType editableType) const
12965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1297926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (editableType == HasEditableAXRole) {
12988abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (AXObjectCache* cache = document().existingAXObjectCache())
1299926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return const_cast<Element*>(cache->rootAXEditableElement(this));
1300926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
130102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
13025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return rootEditableElement();
13035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element* Node::rootEditableElement() const
13065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* result = 0;
13085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (Node* n = const_cast<Node*>(this); n && n->rendererIsEditable(); n = n->parentNode()) {
13095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (n->isElementNode())
1310926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            result = toElement(n);
13115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (n->hasTagName(bodyTag))
13125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
13135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
13155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::inSameContainingBlockFlowElement(Node *n)
13185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return n ? enclosingBlockFlowElement() == n->enclosingBlockFlowElement() : false;
13205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: End of obviously misplaced HTML editing functions.  Try to move these out of Node.
13235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<NodeList> Node::getElementsByTagName(const AtomicString& localName)
13255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (localName.isNull())
13275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
13285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13298abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (document().isHTMLDocument())
1330f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return ensureRareData().ensureNodeLists().addCacheWithAtomicName<HTMLTagNodeList>(this, HTMLTagNodeListType, localName);
1331f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return ensureRareData().ensureNodeLists().addCacheWithAtomicName<TagNodeList>(this, TagNodeListType, localName);
13325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<NodeList> Node::getElementsByTagNameNS(const AtomicString& namespaceURI, const AtomicString& localName)
13355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (localName.isNull())
13375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
13385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (namespaceURI == starAtom)
13405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return getElementsByTagName(localName);
13415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1342f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return ensureRareData().ensureNodeLists().addCacheWithQualifiedName(this, namespaceURI.isEmpty() ? nullAtom : namespaceURI, localName);
13435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<NodeList> Node::getElementsByName(const String& elementName)
13465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1347f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return ensureRareData().ensureNodeLists().addCacheWithAtomicName<NameNodeList>(this, NameNodeListType, elementName);
13485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<NodeList> Node::getElementsByClassName(const String& classNames)
13515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1352f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return ensureRareData().ensureNodeLists().addCacheWithName<ClassNodeList>(this, ClassNodeListType, classNames);
13535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<RadioNodeList> Node::radioNodeList(const AtomicString& name)
13565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(hasTagName(formTag) || hasTagName(fieldsetTag));
1358f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return ensureRareData().ensureNodeLists().addCacheWithAtomicName<RadioNodeList>(this, RadioNodeListType, name);
13595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
136151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)PassRefPtr<Element> Node::querySelector(const AtomicString& selectors, ExceptionState& exceptionState)
13625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (selectors.isEmpty()) {
1364a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(SyntaxError,  "The provided selector is empty.");
13655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
13665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
136851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    SelectorQuery* selectorQuery = document().selectorQueryCache().add(selectors, document(), exceptionState);
13695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!selectorQuery)
13705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
137119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    return selectorQuery->queryFirst(*this);
13725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
137451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)PassRefPtr<NodeList> Node::querySelectorAll(const AtomicString& selectors, ExceptionState& exceptionState)
13755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (selectors.isEmpty()) {
1377a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(SyntaxError, "The provided selector is empty.");
13785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
13795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
138151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    SelectorQuery* selectorQuery = document().selectorQueryCache().add(selectors, document(), exceptionState);
13825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!selectorQuery)
13835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
138419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    return selectorQuery->queryAll(*this);
13855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13878abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)Document* Node::ownerDocument() const
13885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13898abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Document* doc = &document();
13905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return doc == this ? 0 : doc;
13915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)KURL Node::baseURI() const
13945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return parentNode() ? parentNode()->baseURI() : KURL();
13965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::isEqualNode(Node* other) const
13995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!other)
14015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
140202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
14035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NodeType nodeType = this->nodeType();
14045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (nodeType != other->nodeType())
14055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
140602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
14075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (nodeName() != other->nodeName())
14085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
140902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
14105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (localName() != other->localName())
14115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
141202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
14135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (namespaceURI() != other->namespaceURI())
14145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
141502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
14165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (prefix() != other->prefix())
14175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
141802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (nodeValue() != other->nodeValue())
14205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
142102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
14225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isElementNode() && !toElement(this)->hasEquivalentAttributes(toElement(other)))
14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
142402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
14255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* child = firstChild();
14265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* otherChild = other->firstChild();
142702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
14285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (child) {
14295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!child->isEqualNode(otherChild))
14305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
143102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
14325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        child = child->nextSibling();
14335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        otherChild = otherChild->nextSibling();
14345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
143502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
14365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (otherChild)
14375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
143802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
14395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (nodeType == DOCUMENT_TYPE_NODE) {
14408abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        const DocumentType* documentTypeThis = toDocumentType(this);
14418abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        const DocumentType* documentTypeOther = toDocumentType(other);
144202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
14435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (documentTypeThis->publicId() != documentTypeOther->publicId())
14445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (documentTypeThis->systemId() != documentTypeOther->systemId())
14475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
14485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (documentTypeThis->internalSubset() != documentTypeOther->internalSubset())
14505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
14515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // FIXME: We don't compare entities or notations because currently both are always empty.
14535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
145402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
14555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
14565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::isDefaultNamespace(const AtomicString& namespaceURIMaybeEmpty) const
14595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const AtomicString& namespaceURI = namespaceURIMaybeEmpty.isEmpty() ? nullAtom : namespaceURIMaybeEmpty;
14615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (nodeType()) {
14635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case ELEMENT_NODE: {
1464926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            const Element* elem = toElement(this);
146502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
14665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (elem->prefix().isNull())
14675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return elem->namespaceURI() == namespaceURI;
14685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (elem->hasAttributes()) {
14705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                for (unsigned i = 0; i < elem->attributeCount(); i++) {
14715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    const Attribute* attr = elem->attributeItem(i);
147202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
14735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    if (attr->localName() == xmlnsAtom)
14745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return attr->value() == namespaceURI;
14755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
14765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
14775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (Element* ancestor = ancestorElement())
14795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return ancestor->isDefaultNamespace(namespaceURI);
14805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
14825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
14835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case DOCUMENT_NODE:
1484926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (Element* de = toDocument(this)->documentElement())
14855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return de->isDefaultNamespace(namespaceURI);
14865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
14875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case ENTITY_NODE:
14885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case NOTATION_NODE:
14895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case DOCUMENT_TYPE_NODE:
14905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case DOCUMENT_FRAGMENT_NODE:
14915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
14925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case ATTRIBUTE_NODE: {
1493591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            const Attr* attr = toAttr(this);
14945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (attr->ownerElement())
14955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return attr->ownerElement()->isDefaultNamespace(namespaceURI);
14965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
14975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
14985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default:
14995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (Element* ancestor = ancestorElement())
15005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return ancestor->isDefaultNamespace(namespaceURI);
15015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
15025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1505a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)const AtomicString& Node::lookupPrefix(const AtomicString& namespaceURI) const
15065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Implemented according to
15085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/namespaces-algorithms.html#lookupNamespacePrefixAlgo
150902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
15105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (namespaceURI.isEmpty())
1511a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return nullAtom;
151202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
15135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (nodeType()) {
15145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case ELEMENT_NODE:
1515591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return lookupNamespacePrefix(namespaceURI, toElement(this));
15165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case DOCUMENT_NODE:
1517926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (Element* de = toDocument(this)->documentElement())
15185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return de->lookupPrefix(namespaceURI);
1519a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            return nullAtom;
15205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case ENTITY_NODE:
15215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case NOTATION_NODE:
15225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case DOCUMENT_FRAGMENT_NODE:
15235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case DOCUMENT_TYPE_NODE:
1524a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            return nullAtom;
15255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case ATTRIBUTE_NODE: {
1526e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)            const Attr *attr = toAttr(this);
15275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (attr->ownerElement())
15285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return attr->ownerElement()->lookupPrefix(namespaceURI);
1529a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            return nullAtom;
15305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
15315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default:
15325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (Element* ancestor = ancestorElement())
15335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return ancestor->lookupPrefix(namespaceURI);
1534a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            return nullAtom;
15355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1538a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)const AtomicString& Node::lookupNamespaceURI(const String& prefix) const
15395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Implemented according to
15415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/namespaces-algorithms.html#lookupNamespaceURIAlgo
154202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
15435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!prefix.isNull() && prefix.isEmpty())
1544a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return nullAtom;
154502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
15465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (nodeType()) {
15475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case ELEMENT_NODE: {
1548591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            const Element *elem = toElement(this);
154902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
15505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!elem->namespaceURI().isNull() && elem->prefix() == prefix)
15515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return elem->namespaceURI();
155202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
15535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (elem->hasAttributes()) {
15545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                for (unsigned i = 0; i < elem->attributeCount(); i++) {
15555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    const Attribute* attr = elem->attributeItem(i);
155602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
15575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    if (attr->prefix() == xmlnsAtom && attr->localName() == prefix) {
15585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if (!attr->value().isEmpty())
15595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            return attr->value();
156002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1561a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                        return nullAtom;
15625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    } else if (attr->localName() == xmlnsAtom && prefix.isNull()) {
15635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if (!attr->value().isEmpty())
15645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            return attr->value();
156502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1566a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                        return nullAtom;
15675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    }
15685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
15695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
15705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (Element* ancestor = ancestorElement())
15715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return ancestor->lookupNamespaceURI(prefix);
1572a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            return nullAtom;
15735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
15745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case DOCUMENT_NODE:
1575926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (Element* de = toDocument(this)->documentElement())
15765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return de->lookupNamespaceURI(prefix);
1577a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            return nullAtom;
15785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case ENTITY_NODE:
15795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case NOTATION_NODE:
15805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case DOCUMENT_TYPE_NODE:
15815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case DOCUMENT_FRAGMENT_NODE:
1582a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            return nullAtom;
15835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case ATTRIBUTE_NODE: {
1584e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)            const Attr *attr = toAttr(this);
15855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (attr->ownerElement())
15865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return attr->ownerElement()->lookupNamespaceURI(prefix);
15875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else
1588a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                return nullAtom;
15895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
15905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default:
15915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (Element* ancestor = ancestorElement())
15925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return ancestor->lookupNamespaceURI(prefix);
1593a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            return nullAtom;
15945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1597a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)const AtomicString& Node::lookupNamespacePrefix(const AtomicString& _namespaceURI, const Element* originalElement) const
15985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (_namespaceURI.isNull())
1600a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return nullAtom;
160102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
16025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (originalElement->lookupNamespaceURI(prefix()) == _namespaceURI)
16035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return prefix();
160402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
16055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(isElementNode());
16065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Element* thisElement = toElement(this);
16075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (thisElement->hasAttributes()) {
16085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (unsigned i = 0; i < thisElement->attributeCount(); i++) {
16095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            const Attribute* attr = thisElement->attributeItem(i);
161002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
16115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (attr->prefix() == xmlnsAtom && attr->value() == _namespaceURI
16125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    && originalElement->lookupNamespaceURI(attr->localName()) == _namespaceURI)
16135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return attr->localName();
16145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
16155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
161602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
16175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Element* ancestor = ancestorElement())
16185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return ancestor->lookupNamespacePrefix(_namespaceURI, originalElement);
1619a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    return nullAtom;
16205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void appendTextContent(const Node* node, bool convertBRsToNewlines, bool& isNullString, StringBuilder& content)
16235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (node->nodeType()) {
16255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Node::TEXT_NODE:
16265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Node::CDATA_SECTION_NODE:
16275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Node::COMMENT_NODE:
16285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        isNullString = false;
16298abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        content.append(toCharacterData(node)->data());
16305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
16315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Node::PROCESSING_INSTRUCTION_NODE:
16335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        isNullString = false;
16348abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        content.append(toProcessingInstruction(node)->data());
16355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
163602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
16375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Node::ELEMENT_NODE:
16385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (node->hasTagName(brTag) && convertBRsToNewlines) {
16395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            isNullString = false;
16405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            content.append('\n');
16415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
16425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
16435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Fall through.
16445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Node::ATTRIBUTE_NODE:
16455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Node::ENTITY_NODE:
16465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Node::DOCUMENT_FRAGMENT_NODE:
16475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        isNullString = false;
16485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (Node* child = node->firstChild(); child; child = child->nextSibling()) {
16495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (child->nodeType() == Node::COMMENT_NODE || child->nodeType() == Node::PROCESSING_INSTRUCTION_NODE)
16505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                continue;
16515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            appendTextContent(child, convertBRsToNewlines, isNullString, content);
16525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
16535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
16545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Node::DOCUMENT_NODE:
16565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Node::DOCUMENT_TYPE_NODE:
16575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Node::NOTATION_NODE:
16585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Node::XPATH_NAMESPACE_NODE:
16595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
16605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String Node::textContent(bool convertBRsToNewlines) const
16645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StringBuilder content;
16665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isNullString = true;
16675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    appendTextContent(this, convertBRsToNewlines, isNullString, content);
16685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return isNullString ? String() : content.toString();
16695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1671a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void Node::setTextContent(const String& text)
167202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{
16735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (nodeType()) {
16745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case TEXT_NODE:
16755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case CDATA_SECTION_NODE:
16765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case COMMENT_NODE:
16775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case PROCESSING_INSTRUCTION_NODE:
1678e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            setNodeValue(text);
16795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
16805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case ELEMENT_NODE:
16815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case ATTRIBUTE_NODE:
16825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case ENTITY_NODE:
16835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case DOCUMENT_FRAGMENT_NODE: {
16845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RefPtr<ContainerNode> container = toContainerNode(this);
1685f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            ChildListMutationScope mutation(*this);
16865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            container->removeChildren();
16875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!text.isEmpty())
1688a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                container->appendChild(document().createTextNode(text), ASSERT_NO_EXCEPTION);
16895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
16905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
16915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case DOCUMENT_NODE:
16925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case DOCUMENT_TYPE_NODE:
16935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case NOTATION_NODE:
16945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case XPATH_NAMESPACE_NODE:
16955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Do nothing.
16965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
16975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_NOT_REACHED();
16995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element* Node::ancestorElement() const
17025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // In theory, there can be EntityReference nodes between elements, but this is currently not supported.
17045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (ContainerNode* n = parentNode(); n; n = n->parentNode()) {
17055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (n->isElementNode())
1706926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return toElement(n);
17075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
17095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::offsetInCharacters() const
17125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
17145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)unsigned short Node::compareDocumentPosition(const Node* otherNode) const
17175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
171853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return compareDocumentPositionInternal(otherNode, TreatShadowTreesAsDisconnected);
171953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
172053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
17215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)unsigned short Node::compareDocumentPositionInternal(const Node* otherNode, ShadowTreesTreatment treatment) const
172253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
17235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // It is not clear what should be done if |otherNode| is 0.
17245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!otherNode)
17255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return DOCUMENT_POSITION_DISCONNECTED;
17265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (otherNode == this)
17285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return DOCUMENT_POSITION_EQUIVALENT;
172902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1730591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    const Attr* attr1 = nodeType() == ATTRIBUTE_NODE ? toAttr(this) : 0;
1731591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    const Attr* attr2 = otherNode->nodeType() == ATTRIBUTE_NODE ? toAttr(otherNode) : 0;
173202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
17335267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    const Node* start1 = attr1 ? attr1->ownerElement() : this;
17345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    const Node* start2 = attr2 ? attr2->ownerElement() : otherNode;
173502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
17365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If either of start1 or start2 is null, then we are disconnected, since one of the nodes is
17375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // an orphaned attribute node.
17383464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    if (!start1 || !start2) {
17393464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch        unsigned short direction = (this > otherNode) ? DOCUMENT_POSITION_PRECEDING : DOCUMENT_POSITION_FOLLOWING;
17403464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch        return DOCUMENT_POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | direction;
17413464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    }
17425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    Vector<const Node*, 16> chain1;
17445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    Vector<const Node*, 16> chain2;
17455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (attr1)
17465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        chain1.append(attr1);
17475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (attr2)
17485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        chain2.append(attr2);
174902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
17505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (attr1 && attr2 && start1 == start2 && start1) {
17515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We are comparing two attributes on the same node. Crawl our attribute map and see which one we hit first.
17525267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        const Element* owner1 = attr1->ownerElement();
1753926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        owner1->synchronizeAllAttributes();
17545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unsigned length = owner1->attributeCount();
17555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (unsigned i = 0; i < length; ++i) {
175602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch            // If neither of the two determining nodes is a child node and nodeType is the same for both determining nodes, then an
17575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // implementation-dependent order between the determining nodes is returned. This order is stable as long as no nodes of
175802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch            // the same nodeType are inserted into or removed from the direct container. This would be the case, for example,
175902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch            // when comparing two attributes of the same element, and inserting or removing additional attributes might change
17605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // the order between existing attributes.
17615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            const Attribute* attribute = owner1->attributeItem(i);
17625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (attr1->qualifiedName() == attribute->name())
17635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | DOCUMENT_POSITION_FOLLOWING;
17645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (attr2->qualifiedName() == attribute->name())
17655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | DOCUMENT_POSITION_PRECEDING;
17665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
176702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
17685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
17695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return DOCUMENT_POSITION_DISCONNECTED;
17705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If one node is in the document and the other is not, we must be disconnected.
17735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the nodes have different owning documents, they must be disconnected.  Note that we avoid
17745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // comparing Attr nodes here, since they return false from inDocument() all the time (which seems like a bug).
17751e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (start1->inDocument() != start2->inDocument() || (treatment == TreatShadowTreesAsDisconnected && start1->treeScope() != start2->treeScope())) {
17763464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch        unsigned short direction = (this > otherNode) ? DOCUMENT_POSITION_PRECEDING : DOCUMENT_POSITION_FOLLOWING;
17773464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch        return DOCUMENT_POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | direction;
17783464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    }
17795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We need to find a common ancestor container, and then compare the indices of the two immediate children.
17815267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    const Node* current;
178253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    for (current = start1; current; current = current->parentOrShadowHostNode())
17835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        chain1.append(current);
178453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    for (current = start2; current; current = current->parentOrShadowHostNode())
17855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        chain2.append(current);
1786926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
17875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned index1 = chain1.size();
17885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned index2 = chain2.size();
1789926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1790926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // If the two elements don't have a common root, they're not in the same tree.
1791926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (chain1[index1 - 1] != chain2[index2 - 1]) {
17923464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch        unsigned short direction = (this > otherNode) ? DOCUMENT_POSITION_PRECEDING : DOCUMENT_POSITION_FOLLOWING;
1793926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return DOCUMENT_POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | direction;
1794926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
1795926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
17961e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    unsigned connection = start1->treeScope() != start2->treeScope() ? DOCUMENT_POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC : 0;
179753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1798926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Walk the two chains backwards and look for the first difference.
17995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned i = min(index1, index2); i; --i) {
18005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        const Node* child1 = chain1[--index1];
18015267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        const Node* child2 = chain2[--index2];
18025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (child1 != child2) {
18035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // If one of the children is an attribute, it wins.
18045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (child1->nodeType() == ATTRIBUTE_NODE)
180553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                return DOCUMENT_POSITION_FOLLOWING | connection;
18065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (child2->nodeType() == ATTRIBUTE_NODE)
180753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                return DOCUMENT_POSITION_PRECEDING | connection;
180853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
180953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            // If one of the children is a shadow root,
181053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            if (child1->isShadowRoot() || child2->isShadowRoot()) {
181153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                if (!child2->isShadowRoot())
181253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                    return Node::DOCUMENT_POSITION_FOLLOWING | connection;
181353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                if (!child1->isShadowRoot())
181453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                    return Node::DOCUMENT_POSITION_PRECEDING | connection;
181553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
181653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                for (ShadowRoot* child = toShadowRoot(child2)->olderShadowRoot(); child; child = child->olderShadowRoot())
181753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                    if (child == child1)
181853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                        return Node::DOCUMENT_POSITION_FOLLOWING | connection;
181953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
182053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                return Node::DOCUMENT_POSITION_PRECEDING | connection;
182153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            }
182253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
18235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!child2->nextSibling())
182453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                return DOCUMENT_POSITION_FOLLOWING | connection;
18255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!child1->nextSibling())
182653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                return DOCUMENT_POSITION_PRECEDING | connection;
18275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Otherwise we need to see which node occurs first.  Crawl backwards from child2 looking for child1.
18295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            for (Node* child = child2->previousSibling(); child; child = child->previousSibling()) {
18305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (child == child1)
183153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                    return DOCUMENT_POSITION_FOLLOWING | connection;
18325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
183353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            return DOCUMENT_POSITION_PRECEDING | connection;
18345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
18355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
183602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
18375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // There was no difference between the two parent chains, i.e., one was a subset of the other.  The shorter
18385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // chain is the ancestor.
183902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    return index1 < index2 ?
184053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)               DOCUMENT_POSITION_FOLLOWING | DOCUMENT_POSITION_CONTAINED_BY | connection :
184153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)               DOCUMENT_POSITION_PRECEDING | DOCUMENT_POSITION_CONTAINS | connection;
18425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FloatPoint Node::convertToPage(const FloatPoint& p) const
18455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If there is a renderer, just ask it to do the conversion
18475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (renderer())
18485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return renderer()->localToAbsolute(p, UseTransforms);
184902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
18505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Otherwise go up the tree looking for a renderer
18515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element *parent = ancestorElement();
18525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (parent)
18535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return parent->convertToPage(p);
18545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // No parent - no conversion needed
18565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return p;
18575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FloatPoint Node::convertFromPage(const FloatPoint& p) const
18605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If there is a renderer, just ask it to do the conversion
18625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (renderer())
18635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return renderer()->absoluteToLocal(p, UseTransforms);
18645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Otherwise go up the tree looking for a renderer
18665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element *parent = ancestorElement();
18675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (parent)
18685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return parent->convertFromPage(p);
18695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // No parent - no conversion needed
18715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return p;
18725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
187453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)String Node::debugName() const
187553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
187653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    StringBuilder name;
187753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    name.append(nodeName());
187853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
187953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (hasID()) {
188053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        name.appendLiteral(" id=\'");
188153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        name.append(toElement(this)->getIdAttribute());
188253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        name.append('\'');
188353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
188453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
188553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (hasClass()) {
188653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        name.appendLiteral(" class=\'");
1887591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        for (size_t i = 0; i < toElement(this)->classNames().size(); ++i) {
188853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            if (i > 0)
188953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                name.append(' ');
1890591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            name.append(toElement(this)->classNames()[i]);
189153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        }
189253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        name.append('\'');
189353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
189453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
189553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return name.toString();
189653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
189753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1898e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#ifndef NDEBUG
1899e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
19005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void appendAttributeDesc(const Node* node, StringBuilder& stringBuilder, const QualifiedName& name, const char* attrDesc)
19015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!node->isElementNode())
19035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
19045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1905926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    String attr = toElement(node)->getAttribute(name);
19065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (attr.isEmpty())
19075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
19085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stringBuilder.append(attrDesc);
19105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stringBuilder.append(attr);
19115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::showNode(const char* prefix) const
19145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!prefix)
19165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        prefix = "";
19175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isTextNode()) {
19185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        String value = nodeValue();
19195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        value.replaceWithLiteral('\\', "\\\\");
19205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        value.replaceWithLiteral('\n', "\\n");
19215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fprintf(stderr, "%s%s\t%p \"%s\"\n", prefix, nodeName().utf8().data(), this, value.utf8().data());
19225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
19235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        StringBuilder attrs;
19245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        appendAttributeDesc(this, attrs, classAttr, " CLASS=");
19255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        appendAttributeDesc(this, attrs, styleAttr, " STYLE=");
19265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fprintf(stderr, "%s%s\t%p%s\n", prefix, nodeName().utf8().data(), this, attrs.toString().utf8().data());
19275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
19285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::showTreeForThis() const
19315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    showTreeAndMark(this, "*");
19335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::showNodePathForThis() const
19365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<const Node*, 16> chain;
19385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Node* node = this;
1939926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    while (node->parentOrShadowHostNode()) {
19405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        chain.append(node);
1941926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        node = node->parentOrShadowHostNode();
19425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
19435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned index = chain.size(); index > 0; --index) {
19445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const Node* node = chain[index - 1];
19455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (node->isShadowRoot()) {
19465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            int count = 0;
1947f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            for (ShadowRoot* shadowRoot = toShadowRoot(node)->olderShadowRoot(); shadowRoot; shadowRoot = shadowRoot->olderShadowRoot())
19485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ++count;
19495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            fprintf(stderr, "/#shadow-root[%d]", count);
19505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
19515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
19525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        switch (node->nodeType()) {
19545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case ELEMENT_NODE: {
19555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            fprintf(stderr, "/%s", node->nodeName().utf8().data());
19565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            const Element* element = toElement(node);
19585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            const AtomicString& idattr = element->getIdAttribute();
19595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            bool hasIdAttr = !idattr.isNull() && !idattr.isEmpty();
19605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (node->previousSibling() || node->nextSibling()) {
19615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                int count = 0;
19625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                for (Node* previous = node->previousSibling(); previous; previous = previous->previousSibling())
19635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    if (previous->nodeName() == node->nodeName())
19645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        ++count;
19655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (hasIdAttr)
19665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    fprintf(stderr, "[@id=\"%s\" and position()=%d]", idattr.string().utf8().data(), count);
19675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                else
19685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    fprintf(stderr, "[%d]", count);
19695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } else if (hasIdAttr)
19705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                fprintf(stderr, "[@id=\"%s\"]", idattr.string().utf8().data());
19715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
19725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
19735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case TEXT_NODE:
19745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            fprintf(stderr, "/text()");
19755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
19765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case ATTRIBUTE_NODE:
19775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            fprintf(stderr, "/@%s", node->nodeName().utf8().data());
19785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
19795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default:
19805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
19815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
19825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
19835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fprintf(stderr, "\n");
19845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void traverseTreeAndMark(const String& baseIndent, const Node* rootNode, const Node* markedNode1, const char* markedLabel1, const Node* markedNode2, const char* markedLabel2)
19875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
198851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    for (const Node* node = rootNode; node; node = NodeTraversal::next(*node)) {
19895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (node == markedNode1)
19905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            fprintf(stderr, "%s", markedLabel1);
19915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (node == markedNode2)
19925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            fprintf(stderr, "%s", markedLabel2);
19935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        StringBuilder indent;
19955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        indent.append(baseIndent);
1996926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (const Node* tmpNode = node; tmpNode && tmpNode != rootNode; tmpNode = tmpNode->parentOrShadowHostNode())
19975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            indent.append('\t');
19985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fprintf(stderr, "%s", indent.toString().utf8().data());
19995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        node->showNode();
20005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        indent.append('\t');
20015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (node->isShadowRoot()) {
20025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (ShadowRoot* youngerShadowRoot = toShadowRoot(node)->youngerShadowRoot())
20035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                traverseTreeAndMark(indent.toString(), youngerShadowRoot, markedNode1, markedLabel1, markedNode2, markedLabel2);
20045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else if (ShadowRoot* oldestShadowRoot = oldestShadowRootFor(node))
20055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            traverseTreeAndMark(indent.toString(), oldestShadowRoot, markedNode1, markedLabel1, markedNode2, markedLabel2);
20065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
20075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::showTreeAndMark(const Node* markedNode1, const char* markedLabel1, const Node* markedNode2, const char* markedLabel2) const
20105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Node* rootNode;
20125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Node* node = this;
2013926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    while (node->parentOrShadowHostNode() && !node->hasTagName(bodyTag))
2014926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        node = node->parentOrShadowHostNode();
20155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rootNode = node;
20165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String startingIndent;
20185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    traverseTreeAndMark(startingIndent, rootNode, markedNode1, markedLabel1, markedNode2, markedLabel2);
20195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::formatForDebugger(char* buffer, unsigned length) const
20225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String result;
20245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String s;
20255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    s = nodeName();
20275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (s.isEmpty())
20285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = "<none>";
20295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
20305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = s;
20315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    strncpy(buffer, result.utf8().data(), length - 1);
20335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2035926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static ContainerNode* parentOrShadowHostOrFrameOwner(const Node* node)
20365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2037926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ContainerNode* parent = node->parentOrShadowHostNode();
20388abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!parent && node->document().frame())
20398abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        parent = node->document().frame()->ownerElement();
20405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return parent;
20415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void showSubTreeAcrossFrame(const Node* node, const Node* markedNode, const String& indent)
20445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (node == markedNode)
20465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        fputs("*", stderr);
20475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fputs(indent.utf8().data(), stderr);
20485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    node->showNode();
20498abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (node->isShadowRoot()) {
20508abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (ShadowRoot* youngerShadowRoot = toShadowRoot(node)->youngerShadowRoot())
20518abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            showSubTreeAcrossFrame(youngerShadowRoot, markedNode, indent + "\t");
20528abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    } else {
20538abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (node->isFrameOwnerElement())
20548abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            showSubTreeAcrossFrame(toHTMLFrameOwnerElement(node)->contentDocument(), markedNode, indent + "\t");
20558abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (ShadowRoot* oldestShadowRoot = oldestShadowRootFor(node))
20568abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            showSubTreeAcrossFrame(oldestShadowRoot, markedNode, indent + "\t");
20578abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    }
20585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (Node* child = node->firstChild(); child; child = child->nextSibling())
20595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        showSubTreeAcrossFrame(child, markedNode, indent + "\t");
20605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::showTreeForThisAcrossFrame() const
20635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* rootNode = const_cast<Node*>(this);
2065926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    while (parentOrShadowHostOrFrameOwner(rootNode))
2066926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        rootNode = parentOrShadowHostOrFrameOwner(rootNode);
20675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    showSubTreeAcrossFrame(rootNode, this, "");
20685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
20715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// --------
20735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void NodeListsNodeData::invalidateCaches(const QualifiedName* attrName)
20755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NodeListAtomicNameCacheMap::const_iterator atomicNameCacheEnd = m_atomicNameCaches.end();
20775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (NodeListAtomicNameCacheMap::const_iterator it = m_atomicNameCaches.begin(); it != atomicNameCacheEnd; ++it)
20785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        it->value->invalidateCache(attrName);
20795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NodeListNameCacheMap::const_iterator nameCacheEnd = m_nameCaches.end();
20815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (NodeListNameCacheMap::const_iterator it = m_nameCaches.begin(); it != nameCacheEnd; ++it)
20825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        it->value->invalidateCache(attrName);
20835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (attrName)
20855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
20865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TagNodeListCacheNS::iterator tagCacheEnd = m_tagNodeListCacheNS.end();
20885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (TagNodeListCacheNS::iterator it = m_tagNodeListCacheNS.begin(); it != tagCacheEnd; ++it)
20895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        it->value->invalidateCache();
20905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
20915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node* Node::enclosingLinkEventParentOrSelf()
20935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2094926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (Node* node = this; node; node = node->parentOrShadowHostNode()) {
20955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // For imagemaps, the enclosing link node is the associated area element not the image itself.
20965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // So we don't let images be the enclosingLinkNode, even though isLink sometimes returns true
20975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // for them.
20985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (node->isLink() && !node->hasTagName(imgTag))
20995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return node;
21005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
21015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
21035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const AtomicString& Node::interfaceName() const
21065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21071e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return EventTargetNames::Node;
21085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21101e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)ExecutionContext* Node::executionContext() const
21115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21128abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return document().contextDocument().get();
21135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void Node::didMoveToNewDocument(Document& oldDocument)
21165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TreeScopeAdopter::ensureDidMoveToNewDocumentWasCalled(oldDocument);
21185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
211953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (const EventTargetData* eventTargetData = this->eventTargetData()) {
212053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        const EventListenerMap& listenerMap = eventTargetData->eventListenerMap;
212153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (!listenerMap.isEmpty()) {
212253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            Vector<AtomicString> types = listenerMap.eventTypes();
212353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            for (unsigned i = 0; i < types.size(); ++i)
21248abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)                document().addListenerTypeIfNeeded(types[i]);
212553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        }
212653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
212753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
21281e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (AXObjectCache::accessibilityEnabled()) {
21291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        if (AXObjectCache* cache = oldDocument.existingAXObjectCache())
2130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            cache->remove(this);
21311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    }
2132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
21331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    const EventListenerVector& mousewheelListeners = getEventListeners(EventTypeNames::mousewheel);
21341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    WheelController* oldController = WheelController::from(&oldDocument);
21351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    WheelController* newController = WheelController::from(&document());
2136e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    for (size_t i = 0; i < mousewheelListeners.size(); ++i) {
21371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        oldController->didRemoveWheelEventHandler(&oldDocument);
21381e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        newController->didAddWheelEventHandler(&document());
2139e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
2140e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
21411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    const EventListenerVector& wheelListeners = getEventListeners(EventTypeNames::wheel);
21425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < wheelListeners.size(); ++i) {
21431e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        oldController->didRemoveWheelEventHandler(&oldDocument);
21441e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        newController->didAddWheelEventHandler(&document());
21455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
21465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21471e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (const TouchEventTargetSet* touchHandlers = oldDocument.touchEventTargets()) {
214893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        while (touchHandlers->contains(this)) {
21491e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            oldDocument.didRemoveTouchEventHandler(this);
21501e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            document().didAddTouchEventHandler(this);
21515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
21525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
21535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Vector<OwnPtr<MutationObserverRegistration> >* registry = mutationObserverRegistry()) {
21555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (size_t i = 0; i < registry->size(); ++i) {
21568abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            document().addMutationObserverTypes(registry->at(i)->mutationTypes());
21575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
21585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
21595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (HashSet<MutationObserverRegistration*>* transientRegistry = transientMutationObserverRegistry()) {
21615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (HashSet<MutationObserverRegistration*>::iterator iter = transientRegistry->begin(); iter != transientRegistry->end(); ++iter) {
21628abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            document().addMutationObserverTypes((*iter)->mutationTypes());
21635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
21645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
21655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline bool tryAddEventListener(Node* targetNode, const AtomicString& eventType, PassRefPtr<EventListener> listener, bool useCapture)
21685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!targetNode->EventTarget::addEventListener(eventType, listener, useCapture))
21705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
21715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21728abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Document& document = targetNode->document();
21738abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    document.addListenerTypeIfNeeded(eventType);
21741e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (eventType == EventTypeNames::wheel || eventType == EventTypeNames::mousewheel)
21758abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        WheelController::from(&document)->didAddWheelEventHandler(&document);
21761e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    else if (isTouchEventType(eventType))
21771e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        document.didAddTouchEventHandler(targetNode);
21785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
21805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::addEventListener(const AtomicString& eventType, PassRefPtr<EventListener> listener, bool useCapture)
21835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return tryAddEventListener(this, eventType, listener, useCapture);
21855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
21865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline bool tryRemoveEventListener(Node* targetNode, const AtomicString& eventType, EventListener* listener, bool useCapture)
21885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!targetNode->EventTarget::removeEventListener(eventType, listener, useCapture))
21905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
21915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Notify Document that the listener has vanished. We need to keep track of a number of
21935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // listeners for each type, not just a bool - see https://bugs.webkit.org/show_bug.cgi?id=33861
21948abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Document& document = targetNode->document();
21951e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (eventType == EventTypeNames::wheel || eventType == EventTypeNames::mousewheel)
21968abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        WheelController::from(&document)->didAddWheelEventHandler(&document);
21971e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    else if (isTouchEventType(eventType))
21981e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        document.didRemoveTouchEventHandler(targetNode);
21995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
22015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::removeEventListener(const AtomicString& eventType, EventListener* listener, bool useCapture)
22045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
22055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return tryRemoveEventListener(this, eventType, listener, useCapture);
22065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef HashMap<Node*, OwnPtr<EventTargetData> > EventTargetDataMap;
22095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static EventTargetDataMap& eventTargetDataMap()
22115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
22125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(EventTargetDataMap, map, ());
22135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return map;
22145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)EventTargetData* Node::eventTargetData()
22175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
22185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return hasEventTargetData() ? eventTargetDataMap().get(this) : 0;
22195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22211e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)EventTargetData& Node::ensureEventTargetData()
22225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
22235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (hasEventTargetData())
22241e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return *eventTargetDataMap().get(this);
22255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setHasEventTargetData(true);
22265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EventTargetData* data = new EventTargetData;
22275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    eventTargetDataMap().set(this, adoptPtr(data));
22281e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return *data;
22295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::clearEventTargetData()
22325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
22335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    eventTargetDataMap().remove(this);
22345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Vector<OwnPtr<MutationObserverRegistration> >* Node::mutationObserverRegistry()
22375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2238926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!hasRareData())
2239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return 0;
2240926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    NodeMutationObserverData* data = rareData()->mutationObserverData();
2241926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!data)
2242926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return 0;
2243926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return &data->registry;
22445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HashSet<MutationObserverRegistration*>* Node::transientMutationObserverRegistry()
22475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!hasRareData())
2249926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return 0;
2250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    NodeMutationObserverData* data = rareData()->mutationObserverData();
2251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!data)
2252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return 0;
2253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return &data->transientRegistry;
22545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename Registry>
22575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline void collectMatchingObserversForMutation(HashMap<MutationObserver*, MutationRecordDeliveryOptions>& observers, Registry* registry, Node* target, MutationObserver::MutationType type, const QualifiedName* attributeName)
22585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
22595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!registry)
22605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
22615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (typename Registry::iterator iter = registry->begin(); iter != registry->end(); ++iter) {
22625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const MutationObserverRegistration& registration = **iter;
22635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (registration.shouldReceiveMutationFrom(target, type, attributeName)) {
22645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            MutationRecordDeliveryOptions deliveryOptions = registration.deliveryOptions();
22655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            HashMap<MutationObserver*, MutationRecordDeliveryOptions>::AddResult result = observers.add(registration.observer(), deliveryOptions);
22665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!result.isNewEntry)
22675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                result.iterator->value |= deliveryOptions;
22685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
22695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
22705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::getRegisteredMutationObserversOfType(HashMap<MutationObserver*, MutationRecordDeliveryOptions>& observers, MutationObserver::MutationType type, const QualifiedName* attributeName)
22735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
22745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT((type == MutationObserver::Attributes && attributeName) || !attributeName);
22755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    collectMatchingObserversForMutation(observers, mutationObserverRegistry(), this, type, attributeName);
22765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    collectMatchingObserversForMutation(observers, transientMutationObserverRegistry(), this, type, attributeName);
22775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (Node* node = parentNode(); node; node = node->parentNode()) {
22785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        collectMatchingObserversForMutation(observers, node->mutationObserverRegistry(), this, type, attributeName);
22795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        collectMatchingObserversForMutation(observers, node->transientMutationObserverRegistry(), this, type, attributeName);
22805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
22815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
22825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::registerMutationObserver(MutationObserver* observer, MutationObserverOptions options, const HashSet<AtomicString>& attributeFilter)
22845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
22855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MutationObserverRegistration* registration = 0;
2286f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    Vector<OwnPtr<MutationObserverRegistration> >& registry = ensureRareData().ensureMutationObserverData().registry;
2287926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (size_t i = 0; i < registry.size(); ++i) {
2288926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (registry[i]->observer() == observer) {
2289926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            registration = registry[i].get();
22905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            registration->resetObservation(options, attributeFilter);
22915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
22925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
22935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!registration) {
2295926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        registry.append(MutationObserverRegistration::create(observer, this, options, attributeFilter));
2296926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        registration = registry.last().get();
22975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
22985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22998abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    document().addMutationObserverTypes(registration->mutationTypes());
23005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::unregisterMutationObserver(MutationObserverRegistration* registration)
23035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
23045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<OwnPtr<MutationObserverRegistration> >* registry = mutationObserverRegistry();
23055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(registry);
23065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!registry)
23075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
23085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t index = registry->find(registration);
231006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    ASSERT(index != kNotFound);
231106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    if (index == kNotFound)
23125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
23135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2314e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // Deleting the registration may cause this node to be derefed, so we must make sure the Vector operation completes
2315e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // before that, in case |this| is destroyed (see MutationObserverRegistration::m_registrationNodeKeepAlive).
2316e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // FIXME: Simplify the registration/transient registration logic to make this understandable by humans.
2317e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    RefPtr<Node> protect(this);
23185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    registry->remove(index);
23195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::registerTransientMutationObserver(MutationObserverRegistration* registration)
23225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2323f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ensureRareData().ensureMutationObserverData().transientRegistry.add(registration);
23245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::unregisterTransientMutationObserver(MutationObserverRegistration* registration)
23275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
23285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HashSet<MutationObserverRegistration*>* transientRegistry = transientMutationObserverRegistry();
23295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(transientRegistry);
23305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!transientRegistry)
23315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
23325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(transientRegistry->contains(registration));
23345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    transientRegistry->remove(registration);
23355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::notifyMutationObserversNodeWillDetach()
23385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
23398abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!document().hasMutationObservers())
23405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
23415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (Node* node = parentNode(); node; node = node->parentNode()) {
23435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (Vector<OwnPtr<MutationObserverRegistration> >* registry = node->mutationObserverRegistry()) {
23445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            const size_t size = registry->size();
23455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            for (size_t i = 0; i < size; ++i)
23465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                registry->at(i)->observedSubtreeNodeWillDetach(this);
23475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
23485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (HashSet<MutationObserverRegistration*>* transientRegistry = node->transientMutationObserverRegistry()) {
23505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            for (HashSet<MutationObserverRegistration*>::iterator iter = transientRegistry->begin(); iter != transientRegistry->end(); ++iter)
23515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                (*iter)->observedSubtreeNodeWillDetach(this);
23525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
23535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
23545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::handleLocalEvents(Event* event)
23575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
23585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!hasEventTargetData())
23595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
23605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
236153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (isDisabledFormControl(this) && event->isMouseEvent())
23625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
23635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fireEventListeners(event);
23655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::dispatchScopedEvent(PassRefPtr<Event> event)
23685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
23695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dispatchScopedEventDispatchMediator(EventDispatchMediator::create(event));
23705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::dispatchScopedEventDispatchMediator(PassRefPtr<EventDispatchMediator> eventDispatchMediator)
23735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
23745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EventDispatcher::dispatchScopedEvent(this, eventDispatchMediator);
23755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::dispatchEvent(PassRefPtr<Event> event)
23785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2379926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (event->isMouseEvent())
2380f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return EventDispatcher::dispatchEvent(this, MouseEventDispatchMediator::create(static_pointer_cast<MouseEvent>(event), MouseEventDispatchMediator::SyntheticMouseEvent));
2381926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (event->isTouchEvent())
2382f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return dispatchTouchEvent(static_pointer_cast<TouchEvent>(event));
23835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return EventDispatcher::dispatchEvent(this, EventDispatchMediator::create(event));
23845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::dispatchSubtreeModifiedEvent()
23875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
23885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isInShadowTree())
23895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
23905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!NoEventDispatchAssertion::isEventDispatchForbidden());
23925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!document().hasListenerType(Document::DOMSUBTREEMODIFIED_LISTENER))
23945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
23955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23961e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    dispatchScopedEvent(MutationEvent::create(EventTypeNames::DOMSubtreeModified, true));
23975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
23985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::dispatchDOMActivateEvent(int detail, PassRefPtr<Event> underlyingEvent)
24005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!NoEventDispatchAssertion::isEventDispatchForbidden());
2402bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    RefPtr<UIEvent> event = UIEvent::create(EventTypeNames::DOMActivate, true, true, document().domWindow(), detail);
24035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    event->setUnderlyingEvent(underlyingEvent);
24045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dispatchScopedEvent(event);
24055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return event->defaultHandled();
24065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::dispatchKeyEvent(const PlatformKeyboardEvent& event)
24095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2410bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return EventDispatcher::dispatchEvent(this, KeyboardEventDispatchMediator::create(KeyboardEvent::create(event, document().domWindow())));
24115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::dispatchMouseEvent(const PlatformMouseEvent& event, const AtomicString& eventType,
24145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int detail, Node* relatedTarget)
24155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2416bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return EventDispatcher::dispatchEvent(this, MouseEventDispatchMediator::create(MouseEvent::create(eventType, document().domWindow(), event, detail, relatedTarget)));
24175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::dispatchGestureEvent(const PlatformGestureEvent& event)
24205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2421bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    RefPtr<GestureEvent> gestureEvent = GestureEvent::create(document().domWindow(), event);
24225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!gestureEvent.get())
24235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
24245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return EventDispatcher::dispatchEvent(this, GestureEventDispatchMediator::create(gestureEvent));
24255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2427926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool Node::dispatchTouchEvent(PassRefPtr<TouchEvent> event)
24285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2429926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return EventDispatcher::dispatchEvent(this, TouchEventDispatchMediator::create(event));
2430926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2431926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
243251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Node::dispatchSimulatedClick(Event* underlyingEvent, SimulatedClickMouseEventOptions eventOptions)
2433926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
243451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EventDispatcher::dispatchSimulatedClick(this, underlyingEvent, eventOptions);
24355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::dispatchBeforeLoadEvent(const String& sourceURL)
24385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24398abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!document().hasListenerType(Document::BEFORELOAD_LISTENER))
24405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
24415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<Node> protector(this);
24435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<BeforeLoadEvent> beforeLoadEvent = BeforeLoadEvent::create(sourceURL);
24445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dispatchEvent(beforeLoadEvent.get());
24455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !beforeLoadEvent->defaultPrevented();
24465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::dispatchWheelEvent(const PlatformWheelEvent& event)
24495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2450bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return EventDispatcher::dispatchEvent(this, WheelEventDispatchMediator::create(event, document().domWindow()));
24515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::dispatchChangeEvent()
24545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24551e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    dispatchScopedEvent(Event::createBubble(EventTypeNames::change));
24565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::dispatchInputEvent()
24595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24601e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    dispatchScopedEvent(Event::createBubble(EventTypeNames::input));
24615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
24625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::defaultEventHandler(Event* event)
24645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (event->target() != this)
24665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
24675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const AtomicString& eventType = event->type();
24681e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (eventType == EventTypeNames::keydown || eventType == EventTypeNames::keypress) {
2469591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (event->isKeyboardEvent()) {
24708abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            if (Frame* frame = document().frame())
2471f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)                frame->eventHandler().defaultKeyboardEventHandler(toKeyboardEvent(event));
2472591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        }
24731e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    } else if (eventType == EventTypeNames::click) {
24745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int detail = event->isUIEvent() ? static_cast<UIEvent*>(event)->detail() : 0;
24755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (dispatchDOMActivateEvent(detail, event))
24765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            event->setDefaultHandled();
24771e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    } else if (eventType == EventTypeNames::contextmenu) {
24788abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (Page* page = document().page())
2479e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            page->contextMenuController().handleContextMenuEvent(event);
24801e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    } else if (eventType == EventTypeNames::textInput) {
24811e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        if (event->hasInterface(EventNames::TextEvent)) {
24828abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            if (Frame* frame = document().frame())
2483f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)                frame->eventHandler().defaultTextInputEventHandler(toTextEvent(event));
24841e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        }
24858abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN)
24861e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    } else if (eventType == EventTypeNames::mousedown && event->isMouseEvent()) {
2487591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        MouseEvent* mouseEvent = toMouseEvent(event);
24885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (mouseEvent->button() == MiddleButton) {
24895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (enclosingLinkEventParentOrSelf())
24905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return;
24915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RenderObject* renderer = this->renderer();
24935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            while (renderer && (!renderer->isBox() || !toRenderBox(renderer)->canBeScrolledAndHasScrollableArea()))
24945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                renderer = renderer->parent();
24955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (renderer) {
24978abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)                if (Frame* frame = document().frame())
2498f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)                    frame->eventHandler().startPanScrolling(renderer);
24995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
25005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
25015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
25021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    } else if ((eventType == EventTypeNames::wheel || eventType == EventTypeNames::mousewheel) && event->hasInterface(EventNames::WheelEvent)) {
25031e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        WheelEvent* wheelEvent = toWheelEvent(event);
250453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
25055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If we don't have a renderer, send the wheel event to the first node we find with a renderer.
25065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // This is needed for <option> and <optgroup> elements so that <select>s get a wheel scroll.
25075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Node* startNode = this;
25085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while (startNode && !startNode->renderer())
2509926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            startNode = startNode->parentOrShadowHostNode();
251002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2511f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        if (startNode && startNode->renderer()) {
25128abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            if (Frame* frame = document().frame())
2513f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)                frame->eventHandler().defaultWheelEventHandler(startNode, wheelEvent);
2514f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        }
25151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    } else if (event->type() == EventTypeNames::webkitEditableContentChanged) {
25165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        dispatchInputEvent();
25175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
25185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2520591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid Node::willCallDefaultEventHandler(const Event&)
2521591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
2522591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
2523591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
25245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::willRespondToMouseMoveEvents()
25255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
252653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (isDisabledFormControl(this))
25275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
25281e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return hasEventListeners(EventTypeNames::mousemove) || hasEventListeners(EventTypeNames::mouseover) || hasEventListeners(EventTypeNames::mouseout);
25295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::willRespondToMouseClickEvents()
25325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
253353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (isDisabledFormControl(this))
25345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
25351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return isContentEditable(UserSelectAllIsAlwaysNonEditable) || hasEventListeners(EventTypeNames::mouseup) || hasEventListeners(EventTypeNames::mousedown) || hasEventListeners(EventTypeNames::click) || hasEventListeners(EventTypeNames::DOMActivate);
25365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Node::willRespondToTouchEvents()
25395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
254053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (isDisabledFormControl(this))
25415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
25421e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return hasEventListeners(EventTypeNames::touchstart) || hasEventListeners(EventTypeNames::touchmove) || hasEventListeners(EventTypeNames::touchcancel) || hasEventListeners(EventTypeNames::touchend);
25435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2545926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// This is here for inlining
2546926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline void TreeScope::removedLastRefToScope()
2547926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
25481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ASSERT_WITH_SECURITY_IMPLICATION(!deletionHasBegun());
2549926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_guardRefCount) {
2550926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // If removing a child removes the last self-only ref, we don't
2551926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // want the scope to be destructed until after
2552926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // removeDetachedChildren returns, so we guard ourselves with an
2553926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // extra self-only ref.
2554926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        guardRef();
2555926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        dispose();
25561e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#if !ASSERT_DISABLED
2557926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // We need to do this right now since guardDeref() can delete this.
2558926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        rootNode()->m_inRemovedLastRefFunction = false;
2559926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif
2560926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        guardDeref();
2561926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else {
25621e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#if !ASSERT_DISABLED
2563926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        rootNode()->m_inRemovedLastRefFunction = false;
25641e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#endif
25651e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#if SECURITY_ASSERT_ENABLED
2566926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        beginDeletion();
2567926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif
2568926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        delete this;
2569926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
2570926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2571926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
25725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// It's important not to inline removedLastRef, because we don't want to inline the code to
25735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// delete a Node at each deref call site.
25745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::removedLastRef()
25755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
25765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // An explicit check for Document here is better than a virtual function since it is
25775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // faster for non-Document nodes, and because the call to removedLastRef that is inlined
25785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // at all deref call sites is smaller if it's a non-virtual function.
2579926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (isTreeScope()) {
25808abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        treeScope().removedLastRefToScope();
25815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
25825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2583926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
25841e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#if SECURITY_ASSERT_ENABLED
25855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_deletionHasBegun = true;
25865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
25875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    delete this;
25885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
25895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2590926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)unsigned Node::connectedSubframeCount() const
2591926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2592926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return hasRareData() ? rareData()->connectedSubframeCount() : 0;
2593926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2594926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2595926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void Node::incrementConnectedSubframeCount(unsigned amount)
2596926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2597926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(isContainerNode());
2598bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ensureRareData().incrementConnectedSubframeCount(amount);
2599926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2600926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2601926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void Node::decrementConnectedSubframeCount(unsigned amount)
2602926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2603926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    rareData()->decrementConnectedSubframeCount(amount);
2604926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2605926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2606926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void Node::updateAncestorConnectedSubframeCountForRemoval() const
2607926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2608926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    unsigned count = connectedSubframeCount();
2609926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2610926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!count)
2611926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
2612926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2613926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (Node* node = parentOrShadowHostNode(); node; node = node->parentOrShadowHostNode())
2614926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        node->decrementConnectedSubframeCount(count);
2615926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2616926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2617926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void Node::updateAncestorConnectedSubframeCountForInsertion() const
2618926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2619926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    unsigned count = connectedSubframeCount();
2620926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2621926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!count)
2622926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
2623926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2624926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (Node* node = parentOrShadowHostNode(); node; node = node->parentOrShadowHostNode())
2625926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        node->incrementConnectedSubframeCount(count);
2626926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2627926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
26283c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben MurdochPassRefPtr<NodeList> Node::getDestinationInsertionPoints()
26293c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch{
26308abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    document().updateDistributionForNodeIfNeeded(this);
26313c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    Vector<InsertionPoint*, 8> insertionPoints;
263219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    collectDestinationInsertionPoints(*this, insertionPoints);
2633e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    Vector<RefPtr<Node> > filteredInsertionPoints;
26343c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    for (size_t i = 0; i < insertionPoints.size(); ++i) {
26353c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        InsertionPoint* insertionPoint = insertionPoints[i];
26363c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        ASSERT(insertionPoint->containingShadowRoot());
2637e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        if (insertionPoint->containingShadowRoot()->type() != ShadowRoot::UserAgentShadowRoot)
2638e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            filteredInsertionPoints.append(insertionPoint);
26393c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    }
2640e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    return StaticNodeList::adopt(filteredInsertionPoints);
26413c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch}
26423c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
26435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::registerScopedHTMLStyleChild()
26445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
26455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setHasScopedHTMLStyleChild(true);
26465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
26475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Node::unregisterScopedHTMLStyleChild()
26495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
26505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(hasScopedHTMLStyleChild());
26515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setHasScopedHTMLStyleChild(numberOfScopedHTMLStyleChildren());
26525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
26535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)size_t Node::numberOfScopedHTMLStyleChildren() const
26555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
26565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t count = 0;
26575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (Node* child = firstChild(); child; child = child->nextSibling()) {
2658591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (child->hasTagName(HTMLNames::styleTag) && toHTMLStyleElement(child)->isRegisteredAsScoped())
26595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            count++;
26605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
26615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return count;
26635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
26645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2665926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void Node::setFocus(bool flag)
2666926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
26678abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    document().userActionElements().setFocused(this, flag);
2668926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2669926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
267051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Node::setActive(bool flag)
2671926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
26728abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    document().userActionElements().setActive(this, flag);
2673926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2674926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2675926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void Node::setHovered(bool flag)
2676926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
26778abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    document().userActionElements().setHovered(this, flag);
2678926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2679926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2680926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool Node::isUserActionElementActive() const
2681926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2682926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(isUserActionElement());
26838abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return document().userActionElements().isActive(this);
2684926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2685926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2686926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool Node::isUserActionElementInActiveChain() const
2687926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2688926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(isUserActionElement());
26898abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return document().userActionElements().isInActiveChain(this);
2690926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2691926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2692926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool Node::isUserActionElementHovered() const
2693926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2694926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(isUserActionElement());
26958abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return document().userActionElements().isHovered(this);
2696926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2697926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2698926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool Node::isUserActionElementFocused() const
2699926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2700926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(isUserActionElement());
27018abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return document().userActionElements().isFocused(this);
2702926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2703926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
27047757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochvoid Node::setCustomElementState(CustomElementState newState)
270553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
27067757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    CustomElementState oldState = customElementState();
27077757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
27087757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    switch (newState) {
27097757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    case NotCustomElement:
27107757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        ASSERT_NOT_REACHED(); // Everything starts in this state
27117757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        return;
27127757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
2713e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    case WaitingForUpgrade:
271451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        ASSERT(NotCustomElement == oldState);
27157757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        break;
27167757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
27177757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    case Upgraded:
271851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        ASSERT(WaitingForUpgrade == oldState);
27197757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        break;
27207757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    }
27217757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
272253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    ASSERT(isHTMLElement() || isSVGElement());
272351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    setFlag(CustomElement);
272451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    setFlag(newState == Upgraded, CustomElementUpgraded);
272553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
27267757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    if (oldState == NotCustomElement || newState == Upgraded)
27277757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        setNeedsStyleRecalc(); // :unresolved has changed
2728e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
2729e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
27305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
27315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
27335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void showTree(const WebCore::Node* node)
27355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
27365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (node)
27375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        node->showTreeForThis();
27385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
27395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void showNodePath(const WebCore::Node* node)
27415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
27425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (node)
27435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        node->showNodePathForThis();
27445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
27455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
2747