Shrink NodeListsNodeData
[WebKit-https.git] / Source / WebCore / dom / Node.cpp
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4  *           (C) 2001 Dirk Mueller (mueller@kde.org)
5  * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
6  * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
7  * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Library General Public
11  * License as published by the Free Software Foundation; either
12  * version 2 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Library General Public License for more details.
18  *
19  * You should have received a copy of the GNU Library General Public License
20  * along with this library; see the file COPYING.LIB.  If not, write to
21  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22  * Boston, MA 02110-1301, USA.
23  */
24
25 #include "config.h"
26 #include "Node.h"
27
28 #include "AXObjectCache.h"
29 #include "Attr.h"
30 #include "Attribute.h"
31 #include "BeforeLoadEvent.h"
32 #include "ChildListMutationScope.h"
33 #include "Chrome.h"
34 #include "ChromeClient.h"
35 #include "CSSParser.h"
36 #include "CSSRule.h"
37 #include "CSSSelector.h"
38 #include "CSSSelectorList.h"
39 #include "CSSStyleRule.h"
40 #include "CSSStyleSheet.h"
41 #include "ChildNodeList.h"
42 #include "ClassNodeList.h"
43 #include "ContextMenuController.h"
44 #include "DOMImplementation.h"
45 #include "DOMSettableTokenList.h"
46 #include "Document.h"
47 #include "DocumentType.h"
48 #include "DynamicNodeList.h"
49 #include "Element.h"
50 #include "ElementShadow.h"
51 #include "Event.h"
52 #include "EventContext.h"
53 #include "EventDispatchMediator.h"
54 #include "EventDispatcher.h"
55 #include "EventException.h"
56 #include "EventHandler.h"
57 #include "EventListener.h"
58 #include "EventNames.h"
59 #include "ExceptionCode.h"
60 #include "Frame.h"
61 #include "FrameView.h"
62 #include "HTMLElement.h"
63 #include "HTMLFrameOwnerElement.h"
64 #include "HTMLNames.h"
65 #include "InspectorCounters.h"
66 #include "KeyboardEvent.h"
67 #include "LabelsNodeList.h"
68 #include "Logging.h"
69 #include "MouseEvent.h"
70 #include "MutationEvent.h"
71 #include "NameNodeList.h"
72 #include "NamedNodeMap.h"
73 #include "NodeRareData.h"
74 #include "NodeRenderingContext.h"
75 #include "Page.h"
76 #include "PlatformMouseEvent.h"
77 #include "PlatformWheelEvent.h"
78 #include "ProcessingInstruction.h"
79 #include "ProgressEvent.h"
80 #include "RadioNodeList.h"
81 #include "RegisteredEventListener.h"
82 #include "RenderBlock.h"
83 #include "RenderBox.h"
84 #include "RenderTextControl.h"
85 #include "RenderView.h"
86 #include "ScopedEventQueue.h"
87 #include "SelectorQuery.h"
88 #include "Settings.h"
89 #include "ShadowRoot.h"
90 #include "StaticNodeList.h"
91 #include "StorageEvent.h"
92 #include "StyleResolver.h"
93 #include "TagNodeList.h"
94 #include "Text.h"
95 #include "TextEvent.h"
96 #include "TreeScopeAdopter.h"
97 #include "UIEvent.h"
98 #include "UIEventWithKeyState.h"
99 #include "WheelEvent.h"
100 #include "WindowEventContext.h"
101 #include "XMLNames.h"
102 #include "htmlediting.h"
103 #include <wtf/HashSet.h>
104 #include <wtf/PassOwnPtr.h>
105 #include <wtf/RefCountedLeakCounter.h>
106 #include <wtf/UnusedParam.h>
107 #include <wtf/Vector.h>
108 #include <wtf/text/CString.h>
109 #include <wtf/text/StringBuilder.h>
110
111 #if ENABLE(INSPECTOR)
112 #include "InspectorController.h"
113 #endif
114
115 #if USE(JSC)
116 #include <runtime/JSGlobalData.h>
117 #endif
118
119 #if ENABLE(MICRODATA)
120 #include "HTMLPropertiesCollection.h"
121 #endif
122
123 using namespace std;
124
125 namespace WebCore {
126
127 using namespace HTMLNames;
128
129 bool Node::isSupported(const String& feature, const String& version)
130 {
131     return DOMImplementation::hasFeature(feature, version);
132 }
133
134 #if DUMP_NODE_STATISTICS
135 static HashSet<Node*> liveNodeSet;
136 #endif
137
138 void Node::dumpStatistics()
139 {
140 #if DUMP_NODE_STATISTICS
141     size_t nodesWithRareData = 0;
142
143     size_t elementNodes = 0;
144     size_t attrNodes = 0;
145     size_t textNodes = 0;
146     size_t cdataNodes = 0;
147     size_t commentNodes = 0;
148     size_t entityReferenceNodes = 0;
149     size_t entityNodes = 0;
150     size_t piNodes = 0;
151     size_t documentNodes = 0;
152     size_t docTypeNodes = 0;
153     size_t fragmentNodes = 0;
154     size_t notationNodes = 0;
155     size_t xpathNSNodes = 0;
156     size_t shadowRootNodes = 0;
157
158     HashMap<String, size_t> perTagCount;
159
160     size_t attributes = 0;
161     size_t attributesWithAttr = 0;
162     size_t elementsWithAttributeStorage = 0;
163     size_t elementsWithRareData = 0;
164     size_t elementsWithNamedNodeMap = 0;
165
166     for (HashSet<Node*>::iterator it = liveNodeSet.begin(); it != liveNodeSet.end(); ++it) {
167         Node* node = *it;
168
169         if (node->hasRareData()) {
170             ++nodesWithRareData;
171             if (node->isElementNode()) {
172                 ++elementsWithRareData;
173                 if (toElement(node)->hasNamedNodeMap())
174                     ++elementsWithNamedNodeMap;
175             }
176         }
177
178         switch (node->nodeType()) {
179             case ELEMENT_NODE: {
180                 ++elementNodes;
181
182                 // Tag stats
183                 Element* element = static_cast<Element*>(node);
184                 HashMap<String, size_t>::AddResult result = perTagCount.add(element->tagName(), 1);
185                 if (!result.isNewEntry)
186                     result.iterator->second++;
187
188                 if (ElementAttributeData* attributeData = element->attributeData()) {
189                     attributes += attributeData->length();
190                     ++elementsWithAttributeStorage;
191                     for (unsigned i = 0; i < attributeData->length(); ++i) {
192                         Attribute* attr = attributeData->attributeItem(i);
193                         if (attr->attr())
194                             ++attributesWithAttr;
195                     }
196                 }
197                 break;
198             }
199             case ATTRIBUTE_NODE: {
200                 ++attrNodes;
201                 break;
202             }
203             case TEXT_NODE: {
204                 ++textNodes;
205                 break;
206             }
207             case CDATA_SECTION_NODE: {
208                 ++cdataNodes;
209                 break;
210             }
211             case COMMENT_NODE: {
212                 ++commentNodes;
213                 break;
214             }
215             case ENTITY_REFERENCE_NODE: {
216                 ++entityReferenceNodes;
217                 break;
218             }
219             case ENTITY_NODE: {
220                 ++entityNodes;
221                 break;
222             }
223             case PROCESSING_INSTRUCTION_NODE: {
224                 ++piNodes;
225                 break;
226             }
227             case DOCUMENT_NODE: {
228                 ++documentNodes;
229                 break;
230             }
231             case DOCUMENT_TYPE_NODE: {
232                 ++docTypeNodes;
233                 break;
234             }
235             case DOCUMENT_FRAGMENT_NODE: {
236                 if (node->isShadowRoot())
237                     ++shadowRootNodes;
238                 else
239                     ++fragmentNodes;
240                 break;
241             }
242             case NOTATION_NODE: {
243                 ++notationNodes;
244                 break;
245             }
246             case XPATH_NAMESPACE_NODE: {
247                 ++xpathNSNodes;
248                 break;
249             }
250         }
251     }
252
253     printf("Number of Nodes: %d\n\n", liveNodeSet.size());
254     printf("Number of Nodes with RareData: %zu\n\n", nodesWithRareData);
255
256     printf("NodeType distribution:\n");
257     printf("  Number of Element nodes: %zu\n", elementNodes);
258     printf("  Number of Attribute nodes: %zu\n", attrNodes);
259     printf("  Number of Text nodes: %zu\n", textNodes);
260     printf("  Number of CDATASection nodes: %zu\n", cdataNodes);
261     printf("  Number of Comment nodes: %zu\n", commentNodes);
262     printf("  Number of EntityReference nodes: %zu\n", entityReferenceNodes);
263     printf("  Number of Entity nodes: %zu\n", entityNodes);
264     printf("  Number of ProcessingInstruction nodes: %zu\n", piNodes);
265     printf("  Number of Document nodes: %zu\n", documentNodes);
266     printf("  Number of DocumentType nodes: %zu\n", docTypeNodes);
267     printf("  Number of DocumentFragment nodes: %zu\n", fragmentNodes);
268     printf("  Number of Notation nodes: %zu\n", notationNodes);
269     printf("  Number of XPathNS nodes: %zu\n", xpathNSNodes);
270     printf("  Number of ShadowRoot nodes: %zu\n", shadowRootNodes);
271
272     printf("Element tag name distibution:\n");
273     for (HashMap<String, size_t>::iterator it = perTagCount.begin(); it != perTagCount.end(); ++it)
274         printf("  Number of <%s> tags: %zu\n", it->first.utf8().data(), it->second);
275
276     printf("Attributes:\n");
277     printf("  Number of Attributes (non-Node and Node): %zu [%zu]\n", attributes, sizeof(Attribute));
278     printf("  Number of Attributes with an Attr: %zu\n", attributesWithAttr);
279     printf("  Number of Elements with attribute storage: %zu [%zu]\n", elementsWithAttributeStorage, sizeof(ElementAttributeData));
280     printf("  Number of Elements with RareData: %zu\n", elementsWithRareData);
281     printf("  Number of Elements with NamedNodeMap: %zu [%zu]\n", elementsWithNamedNodeMap, sizeof(NamedNodeMap));
282 #endif
283 }
284
285 DEFINE_DEBUG_ONLY_GLOBAL(WTF::RefCountedLeakCounter, nodeCounter, ("WebCoreNode"));
286 DEFINE_DEBUG_ONLY_GLOBAL(HashSet<Node*>, ignoreSet, );
287
288 #ifndef NDEBUG
289 static bool shouldIgnoreLeaks = false;
290 #endif
291
292 void Node::startIgnoringLeaks()
293 {
294 #ifndef NDEBUG
295     shouldIgnoreLeaks = true;
296 #endif
297 }
298
299 void Node::stopIgnoringLeaks()
300 {
301 #ifndef NDEBUG
302     shouldIgnoreLeaks = false;
303 #endif
304 }
305
306 Node::StyleChange Node::diff(const RenderStyle* s1, const RenderStyle* s2, Document* doc)
307 {
308     StyleChange ch = NoInherit;
309     EDisplay display1 = s1 ? s1->display() : NONE;
310     bool fl1 = s1 && s1->hasPseudoStyle(FIRST_LETTER);
311     EDisplay display2 = s2 ? s2->display() : NONE;
312     bool fl2 = s2 && s2->hasPseudoStyle(FIRST_LETTER);
313     
314     // We just detach if a renderer acquires or loses a column-span, since spanning elements
315     // typically won't contain much content.
316     bool colSpan1 = s1 && s1->columnSpan();
317     bool colSpan2 = s2 && s2->columnSpan();
318     
319     bool specifiesColumns1 = s1 && (!s1->hasAutoColumnCount() || !s1->hasAutoColumnWidth());
320     bool specifiesColumns2 = s2 && (!s2->hasAutoColumnCount() || !s2->hasAutoColumnWidth());
321
322     if (display1 != display2 || fl1 != fl2 || colSpan1 != colSpan2 
323         || (specifiesColumns1 != specifiesColumns2 && doc->settings()->regionBasedColumnsEnabled())
324         || (s1 && s2 && !s1->contentDataEquivalent(s2)))
325         ch = Detach;
326     else if (!s1 || !s2)
327         ch = Inherit;
328     else if (*s1 == *s2)
329         ch = NoChange;
330     else if (s1->inheritedNotEqual(s2))
331         ch = Inherit;
332     else if (s1->hasExplicitlyInheritedProperties() || s2->hasExplicitlyInheritedProperties())
333         ch = Inherit;
334
335     // For nth-child and other positional rules, treat styles as different if they have
336     // changed positionally in the DOM. This way subsequent sibling resolutions won't be confused
337     // by the wrong child index and evaluate to incorrect results.
338     if (ch == NoChange && s1->childIndex() != s2->childIndex())
339         ch = NoInherit;
340
341     // If the pseudoStyles have changed, we want any StyleChange that is not NoChange
342     // because setStyle will do the right thing with anything else.
343     if (ch == NoChange && s1->hasAnyPublicPseudoStyles()) {
344         for (PseudoId pseudoId = FIRST_PUBLIC_PSEUDOID; ch == NoChange && pseudoId < FIRST_INTERNAL_PSEUDOID; pseudoId = static_cast<PseudoId>(pseudoId + 1)) {
345             if (s1->hasPseudoStyle(pseudoId)) {
346                 RenderStyle* ps2 = s2->getCachedPseudoStyle(pseudoId);
347                 if (!ps2)
348                     ch = NoInherit;
349                 else {
350                     RenderStyle* ps1 = s1->getCachedPseudoStyle(pseudoId);
351                     ch = ps1 && *ps1 == *ps2 ? NoChange : NoInherit;
352                 }
353             }
354         }
355     }
356
357     // When text-combine property has been changed, we need to prepare a separate renderer object.
358     // When text-combine is on, we use RenderCombineText, otherwise RenderText.
359     // https://bugs.webkit.org/show_bug.cgi?id=55069
360     if ((s1 && s2) && (s1->hasTextCombine() != s2->hasTextCombine()))
361         ch = Detach;
362
363     // We need to reattach the node, so that it is moved to the correct RenderFlowThread.
364     if ((s1 && s2) && (s1->flowThread() != s2->flowThread()))
365         ch = Detach;
366
367     // When the region thread has changed, we need to prepare a separate render region object.
368     if ((s1 && s2) && (s1->regionThread() != s2->regionThread()))
369         ch = Detach;
370
371     return ch;
372 }
373
374 void Node::trackForDebugging()
375 {
376 #ifndef NDEBUG
377     if (shouldIgnoreLeaks)
378         ignoreSet.add(this);
379     else
380         nodeCounter.increment();
381 #endif
382
383 #if DUMP_NODE_STATISTICS
384     liveNodeSet.add(this);
385 #endif
386 }
387
388 Node::~Node()
389 {
390 #ifndef NDEBUG
391     HashSet<Node*>::iterator it = ignoreSet.find(this);
392     if (it != ignoreSet.end())
393         ignoreSet.remove(it);
394     else
395         nodeCounter.decrement();
396 #endif
397
398 #if DUMP_NODE_STATISTICS
399     liveNodeSet.remove(this);
400 #endif
401
402     ASSERT(hasRareData() == NodeRareData::rareDataMap().contains(this));
403     if (hasRareData())
404         clearRareData();
405
406     if (renderer())
407         detach();
408
409     Document* doc = m_document;
410     if (AXObjectCache::accessibilityEnabled() && doc && doc->axObjectCacheExists())
411         doc->axObjectCache()->removeNodeForUse(this);
412     
413     if (m_previous)
414         m_previous->setNextSibling(0);
415     if (m_next)
416         m_next->setPreviousSibling(0);
417
418     if (doc)
419         doc->guardDeref();
420
421     InspectorCounters::decrementCounter(InspectorCounters::NodeCounter);
422 }
423
424 void Node::setDocument(Document* document)
425 {
426     ASSERT(!inDocument() || m_document == document);
427     if (inDocument() || m_document == document)
428         return;
429
430     m_document = document;
431 }
432
433 NodeRareData* Node::setTreeScope(TreeScope* scope)
434 {
435     if (!scope) {
436         if (hasRareData()) {
437             NodeRareData* data = rareData();
438             data->setTreeScope(0);
439             return data;
440         }
441
442         return 0;
443     }
444
445     NodeRareData* data = ensureRareData();
446     data->setTreeScope(scope);
447     return data;
448 }
449
450 TreeScope* Node::treeScope() const
451 {
452     // FIXME: Using m_document directly is not good -> see comment with document() in the header file.
453     if (!hasRareData())
454         return m_document;
455     TreeScope* scope = rareData()->treeScope();
456     return scope ? scope : m_document;
457 }
458
459 NodeRareData* Node::rareData() const
460 {
461     ASSERT(hasRareData());
462     return NodeRareData::rareDataFromMap(this);
463 }
464
465 NodeRareData* Node::ensureRareData()
466 {
467     if (hasRareData())
468         return rareData();
469     
470     ASSERT(!NodeRareData::rareDataMap().contains(this));
471     NodeRareData* data = createRareData().leakPtr();
472     NodeRareData::rareDataMap().set(this, data);
473     setFlag(HasRareDataFlag);
474     return data;
475 }
476     
477 OwnPtr<NodeRareData> Node::createRareData()
478 {
479     return adoptPtr(new NodeRareData);
480 }
481
482 void Node::clearRareData()
483 {
484     ASSERT(hasRareData());
485     if (treeScope() && rareData()->nodeLists())
486         treeScope()->removeNodeListCache();
487
488 #if ENABLE(MUTATION_OBSERVERS)
489     ASSERT(!transientMutationObserverRegistry() || transientMutationObserverRegistry()->isEmpty());
490 #endif
491
492     NodeRareData::NodeRareDataMap& dataMap = NodeRareData::rareDataMap();
493     NodeRareData::NodeRareDataMap::iterator it = dataMap.find(this);
494     ASSERT(it != dataMap.end());
495     delete it->second;
496     dataMap.remove(it);
497     clearFlag(HasRareDataFlag);
498 }
499
500 Node* Node::toNode()
501 {
502     return this;
503 }
504
505 HTMLInputElement* Node::toInputElement()
506 {
507     // If one of the below ASSERTs trigger, you are calling this function
508     // directly or indirectly from a constructor or destructor of this object.
509     // Don't do this!
510     ASSERT(!(isHTMLElement() && hasTagName(inputTag)));
511     return 0;
512 }
513
514 short Node::tabIndex() const
515 {
516     return hasRareData() ? rareData()->tabIndex() : 0;
517 }
518     
519 void Node::setTabIndexExplicitly(short i)
520 {
521     ensureRareData()->setTabIndexExplicitly(i);
522 }
523
524 void Node::clearTabIndexExplicitly()
525 {
526     ensureRareData()->clearTabIndexExplicitly();
527 }
528
529 String Node::nodeValue() const
530 {
531     return String();
532 }
533
534 void Node::setNodeValue(const String& /*nodeValue*/, ExceptionCode& ec)
535 {
536     // NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly
537     if (isReadOnlyNode()) {
538         ec = NO_MODIFICATION_ALLOWED_ERR;
539         return;
540     }
541
542     // By default, setting nodeValue has no effect.
543 }
544
545 PassRefPtr<NodeList> Node::childNodes()
546 {
547     NodeRareData* data = ensureRareData();
548     if (data->childNodeList())
549         return PassRefPtr<NodeList>(data->childNodeList());
550
551     RefPtr<ChildNodeList> list = ChildNodeList::create(this);
552     data->setChildNodeList(list.get());
553     return list.release();
554 }
555
556 Node *Node::lastDescendant() const
557 {
558     Node *n = const_cast<Node *>(this);
559     while (n && n->lastChild())
560         n = n->lastChild();
561     return n;
562 }
563
564 Node* Node::firstDescendant() const
565 {
566     Node *n = const_cast<Node *>(this);
567     while (n && n->firstChild())
568         n = n->firstChild();
569     return n;
570 }
571
572 bool Node::insertBefore(PassRefPtr<Node> newChild, Node* refChild, ExceptionCode& ec, bool shouldLazyAttach)
573 {
574     if (!isContainerNode()) {
575         ec = HIERARCHY_REQUEST_ERR;
576         return false;
577     }
578     return toContainerNode(this)->insertBefore(newChild, refChild, ec, shouldLazyAttach);
579 }
580
581 bool Node::replaceChild(PassRefPtr<Node> newChild, Node* oldChild, ExceptionCode& ec, bool shouldLazyAttach)
582 {
583     if (!isContainerNode()) {
584         ec = HIERARCHY_REQUEST_ERR;
585         return false;
586     }
587     return toContainerNode(this)->replaceChild(newChild, oldChild, ec, shouldLazyAttach);
588 }
589
590 bool Node::removeChild(Node* oldChild, ExceptionCode& ec)
591 {
592     if (!isContainerNode()) {
593         ec = NOT_FOUND_ERR;
594         return false;
595     }
596     return toContainerNode(this)->removeChild(oldChild, ec);
597 }
598
599 bool Node::appendChild(PassRefPtr<Node> newChild, ExceptionCode& ec, bool shouldLazyAttach)
600 {
601     if (!isContainerNode()) {
602         ec = HIERARCHY_REQUEST_ERR;
603         return false;
604     }
605     return toContainerNode(this)->appendChild(newChild, ec, shouldLazyAttach);
606 }
607
608 void Node::remove(ExceptionCode& ec)
609 {
610     if (ContainerNode* parent = parentNode())
611         parent->removeChild(this, ec);
612     else
613         ec = HIERARCHY_REQUEST_ERR;
614 }
615
616 void Node::normalize()
617 {
618     // Go through the subtree beneath us, normalizing all nodes. This means that
619     // any two adjacent text nodes are merged and any empty text nodes are removed.
620
621     RefPtr<Node> node = this;
622     while (Node* firstChild = node->firstChild())
623         node = firstChild;
624     while (node) {
625         NodeType type = node->nodeType();
626         if (type == ELEMENT_NODE)
627             static_cast<Element*>(node.get())->normalizeAttributes();
628
629         if (node == this)
630             break;
631
632         if (type != TEXT_NODE) {
633             node = node->traverseNextNodePostOrder();
634             continue;
635         }
636
637         RefPtr<Text> text = toText(node.get());
638
639         // Remove empty text nodes.
640         if (!text->length()) {
641             // Care must be taken to get the next node before removing the current node.
642             node = node->traverseNextNodePostOrder();
643             ExceptionCode ec;
644             text->remove(ec);
645             continue;
646         }
647
648         // Merge text nodes.
649         while (Node* nextSibling = node->nextSibling()) {
650             if (nextSibling->nodeType() != TEXT_NODE)
651                 break;
652             RefPtr<Text> nextText = toText(nextSibling);
653
654             // Remove empty text nodes.
655             if (!nextText->length()) {
656                 ExceptionCode ec;
657                 nextText->remove(ec);
658                 continue;
659             }
660
661             // Both non-empty text nodes. Merge them.
662             unsigned offset = text->length();
663             ExceptionCode ec;
664             text->appendData(nextText->data(), ec);
665             document()->textNodesMerged(nextText.get(), offset);
666             nextText->remove(ec);
667         }
668
669         node = node->traverseNextNodePostOrder();
670     }
671 }
672
673 const AtomicString& Node::virtualPrefix() const
674 {
675     // For nodes other than elements and attributes, the prefix is always null
676     return nullAtom;
677 }
678
679 void Node::setPrefix(const AtomicString& /*prefix*/, ExceptionCode& ec)
680 {
681     // The spec says that for nodes other than elements and attributes, prefix is always null.
682     // It does not say what to do when the user tries to set the prefix on another type of
683     // node, however Mozilla throws a NAMESPACE_ERR exception.
684     ec = NAMESPACE_ERR;
685 }
686
687 const AtomicString& Node::virtualLocalName() const
688 {
689     return nullAtom;
690 }
691
692 const AtomicString& Node::virtualNamespaceURI() const
693 {
694     return nullAtom;
695 }
696
697 bool Node::isContentEditable()
698 {
699     document()->updateStyleIfNeeded();
700     return rendererIsEditable(Editable);
701 }
702
703 bool Node::isContentRichlyEditable()
704 {
705     document()->updateStyleIfNeeded();
706     return rendererIsEditable(RichlyEditable);
707 }
708
709 void Node::inspect()
710 {
711 #if ENABLE(INSPECTOR)
712     if (document() && document()->page())
713         document()->page()->inspectorController()->inspect(this);
714 #endif
715 }
716
717 bool Node::rendererIsEditable(EditableLevel editableLevel) const
718 {
719     if (document()->frame() && document()->frame()->page() && document()->frame()->page()->isEditable() && !shadowRoot())
720         return true;
721
722     // Ideally we'd call ASSERT(!needsStyleRecalc()) here, but
723     // ContainerNode::setFocus() calls setNeedsStyleRecalc(), so the assertion
724     // would fire in the middle of Document::setFocusedNode().
725
726     for (const Node* node = this; node; node = node->parentNode()) {
727         if ((node->isHTMLElement() || node->isDocumentNode()) && node->renderer()) {
728             switch (node->renderer()->style()->userModify()) {
729             case READ_ONLY:
730                 return false;
731             case READ_WRITE:
732                 return true;
733             case READ_WRITE_PLAINTEXT_ONLY:
734                 return editableLevel != RichlyEditable;
735             }
736             ASSERT_NOT_REACHED();
737             return false;
738         }
739     }
740
741     return false;
742 }
743
744 bool Node::isEditableToAccessibility(EditableLevel editableLevel) const
745 {
746     if (rendererIsEditable(editableLevel))
747         return true;
748
749     // FIXME: Respect editableLevel for ARIA editable elements.
750     if (editableLevel == RichlyEditable)
751         return false;
752
753     ASSERT(document());
754     ASSERT(AXObjectCache::accessibilityEnabled());
755     ASSERT(document()->axObjectCacheExists());
756
757     if (document() && AXObjectCache::accessibilityEnabled() && document()->axObjectCacheExists())
758         return document()->axObjectCache()->rootAXEditableElement(this);
759
760     return false;
761 }
762
763 bool Node::shouldUseInputMethod()
764 {
765     return isContentEditable();
766 }
767
768 RenderBox* Node::renderBox() const
769 {
770     return m_renderer && m_renderer->isBox() ? toRenderBox(m_renderer) : 0;
771 }
772
773 RenderBoxModelObject* Node::renderBoxModelObject() const
774 {
775     return m_renderer && m_renderer->isBoxModelObject() ? toRenderBoxModelObject(m_renderer) : 0;
776 }
777
778 LayoutRect Node::getRect() const
779 {
780     if (renderer())
781         return renderer()->absoluteBoundingBoxRect();
782     return LayoutRect();
783 }
784     
785 LayoutRect Node::renderRect(bool* isReplaced)
786 {    
787     RenderObject* hitRenderer = this->renderer();
788     ASSERT(hitRenderer);
789     RenderObject* renderer = hitRenderer;
790     while (renderer && !renderer->isBody() && !renderer->isRoot()) {
791         if (renderer->isRenderBlock() || renderer->isInlineBlockOrInlineTable() || renderer->isReplaced()) {
792             *isReplaced = renderer->isReplaced();
793             return renderer->absoluteBoundingBoxRect();
794         }
795         renderer = renderer->parent();
796     }
797     return LayoutRect();    
798 }
799
800 bool Node::hasNonEmptyBoundingBox() const
801 {
802     // Before calling absoluteRects, check for the common case where the renderer
803     // is non-empty, since this is a faster check and almost always returns true.
804     RenderBoxModelObject* box = renderBoxModelObject();
805     if (!box)
806         return false;
807     if (!box->borderBoundingBox().isEmpty())
808         return true;
809
810     Vector<IntRect> rects;
811     FloatPoint absPos = renderer()->localToAbsolute();
812     renderer()->absoluteRects(rects, flooredLayoutPoint(absPos));
813     size_t n = rects.size();
814     for (size_t i = 0; i < n; ++i)
815         if (!rects[i].isEmpty())
816             return true;
817
818     return false;
819 }
820
821 inline static ShadowRoot* oldestShadowRootFor(const Node* node)
822 {
823     if (!node->isElementNode())
824         return 0;
825     if (ElementShadow* shadow = toElement(node)->shadow())
826         return shadow->oldestShadowRoot();
827     return 0;
828 }
829
830 inline void Node::setStyleChange(StyleChangeType changeType)
831 {
832     m_nodeFlags = (m_nodeFlags & ~StyleChangeMask) | changeType;
833 }
834
835 inline void Node::markAncestorsWithChildNeedsStyleRecalc()
836 {
837     for (ContainerNode* p = parentOrHostNode(); p && !p->childNeedsStyleRecalc(); p = p->parentOrHostNode())
838         p->setChildNeedsStyleRecalc();
839
840     if (document()->childNeedsStyleRecalc())
841         document()->scheduleStyleRecalc();
842 }
843
844 void Node::refEventTarget()
845 {
846     ref();
847 }
848
849 void Node::derefEventTarget()
850 {
851     deref();
852 }
853
854 void Node::setNeedsStyleRecalc(StyleChangeType changeType)
855 {
856     ASSERT(changeType != NoStyleChange);
857     if (!attached()) // changed compared to what?
858         return;
859
860     StyleChangeType existingChangeType = styleChangeType();
861     if (changeType > existingChangeType)
862         setStyleChange(changeType);
863
864     if (existingChangeType == NoStyleChange)
865         markAncestorsWithChildNeedsStyleRecalc();
866 }
867
868 void Node::lazyAttach(ShouldSetAttached shouldSetAttached)
869 {
870     for (Node* n = this; n; n = n->traverseNextNode(this)) {
871         if (n->hasChildNodes())
872             n->setChildNeedsStyleRecalc();
873         n->setStyleChange(FullStyleChange);
874         if (shouldSetAttached == SetAttached)
875             n->setAttached();
876     }
877     markAncestorsWithChildNeedsStyleRecalc();
878 }
879
880 void Node::setFocus(bool b)
881
882     if (b || hasRareData())
883         ensureRareData()->setFocused(b);
884 }
885
886 bool Node::rareDataFocused() const
887 {
888     ASSERT(hasRareData());
889     return rareData()->isFocused();
890 }
891
892 bool Node::supportsFocus() const
893 {
894     return hasRareData() && rareData()->tabIndexSetExplicitly();
895 }
896     
897 bool Node::isFocusable() const
898 {
899     if (!inDocument() || !supportsFocus())
900         return false;
901     
902     if (renderer())
903         ASSERT(!renderer()->needsLayout());
904     else
905         // If the node is in a display:none tree it might say it needs style recalc but
906         // the whole document is actually up to date.
907         ASSERT(!document()->childNeedsStyleRecalc());
908     
909     // FIXME: Even if we are not visible, we might have a child that is visible.
910     // Hyatt wants to fix that some day with a "has visible content" flag or the like.
911     if (!renderer() || renderer()->style()->visibility() != VISIBLE)
912         return false;
913
914     return true;
915 }
916
917 bool Node::isKeyboardFocusable(KeyboardEvent*) const
918 {
919     return isFocusable() && tabIndex() >= 0;
920 }
921
922 bool Node::isMouseFocusable() const
923 {
924     return isFocusable();
925 }
926
927 Node* Node::focusDelegate()
928 {
929     return this;
930 }
931
932 unsigned Node::nodeIndex() const
933 {
934     Node *_tempNode = previousSibling();
935     unsigned count=0;
936     for ( count=0; _tempNode; count++ )
937         _tempNode = _tempNode->previousSibling();
938     return count;
939 }
940
941 void Node::invalidateNodeListsCacheAfterAttributeChanged(const QualifiedName& attrName, Element* attributeOwnerElement)
942 {
943     if (hasRareData() && isAttributeNode()) {
944         NodeRareData* data = rareData();
945         ASSERT(!data->nodeLists());
946         data->clearChildNodeListCache();
947     }
948
949     // Modifications to attributes that are not associated with an Element can't invalidate NodeList caches.
950     if (!attributeOwnerElement)
951         return;
952
953     // FIXME: Move the list of attributes each NodeList type cares about to be a static on the
954     // appropriate NodeList class. Then use those lists here and in invalidateCachesThatDependOnAttributes
955     // to only invalidate the cache types that depend on the attribute that changed.
956     // FIXME: Keep track of when we have no caches of a given type so that we can avoid the for-loop
957     // below even if a related attribute changed (e.g. if we have no RadioNodeLists, we don't need
958     // to invalidate any caches when id attributes change.)
959     if (attrName != classAttr
960 #if ENABLE(MICRODATA)
961         && attrName != itemscopeAttr
962         && attrName != itempropAttr
963         && attrName != itemtypeAttr
964 #endif
965         && attrName != nameAttr
966         && attrName != forAttr
967         && (attrName != idAttr || !attributeOwnerElement->isFormControlElement()))
968         return;
969
970     document()->clearNodeListCaches();
971
972     if (!treeScope()->hasNodeListCaches())
973         return;
974
975     for (Node* node = this; node; node = node->parentNode()) {
976         ASSERT(this == node || !node->isAttributeNode());
977         if (!node->hasRareData())
978             continue;
979         NodeRareData* data = node->rareData();
980         if (!data->nodeLists())
981             continue;
982
983         data->nodeLists()->invalidateCaches(&attrName);
984     }
985 }
986
987 void Node::invalidateNodeListsCacheAfterChildrenChanged()
988 {
989     if (hasRareData())
990         rareData()->clearChildNodeListCache();
991
992     document()->clearNodeListCaches();
993
994     if (!treeScope()->hasNodeListCaches())
995         return;
996
997     for (Node* node = this; node; node = node->parentNode()) {
998         if (!node->hasRareData())
999             continue;
1000         NodeRareData* data = node->rareData();
1001         if (!data->nodeLists())
1002             continue;
1003
1004         data->nodeLists()->invalidateCaches();
1005     }
1006 }
1007
1008 NodeListsNodeData* Node::nodeLists()
1009 {
1010     return hasRareData() ? rareData()->nodeLists() : 0;
1011 }
1012
1013 void Node::removeCachedChildNodeList()
1014 {
1015     ASSERT(rareData());
1016     rareData()->setChildNodeList(0);
1017 }
1018
1019 Node* Node::traverseNextAncestorSibling() const
1020 {
1021     ASSERT(!nextSibling());
1022     for (const Node* node = parentNode(); node; node = node->parentNode()) {
1023         if (node->nextSibling())
1024             return node->nextSibling();
1025     }
1026     return 0;
1027 }
1028
1029 Node* Node::traverseNextAncestorSibling(const Node* stayWithin) const
1030 {
1031     ASSERT(!nextSibling());
1032     ASSERT(this != stayWithin);
1033     for (const Node* node = parentNode(); node; node = node->parentNode()) {
1034         if (node == stayWithin)
1035             return 0;
1036         if (node->nextSibling())
1037             return node->nextSibling();
1038     }
1039     return 0;
1040 }
1041
1042 Node* Node::traverseNextNodePostOrder() const
1043 {
1044     Node* next = nextSibling();
1045     if (!next)
1046         return parentNode();
1047     while (Node* firstChild = next->firstChild())
1048         next = firstChild;
1049     return next;
1050 }
1051
1052 Node* Node::traversePreviousNode(const Node* stayWithin) const
1053 {
1054     if (this == stayWithin)
1055         return 0;
1056     if (previousSibling()) {
1057         Node *n = previousSibling();
1058         while (n->lastChild())
1059             n = n->lastChild();
1060         return n;
1061     }
1062     return parentNode();
1063 }
1064
1065 Node* Node::traversePreviousSibling(const Node* stayWithin) const
1066 {
1067     if (this == stayWithin)
1068         return 0;
1069     if (previousSibling())
1070         return previousSibling();
1071     const Node *n = this;
1072     while (n && !n->previousSibling() && (!stayWithin || n->parentNode() != stayWithin))
1073         n = n->parentNode();
1074     if (n)
1075         return n->previousSibling();
1076     return 0;
1077 }
1078
1079 Node* Node::traversePreviousNodePostOrder(const Node* stayWithin) const
1080 {
1081     if (lastChild())
1082         return lastChild();
1083     if (this == stayWithin)
1084         return 0;
1085     if (previousSibling())
1086         return previousSibling();
1087     const Node *n = this;
1088     while (n && !n->previousSibling() && (!stayWithin || n->parentNode() != stayWithin))
1089         n = n->parentNode();
1090     if (n)
1091         return n->previousSibling();
1092     return 0;
1093 }
1094
1095 Node* Node::traversePreviousSiblingPostOrder(const Node* stayWithin) const
1096 {
1097     if (this == stayWithin)
1098         return 0;
1099     if (previousSibling())
1100         return previousSibling();
1101     const Node *n = this;
1102     while (n && !n->previousSibling() && (!stayWithin || n->parentNode() != stayWithin))
1103         n = n->parentNode();
1104     if (n)
1105         return n->previousSibling();
1106     return 0;
1107 }
1108
1109 void Node::checkSetPrefix(const AtomicString& prefix, ExceptionCode& ec)
1110 {
1111     // Perform error checking as required by spec for setting Node.prefix. Used by
1112     // Element::setPrefix() and Attr::setPrefix()
1113
1114     if (!prefix.isEmpty() && !Document::isValidName(prefix)) {
1115         ec = INVALID_CHARACTER_ERR;
1116         return;
1117     }
1118
1119     if (isReadOnlyNode()) {
1120         ec = NO_MODIFICATION_ALLOWED_ERR;
1121         return;
1122     }
1123
1124     // FIXME: Raise NAMESPACE_ERR if prefix is malformed per the Namespaces in XML specification.
1125
1126     const AtomicString& nodeNamespaceURI = namespaceURI();
1127     if ((nodeNamespaceURI.isEmpty() && !prefix.isEmpty())
1128         || (prefix == xmlAtom && nodeNamespaceURI != XMLNames::xmlNamespaceURI)) {
1129         ec = NAMESPACE_ERR;
1130         return;
1131     }
1132     // Attribute-specific checks are in Attr::setPrefix().
1133 }
1134
1135 static bool isChildTypeAllowed(Node* newParent, Node* child)
1136 {
1137     if (child->nodeType() != Node::DOCUMENT_FRAGMENT_NODE) {
1138         if (!newParent->childTypeAllowed(child->nodeType()))
1139             return false;
1140         return true;
1141     }
1142     
1143     for (Node *n = child->firstChild(); n; n = n->nextSibling()) {
1144         if (!newParent->childTypeAllowed(n->nodeType()))
1145             return false;
1146     }
1147     return true;
1148 }
1149
1150 bool Node::canReplaceChild(Node* newChild, Node*)
1151 {
1152     return isChildTypeAllowed(this, newChild);
1153 }
1154
1155 static void checkAcceptChild(Node* newParent, Node* newChild, ExceptionCode& ec)
1156 {
1157     // Not mentioned in spec: throw NOT_FOUND_ERR if newChild is null
1158     if (!newChild) {
1159         ec = NOT_FOUND_ERR;
1160         return;
1161     }
1162     
1163     if (newParent->isReadOnlyNode()) {
1164         ec = NO_MODIFICATION_ALLOWED_ERR;
1165         return;
1166     }
1167
1168     if (newChild->inDocument() && newChild->nodeType() == Node::DOCUMENT_TYPE_NODE) {
1169         ec = HIERARCHY_REQUEST_ERR;
1170         return;
1171     }
1172
1173     // HIERARCHY_REQUEST_ERR: Raised if this node is of a type that does not allow children of the type of the
1174     // newChild node, or if the node to append is one of this node's ancestors.
1175
1176     if (newChild == newParent || newParent->isDescendantOf(newChild)) {
1177         ec = HIERARCHY_REQUEST_ERR;
1178         return;
1179     }
1180 }
1181
1182 void Node::checkReplaceChild(Node* newChild, Node* oldChild, ExceptionCode& ec)
1183 {
1184     if (!oldChild) {
1185         ec = NOT_FOUND_ERR;
1186         return;
1187     }
1188
1189     checkAcceptChild(this, newChild, ec);
1190     if (ec)
1191         return;
1192
1193     if (!canReplaceChild(newChild, oldChild)) {
1194         ec = HIERARCHY_REQUEST_ERR;
1195         return;
1196     }
1197 }
1198
1199 void Node::checkAddChild(Node *newChild, ExceptionCode& ec)
1200 {
1201     checkAcceptChild(this, newChild, ec);
1202     if (ec)
1203         return;
1204     
1205     if (!isChildTypeAllowed(this, newChild)) {
1206         ec = HIERARCHY_REQUEST_ERR;
1207         return;
1208     }
1209 }
1210
1211 bool Node::isDescendantOf(const Node *other) const
1212 {
1213     // Return true if other is an ancestor of this, otherwise false
1214     if (!other || !other->hasChildNodes() || inDocument() != other->inDocument())
1215         return false;
1216     if (other == other->document())
1217         return document() == other && this != document() && inDocument();
1218     for (const ContainerNode* n = parentNode(); n; n = n->parentNode()) {
1219         if (n == other)
1220             return true;
1221     }
1222     return false;
1223 }
1224
1225 bool Node::contains(const Node* node) const
1226 {
1227     if (!node)
1228         return false;
1229     return this == node || node->isDescendantOf(this);
1230 }
1231
1232 bool Node::containsIncludingShadowDOM(Node* node)
1233 {
1234     if (!node)
1235         return false;
1236     for (Node* n = node; n; n = n->parentOrHostNode()) {
1237         if (n == this)
1238             return true;
1239     }
1240     return false;
1241 }
1242
1243 void Node::attach()
1244 {
1245     ASSERT(!attached());
1246     ASSERT(!renderer() || (renderer()->style() && renderer()->parent()));
1247
1248     // FIXME: This is O(N^2) for the innerHTML case, where all children are replaced at once (and not attached).
1249     // If this node got a renderer it may be the previousRenderer() of sibling text nodes and thus affect the
1250     // result of Text::rendererIsNeeded() for those nodes.
1251     if (renderer()) {
1252         for (Node* next = nextSibling(); next; next = next->nextSibling()) {
1253             if (next->renderer())
1254                 break;
1255             if (!next->attached())
1256                 break;  // Assume this means none of the following siblings are attached.
1257             if (next->isTextNode())
1258                 next->createRendererIfNeeded();
1259         }
1260     }
1261
1262     setAttached();
1263     clearNeedsStyleRecalc();
1264 }
1265
1266 #ifndef NDEBUG
1267 static Node* detachingNode;
1268
1269 bool Node::inDetach() const
1270 {
1271     return detachingNode == this;
1272 }
1273 #endif
1274
1275 void Node::detach()
1276 {
1277 #ifndef NDEBUG
1278     ASSERT(!detachingNode);
1279     detachingNode = this;
1280 #endif
1281
1282     if (renderer())
1283         renderer()->destroyAndCleanupAnonymousWrappers();
1284     setRenderer(0);
1285
1286     Document* doc = document();
1287     if (hovered())
1288         doc->hoveredNodeDetached(this);
1289     if (inActiveChain())
1290         doc->activeChainNodeDetached(this);
1291
1292     clearFlag(IsActiveFlag);
1293     clearFlag(IsHoveredFlag);
1294     clearFlag(InActiveChainFlag);
1295     clearFlag(IsAttachedFlag);
1296
1297 #ifndef NDEBUG
1298     detachingNode = 0;
1299 #endif
1300 }
1301
1302 // FIXME: This code is used by editing.  Seems like it could move over there and not pollute Node.
1303 Node *Node::previousNodeConsideringAtomicNodes() const
1304 {
1305     if (previousSibling()) {
1306         Node *n = previousSibling();
1307         while (!isAtomicNode(n) && n->lastChild())
1308             n = n->lastChild();
1309         return n;
1310     }
1311     else if (parentNode()) {
1312         return parentNode();
1313     }
1314     else {
1315         return 0;
1316     }
1317 }
1318
1319 Node *Node::nextNodeConsideringAtomicNodes() const
1320 {
1321     if (!isAtomicNode(this) && firstChild())
1322         return firstChild();
1323     if (nextSibling())
1324         return nextSibling();
1325     const Node *n = this;
1326     while (n && !n->nextSibling())
1327         n = n->parentNode();
1328     if (n)
1329         return n->nextSibling();
1330     return 0;
1331 }
1332
1333 Node *Node::previousLeafNode() const
1334 {
1335     Node *node = previousNodeConsideringAtomicNodes();
1336     while (node) {
1337         if (isAtomicNode(node))
1338             return node;
1339         node = node->previousNodeConsideringAtomicNodes();
1340     }
1341     return 0;
1342 }
1343
1344 Node *Node::nextLeafNode() const
1345 {
1346     Node *node = nextNodeConsideringAtomicNodes();
1347     while (node) {
1348         if (isAtomicNode(node))
1349             return node;
1350         node = node->nextNodeConsideringAtomicNodes();
1351     }
1352     return 0;
1353 }
1354
1355 ContainerNode* Node::parentNodeForRenderingAndStyle()
1356 {
1357     return NodeRenderingContext(this).parentNodeForRenderingAndStyle();
1358 }
1359
1360 void Node::createRendererIfNeeded()
1361 {
1362     NodeRendererFactory(this).createRendererIfNeeded();
1363 }
1364
1365 bool Node::rendererIsNeeded(const NodeRenderingContext& context)
1366 {
1367     return (document()->documentElement() == this) || (context.style()->display() != NONE);
1368 }
1369
1370 RenderObject* Node::createRenderer(RenderArena*, RenderStyle*)
1371 {
1372     ASSERT_NOT_REACHED();
1373     return 0;
1374 }
1375     
1376 RenderStyle* Node::nonRendererRenderStyle() const
1377
1378     return 0; 
1379 }   
1380
1381 void Node::setRenderStyle(PassRefPtr<RenderStyle> s)
1382 {
1383     if (m_renderer)
1384         m_renderer->setAnimatableStyle(s); 
1385 }
1386
1387 RenderStyle* Node::virtualComputedStyle(PseudoId pseudoElementSpecifier)
1388 {
1389     return parentOrHostNode() ? parentOrHostNode()->computedStyle(pseudoElementSpecifier) : 0;
1390 }
1391
1392 int Node::maxCharacterOffset() const
1393 {
1394     ASSERT_NOT_REACHED();
1395     return 0;
1396 }
1397
1398 // FIXME: Shouldn't these functions be in the editing code?  Code that asks questions about HTML in the core DOM class
1399 // is obviously misplaced.
1400 bool Node::canStartSelection() const
1401 {
1402     if (rendererIsEditable())
1403         return true;
1404
1405     if (renderer()) {
1406         RenderStyle* style = renderer()->style();
1407         // We allow selections to begin within an element that has -webkit-user-select: none set,
1408         // but if the element is draggable then dragging should take priority over selection.
1409         if (style->userDrag() == DRAG_ELEMENT && style->userSelect() == SELECT_NONE)
1410             return false;
1411     }
1412     return parentOrHostNode() ? parentOrHostNode()->canStartSelection() : true;
1413 }
1414
1415
1416 Node* Node::shadowAncestorNode() const
1417 {
1418 #if ENABLE(SVG)
1419     // SVG elements living in a shadow tree only occur when <use> created them.
1420     // For these cases we do NOT want to return the shadowParentNode() here
1421     // but the actual shadow tree element - as main difference to the HTML forms
1422     // shadow tree concept. (This function _could_ be made virtual - opinions?)
1423     if (isSVGElement())
1424         return const_cast<Node*>(this);
1425 #endif
1426
1427     if (ShadowRoot* root = shadowRoot())
1428         return root->host();
1429
1430     return const_cast<Node*>(this);
1431 }
1432
1433 ShadowRoot* Node::shadowRoot() const
1434 {
1435     Node* root = const_cast<Node*>(this);
1436     while (root) {
1437         if (root->isShadowRoot())
1438             return toShadowRoot(root);
1439         root = root->parentNodeGuaranteedHostFree();
1440     }
1441     return 0;
1442 }
1443
1444 Node* Node::nonBoundaryShadowTreeRootNode()
1445 {
1446     ASSERT(!isShadowRoot());
1447     Node* root = this;
1448     while (root) {
1449         if (root->isShadowRoot())
1450             return root;
1451         Node* parent = root->parentNodeGuaranteedHostFree();
1452         if (parent && parent->isShadowRoot())
1453             return root;
1454         root = parent;
1455     }
1456     return 0;
1457 }
1458
1459 ContainerNode* Node::nonShadowBoundaryParentNode() const
1460 {
1461     ContainerNode* parent = parentNode();
1462     return parent && !parent->isShadowRoot() ? parent : 0;
1463 }
1464
1465 bool Node::isInShadowTree() const
1466 {
1467     return treeScope() != document();
1468 }
1469
1470 Element* Node::parentOrHostElement() const
1471 {
1472     ContainerNode* parent = parentOrHostNode();
1473     if (!parent)
1474         return 0;
1475
1476     if (parent->isShadowRoot())
1477         return toShadowRoot(parent)->host();
1478
1479     if (!parent->isElementNode())
1480         return 0;
1481
1482     return toElement(parent);
1483 }
1484
1485
1486 bool Node::isBlockFlow() const
1487 {
1488     return renderer() && renderer()->isBlockFlow();
1489 }
1490
1491 bool Node::isBlockFlowOrBlockTable() const
1492 {
1493     return renderer() && (renderer()->isBlockFlow() || (renderer()->isTable() && !renderer()->isInline()));
1494 }
1495
1496 Element *Node::enclosingBlockFlowElement() const
1497 {
1498     Node *n = const_cast<Node *>(this);
1499     if (isBlockFlow())
1500         return static_cast<Element *>(n);
1501
1502     while (1) {
1503         n = n->parentNode();
1504         if (!n)
1505             break;
1506         if (n->isBlockFlow() || n->hasTagName(bodyTag))
1507             return static_cast<Element *>(n);
1508     }
1509     return 0;
1510 }
1511
1512 bool Node::isRootEditableElement() const
1513 {
1514     return rendererIsEditable() && isElementNode() && (!parentNode() || !parentNode()->rendererIsEditable()
1515         || !parentNode()->isElementNode() || hasTagName(bodyTag));
1516 }
1517
1518 Element* Node::rootEditableElement(EditableType editableType) const
1519 {
1520     if (editableType == HasEditableAXRole)
1521         return const_cast<Element*>(document()->axObjectCache()->rootAXEditableElement(this));
1522
1523     return rootEditableElement();
1524 }
1525
1526 Element* Node::rootEditableElement() const
1527 {
1528     Element* result = 0;
1529     for (Node* n = const_cast<Node*>(this); n && n->rendererIsEditable(); n = n->parentNode()) {
1530         if (n->isElementNode())
1531             result = static_cast<Element*>(n);
1532         if (n->hasTagName(bodyTag))
1533             break;
1534     }
1535     return result;
1536 }
1537
1538 bool Node::inSameContainingBlockFlowElement(Node *n)
1539 {
1540     return n ? enclosingBlockFlowElement() == n->enclosingBlockFlowElement() : false;
1541 }
1542
1543 // FIXME: End of obviously misplaced HTML editing functions.  Try to move these out of Node.
1544
1545 PassRefPtr<NodeList> Node::getElementsByTagName(const AtomicString& localName)
1546 {
1547     if (localName.isNull())
1548         return 0;
1549
1550     if (document()->isHTMLDocument())
1551         return ensureRareData()->ensureNodeLists(this)->addCacheWithAtomicName<HTMLTagNodeList>(this, DynamicNodeList::TagNodeListType, localName);
1552     return ensureRareData()->ensureNodeLists(this)->addCacheWithAtomicName<TagNodeList>(this, DynamicNodeList::TagNodeListType, localName);
1553 }
1554
1555 PassRefPtr<NodeList> Node::getElementsByTagNameNS(const AtomicString& namespaceURI, const AtomicString& localName)
1556 {
1557     if (localName.isNull())
1558         return 0;
1559
1560     if (namespaceURI == starAtom)
1561         return getElementsByTagName(localName);
1562
1563     return ensureRareData()->ensureNodeLists(this)->addCacheWithQualifiedName(this, namespaceURI.isEmpty() ? nullAtom : namespaceURI, localName);
1564 }
1565
1566 PassRefPtr<NodeList> Node::getElementsByName(const String& elementName)
1567 {
1568     return ensureRareData()->ensureNodeLists(this)->addCacheWithAtomicName<NameNodeList>(this, DynamicNodeList::NameNodeListType, elementName);
1569 }
1570
1571 PassRefPtr<NodeList> Node::getElementsByClassName(const String& classNames)
1572 {
1573     return ensureRareData()->ensureNodeLists(this)->addCacheWithName<ClassNodeList>(this, DynamicNodeList::ClassNodeListType, classNames);
1574 }
1575
1576 PassRefPtr<RadioNodeList> Node::radioNodeList(const AtomicString& name)
1577 {
1578     ASSERT(hasTagName(formTag) || hasTagName(fieldsetTag));
1579     return ensureRareData()->ensureNodeLists(this)->addCacheWithAtomicName<RadioNodeList>(this, DynamicNodeList::RadioNodeListType, name);
1580 }
1581
1582 PassRefPtr<Element> Node::querySelector(const AtomicString& selectors, ExceptionCode& ec)
1583 {
1584     if (selectors.isEmpty()) {
1585         ec = SYNTAX_ERR;
1586         return 0;
1587     }
1588
1589     SelectorQuery* selectorQuery = document()->selectorQueryCache()->add(selectors, document(), ec);
1590     if (!selectorQuery)
1591         return 0;
1592     return selectorQuery->queryFirst(this);
1593 }
1594
1595 PassRefPtr<NodeList> Node::querySelectorAll(const AtomicString& selectors, ExceptionCode& ec)
1596 {
1597     if (selectors.isEmpty()) {
1598         ec = SYNTAX_ERR;
1599         return 0;
1600     }
1601
1602     SelectorQuery* selectorQuery = document()->selectorQueryCache()->add(selectors, document(), ec);
1603     if (!selectorQuery)
1604         return 0;
1605     return selectorQuery->queryAll(this);
1606 }
1607
1608 Document *Node::ownerDocument() const
1609 {
1610     Document *doc = document();
1611     return doc == this ? 0 : doc;
1612 }
1613
1614 KURL Node::baseURI() const
1615 {
1616     return parentNode() ? parentNode()->baseURI() : KURL();
1617 }
1618
1619 bool Node::isEqualNode(Node* other) const
1620 {
1621     if (!other)
1622         return false;
1623     
1624     NodeType nodeType = this->nodeType();
1625     if (nodeType != other->nodeType())
1626         return false;
1627     
1628     if (nodeName() != other->nodeName())
1629         return false;
1630     
1631     if (localName() != other->localName())
1632         return false;
1633     
1634     if (namespaceURI() != other->namespaceURI())
1635         return false;
1636     
1637     if (prefix() != other->prefix())
1638         return false;
1639     
1640     if (nodeValue() != other->nodeValue())
1641         return false;
1642     
1643     if (isElementNode() && !toElement(this)->hasEquivalentAttributes(toElement(other)))
1644         return false;
1645     
1646     Node* child = firstChild();
1647     Node* otherChild = other->firstChild();
1648     
1649     while (child) {
1650         if (!child->isEqualNode(otherChild))
1651             return false;
1652         
1653         child = child->nextSibling();
1654         otherChild = otherChild->nextSibling();
1655     }
1656     
1657     if (otherChild)
1658         return false;
1659     
1660     if (nodeType == DOCUMENT_TYPE_NODE) {
1661         const DocumentType* documentTypeThis = static_cast<const DocumentType*>(this);
1662         const DocumentType* documentTypeOther = static_cast<const DocumentType*>(other);
1663         
1664         if (documentTypeThis->publicId() != documentTypeOther->publicId())
1665             return false;
1666
1667         if (documentTypeThis->systemId() != documentTypeOther->systemId())
1668             return false;
1669
1670         if (documentTypeThis->internalSubset() != documentTypeOther->internalSubset())
1671             return false;
1672
1673         // FIXME: We don't compare entities or notations because currently both are always empty.
1674     }
1675     
1676     return true;
1677 }
1678
1679 bool Node::isDefaultNamespace(const AtomicString& namespaceURIMaybeEmpty) const
1680 {
1681     const AtomicString& namespaceURI = namespaceURIMaybeEmpty.isEmpty() ? nullAtom : namespaceURIMaybeEmpty;
1682
1683     switch (nodeType()) {
1684         case ELEMENT_NODE: {
1685             const Element* elem = static_cast<const Element*>(this);
1686             
1687             if (elem->prefix().isNull())
1688                 return elem->namespaceURI() == namespaceURI;
1689
1690             if (elem->hasAttributes()) {
1691                 for (unsigned i = 0; i < elem->attributeCount(); i++) {
1692                     Attribute* attr = elem->attributeItem(i);
1693                     
1694                     if (attr->localName() == xmlnsAtom)
1695                         return attr->value() == namespaceURI;
1696                 }
1697             }
1698
1699             if (Element* ancestor = ancestorElement())
1700                 return ancestor->isDefaultNamespace(namespaceURI);
1701
1702             return false;
1703         }
1704         case DOCUMENT_NODE:
1705             if (Element* de = static_cast<const Document*>(this)->documentElement())
1706                 return de->isDefaultNamespace(namespaceURI);
1707             return false;
1708         case ENTITY_NODE:
1709         case NOTATION_NODE:
1710         case DOCUMENT_TYPE_NODE:
1711         case DOCUMENT_FRAGMENT_NODE:
1712             return false;
1713         case ATTRIBUTE_NODE: {
1714             const Attr* attr = static_cast<const Attr*>(this);
1715             if (attr->ownerElement())
1716                 return attr->ownerElement()->isDefaultNamespace(namespaceURI);
1717             return false;
1718         }
1719         default:
1720             if (Element* ancestor = ancestorElement())
1721                 return ancestor->isDefaultNamespace(namespaceURI);
1722             return false;
1723     }
1724 }
1725
1726 String Node::lookupPrefix(const AtomicString &namespaceURI) const
1727 {
1728     // Implemented according to
1729     // http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/namespaces-algorithms.html#lookupNamespacePrefixAlgo
1730     
1731     if (namespaceURI.isEmpty())
1732         return String();
1733     
1734     switch (nodeType()) {
1735         case ELEMENT_NODE:
1736             return lookupNamespacePrefix(namespaceURI, static_cast<const Element *>(this));
1737         case DOCUMENT_NODE:
1738             if (Element* de = static_cast<const Document*>(this)->documentElement())
1739                 return de->lookupPrefix(namespaceURI);
1740             return String();
1741         case ENTITY_NODE:
1742         case NOTATION_NODE:
1743         case DOCUMENT_FRAGMENT_NODE:
1744         case DOCUMENT_TYPE_NODE:
1745             return String();
1746         case ATTRIBUTE_NODE: {
1747             const Attr *attr = static_cast<const Attr *>(this);
1748             if (attr->ownerElement())
1749                 return attr->ownerElement()->lookupPrefix(namespaceURI);
1750             return String();
1751         }
1752         default:
1753             if (Element* ancestor = ancestorElement())
1754                 return ancestor->lookupPrefix(namespaceURI);
1755             return String();
1756     }
1757 }
1758
1759 String Node::lookupNamespaceURI(const String &prefix) const
1760 {
1761     // Implemented according to
1762     // http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/namespaces-algorithms.html#lookupNamespaceURIAlgo
1763     
1764     if (!prefix.isNull() && prefix.isEmpty())
1765         return String();
1766     
1767     switch (nodeType()) {
1768         case ELEMENT_NODE: {
1769             const Element *elem = static_cast<const Element *>(this);
1770             
1771             if (!elem->namespaceURI().isNull() && elem->prefix() == prefix)
1772                 return elem->namespaceURI();
1773             
1774             if (elem->hasAttributes()) {
1775                 for (unsigned i = 0; i < elem->attributeCount(); i++) {
1776                     Attribute* attr = elem->attributeItem(i);
1777                     
1778                     if (attr->prefix() == xmlnsAtom && attr->localName() == prefix) {
1779                         if (!attr->value().isEmpty())
1780                             return attr->value();
1781                         
1782                         return String();
1783                     } else if (attr->localName() == xmlnsAtom && prefix.isNull()) {
1784                         if (!attr->value().isEmpty())
1785                             return attr->value();
1786                         
1787                         return String();
1788                     }
1789                 }
1790             }
1791             if (Element* ancestor = ancestorElement())
1792                 return ancestor->lookupNamespaceURI(prefix);
1793             return String();
1794         }
1795         case DOCUMENT_NODE:
1796             if (Element* de = static_cast<const Document*>(this)->documentElement())
1797                 return de->lookupNamespaceURI(prefix);
1798             return String();
1799         case ENTITY_NODE:
1800         case NOTATION_NODE:
1801         case DOCUMENT_TYPE_NODE:
1802         case DOCUMENT_FRAGMENT_NODE:
1803             return String();
1804         case ATTRIBUTE_NODE: {
1805             const Attr *attr = static_cast<const Attr *>(this);
1806             
1807             if (attr->ownerElement())
1808                 return attr->ownerElement()->lookupNamespaceURI(prefix);
1809             else
1810                 return String();
1811         }
1812         default:
1813             if (Element* ancestor = ancestorElement())
1814                 return ancestor->lookupNamespaceURI(prefix);
1815             return String();
1816     }
1817 }
1818
1819 String Node::lookupNamespacePrefix(const AtomicString &_namespaceURI, const Element *originalElement) const
1820 {
1821     if (_namespaceURI.isNull())
1822         return String();
1823             
1824     if (originalElement->lookupNamespaceURI(prefix()) == _namespaceURI)
1825         return prefix();
1826     
1827     ASSERT(isElementNode());
1828     const Element* thisElement = toElement(this);
1829     if (thisElement->hasAttributes()) {
1830         for (unsigned i = 0; i < thisElement->attributeCount(); i++) {
1831             Attribute* attr = thisElement->attributeItem(i);
1832             
1833             if (attr->prefix() == xmlnsAtom && attr->value() == _namespaceURI
1834                     && originalElement->lookupNamespaceURI(attr->localName()) == _namespaceURI)
1835                 return attr->localName();
1836         }
1837     }
1838     
1839     if (Element* ancestor = ancestorElement())
1840         return ancestor->lookupNamespacePrefix(_namespaceURI, originalElement);
1841     return String();
1842 }
1843
1844 static void appendTextContent(const Node* node, bool convertBRsToNewlines, bool& isNullString, StringBuilder& content)
1845 {
1846     switch (node->nodeType()) {
1847     case Node::TEXT_NODE:
1848     case Node::CDATA_SECTION_NODE:
1849     case Node::COMMENT_NODE:
1850         isNullString = false;
1851         content.append(static_cast<const CharacterData*>(node)->data());
1852         break;
1853
1854     case Node::PROCESSING_INSTRUCTION_NODE:
1855         isNullString = false;
1856         content.append(static_cast<const ProcessingInstruction*>(node)->data());
1857         break;
1858     
1859     case Node::ELEMENT_NODE:
1860         if (node->hasTagName(brTag) && convertBRsToNewlines) {
1861             isNullString = false;
1862             content.append('\n');
1863             break;
1864         }
1865     // Fall through.
1866     case Node::ATTRIBUTE_NODE:
1867     case Node::ENTITY_NODE:
1868     case Node::ENTITY_REFERENCE_NODE:
1869     case Node::DOCUMENT_FRAGMENT_NODE:
1870         isNullString = false;
1871         for (Node* child = node->firstChild(); child; child = child->nextSibling()) {
1872             if (child->nodeType() == Node::COMMENT_NODE || child->nodeType() == Node::PROCESSING_INSTRUCTION_NODE)
1873                 continue;
1874             appendTextContent(child, convertBRsToNewlines, isNullString, content);
1875         }
1876         break;
1877
1878     case Node::DOCUMENT_NODE:
1879     case Node::DOCUMENT_TYPE_NODE:
1880     case Node::NOTATION_NODE:
1881     case Node::XPATH_NAMESPACE_NODE:
1882         break;
1883     }
1884 }
1885
1886 String Node::textContent(bool convertBRsToNewlines) const
1887 {
1888     StringBuilder content;
1889     bool isNullString = true;
1890     appendTextContent(this, convertBRsToNewlines, isNullString, content);
1891     return isNullString ? String() : content.toString();
1892 }
1893
1894 void Node::setTextContent(const String& text, ExceptionCode& ec)
1895 {           
1896     switch (nodeType()) {
1897         case TEXT_NODE:
1898         case CDATA_SECTION_NODE:
1899         case COMMENT_NODE:
1900         case PROCESSING_INSTRUCTION_NODE:
1901             setNodeValue(text, ec);
1902             return;
1903         case ELEMENT_NODE:
1904         case ATTRIBUTE_NODE:
1905         case ENTITY_NODE:
1906         case ENTITY_REFERENCE_NODE:
1907         case DOCUMENT_FRAGMENT_NODE: {
1908             RefPtr<ContainerNode> container = toContainerNode(this);
1909 #if ENABLE(MUTATION_OBSERVERS)
1910             ChildListMutationScope mutation(this);
1911 #endif
1912             container->removeChildren();
1913             if (!text.isEmpty())
1914                 container->appendChild(document()->createTextNode(text), ec);
1915             return;
1916         }
1917         case DOCUMENT_NODE:
1918         case DOCUMENT_TYPE_NODE:
1919         case NOTATION_NODE:
1920         case XPATH_NAMESPACE_NODE:
1921             // Do nothing.
1922             return;
1923     }
1924     ASSERT_NOT_REACHED();
1925 }
1926
1927 Element* Node::ancestorElement() const
1928 {
1929     // In theory, there can be EntityReference nodes between elements, but this is currently not supported.
1930     for (ContainerNode* n = parentNode(); n; n = n->parentNode()) {
1931         if (n->isElementNode())
1932             return static_cast<Element*>(n);
1933     }
1934     return 0;
1935 }
1936
1937 bool Node::offsetInCharacters() const
1938 {
1939     return false;
1940 }
1941
1942 unsigned short Node::compareDocumentPosition(Node* otherNode)
1943 {
1944     // It is not clear what should be done if |otherNode| is 0.
1945     if (!otherNode)
1946         return DOCUMENT_POSITION_DISCONNECTED;
1947
1948     if (otherNode == this)
1949         return DOCUMENT_POSITION_EQUIVALENT;
1950     
1951     Attr* attr1 = nodeType() == ATTRIBUTE_NODE ? static_cast<Attr*>(this) : 0;
1952     Attr* attr2 = otherNode->nodeType() == ATTRIBUTE_NODE ? static_cast<Attr*>(otherNode) : 0;
1953     
1954     Node* start1 = attr1 ? attr1->ownerElement() : this;
1955     Node* start2 = attr2 ? attr2->ownerElement() : otherNode;
1956     
1957     // If either of start1 or start2 is null, then we are disconnected, since one of the nodes is
1958     // an orphaned attribute node.
1959     if (!start1 || !start2)
1960         return DOCUMENT_POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC;
1961
1962     Vector<Node*, 16> chain1;
1963     Vector<Node*, 16> chain2;
1964     if (attr1)
1965         chain1.append(attr1);
1966     if (attr2)
1967         chain2.append(attr2);
1968     
1969     if (attr1 && attr2 && start1 == start2 && start1) {
1970         // We are comparing two attributes on the same node. Crawl our attribute map and see which one we hit first.
1971         Element* owner1 = attr1->ownerElement();
1972         owner1->updatedAttributeData(); // Force update invalid attributes.
1973         unsigned length = owner1->attributeCount();
1974         for (unsigned i = 0; i < length; ++i) {
1975             // If neither of the two determining nodes is a child node and nodeType is the same for both determining nodes, then an 
1976             // implementation-dependent order between the determining nodes is returned. This order is stable as long as no nodes of
1977             // the same nodeType are inserted into or removed from the direct container. This would be the case, for example, 
1978             // when comparing two attributes of the same element, and inserting or removing additional attributes might change 
1979             // the order between existing attributes.
1980             Attribute* attribute = owner1->attributeItem(i);
1981             if (attr1->qualifiedName() == attribute->name())
1982                 return DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | DOCUMENT_POSITION_FOLLOWING;
1983             if (attr2->qualifiedName() == attribute->name())
1984                 return DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | DOCUMENT_POSITION_PRECEDING;
1985         }
1986         
1987         ASSERT_NOT_REACHED();
1988         return DOCUMENT_POSITION_DISCONNECTED;
1989     }
1990
1991     // If one node is in the document and the other is not, we must be disconnected.
1992     // If the nodes have different owning documents, they must be disconnected.  Note that we avoid
1993     // comparing Attr nodes here, since they return false from inDocument() all the time (which seems like a bug).
1994     if (start1->inDocument() != start2->inDocument() ||
1995         start1->document() != start2->document())
1996         return DOCUMENT_POSITION_DISCONNECTED | DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC;
1997
1998     // We need to find a common ancestor container, and then compare the indices of the two immediate children.
1999     Node* current;
2000     for (current = start1; current; current = current->parentNode())
2001         chain1.append(current);
2002     for (current = start2; current; current = current->parentNode())
2003         chain2.append(current);
2004    
2005     // Walk the two chains backwards and look for the first difference.
2006     unsigned index1 = chain1.size();
2007     unsigned index2 = chain2.size();
2008     for (unsigned i = min(index1, index2); i; --i) {
2009         Node* child1 = chain1[--index1];
2010         Node* child2 = chain2[--index2];
2011         if (child1 != child2) {
2012             // If one of the children is an attribute, it wins.
2013             if (child1->nodeType() == ATTRIBUTE_NODE)
2014                 return DOCUMENT_POSITION_FOLLOWING;
2015             if (child2->nodeType() == ATTRIBUTE_NODE)
2016                 return DOCUMENT_POSITION_PRECEDING;
2017             
2018             if (!child2->nextSibling())
2019                 return DOCUMENT_POSITION_FOLLOWING;
2020             if (!child1->nextSibling())
2021                 return DOCUMENT_POSITION_PRECEDING;
2022
2023             // Otherwise we need to see which node occurs first.  Crawl backwards from child2 looking for child1.
2024             for (Node* child = child2->previousSibling(); child; child = child->previousSibling()) {
2025                 if (child == child1)
2026                     return DOCUMENT_POSITION_FOLLOWING;
2027             }
2028             return DOCUMENT_POSITION_PRECEDING;
2029         }
2030     }
2031     
2032     // There was no difference between the two parent chains, i.e., one was a subset of the other.  The shorter
2033     // chain is the ancestor.
2034     return index1 < index2 ? 
2035                DOCUMENT_POSITION_FOLLOWING | DOCUMENT_POSITION_CONTAINED_BY :
2036                DOCUMENT_POSITION_PRECEDING | DOCUMENT_POSITION_CONTAINS;
2037 }
2038
2039 FloatPoint Node::convertToPage(const FloatPoint& p) const
2040 {
2041     // If there is a renderer, just ask it to do the conversion
2042     if (renderer())
2043         return renderer()->localToAbsolute(p, false, true);
2044     
2045     // Otherwise go up the tree looking for a renderer
2046     Element *parent = ancestorElement();
2047     if (parent)
2048         return parent->convertToPage(p);
2049
2050     // No parent - no conversion needed
2051     return p;
2052 }
2053
2054 FloatPoint Node::convertFromPage(const FloatPoint& p) const
2055 {
2056     // If there is a renderer, just ask it to do the conversion
2057     if (renderer())
2058         return renderer()->absoluteToLocal(p, false, true);
2059
2060     // Otherwise go up the tree looking for a renderer
2061     Element *parent = ancestorElement();
2062     if (parent)
2063         return parent->convertFromPage(p);
2064
2065     // No parent - no conversion needed
2066     return p;
2067 }
2068
2069 #ifndef NDEBUG
2070
2071 static void appendAttributeDesc(const Node* node, String& string, const QualifiedName& name, const char* attrDesc)
2072 {
2073     if (node->isElementNode()) {
2074         String attr = static_cast<const Element*>(node)->getAttribute(name);
2075         if (!attr.isEmpty()) {
2076             string += attrDesc;
2077             string += attr;
2078         }
2079     }
2080 }
2081
2082 void Node::showNode(const char* prefix) const
2083 {
2084     if (!prefix)
2085         prefix = "";
2086     if (isTextNode()) {
2087         String value = nodeValue();
2088         value.replace('\\', "\\\\");
2089         value.replace('\n', "\\n");
2090         fprintf(stderr, "%s%s\t%p \"%s\"\n", prefix, nodeName().utf8().data(), this, value.utf8().data());
2091     } else {
2092         String attrs = "";
2093         appendAttributeDesc(this, attrs, classAttr, " CLASS=");
2094         appendAttributeDesc(this, attrs, styleAttr, " STYLE=");
2095         fprintf(stderr, "%s%s\t%p%s\n", prefix, nodeName().utf8().data(), this, attrs.utf8().data());
2096     }
2097 }
2098
2099 void Node::showTreeForThis() const
2100 {
2101     showTreeAndMark(this, "*");
2102 }
2103
2104 void Node::showNodePathForThis() const
2105 {
2106     Vector<const Node*, 16> chain;
2107     const Node* node = this;
2108     while (node->parentOrHostNode()) {
2109         chain.append(node);
2110         node = node->parentOrHostNode();
2111     }
2112     for (unsigned index = chain.size(); index > 0; --index) {
2113         const Node* node = chain[index - 1];
2114         if (node->isShadowRoot()) {
2115             int count = 0;
2116             for (ShadowRoot* shadowRoot = oldestShadowRootFor(node); shadowRoot && shadowRoot != node; shadowRoot = shadowRoot->youngerShadowRoot())
2117                 ++count;
2118             fprintf(stderr, "/#shadow-root[%d]", count);
2119             continue;
2120         }
2121
2122         switch (node->nodeType()) {
2123         case ELEMENT_NODE: {
2124             fprintf(stderr, "/%s", node->nodeName().utf8().data());
2125
2126             const Element* element = toElement(node);
2127             const AtomicString& idattr = element->getIdAttribute();
2128             bool hasIdAttr = !idattr.isNull() && !idattr.isEmpty();
2129             if (node->previousSibling() || node->nextSibling()) {
2130                 int count = 0;
2131                 for (Node* previous = node->previousSibling(); previous; previous = previous->previousSibling())
2132                     if (previous->nodeName() == node->nodeName())
2133                         ++count;
2134                 if (hasIdAttr)
2135                     fprintf(stderr, "[@id=\"%s\" and position()=%d]", idattr.string().utf8().data(), count);
2136                 else
2137                     fprintf(stderr, "[%d]", count);
2138             } else if (hasIdAttr)
2139                 fprintf(stderr, "[@id=\"%s\"]", idattr.string().utf8().data());
2140             break;
2141         }
2142         case TEXT_NODE:
2143             fprintf(stderr, "/text()");
2144             break;
2145         case ATTRIBUTE_NODE:
2146             fprintf(stderr, "/@%s", node->nodeName().utf8().data());
2147             break;
2148         default:
2149             break;
2150         }
2151     }
2152     fprintf(stderr, "\n");
2153 }
2154
2155 static void traverseTreeAndMark(const String& baseIndent, const Node* rootNode, const Node* markedNode1, const char* markedLabel1, const Node* markedNode2, const char* markedLabel2)
2156 {
2157     for (const Node* node = rootNode; node; node = node->traverseNextNode()) {
2158         if (node == markedNode1)
2159             fprintf(stderr, "%s", markedLabel1);
2160         if (node == markedNode2)
2161             fprintf(stderr, "%s", markedLabel2);
2162
2163         String indent = baseIndent;
2164         for (const Node* tmpNode = node; tmpNode && tmpNode != rootNode; tmpNode = tmpNode->parentOrHostNode())
2165             indent += "\t";
2166         fprintf(stderr, "%s", indent.utf8().data());
2167         node->showNode();
2168         if (node->isShadowRoot()) {
2169             if (ShadowRoot* youngerShadowRoot = toShadowRoot(node)->youngerShadowRoot())
2170                 traverseTreeAndMark(indent + "\t", youngerShadowRoot, markedNode1, markedLabel1, markedNode2, markedLabel2);
2171         } else if (ShadowRoot* oldestShadowRoot = oldestShadowRootFor(node))
2172             traverseTreeAndMark(indent + "\t", oldestShadowRoot, markedNode1, markedLabel1, markedNode2, markedLabel2);
2173     }
2174 }
2175
2176 void Node::showTreeAndMark(const Node* markedNode1, const char* markedLabel1, const Node* markedNode2, const char* markedLabel2) const
2177 {
2178     const Node* rootNode;
2179     const Node* node = this;
2180     while (node->parentOrHostNode() && !node->hasTagName(bodyTag))
2181         node = node->parentOrHostNode();
2182     rootNode = node;
2183
2184     String startingIndent;
2185     traverseTreeAndMark(startingIndent, rootNode, markedNode1, markedLabel1, markedNode2, markedLabel2);
2186 }
2187
2188 void Node::formatForDebugger(char* buffer, unsigned length) const
2189 {
2190     String result;
2191     String s;
2192     
2193     s = nodeName();
2194     if (s.length() == 0)
2195         result += "<none>";
2196     else
2197         result += s;
2198           
2199     strncpy(buffer, result.utf8().data(), length - 1);
2200 }
2201
2202 static ContainerNode* parentOrHostOrFrameOwner(const Node* node)
2203 {
2204     ContainerNode* parent = node->parentOrHostNode();
2205     if (!parent && node->document() && node->document()->frame())
2206         parent = node->document()->frame()->ownerElement();
2207     return parent;
2208 }
2209
2210 static void showSubTreeAcrossFrame(const Node* node, const Node* markedNode, const String& indent)
2211 {
2212     if (node == markedNode)
2213         fputs("*", stderr);
2214     fputs(indent.utf8().data(), stderr);
2215     node->showNode();
2216      if (node->isShadowRoot()) {
2217          if (ShadowRoot* youngerShadowRoot = toShadowRoot(node)->youngerShadowRoot())
2218              showSubTreeAcrossFrame(youngerShadowRoot, markedNode, indent + "\t");
2219      } else {
2220          if (node->isFrameOwnerElement())
2221              showSubTreeAcrossFrame(static_cast<const HTMLFrameOwnerElement*>(node)->contentDocument(), markedNode, indent + "\t");
2222          if (ShadowRoot* oldestShadowRoot = oldestShadowRootFor(node))
2223              showSubTreeAcrossFrame(oldestShadowRoot, markedNode, indent + "\t");
2224      }
2225     for (Node* child = node->firstChild(); child; child = child->nextSibling())
2226         showSubTreeAcrossFrame(child, markedNode, indent + "\t");
2227 }
2228
2229 void Node::showTreeForThisAcrossFrame() const
2230 {
2231     Node* rootNode = const_cast<Node*>(this);
2232     while (parentOrHostOrFrameOwner(rootNode))
2233         rootNode = parentOrHostOrFrameOwner(rootNode);
2234     showSubTreeAcrossFrame(rootNode, this, "");
2235 }
2236
2237 #endif
2238
2239 // --------
2240
2241 void NodeListsNodeData::invalidateCaches(const QualifiedName* attrName)
2242 {
2243     NodeListAtomicNameCacheMap::const_iterator atomicNameCacheEnd = m_atomicNameCaches.end();
2244     for (NodeListAtomicNameCacheMap::const_iterator it = m_atomicNameCaches.begin(); it != atomicNameCacheEnd; ++it) {
2245         if (!attrName || it->second->shouldInvalidateOnAttributeChange())
2246             it->second->invalidateCache();
2247     }
2248
2249     NodeListNameCacheMap::const_iterator nameCacheEnd = m_nameCaches.end();
2250     for (NodeListNameCacheMap::const_iterator it = m_nameCaches.begin(); it != nameCacheEnd; ++it) {
2251         if (!attrName || it->second->shouldInvalidateOnAttributeChange())
2252             it->second->invalidateCache();
2253     }
2254
2255     if (!attrName)
2256         return;
2257
2258     TagNodeListCacheNS::iterator tagCacheEnd = m_tagNodeListCacheNS.end();
2259     for (TagNodeListCacheNS::iterator it = m_tagNodeListCacheNS.begin(); it != tagCacheEnd; ++it)
2260         it->second->invalidateCache();
2261 }
2262
2263 void Node::getSubresourceURLs(ListHashSet<KURL>& urls) const
2264 {
2265     addSubresourceAttributeURLs(urls);
2266 }
2267
2268 Node* Node::enclosingLinkEventParentOrSelf()
2269 {
2270     for (Node* node = this; node; node = node->parentOrHostNode()) {
2271         // For imagemaps, the enclosing link node is the associated area element not the image itself.
2272         // So we don't let images be the enclosingLinkNode, even though isLink sometimes returns true
2273         // for them.
2274         if (node->isLink() && !node->hasTagName(imgTag))
2275             return node;
2276     }
2277
2278     return 0;
2279 }
2280
2281 const AtomicString& Node::interfaceName() const
2282 {
2283     return eventNames().interfaceForNode;
2284 }
2285
2286 ScriptExecutionContext* Node::scriptExecutionContext() const
2287 {
2288     return document();
2289 }
2290
2291 Node::InsertionNotificationRequest Node::insertedInto(ContainerNode* insertionPoint)
2292 {
2293     ASSERT(insertionPoint->inDocument() || isContainerNode());
2294     if (insertionPoint->inDocument())
2295         setFlag(InDocumentFlag);
2296     return InsertionDone;
2297 }
2298
2299 void Node::removedFrom(ContainerNode* insertionPoint)
2300 {
2301     ASSERT(insertionPoint->inDocument() || isContainerNode());
2302     if (insertionPoint->inDocument())
2303         clearFlag(InDocumentFlag);
2304 }
2305
2306 void Node::didMoveToNewDocument(Document* oldDocument)
2307 {
2308     TreeScopeAdopter::ensureDidMoveToNewDocumentWasCalled(oldDocument);
2309
2310     // FIXME: Event listener types for this node should be set on the new owner document here.
2311
2312 #if ENABLE(MUTATION_OBSERVERS)
2313     if (Vector<OwnPtr<MutationObserverRegistration> >* registry = mutationObserverRegistry()) {
2314         for (size_t i = 0; i < registry->size(); ++i) {
2315             document()->addMutationObserverTypes(registry->at(i)->mutationTypes());
2316         }
2317     }
2318
2319     if (HashSet<MutationObserverRegistration*>* transientRegistry = transientMutationObserverRegistry()) {
2320         for (HashSet<MutationObserverRegistration*>::iterator iter = transientRegistry->begin(); iter != transientRegistry->end(); ++iter) {
2321             document()->addMutationObserverTypes((*iter)->mutationTypes());
2322         }
2323     }
2324 #endif
2325 }
2326
2327 static inline bool tryAddEventListener(Node* targetNode, const AtomicString& eventType, PassRefPtr<EventListener> listener, bool useCapture)
2328 {
2329     if (!targetNode->EventTarget::addEventListener(eventType, listener, useCapture))
2330         return false;
2331
2332     if (Document* document = targetNode->document()) {
2333         document->addListenerTypeIfNeeded(eventType);
2334         if (eventType == eventNames().mousewheelEvent)
2335             document->didAddWheelEventHandler();
2336         else if (eventNames().isTouchEventType(eventType))
2337             document->didAddTouchEventHandler();
2338     }
2339
2340     return true;
2341 }
2342
2343 bool Node::addEventListener(const AtomicString& eventType, PassRefPtr<EventListener> listener, bool useCapture)
2344 {
2345     return tryAddEventListener(this, eventType, listener, useCapture);
2346 }
2347
2348 static inline bool tryRemoveEventListener(Node* targetNode, const AtomicString& eventType, EventListener* listener, bool useCapture)
2349 {
2350     if (!targetNode->EventTarget::removeEventListener(eventType, listener, useCapture))
2351         return false;
2352
2353     // FIXME: Notify Document that the listener has vanished. We need to keep track of a number of
2354     // listeners for each type, not just a bool - see https://bugs.webkit.org/show_bug.cgi?id=33861
2355     if (Document* document = targetNode->document()) {
2356         if (eventType == eventNames().mousewheelEvent)
2357             document->didRemoveWheelEventHandler();
2358         else if (eventNames().isTouchEventType(eventType))
2359             document->didRemoveTouchEventHandler();
2360     }
2361
2362     return true;
2363 }
2364
2365 bool Node::removeEventListener(const AtomicString& eventType, EventListener* listener, bool useCapture)
2366 {
2367     return tryRemoveEventListener(this, eventType, listener, useCapture);
2368 }
2369
2370 EventTargetData* Node::eventTargetData()
2371 {
2372     return hasRareData() ? rareData()->eventTargetData() : 0;
2373 }
2374
2375 EventTargetData* Node::ensureEventTargetData()
2376 {
2377     return ensureRareData()->ensureEventTargetData();
2378 }
2379
2380 #if ENABLE(MUTATION_OBSERVERS)
2381 Vector<OwnPtr<MutationObserverRegistration> >* Node::mutationObserverRegistry()
2382 {
2383     return hasRareData() ? rareData()->mutationObserverRegistry() : 0;
2384 }
2385
2386 HashSet<MutationObserverRegistration*>* Node::transientMutationObserverRegistry()
2387 {
2388     return hasRareData() ? rareData()->transientMutationObserverRegistry() : 0;
2389 }
2390
2391 void Node::collectMatchingObserversForMutation(HashMap<WebKitMutationObserver*, MutationRecordDeliveryOptions>& observers, Node* fromNode, WebKitMutationObserver::MutationType type, const QualifiedName* attributeName)
2392 {
2393     ASSERT((type == WebKitMutationObserver::Attributes && attributeName) || !attributeName);
2394     if (Vector<OwnPtr<MutationObserverRegistration> >* registry = fromNode->mutationObserverRegistry()) {
2395         const size_t size = registry->size();
2396         for (size_t i = 0; i < size; ++i) {
2397             MutationObserverRegistration* registration = registry->at(i).get();
2398             if (registration->shouldReceiveMutationFrom(this, type, attributeName)) {
2399                 MutationRecordDeliveryOptions deliveryOptions = registration->deliveryOptions();
2400                 HashMap<WebKitMutationObserver*, MutationRecordDeliveryOptions>::AddResult result = observers.add(registration->observer(), deliveryOptions);
2401                 if (!result.isNewEntry)
2402                     result.iterator->second |= deliveryOptions;
2403
2404             }
2405         }
2406     }
2407
2408     if (HashSet<MutationObserverRegistration*>* transientRegistry = fromNode->transientMutationObserverRegistry()) {
2409         for (HashSet<MutationObserverRegistration*>::iterator iter = transientRegistry->begin(); iter != transientRegistry->end(); ++iter) {
2410             MutationObserverRegistration* registration = *iter;
2411             if (registration->shouldReceiveMutationFrom(this, type, attributeName)) {
2412                 MutationRecordDeliveryOptions deliveryOptions = registration->deliveryOptions();
2413                 HashMap<WebKitMutationObserver*, MutationRecordDeliveryOptions>::AddResult result = observers.add(registration->observer(), deliveryOptions);
2414                 if (!result.isNewEntry)
2415                     result.iterator->second |= deliveryOptions;
2416             }
2417         }
2418     }
2419 }
2420
2421 void Node::getRegisteredMutationObserversOfType(HashMap<WebKitMutationObserver*, MutationRecordDeliveryOptions>& observers, WebKitMutationObserver::MutationType type, const QualifiedName* attributeName)
2422 {
2423     ASSERT((type == WebKitMutationObserver::Attributes && attributeName) || !attributeName);
2424     collectMatchingObserversForMutation(observers, this, type, attributeName);
2425     for (Node* node = parentNode(); node; node = node->parentNode())
2426         collectMatchingObserversForMutation(observers, node, type, attributeName);
2427 }
2428
2429 MutationObserverRegistration* Node::registerMutationObserver(PassRefPtr<WebKitMutationObserver> observer)
2430 {
2431     Vector<OwnPtr<MutationObserverRegistration> >* registry = ensureRareData()->ensureMutationObserverRegistry();
2432     for (size_t i = 0; i < registry->size(); ++i) {
2433         if (registry->at(i)->observer() == observer)
2434             return registry->at(i).get();
2435     }
2436
2437     OwnPtr<MutationObserverRegistration> registration = MutationObserverRegistration::create(observer, this);
2438     MutationObserverRegistration* registrationPtr = registration.get();
2439     registry->append(registration.release());
2440     return registrationPtr;
2441 }
2442
2443 void Node::unregisterMutationObserver(MutationObserverRegistration* registration)
2444 {
2445     Vector<OwnPtr<MutationObserverRegistration> >* registry = mutationObserverRegistry();
2446     ASSERT(registry);
2447     if (!registry)
2448         return;
2449
2450     size_t index = registry->find(registration);
2451     ASSERT(index != notFound);
2452     if (index == notFound)
2453         return;
2454
2455     registry->remove(index);
2456 }
2457
2458 void Node::registerTransientMutationObserver(MutationObserverRegistration* registration)
2459 {
2460     ensureRareData()->ensureTransientMutationObserverRegistry()->add(registration);
2461 }
2462
2463 void Node::unregisterTransientMutationObserver(MutationObserverRegistration* registration)
2464 {
2465     HashSet<MutationObserverRegistration*>* transientRegistry = transientMutationObserverRegistry();
2466     ASSERT(transientRegistry);
2467     if (!transientRegistry)
2468         return;
2469
2470     ASSERT(transientRegistry->contains(registration));
2471     transientRegistry->remove(registration);
2472 }
2473
2474 void Node::notifyMutationObserversNodeWillDetach()
2475 {
2476     if (!document()->hasMutationObservers())
2477         return;
2478
2479     for (Node* node = parentNode(); node; node = node->parentNode()) {
2480         if (Vector<OwnPtr<MutationObserverRegistration> >* registry = node->mutationObserverRegistry()) {
2481             const size_t size = registry->size();
2482             for (size_t i = 0; i < size; ++i)
2483                 registry->at(i)->observedSubtreeNodeWillDetach(this);
2484         }
2485
2486         if (HashSet<MutationObserverRegistration*>* transientRegistry = node->transientMutationObserverRegistry()) {
2487             for (HashSet<MutationObserverRegistration*>::iterator iter = transientRegistry->begin(); iter != transientRegistry->end(); ++iter)
2488                 (*iter)->observedSubtreeNodeWillDetach(this);
2489         }
2490     }
2491 }
2492 #endif // ENABLE(MUTATION_OBSERVERS)
2493
2494 #if ENABLE(STYLE_SCOPED)
2495 bool Node::hasScopedHTMLStyleChild() const
2496 {
2497     return hasRareData() && rareData()->hasScopedHTMLStyleChild();
2498 }
2499
2500 size_t Node::numberOfScopedHTMLStyleChildren() const
2501 {
2502     return hasRareData() ? rareData()->numberOfScopedHTMLStyleChildren() : 0;
2503 }
2504
2505 void Node::registerScopedHTMLStyleChild()
2506 {
2507     ensureRareData()->registerScopedHTMLStyleChild();
2508 }
2509
2510 void Node::unregisterScopedHTMLStyleChild()
2511 {
2512     ASSERT(hasRareData());
2513     if (hasRareData())
2514         rareData()->unregisterScopedHTMLStyleChild();
2515 }
2516 #else
2517 bool Node::hasScopedHTMLStyleChild() const
2518 {
2519     return 0;
2520 }
2521
2522 size_t Node::numberOfScopedHTMLStyleChildren() const
2523 {
2524     return 0;
2525 }
2526 #endif
2527
2528 void Node::handleLocalEvents(Event* event)
2529 {
2530     if (!hasRareData() || !rareData()->eventTargetData())
2531         return;
2532
2533     if (disabled() && event->isMouseEvent())
2534         return;
2535
2536     fireEventListeners(event);
2537 }
2538
2539 void Node::dispatchScopedEvent(PassRefPtr<Event> event)
2540 {
2541     dispatchScopedEventDispatchMediator(EventDispatchMediator::create(event));
2542 }
2543
2544 void Node::dispatchScopedEventDispatchMediator(PassRefPtr<EventDispatchMediator> eventDispatchMediator)
2545 {
2546     EventDispatcher::dispatchScopedEvent(this, eventDispatchMediator);
2547 }
2548
2549 bool Node::dispatchEvent(PassRefPtr<Event> event)
2550 {
2551     return EventDispatcher::dispatchEvent(this, EventDispatchMediator::create(event));
2552 }
2553
2554 void Node::dispatchRegionLayoutUpdateEvent()
2555 {
2556     ASSERT(!eventDispatchForbidden());
2557
2558     if (!document()->hasListenerType(Document::REGIONLAYOUTUPDATE_LISTENER))
2559         return;
2560
2561     dispatchScopedEvent(UIEvent::create(eventNames().webkitRegionLayoutUpdateEvent, true, true, document()->defaultView(), 0));
2562 }
2563
2564 void Node::dispatchSubtreeModifiedEvent()
2565 {
2566     if (isInShadowTree())
2567         return;
2568
2569     ASSERT(!eventDispatchForbidden());
2570
2571     if (!document()->hasListenerType(Document::DOMSUBTREEMODIFIED_LISTENER))
2572         return;
2573
2574     dispatchScopedEvent(MutationEvent::create(eventNames().DOMSubtreeModifiedEvent, true));
2575 }
2576
2577 void Node::dispatchFocusInEvent(const AtomicString& eventType, PassRefPtr<Node> oldFocusedNode)
2578 {
2579     ASSERT(!eventDispatchForbidden());
2580     ASSERT(eventType == eventNames().focusinEvent || eventType == eventNames().DOMFocusInEvent);
2581     dispatchScopedEventDispatchMediator(FocusInEventDispatchMediator::create(UIEvent::create(eventType, true, false, document()->defaultView(), 0), oldFocusedNode));
2582 }
2583
2584 void Node::dispatchFocusOutEvent(const AtomicString& eventType, PassRefPtr<Node> newFocusedNode)
2585 {
2586     ASSERT(!eventDispatchForbidden());
2587     ASSERT(eventType == eventNames().focusoutEvent || eventType == eventNames().DOMFocusOutEvent);
2588     dispatchScopedEventDispatchMediator(FocusOutEventDispatchMediator::create(UIEvent::create(eventType, true, false, document()->defaultView(), 0), newFocusedNode));
2589 }
2590
2591 bool Node::dispatchDOMActivateEvent(int detail, PassRefPtr<Event> underlyingEvent)
2592 {
2593     ASSERT(!eventDispatchForbidden());
2594     RefPtr<UIEvent> event = UIEvent::create(eventNames().DOMActivateEvent, true, true, document()->defaultView(), detail);
2595     event->setUnderlyingEvent(underlyingEvent);
2596     dispatchScopedEvent(event);
2597     return event->defaultHandled();
2598 }
2599
2600 bool Node::dispatchKeyEvent(const PlatformKeyboardEvent& event)
2601 {
2602     return EventDispatcher::dispatchEvent(this, KeyboardEventDispatchMediator::create(KeyboardEvent::create(event, document()->defaultView())));
2603 }
2604
2605 bool Node::dispatchMouseEvent(const PlatformMouseEvent& event, const AtomicString& eventType,
2606     int detail, Node* relatedTarget)
2607 {
2608     return EventDispatcher::dispatchEvent(this, MouseEventDispatchMediator::create(MouseEvent::create(eventType, document()->defaultView(), event, detail, relatedTarget)));
2609 }
2610
2611 void Node::dispatchSimulatedClick(PassRefPtr<Event> event, bool sendMouseEvents, bool showPressedLook)
2612 {
2613     EventDispatcher::dispatchSimulatedClick(this, event, sendMouseEvents, showPressedLook);
2614 }
2615
2616 bool Node::dispatchBeforeLoadEvent(const String& sourceURL)
2617 {
2618     if (!document()->hasListenerType(Document::BEFORELOAD_LISTENER))
2619         return true;
2620
2621     RefPtr<Node> protector(this);
2622     RefPtr<BeforeLoadEvent> beforeLoadEvent = BeforeLoadEvent::create(sourceURL);
2623     dispatchEvent(beforeLoadEvent.get());
2624     return !beforeLoadEvent->defaultPrevented();
2625 }
2626
2627 bool Node::dispatchWheelEvent(const PlatformWheelEvent& event)
2628 {
2629     return EventDispatcher::dispatchEvent(this, WheelEventDispatchMediator::create(event, document()->defaultView()));
2630 }
2631
2632 void Node::dispatchFocusEvent(PassRefPtr<Node> oldFocusedNode)
2633 {
2634     if (document()->page())
2635         document()->page()->chrome()->client()->elementDidFocus(this);
2636     
2637     EventDispatcher::dispatchEvent(this, FocusEventDispatchMediator::create(oldFocusedNode));
2638 }
2639
2640 void Node::dispatchBlurEvent(PassRefPtr<Node> newFocusedNode)
2641 {
2642     if (document()->page())
2643         document()->page()->chrome()->client()->elementDidBlur(this);
2644
2645     EventDispatcher::dispatchEvent(this, BlurEventDispatchMediator::create(newFocusedNode));
2646 }
2647
2648 void Node::dispatchChangeEvent()
2649 {
2650     dispatchEvent(Event::create(eventNames().changeEvent, true, false));
2651 }
2652
2653 void Node::dispatchInputEvent()
2654 {
2655     dispatchEvent(Event::create(eventNames().inputEvent, true, false));
2656 }
2657
2658 bool Node::disabled() const
2659 {
2660     return false;
2661 }
2662
2663 void Node::defaultEventHandler(Event* event)
2664 {
2665     if (event->target() != this)
2666         return;
2667     const AtomicString& eventType = event->type();
2668     if (eventType == eventNames().keydownEvent || eventType == eventNames().keypressEvent) {
2669         if (event->isKeyboardEvent())
2670             if (Frame* frame = document()->frame())
2671                 frame->eventHandler()->defaultKeyboardEventHandler(static_cast<KeyboardEvent*>(event));
2672     } else if (eventType == eventNames().clickEvent) {
2673         int detail = event->isUIEvent() ? static_cast<UIEvent*>(event)->detail() : 0;
2674         if (dispatchDOMActivateEvent(detail, event))
2675             event->setDefaultHandled();
2676 #if ENABLE(CONTEXT_MENUS)
2677     } else if (eventType == eventNames().contextmenuEvent) {
2678         if (Frame* frame = document()->frame())
2679             if (Page* page = frame->page())
2680                 page->contextMenuController()->handleContextMenuEvent(event);
2681 #endif
2682     } else if (eventType == eventNames().textInputEvent) {
2683         if (event->hasInterface(eventNames().interfaceForTextEvent))
2684             if (Frame* frame = document()->frame())
2685                 frame->eventHandler()->defaultTextInputEventHandler(static_cast<TextEvent*>(event));
2686 #if ENABLE(PAN_SCROLLING)
2687     } else if (eventType == eventNames().mousedownEvent && event->isMouseEvent()) {
2688         MouseEvent* mouseEvent = static_cast<MouseEvent*>(event);
2689         if (mouseEvent->button() == MiddleButton) {
2690             if (enclosingLinkEventParentOrSelf())
2691                 return;
2692
2693             RenderObject* renderer = this->renderer();
2694             while (renderer && (!renderer->isBox() || !toRenderBox(renderer)->canBeScrolledAndHasScrollableArea()))
2695                 renderer = renderer->parent();
2696
2697             if (renderer) {
2698                 if (Frame* frame = document()->frame())
2699                     frame->eventHandler()->startPanScrolling(renderer);
2700             }
2701         }
2702 #endif
2703     } else if (eventType == eventNames().mousewheelEvent && event->hasInterface(eventNames().interfaceForWheelEvent)) {
2704         WheelEvent* wheelEvent = static_cast<WheelEvent*>(event);
2705         
2706         // If we don't have a renderer, send the wheel event to the first node we find with a renderer.
2707         // This is needed for <option> and <optgroup> elements so that <select>s get a wheel scroll.
2708         Node* startNode = this;
2709         while (startNode && !startNode->renderer())
2710             startNode = startNode->parentOrHostNode();
2711         
2712         if (startNode && startNode->renderer())
2713             if (Frame* frame = document()->frame())
2714                 frame->eventHandler()->defaultWheelEventHandler(startNode, wheelEvent);
2715     } else if (event->type() == eventNames().webkitEditableContentChangedEvent) {
2716         dispatchInputEvent();
2717     }
2718 }
2719
2720 #if ENABLE(MICRODATA)
2721 DOMSettableTokenList* Node::itemProp()
2722 {
2723     return ensureRareData()->itemProp();
2724 }
2725
2726 void Node::setItemProp(const String& value)
2727 {
2728     ensureRareData()->setItemProp(value);
2729 }
2730
2731 DOMSettableTokenList* Node::itemRef()
2732 {
2733     return ensureRareData()->itemRef();
2734 }
2735
2736 void Node::setItemRef(const String& value)
2737 {
2738     ensureRareData()->setItemRef(value);
2739 }
2740
2741 DOMSettableTokenList* Node::itemType()
2742 {
2743     return ensureRareData()->itemType();
2744 }
2745
2746 void Node::setItemType(const String& value)
2747 {
2748     ensureRareData()->setItemType(value);
2749 }
2750
2751 HTMLPropertiesCollection* Node::properties()
2752 {
2753     return ensureRareData()->properties(this);
2754 }
2755 #endif
2756
2757 void NodeRareData::createNodeLists(Node* node)
2758 {
2759     ASSERT(node);
2760     setNodeLists(NodeListsNodeData::create());
2761     if (TreeScope* treeScope = node->treeScope())
2762         treeScope->addNodeListCache();
2763 }
2764
2765 void NodeRareData::clearChildNodeListCache()
2766 {
2767     if (m_childNodeList)
2768         m_childNodeList->invalidateCache();
2769 }
2770
2771 // It's important not to inline removedLastRef, because we don't want to inline the code to
2772 // delete a Node at each deref call site.
2773 void Node::removedLastRef()
2774 {
2775     // An explicit check for Document here is better than a virtual function since it is
2776     // faster for non-Document nodes, and because the call to removedLastRef that is inlined
2777     // at all deref call sites is smaller if it's a non-virtual function.
2778     if (isDocumentNode()) {
2779         static_cast<Document*>(this)->removedLastRef();
2780         return;
2781     }
2782 #ifndef NDEBUG
2783     m_deletionHasBegun = true;
2784 #endif
2785     delete this;
2786 }
2787
2788 } // namespace WebCore
2789
2790 #ifndef NDEBUG
2791
2792 void showTree(const WebCore::Node* node)
2793 {
2794     if (node)
2795         node->showTreeForThis();
2796 }
2797
2798 void showNodePath(const WebCore::Node* node)
2799 {
2800     if (node)
2801         node->showNodePathForThis();
2802 }
2803
2804 #endif