Changeset 110465 in webkit
- Timestamp:
- Mar 12, 2012 1:11:16 PM (12 years ago)
- Location:
- trunk
- Files:
-
- 5 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r110455 r110465 1 2012-03-12 Adam Klein <adamk@chromium.org> 2 3 [MutationObservers] Enforce a consistent order of MutationRecord delivery 4 https://bugs.webkit.org/show_bug.cgi?id=80549 5 6 Reviewed by Ojan Vafai. 7 8 * fast/mutation/create-during-delivery-expected.txt: Added. 9 * fast/mutation/create-during-delivery.html: Added. 10 * fast/mutation/delivery-order.html: Added. 11 * fast/mutation/mutate-during-delivery-expected.txt: Added. 12 * fast/mutation/mutate-during-delivery.html: Added. 13 1 14 2012-03-12 Mike Lawther <mikelawther@chromium.org> 2 15 -
trunk/Source/WebCore/ChangeLog
r110464 r110465 1 2012-03-12 Adam Klein <adamk@chromium.org> 2 3 [MutationObservers] Enforce a consistent order of MutationRecord delivery 4 https://bugs.webkit.org/show_bug.cgi?id=80549 5 6 Reviewed by Ojan Vafai. 7 8 Mutations should be delivered in order of creation. 9 10 Tests: fast/mutation/create-during-delivery.html 11 fast/mutation/delivery-order.html 12 fast/mutation/mutate-during-delivery.html 13 14 * dom/WebKitMutationObserver.cpp: 15 (WebCore): 16 (WebCore::WebKitMutationObserver::ObserverLessThan::operator()): Functor for use with std::sort. 17 (WebCore::WebKitMutationObserver::create): 18 (WebCore::WebKitMutationObserver::WebKitMutationObserver): 19 (WebCore::WebKitMutationObserver::deliverAllMutations): Move observers into a sorted vector before delivery. 20 * dom/WebKitMutationObserver.h: Add a "priority" member which monotonically increases with each construction. 21 1 22 2012-03-12 Nat Duca <nduca@chromium.org> 2 23 -
trunk/Source/WebCore/dom/WebKitMutationObserver.cpp
r109058 r110465 41 41 #include "MutationRecord.h" 42 42 #include "Node.h" 43 #include <wtf/ListHashSet.h> 43 #include <algorithm> 44 #include <wtf/HashSet.h> 44 45 #include <wtf/MainThread.h> 46 #include <wtf/Vector.h> 45 47 46 48 namespace WebCore { 47 49 50 static unsigned s_observerPriority = 0; 51 52 struct WebKitMutationObserver::ObserverLessThan { 53 bool operator()(const RefPtr<WebKitMutationObserver>& lhs, const RefPtr<WebKitMutationObserver>& rhs) 54 { 55 return lhs->m_priority < rhs->m_priority; 56 } 57 }; 58 48 59 PassRefPtr<WebKitMutationObserver> WebKitMutationObserver::create(PassRefPtr<MutationCallback> callback) 49 60 { 61 ASSERT(isMainThread()); 50 62 return adoptRef(new WebKitMutationObserver(callback)); 51 63 } … … 53 65 WebKitMutationObserver::WebKitMutationObserver(PassRefPtr<MutationCallback> callback) 54 66 : m_callback(callback) 67 , m_priority(s_observerPriority++) 55 68 { 56 69 } … … 108 121 } 109 122 110 typedef ListHashSet<RefPtr<WebKitMutationObserver> > MutationObserverSet;123 typedef HashSet<RefPtr<WebKitMutationObserver> > MutationObserverSet; 111 124 112 125 static MutationObserverSet& activeMutationObservers() … … 146 159 147 160 while (!activeMutationObservers().isEmpty()) { 148 MutationObserverSet::iterator iter = activeMutationObservers().begin(); 149 RefPtr<WebKitMutationObserver> observer = *iter; 150 activeMutationObservers().remove(iter); 151 observer->deliver(); 161 Vector<RefPtr<WebKitMutationObserver> > observers; 162 copyToVector(activeMutationObservers(), observers); 163 activeMutationObservers().clear(); 164 std::sort(observers.begin(), observers.end(), ObserverLessThan()); 165 for (size_t i = 0; i < observers.size(); ++i) 166 observers[i]->deliver(); 152 167 } 153 168 -
trunk/Source/WebCore/dom/WebKitMutationObserver.h
r103001 r110465 86 86 87 87 private: 88 struct ObserverLessThan; 89 88 90 WebKitMutationObserver(PassRefPtr<MutationCallback>); 89 91 void deliver(); … … 94 96 Vector<RefPtr<MutationRecord> > m_records; 95 97 HashSet<MutationObserverRegistration*> m_registrations; 98 unsigned m_priority; 96 99 }; 97 100
Note: See TracChangeset
for help on using the changeset viewer.