Changeset 231248 in webkit


Ignore:
Timestamp:
May 2, 2018 11:39:20 AM (6 years ago)
Author:
Chris Dumez
Message:

document.open() event listener removal is not immediate
https://bugs.webkit.org/show_bug.cgi?id=185191

Reviewed by Darin Adler.

Source/WebCore:

We need to make sure we set the 'wasremoved' flag on RegisteredEventListeners
whenever they get removed from the EventListenerMap. We were doing so correctly
in EventListenerMap:remove() but not EventListenerMap::clear(). This patch
updates clear() accordingly.

The reason we need to set this flag is that RegisteredEventListeners is RefCounted
and EventTarget::fireEventListeners() may be currently running and calling
each listener one by one, holding a reference to all listener of a given event.

Test: fast/dom/Document/document-open-removes-all-listeners.html

  • dom/EventListenerMap.cpp:

(WebCore::EventListenerMap::clear):

LayoutTests:

Add layout test coverage.

  • fast/dom/Document/document-open-removes-all-listeners-expected.txt: Added.
  • fast/dom/Document/document-open-removes-all-listeners.html: Added.
Location:
trunk
Files:
2 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r231236 r231248  
     12018-05-02  Chris Dumez  <cdumez@apple.com>
     2
     3        document.open() event listener removal is not immediate
     4        https://bugs.webkit.org/show_bug.cgi?id=185191
     5
     6        Reviewed by Darin Adler.
     7
     8        Add layout test coverage.
     9
     10        * fast/dom/Document/document-open-removes-all-listeners-expected.txt: Added.
     11        * fast/dom/Document/document-open-removes-all-listeners.html: Added.
     12
    1132018-05-01  Brent Fulgham  <bfulgham@apple.com>
    214
  • trunk/Source/WebCore/ChangeLog

    r231245 r231248  
     12018-05-02  Chris Dumez  <cdumez@apple.com>
     2
     3        document.open() event listener removal is not immediate
     4        https://bugs.webkit.org/show_bug.cgi?id=185191
     5
     6        Reviewed by Darin Adler.
     7
     8        We need to make sure we set the 'wasremoved' flag on RegisteredEventListeners
     9        whenever they get removed from the EventListenerMap. We were doing so correctly
     10        in EventListenerMap:remove() but not EventListenerMap::clear(). This patch
     11        updates clear() accordingly.
     12
     13        The reason we need to set this flag is that RegisteredEventListeners is RefCounted
     14        and EventTarget::fireEventListeners() may be currently running and calling
     15        each listener one by one, holding a reference to all listener of a given event.
     16
     17        Test: fast/dom/Document/document-open-removes-all-listeners.html
     18
     19        * dom/EventListenerMap.cpp:
     20        (WebCore::EventListenerMap::clear):
     21
    1222018-05-02  Zalan Bujtas <zalan@apple.com>
    223
  • trunk/Source/WebCore/dom/EventListenerMap.cpp

    r223476 r231248  
    8787    assertNoActiveIterators();
    8888
     89    for (auto& entry : m_entries) {
     90        for (auto& listener : *entry.second)
     91            listener->markAsRemoved();
     92    }
     93
    8994    m_entries.clear();
    9095}
Note: See TracChangeset for help on using the changeset viewer.