| OLD | NEW |
| 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 Apple Inc. All rights reserv
ed. | 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv
ed. |
| 6 * | 6 * |
| 7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
| 8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
| 9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
| 10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 #include "wtf/Vector.h" | 40 #include "wtf/Vector.h" |
| 41 | 41 |
| 42 using namespace std; | 42 using namespace std; |
| 43 | 43 |
| 44 namespace WebCore { | 44 namespace WebCore { |
| 45 | 45 |
| 46 static void dispatchChildInsertionEvents(Node*); | 46 static void dispatchChildInsertionEvents(Node*); |
| 47 static void dispatchChildRemovalEvents(Node*); | 47 static void dispatchChildRemovalEvents(Node*); |
| 48 static void updateTreeAfterInsertion(ContainerNode*, Node*, AttachBehavior); | 48 static void updateTreeAfterInsertion(ContainerNode*, Node*, AttachBehavior); |
| 49 | 49 |
| 50 typedef pair<NodeCallback, RefPtr<Node> > CallbackInfo; | 50 typedef pair<NodeCallback, RefPtr<Node> > NodeCallbackInfo; |
| 51 typedef Vector<CallbackInfo> NodeCallbackQueue; | 51 typedef Vector<NodeCallbackInfo> NodeCallbackQueue; |
| 52 typedef pair<ElementCallback, RefPtr<Element> > ElementCallbackInfo; |
| 53 typedef Vector<ElementCallbackInfo> ElementCallbackQueue; |
| 52 | 54 |
| 53 static NodeCallbackQueue* s_postAttachCallbackQueue; | 55 static NodeCallbackQueue* s_postAttachCallbackQueue; |
| 56 static ElementCallbackQueue* s_insertionCallbackQueue; |
| 54 | 57 |
| 58 static size_t s_insertionDepth; |
| 55 static size_t s_attachDepth; | 59 static size_t s_attachDepth; |
| 56 | 60 |
| 57 ChildNodesLazySnapshot* ChildNodesLazySnapshot::latestSnapshot = 0; | 61 ChildNodesLazySnapshot* ChildNodesLazySnapshot::latestSnapshot = 0; |
| 58 | 62 |
| 59 #ifndef NDEBUG | 63 #ifndef NDEBUG |
| 60 unsigned NoEventDispatchAssertion::s_count = 0; | 64 unsigned NoEventDispatchAssertion::s_count = 0; |
| 61 #endif | 65 #endif |
| 62 | 66 |
| 63 static void collectChildrenAndRemoveFromOldParent(Node* node, NodeVector& nodes,
ExceptionCode& ec) | 67 static void collectChildrenAndRemoveFromOldParent(Node* node, NodeVector& nodes,
ExceptionCode& ec) |
| 64 { | 68 { |
| (...skipping 617 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 682 { | 686 { |
| 683 if (s_attachDepth == 1) { | 687 if (s_attachDepth == 1) { |
| 684 RefPtr<ContainerNode> protect(this); | 688 RefPtr<ContainerNode> protect(this); |
| 685 | 689 |
| 686 if (s_postAttachCallbackQueue) | 690 if (s_postAttachCallbackQueue) |
| 687 dispatchPostAttachCallbacks(); | 691 dispatchPostAttachCallbacks(); |
| 688 } | 692 } |
| 689 --s_attachDepth; | 693 --s_attachDepth; |
| 690 } | 694 } |
| 691 | 695 |
| 696 void ContainerNode::suspendInsertionCallbacks() |
| 697 { |
| 698 ++s_insertionDepth; |
| 699 } |
| 700 |
| 701 void ContainerNode::resumeInsertionCallbacks() |
| 702 { |
| 703 if (s_insertionDepth == 1 && s_insertionCallbackQueue) |
| 704 dispatchInsertionCallbacks(); |
| 705 --s_insertionDepth; |
| 706 } |
| 707 |
| 708 void ContainerNode::queueInsertionCallback(ElementCallback callback, Element* el
ement) |
| 709 { |
| 710 if (!s_insertionDepth) { |
| 711 (*callback)(element); |
| 712 return; |
| 713 } |
| 714 if (!s_insertionCallbackQueue) |
| 715 s_insertionCallbackQueue = new ElementCallbackQueue; |
| 716 s_insertionCallbackQueue->append(ElementCallbackInfo(callback, element)); |
| 717 } |
| 718 |
| 692 void ContainerNode::queuePostAttachCallback(NodeCallback callback, Node* node) | 719 void ContainerNode::queuePostAttachCallback(NodeCallback callback, Node* node) |
| 693 { | 720 { |
| 694 if (!s_postAttachCallbackQueue) | 721 if (!s_postAttachCallbackQueue) |
| 695 s_postAttachCallbackQueue = new NodeCallbackQueue; | 722 s_postAttachCallbackQueue = new NodeCallbackQueue; |
| 696 s_postAttachCallbackQueue->append(CallbackInfo(callback, node)); | 723 s_postAttachCallbackQueue->append(NodeCallbackInfo(callback, node)); |
| 697 } | 724 } |
| 698 | 725 |
| 699 bool ContainerNode::postAttachCallbacksAreSuspended() | 726 bool ContainerNode::postAttachCallbacksAreSuspended() |
| 700 { | 727 { |
| 701 return s_attachDepth; | 728 return s_attachDepth; |
| 702 } | 729 } |
| 703 | 730 |
| 704 void ContainerNode::dispatchPostAttachCallbacks() | 731 void ContainerNode::dispatchPostAttachCallbacks() |
| 705 { | 732 { |
| 706 // We recalculate size() each time through the loop because a callback | 733 // We recalculate size() each time through the loop because a callback |
| 707 // can add more callbacks to the end of the queue. | 734 // can add more callbacks to the end of the queue. |
| 708 for (size_t i = 0; i < s_postAttachCallbackQueue->size(); ++i) { | 735 for (size_t i = 0; i < s_postAttachCallbackQueue->size(); ++i) { |
| 709 const CallbackInfo& info = (*s_postAttachCallbackQueue)[i]; | 736 const NodeCallbackInfo& info = (*s_postAttachCallbackQueue)[i]; |
| 710 info.first(info.second.get()); | 737 info.first(info.second.get()); |
| 711 } | 738 } |
| 712 s_postAttachCallbackQueue->clear(); | 739 s_postAttachCallbackQueue->clear(); |
| 713 } | 740 } |
| 714 | 741 |
| 715 void ContainerNode::attach(const AttachContext& context) | 742 void ContainerNode::attach(const AttachContext& context) |
| 716 { | 743 { |
| 717 attachChildren(context); | 744 attachChildren(context); |
| 718 Node::attach(context); | 745 Node::attach(context); |
| 719 } | 746 } |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1027 if (c->parentNode() && document->hasListenerType(Document::DOMNODEREMOVED_LI
STENER)) | 1054 if (c->parentNode() && document->hasListenerType(Document::DOMNODEREMOVED_LI
STENER)) |
| 1028 c->dispatchScopedEvent(MutationEvent::create(eventNames().DOMNodeRemoved
Event, true, c->parentNode())); | 1055 c->dispatchScopedEvent(MutationEvent::create(eventNames().DOMNodeRemoved
Event, true, c->parentNode())); |
| 1029 | 1056 |
| 1030 // dispatch the DOMNodeRemovedFromDocument event to all descendants | 1057 // dispatch the DOMNodeRemovedFromDocument event to all descendants |
| 1031 if (c->inDocument() && document->hasListenerType(Document::DOMNODEREMOVEDFRO
MDOCUMENT_LISTENER)) { | 1058 if (c->inDocument() && document->hasListenerType(Document::DOMNODEREMOVEDFRO
MDOCUMENT_LISTENER)) { |
| 1032 for (; c; c = NodeTraversal::next(c.get(), child)) | 1059 for (; c; c = NodeTraversal::next(c.get(), child)) |
| 1033 c->dispatchScopedEvent(MutationEvent::create(eventNames().DOMNodeRem
ovedFromDocumentEvent, false)); | 1060 c->dispatchScopedEvent(MutationEvent::create(eventNames().DOMNodeRem
ovedFromDocumentEvent, false)); |
| 1034 } | 1061 } |
| 1035 } | 1062 } |
| 1036 | 1063 |
| 1064 void ContainerNode::dispatchInsertionCallbacks() |
| 1065 { |
| 1066 for (size_t i = s_insertionCallbackQueue->size(); i; --i) { |
| 1067 const ElementCallbackInfo& info = (*s_insertionCallbackQueue)[i - 1]; |
| 1068 info.first(info.second.get()); |
| 1069 } |
| 1070 s_insertionCallbackQueue->clear(); |
| 1071 } |
| 1072 |
| 1037 static void updateTreeAfterInsertion(ContainerNode* parent, Node* child, AttachB
ehavior attachBehavior) | 1073 static void updateTreeAfterInsertion(ContainerNode* parent, Node* child, AttachB
ehavior attachBehavior) |
| 1038 { | 1074 { |
| 1039 ASSERT(parent->refCount()); | 1075 ASSERT(parent->refCount()); |
| 1040 ASSERT(child->refCount()); | 1076 ASSERT(child->refCount()); |
| 1041 | 1077 |
| 1042 ChildListMutationScope(parent).childAdded(child); | 1078 ChildListMutationScope(parent).childAdded(child); |
| 1043 | 1079 |
| 1044 parent->childrenChanged(false, child->previousSibling(), child->nextSibling(
), 1); | 1080 parent->childrenChanged(false, child->previousSibling(), child->nextSibling(
), 1); |
| 1045 | 1081 |
| 1046 ChildNodeInsertionNotifier(parent).notify(child); | 1082 ChildNodeInsertionNotifier(parent).notify(child); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1067 return true; | 1103 return true; |
| 1068 | 1104 |
| 1069 if (node->isElementNode() && toElement(node)->shadow()) | 1105 if (node->isElementNode() && toElement(node)->shadow()) |
| 1070 return true; | 1106 return true; |
| 1071 | 1107 |
| 1072 return false; | 1108 return false; |
| 1073 } | 1109 } |
| 1074 #endif | 1110 #endif |
| 1075 | 1111 |
| 1076 } // namespace WebCore | 1112 } // namespace WebCore |
| OLD | NEW |