Changeset 110465 in webkit


Ignore:
Timestamp:
Mar 12, 2012 1:11:16 PM (12 years ago)
Author:
adamk@chromium.org
Message:

[MutationObservers] Enforce a consistent order of MutationRecord delivery
https://bugs.webkit.org/show_bug.cgi?id=80549

Reviewed by Ojan Vafai.

Source/WebCore:

Mutations should be delivered in order of creation.

Tests: fast/mutation/create-during-delivery.html

fast/mutation/delivery-order.html
fast/mutation/mutate-during-delivery.html

  • dom/WebKitMutationObserver.cpp:

(WebCore):
(WebCore::WebKitMutationObserver::ObserverLessThan::operator()): Functor for use with std::sort.
(WebCore::WebKitMutationObserver::create):
(WebCore::WebKitMutationObserver::WebKitMutationObserver):
(WebCore::WebKitMutationObserver::deliverAllMutations): Move observers into a sorted vector before delivery.

  • dom/WebKitMutationObserver.h: Add a "priority" member which monotonically increases with each construction.

LayoutTests:

  • fast/mutation/create-during-delivery-expected.txt: Added.
  • fast/mutation/create-during-delivery.html: Added.
  • fast/mutation/delivery-order.html: Added.
  • fast/mutation/mutate-during-delivery-expected.txt: Added.
  • fast/mutation/mutate-during-delivery.html: Added.
Location:
trunk
Files:
5 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r110455 r110465  
     12012-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
    1142012-03-12  Mike Lawther  <mikelawther@chromium.org>
    215
  • trunk/Source/WebCore/ChangeLog

    r110464 r110465  
     12012-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
    1222012-03-12  Nat Duca  <nduca@chromium.org>
    223
  • trunk/Source/WebCore/dom/WebKitMutationObserver.cpp

    r109058 r110465  
    4141#include "MutationRecord.h"
    4242#include "Node.h"
    43 #include <wtf/ListHashSet.h>
     43#include <algorithm>
     44#include <wtf/HashSet.h>
    4445#include <wtf/MainThread.h>
     46#include <wtf/Vector.h>
    4547
    4648namespace WebCore {
    4749
     50static unsigned s_observerPriority = 0;
     51
     52struct 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
    4859PassRefPtr<WebKitMutationObserver> WebKitMutationObserver::create(PassRefPtr<MutationCallback> callback)
    4960{
     61    ASSERT(isMainThread());
    5062    return adoptRef(new WebKitMutationObserver(callback));
    5163}
     
    5365WebKitMutationObserver::WebKitMutationObserver(PassRefPtr<MutationCallback> callback)
    5466    : m_callback(callback)
     67    , m_priority(s_observerPriority++)
    5568{
    5669}
     
    108121}
    109122
    110 typedef ListHashSet<RefPtr<WebKitMutationObserver> > MutationObserverSet;
     123typedef HashSet<RefPtr<WebKitMutationObserver> > MutationObserverSet;
    111124
    112125static MutationObserverSet& activeMutationObservers()
     
    146159
    147160    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();
    152167    }
    153168
  • trunk/Source/WebCore/dom/WebKitMutationObserver.h

    r103001 r110465  
    8686
    8787private:
     88    struct ObserverLessThan;
     89
    8890    WebKitMutationObserver(PassRefPtr<MutationCallback>);
    8991    void deliver();
     
    9496    Vector<RefPtr<MutationRecord> > m_records;
    9597    HashSet<MutationObserverRegistration*> m_registrations;
     98    unsigned m_priority;
    9699};
    97100
Note: See TracChangeset for help on using the changeset viewer.