Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(303)

Side by Side Diff: Source/core/dom/Node.cpp

Issue 23819007: Have Node::document() return a reference instead of a pointer (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebase on master Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/dom/Node.h ('k') | Source/core/dom/NodeIterator.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Dirk Mueller (mueller@kde.org) 4 * (C) 2001 Dirk Mueller (mueller@kde.org)
5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r ights reserved. 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r ights reserved.
6 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 6 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
7 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) 7 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/)
8 * 8 *
9 * This library is free software; you can redistribute it and/or 9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public 10 * modify it under the terms of the GNU Library General Public
(...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after
593 593
594 // Remove empty text nodes. 594 // Remove empty text nodes.
595 if (!nextText->length()) { 595 if (!nextText->length()) {
596 nextText->remove(IGNORE_EXCEPTION); 596 nextText->remove(IGNORE_EXCEPTION);
597 continue; 597 continue;
598 } 598 }
599 599
600 // Both non-empty text nodes. Merge them. 600 // Both non-empty text nodes. Merge them.
601 unsigned offset = text->length(); 601 unsigned offset = text->length();
602 text->appendData(nextText->data()); 602 text->appendData(nextText->data());
603 document()->textNodesMerged(nextText.get(), offset); 603 document().textNodesMerged(nextText.get(), offset);
604 nextText->remove(IGNORE_EXCEPTION); 604 nextText->remove(IGNORE_EXCEPTION);
605 } 605 }
606 606
607 node = NodeTraversal::nextPostOrder(node.get()); 607 node = NodeTraversal::nextPostOrder(node.get());
608 } 608 }
609 } 609 }
610 610
611 const AtomicString& Node::prefix() const 611 const AtomicString& Node::prefix() const
612 { 612 {
613 // For nodes other than elements and attributes, the prefix is always null 613 // For nodes other than elements and attributes, the prefix is always null
(...skipping 13 matching lines...) Expand all
627 return nullAtom; 627 return nullAtom;
628 } 628 }
629 629
630 const AtomicString& Node::namespaceURI() const 630 const AtomicString& Node::namespaceURI() const
631 { 631 {
632 return nullAtom; 632 return nullAtom;
633 } 633 }
634 634
635 bool Node::isContentEditable(UserSelectAllTreatment treatment) 635 bool Node::isContentEditable(UserSelectAllTreatment treatment)
636 { 636 {
637 document()->updateStyleIfNeeded(); 637 document().updateStyleIfNeeded();
638 return rendererIsEditable(Editable, treatment); 638 return rendererIsEditable(Editable, treatment);
639 } 639 }
640 640
641 bool Node::isContentRichlyEditable() 641 bool Node::isContentRichlyEditable()
642 { 642 {
643 document()->updateStyleIfNeeded(); 643 document().updateStyleIfNeeded();
644 return rendererIsEditable(RichlyEditable, UserSelectAllIsAlwaysNonEditable); 644 return rendererIsEditable(RichlyEditable, UserSelectAllIsAlwaysNonEditable);
645 } 645 }
646 646
647 bool Node::rendererIsEditable(EditableLevel editableLevel, UserSelectAllTreatmen t treatment) const 647 bool Node::rendererIsEditable(EditableLevel editableLevel, UserSelectAllTreatmen t treatment) const
648 { 648 {
649 if (isPseudoElement()) 649 if (isPseudoElement())
650 return false; 650 return false;
651 651
652 // Ideally we'd call ASSERT(!needsStyleRecalc()) here, but 652 // Ideally we'd call ASSERT(!needsStyleRecalc()) here, but
653 // ContainerNode::setFocus() calls setNeedsStyleRecalc(), so the assertion 653 // ContainerNode::setFocus() calls setNeedsStyleRecalc(), so the assertion
(...skipping 23 matching lines...) Expand all
677 677
678 bool Node::isEditableToAccessibility(EditableLevel editableLevel) const 678 bool Node::isEditableToAccessibility(EditableLevel editableLevel) const
679 { 679 {
680 if (rendererIsEditable(editableLevel)) 680 if (rendererIsEditable(editableLevel))
681 return true; 681 return true;
682 682
683 // FIXME: Respect editableLevel for ARIA editable elements. 683 // FIXME: Respect editableLevel for ARIA editable elements.
684 if (editableLevel == RichlyEditable) 684 if (editableLevel == RichlyEditable)
685 return false; 685 return false;
686 686
687 ASSERT(document());
688 ASSERT(AXObjectCache::accessibilityEnabled()); 687 ASSERT(AXObjectCache::accessibilityEnabled());
689 ASSERT(document()->existingAXObjectCache()); 688 ASSERT(document().existingAXObjectCache());
690 689
691 if (AXObjectCache* cache = document()->existingAXObjectCache()) 690 if (AXObjectCache* cache = document().existingAXObjectCache())
692 return cache->rootAXEditableElement(this); 691 return cache->rootAXEditableElement(this);
693 692
694 return false; 693 return false;
695 } 694 }
696 695
697 bool Node::shouldUseInputMethod() 696 bool Node::shouldUseInputMethod()
698 { 697 {
699 return isContentEditable(UserSelectAllIsAlwaysNonEditable); 698 return isContentEditable(UserSelectAllIsAlwaysNonEditable);
700 } 699 }
701 700
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
785 784
786 void Node::setIsLink(bool isLink) 785 void Node::setIsLink(bool isLink)
787 { 786 {
788 setFlag(isLink && !SVGImage::isInSVGImage(toElement(this)), IsLinkFlag); 787 setFlag(isLink && !SVGImage::isInSVGImage(toElement(this)), IsLinkFlag);
789 } 788 }
790 789
791 void Node::markAncestorsWithChildNeedsDistributionRecalc() 790 void Node::markAncestorsWithChildNeedsDistributionRecalc()
792 { 791 {
793 for (Node* node = this; node && !node->childNeedsDistributionRecalc(); node = node->parentOrShadowHostNode()) 792 for (Node* node = this; node && !node->childNeedsDistributionRecalc(); node = node->parentOrShadowHostNode())
794 node->setChildNeedsDistributionRecalc(); 793 node->setChildNeedsDistributionRecalc();
795 if (document()->childNeedsDistributionRecalc()) 794 if (document().childNeedsDistributionRecalc())
796 document()->scheduleStyleRecalc(); 795 document().scheduleStyleRecalc();
797 } 796 }
798 797
799 inline void Node::setStyleChange(StyleChangeType changeType) 798 inline void Node::setStyleChange(StyleChangeType changeType)
800 { 799 {
801 m_nodeFlags = (m_nodeFlags & ~StyleChangeMask) | changeType; 800 m_nodeFlags = (m_nodeFlags & ~StyleChangeMask) | changeType;
802 } 801 }
803 802
804 inline void Node::markAncestorsWithChildNeedsStyleRecalc() 803 inline void Node::markAncestorsWithChildNeedsStyleRecalc()
805 { 804 {
806 for (ContainerNode* p = parentOrShadowHostNode(); p && !p->childNeedsStyleRe calc(); p = p->parentOrShadowHostNode()) 805 for (ContainerNode* p = parentOrShadowHostNode(); p && !p->childNeedsStyleRe calc(); p = p->parentOrShadowHostNode())
807 p->setChildNeedsStyleRecalc(); 806 p->setChildNeedsStyleRecalc();
808 807
809 if (document()->needsStyleRecalc() || document()->childNeedsStyleRecalc()) 808 if (document().needsStyleRecalc() || document().childNeedsStyleRecalc())
810 document()->scheduleStyleRecalc(); 809 document().scheduleStyleRecalc();
811 } 810 }
812 811
813 void Node::refEventTarget() 812 void Node::refEventTarget()
814 { 813 {
815 ref(); 814 ref();
816 } 815 }
817 816
818 void Node::derefEventTarget() 817 void Node::derefEventTarget()
819 { 818 {
820 deref(); 819 deref();
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
858 } 857 }
859 858
860 bool Node::shouldHaveFocusAppearance() const 859 bool Node::shouldHaveFocusAppearance() const
861 { 860 {
862 ASSERT(focused()); 861 ASSERT(focused());
863 return true; 862 return true;
864 } 863 }
865 864
866 bool Node::isInert() const 865 bool Node::isInert() const
867 { 866 {
868 const HTMLDialogElement* dialog = document()->activeModalDialog(); 867 const HTMLDialogElement* dialog = document().activeModalDialog();
869 if (dialog && !containsIncludingShadowDOM(dialog) && !dialog->containsInclud ingShadowDOM(this)) 868 if (dialog && !containsIncludingShadowDOM(dialog) && !dialog->containsInclud ingShadowDOM(this))
870 return true; 869 return true;
871 return document()->ownerElement() && document()->ownerElement()->isInert(); 870 return document().ownerElement() && document().ownerElement()->isInert();
872 } 871 }
873 872
874 unsigned Node::nodeIndex() const 873 unsigned Node::nodeIndex() const
875 { 874 {
876 Node *_tempNode = previousSibling(); 875 Node *_tempNode = previousSibling();
877 unsigned count=0; 876 unsigned count=0;
878 for ( count=0; _tempNode; count++ ) 877 for ( count=0; _tempNode; count++ )
879 _tempNode = _tempNode->previousSibling(); 878 _tempNode = _tempNode->previousSibling();
880 return count; 879 return count;
881 } 880 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
918 { 917 {
919 if (hasRareData() && (!attrName || isAttributeNode())) { 918 if (hasRareData() && (!attrName || isAttributeNode())) {
920 if (NodeListsNodeData* lists = rareData()->nodeLists()) 919 if (NodeListsNodeData* lists = rareData()->nodeLists())
921 lists->clearChildNodeListCache(); 920 lists->clearChildNodeListCache();
922 } 921 }
923 922
924 // Modifications to attributes that are not associated with an Element can't invalidate NodeList caches. 923 // Modifications to attributes that are not associated with an Element can't invalidate NodeList caches.
925 if (attrName && !attributeOwnerElement) 924 if (attrName && !attributeOwnerElement)
926 return; 925 return;
927 926
928 if (!document()->shouldInvalidateNodeListCaches(attrName)) 927 if (!document().shouldInvalidateNodeListCaches(attrName))
929 return; 928 return;
930 929
931 document()->invalidateNodeListCaches(attrName); 930 document().invalidateNodeListCaches(attrName);
932 931
933 for (Node* node = this; node; node = node->parentNode()) { 932 for (Node* node = this; node; node = node->parentNode()) {
934 if (!node->hasRareData()) 933 if (!node->hasRareData())
935 continue; 934 continue;
936 NodeRareData* data = node->rareData(); 935 NodeRareData* data = node->rareData();
937 if (data->nodeLists()) 936 if (data->nodeLists())
938 data->nodeLists()->invalidateCaches(attrName); 937 data->nodeLists()->invalidateCaches(attrName);
939 } 938 }
940 } 939 }
941 940
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
994 } 993 }
995 994
996 bool Node::containsIncludingShadowDOM(const Node* node) const 995 bool Node::containsIncludingShadowDOM(const Node* node) const
997 { 996 {
998 if (!node) 997 if (!node)
999 return false; 998 return false;
1000 999
1001 if (this == node) 1000 if (this == node)
1002 return true; 1001 return true;
1003 1002
1004 if (document() != node->document()) 1003 if (&document() != &node->document())
1005 return false; 1004 return false;
1006 1005
1007 if (inDocument() != node->inDocument()) 1006 if (inDocument() != node->inDocument())
1008 return false; 1007 return false;
1009 1008
1010 bool hasChildren = isContainerNode() && toContainerNode(this)->hasChildNodes (); 1009 bool hasChildren = isContainerNode() && toContainerNode(this)->hasChildNodes ();
1011 bool hasShadow = isElementNode() && toElement(this)->shadow(); 1010 bool hasShadow = isElementNode() && toElement(this)->shadow();
1012 if (!hasChildren && !hasShadow) 1011 if (!hasChildren && !hasShadow)
1013 return false; 1012 return false;
1014 1013
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1056 // FIXME: innerHTML and editing should also lazyAttach. 1055 // FIXME: innerHTML and editing should also lazyAttach.
1057 if (node->attached()) 1056 if (node->attached())
1058 node->detach(context); 1057 node->detach(context);
1059 node = NodeTraversal::nextSkippingChildren(node, root); 1058 node = NodeTraversal::nextSkippingChildren(node, root);
1060 } 1059 }
1061 } 1060 }
1062 1061
1063 void Node::reattach(const AttachContext& context) 1062 void Node::reattach(const AttachContext& context)
1064 { 1063 {
1065 // FIXME: Text::updateTextRenderer calls reattach outside a style recalc. 1064 // FIXME: Text::updateTextRenderer calls reattach outside a style recalc.
1066 ASSERT(document()->inStyleRecalc() || isTextNode()); 1065 ASSERT(document().inStyleRecalc() || isTextNode());
1067 AttachContext reattachContext(context); 1066 AttachContext reattachContext(context);
1068 reattachContext.performingReattach = true; 1067 reattachContext.performingReattach = true;
1069 1068
1070 detachNode(this, reattachContext); 1069 detachNode(this, reattachContext);
1071 attach(reattachContext); 1070 attach(reattachContext);
1072 } 1071 }
1073 1072
1074 void Node::attach(const AttachContext&) 1073 void Node::attach(const AttachContext&)
1075 { 1074 {
1076 ASSERT(!attached()); 1075 ASSERT(!attached());
1077 ASSERT(!renderer() || (renderer()->style() && (renderer()->parent() || rende rer()->isRenderView()))); 1076 ASSERT(!renderer() || (renderer()->style() && (renderer()->parent() || rende rer()->isRenderView())));
1078 1077
1079 // If this node got a renderer it may be the previousRenderer() of sibling t ext nodes and thus affect the 1078 // If this node got a renderer it may be the previousRenderer() of sibling t ext nodes and thus affect the
1080 // result of Text::textRendererIsNeeded() for those nodes. 1079 // result of Text::textRendererIsNeeded() for those nodes.
1081 // FIXME: This loop is no longer required once we lazy attach all the time. 1080 // FIXME: This loop is no longer required once we lazy attach all the time.
1082 if (renderer() && !document()->inStyleRecalc()) { 1081 if (renderer() && !document().inStyleRecalc()) {
1083 for (Node* next = nextSibling(); next; next = next->nextSibling()) { 1082 for (Node* next = nextSibling(); next; next = next->nextSibling()) {
1084 if (next->renderer()) 1083 if (next->renderer())
1085 break; 1084 break;
1086 if (!next->attached()) 1085 if (!next->attached())
1087 break; // Assume this means none of the following siblings are a ttached. 1086 break; // Assume this means none of the following siblings are a ttached.
1088 if (!next->isTextNode()) 1087 if (!next->isTextNode())
1089 continue; 1088 continue;
1090 ASSERT(!next->renderer()); 1089 ASSERT(!next->renderer());
1091 toText(next)->reattach(); 1090 toText(next)->reattach();
1092 // If we again decided not to create a renderer for next, we can bai l out the loop, 1091 // If we again decided not to create a renderer for next, we can bai l out the loop,
(...skipping 29 matching lines...) Expand all
1122 detachingNode = this; 1121 detachingNode = this;
1123 #endif 1122 #endif
1124 1123
1125 if (renderer()) 1124 if (renderer())
1126 renderer()->destroyAndCleanupAnonymousWrappers(); 1125 renderer()->destroyAndCleanupAnonymousWrappers();
1127 setRenderer(0); 1126 setRenderer(0);
1128 1127
1129 // Do not remove the element's hovered and active status 1128 // Do not remove the element's hovered and active status
1130 // if performing a reattach. 1129 // if performing a reattach.
1131 if (!context.performingReattach) { 1130 if (!context.performingReattach) {
1132 Document* doc = document(); 1131 Document& doc = document();
1133 if (isUserActionElement()) { 1132 if (isUserActionElement()) {
1134 if (hovered()) 1133 if (hovered())
1135 doc->hoveredNodeDetached(this); 1134 doc.hoveredNodeDetached(this);
1136 if (inActiveChain()) 1135 if (inActiveChain())
1137 doc->activeChainNodeDetached(this); 1136 doc.activeChainNodeDetached(this);
1138 doc->userActionElements().didDetach(this); 1137 doc.userActionElements().didDetach(this);
1139 } 1138 }
1140 } 1139 }
1141 1140
1142 clearAttached(); 1141 clearAttached();
1143 1142
1144 #ifndef NDEBUG 1143 #ifndef NDEBUG
1145 detachingNode = 0; 1144 detachingNode = 0;
1146 #endif 1145 #endif
1147 } 1146 }
1148 1147
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
1222 // We allow selections to begin within an element that has -webkit-user- select: none set, 1221 // We allow selections to begin within an element that has -webkit-user- select: none set,
1223 // but if the element is draggable then dragging should take priority ov er selection. 1222 // but if the element is draggable then dragging should take priority ov er selection.
1224 if (style->userDrag() == DRAG_ELEMENT && style->userSelect() == SELECT_N ONE) 1223 if (style->userDrag() == DRAG_ELEMENT && style->userSelect() == SELECT_N ONE)
1225 return false; 1224 return false;
1226 } 1225 }
1227 return parentOrShadowHostNode() ? parentOrShadowHostNode()->canStartSelectio n() : true; 1226 return parentOrShadowHostNode() ? parentOrShadowHostNode()->canStartSelectio n() : true;
1228 } 1227 }
1229 1228
1230 bool Node::isRegisteredWithNamedFlow() const 1229 bool Node::isRegisteredWithNamedFlow() const
1231 { 1230 {
1232 return document()->renderView()->flowThreadController()->isContentNodeRegist eredWithAnyNamedFlow(this); 1231 return document().renderView()->flowThreadController()->isContentNodeRegiste redWithAnyNamedFlow(this);
1233 } 1232 }
1234 1233
1235 Element* Node::shadowHost() const 1234 Element* Node::shadowHost() const
1236 { 1235 {
1237 if (ShadowRoot* root = containingShadowRoot()) 1236 if (ShadowRoot* root = containingShadowRoot())
1238 return root->host(); 1237 return root->host();
1239 return 0; 1238 return 0;
1240 } 1239 }
1241 1240
1242 Node* Node::deprecatedShadowAncestorNode() const 1241 Node* Node::deprecatedShadowAncestorNode() const
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1312 1311
1313 bool Node::isRootEditableElement() const 1312 bool Node::isRootEditableElement() const
1314 { 1313 {
1315 return rendererIsEditable() && isElementNode() && (!parentNode() || !parentN ode()->rendererIsEditable() 1314 return rendererIsEditable() && isElementNode() && (!parentNode() || !parentN ode()->rendererIsEditable()
1316 || !parentNode()->isElementNode() || hasTagName(bodyTag)); 1315 || !parentNode()->isElementNode() || hasTagName(bodyTag));
1317 } 1316 }
1318 1317
1319 Element* Node::rootEditableElement(EditableType editableType) const 1318 Element* Node::rootEditableElement(EditableType editableType) const
1320 { 1319 {
1321 if (editableType == HasEditableAXRole) { 1320 if (editableType == HasEditableAXRole) {
1322 if (AXObjectCache* cache = document()->existingAXObjectCache()) 1321 if (AXObjectCache* cache = document().existingAXObjectCache())
1323 return const_cast<Element*>(cache->rootAXEditableElement(this)); 1322 return const_cast<Element*>(cache->rootAXEditableElement(this));
1324 } 1323 }
1325 1324
1326 return rootEditableElement(); 1325 return rootEditableElement();
1327 } 1326 }
1328 1327
1329 Element* Node::rootEditableElement() const 1328 Element* Node::rootEditableElement() const
1330 { 1329 {
1331 Element* result = 0; 1330 Element* result = 0;
1332 for (Node* n = const_cast<Node*>(this); n && n->rendererIsEditable(); n = n- >parentNode()) { 1331 for (Node* n = const_cast<Node*>(this); n && n->rendererIsEditable(); n = n- >parentNode()) {
(...skipping 10 matching lines...) Expand all
1343 return n ? enclosingBlockFlowElement() == n->enclosingBlockFlowElement() : f alse; 1342 return n ? enclosingBlockFlowElement() == n->enclosingBlockFlowElement() : f alse;
1344 } 1343 }
1345 1344
1346 // FIXME: End of obviously misplaced HTML editing functions. Try to move these out of Node. 1345 // FIXME: End of obviously misplaced HTML editing functions. Try to move these out of Node.
1347 1346
1348 PassRefPtr<NodeList> Node::getElementsByTagName(const AtomicString& localName) 1347 PassRefPtr<NodeList> Node::getElementsByTagName(const AtomicString& localName)
1349 { 1348 {
1350 if (localName.isNull()) 1349 if (localName.isNull())
1351 return 0; 1350 return 0;
1352 1351
1353 if (document()->isHTMLDocument()) 1352 if (document().isHTMLDocument())
1354 return ensureRareData()->ensureNodeLists()->addCacheWithAtomicName<HTMLT agNodeList>(this, HTMLTagNodeListType, localName); 1353 return ensureRareData()->ensureNodeLists()->addCacheWithAtomicName<HTMLT agNodeList>(this, HTMLTagNodeListType, localName);
1355 return ensureRareData()->ensureNodeLists()->addCacheWithAtomicName<TagNodeLi st>(this, TagNodeListType, localName); 1354 return ensureRareData()->ensureNodeLists()->addCacheWithAtomicName<TagNodeLi st>(this, TagNodeListType, localName);
1356 } 1355 }
1357 1356
1358 PassRefPtr<NodeList> Node::getElementsByTagNameNS(const AtomicString& namespaceU RI, const AtomicString& localName) 1357 PassRefPtr<NodeList> Node::getElementsByTagNameNS(const AtomicString& namespaceU RI, const AtomicString& localName)
1359 { 1358 {
1360 if (localName.isNull()) 1359 if (localName.isNull())
1361 return 0; 1360 return 0;
1362 1361
1363 if (namespaceURI == starAtom) 1362 if (namespaceURI == starAtom)
(...skipping 18 matching lines...) Expand all
1382 return ensureRareData()->ensureNodeLists()->addCacheWithAtomicName<RadioNode List>(this, RadioNodeListType, name); 1381 return ensureRareData()->ensureNodeLists()->addCacheWithAtomicName<RadioNode List>(this, RadioNodeListType, name);
1383 } 1382 }
1384 1383
1385 PassRefPtr<Element> Node::querySelector(const AtomicString& selectors, Exception State& es) 1384 PassRefPtr<Element> Node::querySelector(const AtomicString& selectors, Exception State& es)
1386 { 1385 {
1387 if (selectors.isEmpty()) { 1386 if (selectors.isEmpty()) {
1388 es.throwDOMException(SyntaxError); 1387 es.throwDOMException(SyntaxError);
1389 return 0; 1388 return 0;
1390 } 1389 }
1391 1390
1392 SelectorQuery* selectorQuery = document()->selectorQueryCache()->add(selecto rs, document(), es); 1391 SelectorQuery* selectorQuery = document().selectorQueryCache()->add(selector s, &document(), es);
1393 if (!selectorQuery) 1392 if (!selectorQuery)
1394 return 0; 1393 return 0;
1395 return selectorQuery->queryFirst(this); 1394 return selectorQuery->queryFirst(this);
1396 } 1395 }
1397 1396
1398 PassRefPtr<NodeList> Node::querySelectorAll(const AtomicString& selectors, Excep tionState& es) 1397 PassRefPtr<NodeList> Node::querySelectorAll(const AtomicString& selectors, Excep tionState& es)
1399 { 1398 {
1400 if (selectors.isEmpty()) { 1399 if (selectors.isEmpty()) {
1401 es.throwDOMException(SyntaxError); 1400 es.throwDOMException(SyntaxError);
1402 return 0; 1401 return 0;
1403 } 1402 }
1404 1403
1405 SelectorQuery* selectorQuery = document()->selectorQueryCache()->add(selecto rs, document(), es); 1404 SelectorQuery* selectorQuery = document().selectorQueryCache()->add(selector s, &document(), es);
1406 if (!selectorQuery) 1405 if (!selectorQuery)
1407 return 0; 1406 return 0;
1408 return selectorQuery->queryAll(this); 1407 return selectorQuery->queryAll(this);
1409 } 1408 }
1410 1409
1411 Document* Node::ownerDocument() const 1410 Document* Node::ownerDocument() const
1412 { 1411 {
1413 Document* doc = document(); 1412 Document* doc = &document();
1414 return doc == this ? 0 : doc; 1413 return doc == this ? 0 : doc;
1415 } 1414 }
1416 1415
1417 KURL Node::baseURI() const 1416 KURL Node::baseURI() const
1418 { 1417 {
1419 return parentNode() ? parentNode()->baseURI() : KURL(); 1418 return parentNode() ? parentNode()->baseURI() : KURL();
1420 } 1419 }
1421 1420
1422 bool Node::isEqualNode(Node* other) const 1421 bool Node::isEqualNode(Node* other) const
1423 { 1422 {
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
1703 setNodeValue(text); 1702 setNodeValue(text);
1704 return; 1703 return;
1705 case ELEMENT_NODE: 1704 case ELEMENT_NODE:
1706 case ATTRIBUTE_NODE: 1705 case ATTRIBUTE_NODE:
1707 case ENTITY_NODE: 1706 case ENTITY_NODE:
1708 case DOCUMENT_FRAGMENT_NODE: { 1707 case DOCUMENT_FRAGMENT_NODE: {
1709 RefPtr<ContainerNode> container = toContainerNode(this); 1708 RefPtr<ContainerNode> container = toContainerNode(this);
1710 ChildListMutationScope mutation(this); 1709 ChildListMutationScope mutation(this);
1711 container->removeChildren(); 1710 container->removeChildren();
1712 if (!text.isEmpty()) 1711 if (!text.isEmpty())
1713 container->appendChild(document()->createTextNode(text), es); 1712 container->appendChild(document().createTextNode(text), es);
1714 return; 1713 return;
1715 } 1714 }
1716 case DOCUMENT_NODE: 1715 case DOCUMENT_NODE:
1717 case DOCUMENT_TYPE_NODE: 1716 case DOCUMENT_TYPE_NODE:
1718 case NOTATION_NODE: 1717 case NOTATION_NODE:
1719 case XPATH_NAMESPACE_NODE: 1718 case XPATH_NAMESPACE_NODE:
1720 // Do nothing. 1719 // Do nothing.
1721 return; 1720 return;
1722 } 1721 }
1723 ASSERT_NOT_REACHED(); 1722 ASSERT_NOT_REACHED();
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
2053 result = "<none>"; 2052 result = "<none>";
2054 else 2053 else
2055 result = s; 2054 result = s;
2056 2055
2057 strncpy(buffer, result.utf8().data(), length - 1); 2056 strncpy(buffer, result.utf8().data(), length - 1);
2058 } 2057 }
2059 2058
2060 static ContainerNode* parentOrShadowHostOrFrameOwner(const Node* node) 2059 static ContainerNode* parentOrShadowHostOrFrameOwner(const Node* node)
2061 { 2060 {
2062 ContainerNode* parent = node->parentOrShadowHostNode(); 2061 ContainerNode* parent = node->parentOrShadowHostNode();
2063 if (!parent && node->document()->frame()) 2062 if (!parent && node->document().frame())
2064 parent = node->document()->frame()->ownerElement(); 2063 parent = node->document().frame()->ownerElement();
2065 return parent; 2064 return parent;
2066 } 2065 }
2067 2066
2068 static void showSubTreeAcrossFrame(const Node* node, const Node* markedNode, con st String& indent) 2067 static void showSubTreeAcrossFrame(const Node* node, const Node* markedNode, con st String& indent)
2069 { 2068 {
2070 if (node == markedNode) 2069 if (node == markedNode)
2071 fputs("*", stderr); 2070 fputs("*", stderr);
2072 fputs(indent.utf8().data(), stderr); 2071 fputs(indent.utf8().data(), stderr);
2073 node->showNode(); 2072 node->showNode();
2074 if (node->isShadowRoot()) { 2073 if (node->isShadowRoot()) {
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
2127 return 0; 2126 return 0;
2128 } 2127 }
2129 2128
2130 const AtomicString& Node::interfaceName() const 2129 const AtomicString& Node::interfaceName() const
2131 { 2130 {
2132 return eventNames().interfaceForNode; 2131 return eventNames().interfaceForNode;
2133 } 2132 }
2134 2133
2135 ScriptExecutionContext* Node::scriptExecutionContext() const 2134 ScriptExecutionContext* Node::scriptExecutionContext() const
2136 { 2135 {
2137 return document(); 2136 return &document();
2138 } 2137 }
2139 2138
2140 void Node::didMoveToNewDocument(Document* oldDocument) 2139 void Node::didMoveToNewDocument(Document* oldDocument)
2141 { 2140 {
2142 TreeScopeAdopter::ensureDidMoveToNewDocumentWasCalled(oldDocument); 2141 TreeScopeAdopter::ensureDidMoveToNewDocumentWasCalled(oldDocument);
2143 2142
2144 if (const EventTargetData* eventTargetData = this->eventTargetData()) { 2143 if (const EventTargetData* eventTargetData = this->eventTargetData()) {
2145 const EventListenerMap& listenerMap = eventTargetData->eventListenerMap; 2144 const EventListenerMap& listenerMap = eventTargetData->eventListenerMap;
2146 if (!listenerMap.isEmpty()) { 2145 if (!listenerMap.isEmpty()) {
2147 Vector<AtomicString> types = listenerMap.eventTypes(); 2146 Vector<AtomicString> types = listenerMap.eventTypes();
2148 for (unsigned i = 0; i < types.size(); ++i) 2147 for (unsigned i = 0; i < types.size(); ++i)
2149 document()->addListenerTypeIfNeeded(types[i]); 2148 document().addListenerTypeIfNeeded(types[i]);
2150 } 2149 }
2151 } 2150 }
2152 2151
2153 if (AXObjectCache::accessibilityEnabled() && oldDocument) 2152 if (AXObjectCache::accessibilityEnabled() && oldDocument)
2154 if (AXObjectCache* cache = oldDocument->existingAXObjectCache()) 2153 if (AXObjectCache* cache = oldDocument->existingAXObjectCache())
2155 cache->remove(this); 2154 cache->remove(this);
2156 2155
2157 const EventListenerVector& mousewheelListeners = getEventListeners(eventName s().mousewheelEvent); 2156 const EventListenerVector& mousewheelListeners = getEventListeners(eventName s().mousewheelEvent);
2158 for (size_t i = 0; i < mousewheelListeners.size(); ++i) { 2157 for (size_t i = 0; i < mousewheelListeners.size(); ++i) {
2159 oldDocument->didRemoveWheelEventHandler(); 2158 oldDocument->didRemoveWheelEventHandler();
2160 document()->didAddWheelEventHandler(); 2159 document().didAddWheelEventHandler();
2161 } 2160 }
2162 2161
2163 const EventListenerVector& wheelListeners = getEventListeners(eventNames().w heelEvent); 2162 const EventListenerVector& wheelListeners = getEventListeners(eventNames().w heelEvent);
2164 for (size_t i = 0; i < wheelListeners.size(); ++i) { 2163 for (size_t i = 0; i < wheelListeners.size(); ++i) {
2165 oldDocument->didRemoveWheelEventHandler(); 2164 oldDocument->didRemoveWheelEventHandler();
2166 document()->didAddWheelEventHandler(); 2165 document().didAddWheelEventHandler();
2167 } 2166 }
2168 2167
2169 if (const TouchEventTargetSet* touchHandlers = oldDocument ? oldDocument->to uchEventTargets() : 0) { 2168 if (const TouchEventTargetSet* touchHandlers = oldDocument ? oldDocument->to uchEventTargets() : 0) {
2170 while (touchHandlers->contains(this)) { 2169 while (touchHandlers->contains(this)) {
2171 oldDocument->didRemoveTouchEventHandler(this); 2170 oldDocument->didRemoveTouchEventHandler(this);
2172 document()->didAddTouchEventHandler(this); 2171 document().didAddTouchEventHandler(this);
2173 } 2172 }
2174 } 2173 }
2175 2174
2176 if (Vector<OwnPtr<MutationObserverRegistration> >* registry = mutationObserv erRegistry()) { 2175 if (Vector<OwnPtr<MutationObserverRegistration> >* registry = mutationObserv erRegistry()) {
2177 for (size_t i = 0; i < registry->size(); ++i) { 2176 for (size_t i = 0; i < registry->size(); ++i) {
2178 document()->addMutationObserverTypes(registry->at(i)->mutationTypes( )); 2177 document().addMutationObserverTypes(registry->at(i)->mutationTypes() );
2179 } 2178 }
2180 } 2179 }
2181 2180
2182 if (HashSet<MutationObserverRegistration*>* transientRegistry = transientMut ationObserverRegistry()) { 2181 if (HashSet<MutationObserverRegistration*>* transientRegistry = transientMut ationObserverRegistry()) {
2183 for (HashSet<MutationObserverRegistration*>::iterator iter = transientRe gistry->begin(); iter != transientRegistry->end(); ++iter) { 2182 for (HashSet<MutationObserverRegistration*>::iterator iter = transientRe gistry->begin(); iter != transientRegistry->end(); ++iter) {
2184 document()->addMutationObserverTypes((*iter)->mutationTypes()); 2183 document().addMutationObserverTypes((*iter)->mutationTypes());
2185 } 2184 }
2186 } 2185 }
2187 } 2186 }
2188 2187
2189 static inline bool tryAddEventListener(Node* targetNode, const AtomicString& eve ntType, PassRefPtr<EventListener> listener, bool useCapture) 2188 static inline bool tryAddEventListener(Node* targetNode, const AtomicString& eve ntType, PassRefPtr<EventListener> listener, bool useCapture)
2190 { 2189 {
2191 if (!targetNode->EventTarget::addEventListener(eventType, listener, useCaptu re)) 2190 if (!targetNode->EventTarget::addEventListener(eventType, listener, useCaptu re))
2192 return false; 2191 return false;
2193 2192
2194 Document* document = targetNode->document(); 2193 Document& document = targetNode->document();
2195 document->addListenerTypeIfNeeded(eventType); 2194 document.addListenerTypeIfNeeded(eventType);
2196 if (eventType == eventNames().wheelEvent || eventType == eventNames().mousew heelEvent) 2195 if (eventType == eventNames().wheelEvent || eventType == eventNames().mousew heelEvent)
2197 document->didAddWheelEventHandler(); 2196 document.didAddWheelEventHandler();
2198 else if (eventNames().isTouchEventType(eventType)) 2197 else if (eventNames().isTouchEventType(eventType))
2199 document->didAddTouchEventHandler(targetNode); 2198 document.didAddTouchEventHandler(targetNode);
2200 2199
2201 return true; 2200 return true;
2202 } 2201 }
2203 2202
2204 bool Node::addEventListener(const AtomicString& eventType, PassRefPtr<EventListe ner> listener, bool useCapture) 2203 bool Node::addEventListener(const AtomicString& eventType, PassRefPtr<EventListe ner> listener, bool useCapture)
2205 { 2204 {
2206 return tryAddEventListener(this, eventType, listener, useCapture); 2205 return tryAddEventListener(this, eventType, listener, useCapture);
2207 } 2206 }
2208 2207
2209 static inline bool tryRemoveEventListener(Node* targetNode, const AtomicString& eventType, EventListener* listener, bool useCapture) 2208 static inline bool tryRemoveEventListener(Node* targetNode, const AtomicString& eventType, EventListener* listener, bool useCapture)
2210 { 2209 {
2211 if (!targetNode->EventTarget::removeEventListener(eventType, listener, useCa pture)) 2210 if (!targetNode->EventTarget::removeEventListener(eventType, listener, useCa pture))
2212 return false; 2211 return false;
2213 2212
2214 // FIXME: Notify Document that the listener has vanished. We need to keep tr ack of a number of 2213 // FIXME: Notify Document that the listener has vanished. We need to keep tr ack of a number of
2215 // listeners for each type, not just a bool - see https://bugs.webkit.org/sh ow_bug.cgi?id=33861 2214 // listeners for each type, not just a bool - see https://bugs.webkit.org/sh ow_bug.cgi?id=33861
2216 Document* document = targetNode->document(); 2215 Document& document = targetNode->document();
2217 if (eventType == eventNames().wheelEvent || eventType == eventNames().mousew heelEvent) 2216 if (eventType == eventNames().wheelEvent || eventType == eventNames().mousew heelEvent)
2218 document->didRemoveWheelEventHandler(); 2217 document.didRemoveWheelEventHandler();
2219 else if (eventNames().isTouchEventType(eventType)) 2218 else if (eventNames().isTouchEventType(eventType))
2220 document->didRemoveTouchEventHandler(targetNode); 2219 document.didRemoveTouchEventHandler(targetNode);
2221 2220
2222 return true; 2221 return true;
2223 } 2222 }
2224 2223
2225 bool Node::removeEventListener(const AtomicString& eventType, EventListener* lis tener, bool useCapture) 2224 bool Node::removeEventListener(const AtomicString& eventType, EventListener* lis tener, bool useCapture)
2226 { 2225 {
2227 return tryRemoveEventListener(this, eventType, listener, useCapture); 2226 return tryRemoveEventListener(this, eventType, listener, useCapture);
2228 } 2227 }
2229 2228
2230 typedef HashMap<Node*, OwnPtr<EventTargetData> > EventTargetDataMap; 2229 typedef HashMap<Node*, OwnPtr<EventTargetData> > EventTargetDataMap;
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
2311 registration = registry[i].get(); 2310 registration = registry[i].get();
2312 registration->resetObservation(options, attributeFilter); 2311 registration->resetObservation(options, attributeFilter);
2313 } 2312 }
2314 } 2313 }
2315 2314
2316 if (!registration) { 2315 if (!registration) {
2317 registry.append(MutationObserverRegistration::create(observer, this, opt ions, attributeFilter)); 2316 registry.append(MutationObserverRegistration::create(observer, this, opt ions, attributeFilter));
2318 registration = registry.last().get(); 2317 registration = registry.last().get();
2319 } 2318 }
2320 2319
2321 document()->addMutationObserverTypes(registration->mutationTypes()); 2320 document().addMutationObserverTypes(registration->mutationTypes());
2322 } 2321 }
2323 2322
2324 void Node::unregisterMutationObserver(MutationObserverRegistration* registration ) 2323 void Node::unregisterMutationObserver(MutationObserverRegistration* registration )
2325 { 2324 {
2326 Vector<OwnPtr<MutationObserverRegistration> >* registry = mutationObserverRe gistry(); 2325 Vector<OwnPtr<MutationObserverRegistration> >* registry = mutationObserverRe gistry();
2327 ASSERT(registry); 2326 ASSERT(registry);
2328 if (!registry) 2327 if (!registry)
2329 return; 2328 return;
2330 2329
2331 size_t index = registry->find(registration); 2330 size_t index = registry->find(registration);
(...skipping 19 matching lines...) Expand all
2351 ASSERT(transientRegistry); 2350 ASSERT(transientRegistry);
2352 if (!transientRegistry) 2351 if (!transientRegistry)
2353 return; 2352 return;
2354 2353
2355 ASSERT(transientRegistry->contains(registration)); 2354 ASSERT(transientRegistry->contains(registration));
2356 transientRegistry->remove(registration); 2355 transientRegistry->remove(registration);
2357 } 2356 }
2358 2357
2359 void Node::notifyMutationObserversNodeWillDetach() 2358 void Node::notifyMutationObserversNodeWillDetach()
2360 { 2359 {
2361 if (!document()->hasMutationObservers()) 2360 if (!document().hasMutationObservers())
2362 return; 2361 return;
2363 2362
2364 for (Node* node = parentNode(); node; node = node->parentNode()) { 2363 for (Node* node = parentNode(); node; node = node->parentNode()) {
2365 if (Vector<OwnPtr<MutationObserverRegistration> >* registry = node->muta tionObserverRegistry()) { 2364 if (Vector<OwnPtr<MutationObserverRegistration> >* registry = node->muta tionObserverRegistry()) {
2366 const size_t size = registry->size(); 2365 const size_t size = registry->size();
2367 for (size_t i = 0; i < size; ++i) 2366 for (size_t i = 0; i < size; ++i)
2368 registry->at(i)->observedSubtreeNodeWillDetach(this); 2367 registry->at(i)->observedSubtreeNodeWillDetach(this);
2369 } 2368 }
2370 2369
2371 if (HashSet<MutationObserverRegistration*>* transientRegistry = node->tr ansientMutationObserverRegistry()) { 2370 if (HashSet<MutationObserverRegistration*>* transientRegistry = node->tr ansientMutationObserverRegistry()) {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
2405 return EventDispatcher::dispatchEvent(this, EventDispatchMediator::create(ev ent)); 2404 return EventDispatcher::dispatchEvent(this, EventDispatchMediator::create(ev ent));
2406 } 2405 }
2407 2406
2408 void Node::dispatchSubtreeModifiedEvent() 2407 void Node::dispatchSubtreeModifiedEvent()
2409 { 2408 {
2410 if (isInShadowTree()) 2409 if (isInShadowTree())
2411 return; 2410 return;
2412 2411
2413 ASSERT(!NoEventDispatchAssertion::isEventDispatchForbidden()); 2412 ASSERT(!NoEventDispatchAssertion::isEventDispatchForbidden());
2414 2413
2415 if (!document()->hasListenerType(Document::DOMSUBTREEMODIFIED_LISTENER)) 2414 if (!document().hasListenerType(Document::DOMSUBTREEMODIFIED_LISTENER))
2416 return; 2415 return;
2417 2416
2418 dispatchScopedEvent(MutationEvent::create(eventNames().DOMSubtreeModifiedEve nt, true)); 2417 dispatchScopedEvent(MutationEvent::create(eventNames().DOMSubtreeModifiedEve nt, true));
2419 } 2418 }
2420 2419
2421 bool Node::dispatchDOMActivateEvent(int detail, PassRefPtr<Event> underlyingEven t) 2420 bool Node::dispatchDOMActivateEvent(int detail, PassRefPtr<Event> underlyingEven t)
2422 { 2421 {
2423 ASSERT(!NoEventDispatchAssertion::isEventDispatchForbidden()); 2422 ASSERT(!NoEventDispatchAssertion::isEventDispatchForbidden());
2424 RefPtr<UIEvent> event = UIEvent::create(eventNames().DOMActivateEvent, true, true, document()->defaultView(), detail); 2423 RefPtr<UIEvent> event = UIEvent::create(eventNames().DOMActivateEvent, true, true, document().defaultView(), detail);
2425 event->setUnderlyingEvent(underlyingEvent); 2424 event->setUnderlyingEvent(underlyingEvent);
2426 dispatchScopedEvent(event); 2425 dispatchScopedEvent(event);
2427 return event->defaultHandled(); 2426 return event->defaultHandled();
2428 } 2427 }
2429 2428
2430 bool Node::dispatchKeyEvent(const PlatformKeyboardEvent& event) 2429 bool Node::dispatchKeyEvent(const PlatformKeyboardEvent& event)
2431 { 2430 {
2432 return EventDispatcher::dispatchEvent(this, KeyboardEventDispatchMediator::c reate(KeyboardEvent::create(event, document()->defaultView()))); 2431 return EventDispatcher::dispatchEvent(this, KeyboardEventDispatchMediator::c reate(KeyboardEvent::create(event, document().defaultView())));
2433 } 2432 }
2434 2433
2435 bool Node::dispatchMouseEvent(const PlatformMouseEvent& event, const AtomicStrin g& eventType, 2434 bool Node::dispatchMouseEvent(const PlatformMouseEvent& event, const AtomicStrin g& eventType,
2436 int detail, Node* relatedTarget) 2435 int detail, Node* relatedTarget)
2437 { 2436 {
2438 return EventDispatcher::dispatchEvent(this, MouseEventDispatchMediator::crea te(MouseEvent::create(eventType, document()->defaultView(), event, detail, relat edTarget))); 2437 return EventDispatcher::dispatchEvent(this, MouseEventDispatchMediator::crea te(MouseEvent::create(eventType, document().defaultView(), event, detail, relate dTarget)));
2439 } 2438 }
2440 2439
2441 bool Node::dispatchGestureEvent(const PlatformGestureEvent& event) 2440 bool Node::dispatchGestureEvent(const PlatformGestureEvent& event)
2442 { 2441 {
2443 RefPtr<GestureEvent> gestureEvent = GestureEvent::create(document()->default View(), event); 2442 RefPtr<GestureEvent> gestureEvent = GestureEvent::create(document().defaultV iew(), event);
2444 if (!gestureEvent.get()) 2443 if (!gestureEvent.get())
2445 return false; 2444 return false;
2446 return EventDispatcher::dispatchEvent(this, GestureEventDispatchMediator::cr eate(gestureEvent)); 2445 return EventDispatcher::dispatchEvent(this, GestureEventDispatchMediator::cr eate(gestureEvent));
2447 } 2446 }
2448 2447
2449 bool Node::dispatchTouchEvent(PassRefPtr<TouchEvent> event) 2448 bool Node::dispatchTouchEvent(PassRefPtr<TouchEvent> event)
2450 { 2449 {
2451 return EventDispatcher::dispatchEvent(this, TouchEventDispatchMediator::crea te(event)); 2450 return EventDispatcher::dispatchEvent(this, TouchEventDispatchMediator::crea te(event));
2452 } 2451 }
2453 2452
2454 void Node::dispatchSimulatedClick(Event* underlyingEvent, SimulatedClickMouseEve ntOptions eventOptions, SimulatedClickVisualOptions visualOptions) 2453 void Node::dispatchSimulatedClick(Event* underlyingEvent, SimulatedClickMouseEve ntOptions eventOptions, SimulatedClickVisualOptions visualOptions)
2455 { 2454 {
2456 EventDispatcher::dispatchSimulatedClick(this, underlyingEvent, eventOptions, visualOptions); 2455 EventDispatcher::dispatchSimulatedClick(this, underlyingEvent, eventOptions, visualOptions);
2457 } 2456 }
2458 2457
2459 bool Node::dispatchBeforeLoadEvent(const String& sourceURL) 2458 bool Node::dispatchBeforeLoadEvent(const String& sourceURL)
2460 { 2459 {
2461 if (!document()->hasListenerType(Document::BEFORELOAD_LISTENER)) 2460 if (!document().hasListenerType(Document::BEFORELOAD_LISTENER))
2462 return true; 2461 return true;
2463 2462
2464 RefPtr<Node> protector(this); 2463 RefPtr<Node> protector(this);
2465 RefPtr<BeforeLoadEvent> beforeLoadEvent = BeforeLoadEvent::create(sourceURL) ; 2464 RefPtr<BeforeLoadEvent> beforeLoadEvent = BeforeLoadEvent::create(sourceURL) ;
2466 dispatchEvent(beforeLoadEvent.get()); 2465 dispatchEvent(beforeLoadEvent.get());
2467 return !beforeLoadEvent->defaultPrevented(); 2466 return !beforeLoadEvent->defaultPrevented();
2468 } 2467 }
2469 2468
2470 bool Node::dispatchWheelEvent(const PlatformWheelEvent& event) 2469 bool Node::dispatchWheelEvent(const PlatformWheelEvent& event)
2471 { 2470 {
2472 return EventDispatcher::dispatchEvent(this, WheelEventDispatchMediator::crea te(event, document()->defaultView())); 2471 return EventDispatcher::dispatchEvent(this, WheelEventDispatchMediator::crea te(event, document().defaultView()));
2473 } 2472 }
2474 2473
2475 void Node::dispatchChangeEvent() 2474 void Node::dispatchChangeEvent()
2476 { 2475 {
2477 dispatchScopedEvent(Event::createBubble(eventNames().changeEvent)); 2476 dispatchScopedEvent(Event::createBubble(eventNames().changeEvent));
2478 } 2477 }
2479 2478
2480 void Node::dispatchInputEvent() 2479 void Node::dispatchInputEvent()
2481 { 2480 {
2482 dispatchScopedEvent(Event::createBubble(eventNames().inputEvent)); 2481 dispatchScopedEvent(Event::createBubble(eventNames().inputEvent));
2483 } 2482 }
2484 2483
2485 void Node::defaultEventHandler(Event* event) 2484 void Node::defaultEventHandler(Event* event)
2486 { 2485 {
2487 if (event->target() != this) 2486 if (event->target() != this)
2488 return; 2487 return;
2489 const AtomicString& eventType = event->type(); 2488 const AtomicString& eventType = event->type();
2490 if (eventType == eventNames().keydownEvent || eventType == eventNames().keyp ressEvent) { 2489 if (eventType == eventNames().keydownEvent || eventType == eventNames().keyp ressEvent) {
2491 if (event->isKeyboardEvent()) { 2490 if (event->isKeyboardEvent()) {
2492 if (Frame* frame = document()->frame()) 2491 if (Frame* frame = document().frame())
2493 frame->eventHandler()->defaultKeyboardEventHandler(toKeyboardEve nt(event)); 2492 frame->eventHandler()->defaultKeyboardEventHandler(toKeyboardEve nt(event));
2494 } 2493 }
2495 } else if (eventType == eventNames().clickEvent) { 2494 } else if (eventType == eventNames().clickEvent) {
2496 int detail = event->isUIEvent() ? static_cast<UIEvent*>(event)->detail() : 0; 2495 int detail = event->isUIEvent() ? static_cast<UIEvent*>(event)->detail() : 0;
2497 if (dispatchDOMActivateEvent(detail, event)) 2496 if (dispatchDOMActivateEvent(detail, event))
2498 event->setDefaultHandled(); 2497 event->setDefaultHandled();
2499 } else if (eventType == eventNames().contextmenuEvent) { 2498 } else if (eventType == eventNames().contextmenuEvent) {
2500 if (Page* page = document()->page()) 2499 if (Page* page = document().page())
2501 page->contextMenuController().handleContextMenuEvent(event); 2500 page->contextMenuController().handleContextMenuEvent(event);
2502 } else if (eventType == eventNames().textInputEvent) { 2501 } else if (eventType == eventNames().textInputEvent) {
2503 if (event->hasInterface(eventNames().interfaceForTextEvent)) 2502 if (event->hasInterface(eventNames().interfaceForTextEvent))
2504 if (Frame* frame = document()->frame()) 2503 if (Frame* frame = document().frame())
2505 frame->eventHandler()->defaultTextInputEventHandler(static_cast< TextEvent*>(event)); 2504 frame->eventHandler()->defaultTextInputEventHandler(static_cast< TextEvent*>(event));
2506 #if OS(WINDOWS) 2505 #if OS(WINDOWS)
2507 } else if (eventType == eventNames().mousedownEvent && event->isMouseEvent() ) { 2506 } else if (eventType == eventNames().mousedownEvent && event->isMouseEvent() ) {
2508 MouseEvent* mouseEvent = toMouseEvent(event); 2507 MouseEvent* mouseEvent = toMouseEvent(event);
2509 if (mouseEvent->button() == MiddleButton) { 2508 if (mouseEvent->button() == MiddleButton) {
2510 if (enclosingLinkEventParentOrSelf()) 2509 if (enclosingLinkEventParentOrSelf())
2511 return; 2510 return;
2512 2511
2513 RenderObject* renderer = this->renderer(); 2512 RenderObject* renderer = this->renderer();
2514 while (renderer && (!renderer->isBox() || !toRenderBox(renderer)->ca nBeScrolledAndHasScrollableArea())) 2513 while (renderer && (!renderer->isBox() || !toRenderBox(renderer)->ca nBeScrolledAndHasScrollableArea()))
2515 renderer = renderer->parent(); 2514 renderer = renderer->parent();
2516 2515
2517 if (renderer) { 2516 if (renderer) {
2518 if (Frame* frame = document()->frame()) 2517 if (Frame* frame = document().frame())
2519 frame->eventHandler()->startPanScrolling(renderer); 2518 frame->eventHandler()->startPanScrolling(renderer);
2520 } 2519 }
2521 } 2520 }
2522 #endif 2521 #endif
2523 } else if ((eventType == eventNames().wheelEvent || eventType == eventNames( ).mousewheelEvent) && event->hasInterface(eventNames().interfaceForWheelEvent)) { 2522 } else if ((eventType == eventNames().wheelEvent || eventType == eventNames( ).mousewheelEvent) && event->hasInterface(eventNames().interfaceForWheelEvent)) {
2524 WheelEvent* wheelEvent = static_cast<WheelEvent*>(event); 2523 WheelEvent* wheelEvent = static_cast<WheelEvent*>(event);
2525 2524
2526 // If we don't have a renderer, send the wheel event to the first node w e find with a renderer. 2525 // If we don't have a renderer, send the wheel event to the first node w e find with a renderer.
2527 // This is needed for <option> and <optgroup> elements so that <select>s get a wheel scroll. 2526 // This is needed for <option> and <optgroup> elements so that <select>s get a wheel scroll.
2528 Node* startNode = this; 2527 Node* startNode = this;
2529 while (startNode && !startNode->renderer()) 2528 while (startNode && !startNode->renderer())
2530 startNode = startNode->parentOrShadowHostNode(); 2529 startNode = startNode->parentOrShadowHostNode();
2531 2530
2532 if (startNode && startNode->renderer()) 2531 if (startNode && startNode->renderer())
2533 if (Frame* frame = document()->frame()) 2532 if (Frame* frame = document().frame())
2534 frame->eventHandler()->defaultWheelEventHandler(startNode, wheel Event); 2533 frame->eventHandler()->defaultWheelEventHandler(startNode, wheel Event);
2535 } else if (event->type() == eventNames().webkitEditableContentChangedEvent) { 2534 } else if (event->type() == eventNames().webkitEditableContentChangedEvent) {
2536 dispatchInputEvent(); 2535 dispatchInputEvent();
2537 } 2536 }
2538 } 2537 }
2539 2538
2540 void Node::willCallDefaultEventHandler(const Event&) 2539 void Node::willCallDefaultEventHandler(const Event&)
2541 { 2540 {
2542 } 2541 }
2543 2542
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
2600 } 2599 }
2601 2600
2602 #ifndef NDEBUG 2601 #ifndef NDEBUG
2603 m_deletionHasBegun = true; 2602 m_deletionHasBegun = true;
2604 #endif 2603 #endif
2605 delete this; 2604 delete this;
2606 } 2605 }
2607 2606
2608 void Node::textRects(Vector<IntRect>& rects) const 2607 void Node::textRects(Vector<IntRect>& rects) const
2609 { 2608 {
2610 RefPtr<Range> range = Range::create(document()); 2609 RefPtr<Range> range = Range::create(&document());
2611 range->selectNodeContents(const_cast<Node*>(this), IGNORE_EXCEPTION); 2610 range->selectNodeContents(const_cast<Node*>(this), IGNORE_EXCEPTION);
2612 range->textRects(rects); 2611 range->textRects(rects);
2613 } 2612 }
2614 2613
2615 unsigned Node::connectedSubframeCount() const 2614 unsigned Node::connectedSubframeCount() const
2616 { 2615 {
2617 return hasRareData() ? rareData()->connectedSubframeCount() : 0; 2616 return hasRareData() ? rareData()->connectedSubframeCount() : 0;
2618 } 2617 }
2619 2618
2620 void Node::incrementConnectedSubframeCount(unsigned amount) 2619 void Node::incrementConnectedSubframeCount(unsigned amount)
(...skipping 24 matching lines...) Expand all
2645 2644
2646 if (!count) 2645 if (!count)
2647 return; 2646 return;
2648 2647
2649 for (Node* node = parentOrShadowHostNode(); node; node = node->parentOrShado wHostNode()) 2648 for (Node* node = parentOrShadowHostNode(); node; node = node->parentOrShado wHostNode())
2650 node->incrementConnectedSubframeCount(count); 2649 node->incrementConnectedSubframeCount(count);
2651 } 2650 }
2652 2651
2653 PassRefPtr<NodeList> Node::getDestinationInsertionPoints() 2652 PassRefPtr<NodeList> Node::getDestinationInsertionPoints()
2654 { 2653 {
2655 document()->updateDistributionForNodeIfNeeded(this); 2654 document().updateDistributionForNodeIfNeeded(this);
2656 Vector<InsertionPoint*, 8> insertionPoints; 2655 Vector<InsertionPoint*, 8> insertionPoints;
2657 collectInsertionPointsWhereNodeIsDistributed(this, insertionPoints); 2656 collectInsertionPointsWhereNodeIsDistributed(this, insertionPoints);
2658 Vector<RefPtr<Node> > filteredInsertionPoints; 2657 Vector<RefPtr<Node> > filteredInsertionPoints;
2659 for (size_t i = 0; i < insertionPoints.size(); ++i) { 2658 for (size_t i = 0; i < insertionPoints.size(); ++i) {
2660 InsertionPoint* insertionPoint = insertionPoints[i]; 2659 InsertionPoint* insertionPoint = insertionPoints[i];
2661 ASSERT(insertionPoint->containingShadowRoot()); 2660 ASSERT(insertionPoint->containingShadowRoot());
2662 if (insertionPoint->containingShadowRoot()->type() != ShadowRoot::UserAg entShadowRoot) 2661 if (insertionPoint->containingShadowRoot()->type() != ShadowRoot::UserAg entShadowRoot)
2663 filteredInsertionPoints.append(insertionPoint); 2662 filteredInsertionPoints.append(insertionPoint);
2664 } 2663 }
2665 return StaticNodeList::adopt(filteredInsertionPoints); 2664 return StaticNodeList::adopt(filteredInsertionPoints);
(...skipping 16 matching lines...) Expand all
2682 for (Node* child = firstChild(); child; child = child->nextSibling()) { 2681 for (Node* child = firstChild(); child; child = child->nextSibling()) {
2683 if (child->hasTagName(HTMLNames::styleTag) && toHTMLStyleElement(child)- >isRegisteredAsScoped()) 2682 if (child->hasTagName(HTMLNames::styleTag) && toHTMLStyleElement(child)- >isRegisteredAsScoped())
2684 count++; 2683 count++;
2685 } 2684 }
2686 2685
2687 return count; 2686 return count;
2688 } 2687 }
2689 2688
2690 void Node::setFocus(bool flag) 2689 void Node::setFocus(bool flag)
2691 { 2690 {
2692 document()->userActionElements().setFocused(this, flag); 2691 document().userActionElements().setFocused(this, flag);
2693 } 2692 }
2694 2693
2695 void Node::setActive(bool flag, bool) 2694 void Node::setActive(bool flag, bool)
2696 { 2695 {
2697 document()->userActionElements().setActive(this, flag); 2696 document().userActionElements().setActive(this, flag);
2698 } 2697 }
2699 2698
2700 void Node::setHovered(bool flag) 2699 void Node::setHovered(bool flag)
2701 { 2700 {
2702 document()->userActionElements().setHovered(this, flag); 2701 document().userActionElements().setHovered(this, flag);
2703 } 2702 }
2704 2703
2705 bool Node::isUserActionElementActive() const 2704 bool Node::isUserActionElementActive() const
2706 { 2705 {
2707 ASSERT(isUserActionElement()); 2706 ASSERT(isUserActionElement());
2708 return document()->userActionElements().isActive(this); 2707 return document().userActionElements().isActive(this);
2709 } 2708 }
2710 2709
2711 bool Node::isUserActionElementInActiveChain() const 2710 bool Node::isUserActionElementInActiveChain() const
2712 { 2711 {
2713 ASSERT(isUserActionElement()); 2712 ASSERT(isUserActionElement());
2714 return document()->userActionElements().isInActiveChain(this); 2713 return document().userActionElements().isInActiveChain(this);
2715 } 2714 }
2716 2715
2717 bool Node::isUserActionElementHovered() const 2716 bool Node::isUserActionElementHovered() const
2718 { 2717 {
2719 ASSERT(isUserActionElement()); 2718 ASSERT(isUserActionElement());
2720 return document()->userActionElements().isHovered(this); 2719 return document().userActionElements().isHovered(this);
2721 } 2720 }
2722 2721
2723 bool Node::isUserActionElementFocused() const 2722 bool Node::isUserActionElementFocused() const
2724 { 2723 {
2725 ASSERT(isUserActionElement()); 2724 ASSERT(isUserActionElement());
2726 return document()->userActionElements().isFocused(this); 2725 return document().userActionElements().isFocused(this);
2727 } 2726 }
2728 2727
2729 void Node::setCustomElementState(CustomElementState newState) 2728 void Node::setCustomElementState(CustomElementState newState)
2730 { 2729 {
2731 CustomElementState oldState = customElementState(); 2730 CustomElementState oldState = customElementState();
2732 2731
2733 switch (newState) { 2732 switch (newState) {
2734 case NotCustomElement: 2733 case NotCustomElement:
2735 ASSERT_NOT_REACHED(); // Everything starts in this state 2734 ASSERT_NOT_REACHED(); // Everything starts in this state
2736 return; 2735 return;
(...skipping 29 matching lines...) Expand all
2766 node->showTreeForThis(); 2765 node->showTreeForThis();
2767 } 2766 }
2768 2767
2769 void showNodePath(const WebCore::Node* node) 2768 void showNodePath(const WebCore::Node* node)
2770 { 2769 {
2771 if (node) 2770 if (node)
2772 node->showNodePathForThis(); 2771 node->showNodePathForThis();
2773 } 2772 }
2774 2773
2775 #endif 2774 #endif
OLDNEW
« no previous file with comments | « Source/core/dom/Node.h ('k') | Source/core/dom/NodeIterator.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698