Changeset 138754 in webkit


Ignore:
Timestamp:
Jan 3, 2013 3:22:44 PM (11 years ago)
Author:
rafaelw@chromium.org
Message:

[Mutation Observers] prevent delivery while recipient context is suspended
https://bugs.webkit.org/show_bug.cgi?id=105810

Reviewed by Adam Barth.

Source/WebCore:

Test: inspector/debugger/mutation-observer-suspend-while-paused.html

  • dom/MutationObserver.cpp:

(WebCore::suspendedMutationObservers):
(WebCore):
(WebCore::MutationObserver::canDeliver):
(WebCore::MutationObserver::deliver):
(WebCore::MutationObserver::deliverAllMutations):

  • dom/MutationObserver.h:

LayoutTests:

  • inspector/debugger/mutation-observer-suspend-while-paused-expected.txt: Added.
  • inspector/debugger/mutation-observer-suspend-while-paused.html: Added.
Location:
trunk
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r138751 r138754  
     12013-01-03  Rafael Weinstein  <rafaelw@chromium.org>
     2
     3        [Mutation Observers] prevent delivery while recipient context is suspended
     4        https://bugs.webkit.org/show_bug.cgi?id=105810
     5
     6        Reviewed by Adam Barth.
     7
     8        * inspector/debugger/mutation-observer-suspend-while-paused-expected.txt: Added.
     9        * inspector/debugger/mutation-observer-suspend-while-paused.html: Added.
     10
    1112013-01-03  Csaba Osztrogonác  <ossy@webkit.org>
    212
  • trunk/Source/WebCore/ChangeLog

    r138747 r138754  
     12013-01-03  Rafael Weinstein  <rafaelw@chromium.org>
     2
     3        [Mutation Observers] prevent delivery while recipient context is suspended
     4        https://bugs.webkit.org/show_bug.cgi?id=105810
     5
     6        Reviewed by Adam Barth.
     7
     8        Test: inspector/debugger/mutation-observer-suspend-while-paused.html
     9
     10        * dom/MutationObserver.cpp:
     11        (WebCore::suspendedMutationObservers):
     12        (WebCore):
     13        (WebCore::MutationObserver::canDeliver):
     14        (WebCore::MutationObserver::deliver):
     15        (WebCore::MutationObserver::deliverAllMutations):
     16        * dom/MutationObserver.h:
     17
    1182013-01-03  Dan Bernstein  <mitz@apple.com>
    219
  • trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm

    r138138 r138754  
    28302830    push(@headerContent, "    }\n\n");
    28312831
     2832    # ScriptExecutionContext
     2833    push(@headerContent, "    virtual ScriptExecutionContext* scriptExecutionContext() const { return ContextDestructionObserver::scriptExecutionContext(); }\n\n");
     2834
    28322835    # Destructor
    28332836    push(@headerContent, "    virtual ~$className();\n");
  • trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm

    r138725 r138754  
    32873287
    32883288    push(@headerContent, <<END);
     3289 
     3290    virtual ScriptExecutionContext* scriptExecutionContext() const { return ContextDestructionObserver::scriptExecutionContext(); }
    32893291
    32903292private:
  • trunk/Source/WebCore/dom/MutationCallback.h

    r122159 r138754  
    5050
    5151    virtual bool handleEvent(MutationRecordArray*, MutationObserver*) = 0;
     52    virtual ScriptExecutionContext* scriptExecutionContext() const = 0;
    5253};
    5354
  • trunk/Source/WebCore/dom/MutationObserver.cpp

    r135228 r138754  
    155155}
    156156
     157static MutationObserverSet& suspendedMutationObservers()
     158{
     159    DEFINE_STATIC_LOCAL(MutationObserverSet, suspendedObservers, ());
     160    return suspendedObservers;
     161}
     162
    157163void MutationObserver::enqueueMutationRecord(PassRefPtr<MutationRecord> mutation)
    158164{
     
    176182}
    177183
     184bool MutationObserver::canDeliver()
     185{
     186    return !m_callback->scriptExecutionContext()->activeDOMObjectsAreSuspended();
     187}
     188
    178189void MutationObserver::deliver()
    179190{
     191    ASSERT(canDeliver());
     192
    180193    // Calling clearTransientRegistrations() can modify m_registrations, so it's necessary
    181194    // to make a copy of the transient registrations before operating on them.
     
    205218    deliveryInProgress = true;
    206219
     220    if (!suspendedMutationObservers().isEmpty()) {
     221        Vector<RefPtr<MutationObserver> > suspended;
     222        copyToVector(suspendedMutationObservers(), suspended);
     223        for (size_t i = 0; i < suspended.size(); ++i) {
     224            if (!suspended[i]->canDeliver())
     225                continue;
     226
     227            suspendedMutationObservers().remove(suspended[i]);
     228            activeMutationObservers().add(suspended[i]);
     229        }
     230    }
     231
    207232    while (!activeMutationObservers().isEmpty()) {
    208233        Vector<RefPtr<MutationObserver> > observers;
     
    210235        activeMutationObservers().clear();
    211236        std::sort(observers.begin(), observers.end(), ObserverLessThan());
    212         for (size_t i = 0; i < observers.size(); ++i)
    213             observers[i]->deliver();
     237        for (size_t i = 0; i < observers.size(); ++i) {
     238            if (observers[i]->canDeliver())
     239                observers[i]->deliver();
     240            else
     241                suspendedMutationObservers().add(observers[i]);
     242        }
    214243    }
    215244
  • trunk/Source/WebCore/dom/MutationObserver.h

    r135228 r138754  
    8787    void enqueueMutationRecord(PassRefPtr<MutationRecord>);
    8888    void setHasTransientRegistration();
     89    bool canDeliver();
    8990
    9091    HashSet<Node*> getObservedNodes() const;
Note: See TracChangeset for help on using the changeset viewer.