| Index: third_party/WebKit/Source/core/workers/WorkerGlobalScope.cpp
|
| diff --git a/third_party/WebKit/Source/core/workers/WorkerGlobalScope.cpp b/third_party/WebKit/Source/core/workers/WorkerGlobalScope.cpp
|
| index 8f5f58086ddc2173907092df8160c9e4d507f74a..4455c27cc0e1530589e6781cea6b0f1526006234 100644
|
| --- a/third_party/WebKit/Source/core/workers/WorkerGlobalScope.cpp
|
| +++ b/third_party/WebKit/Source/core/workers/WorkerGlobalScope.cpp
|
| @@ -91,13 +91,15 @@ void WorkerGlobalScope::dispose() {
|
| // Event listeners would keep DOMWrapperWorld objects alive for too long.
|
| // Also, they have references to JS objects, which become dangling once Heap
|
| // is destroyed.
|
| - for (auto it = m_eventListeners.begin(); it != m_eventListeners.end();) {
|
| - V8AbstractEventListener* listener = *it;
|
| - // clearListenerObject() will unregister the listener from
|
| - // m_eventListeners, and invalidate the iterator, so we have to advance
|
| - // it first.
|
| - ++it;
|
| - listener->clearListenerObject();
|
| + m_closing = true;
|
| + HeapHashSet<Member<V8AbstractEventListener>> listeners;
|
| + listeners.swap(m_eventListeners);
|
| + while (!listeners.isEmpty()) {
|
| + for (const auto& listener : listeners)
|
| + listener->clearListenerObject();
|
| + listeners.clear();
|
| + // Pick up any additions made while iterating.
|
| + listeners.swap(m_eventListeners);
|
| }
|
| removeAllEventListeners();
|
|
|
| @@ -139,7 +141,7 @@ void WorkerGlobalScope::registerEventListener(
|
| void WorkerGlobalScope::deregisterEventListener(
|
| V8AbstractEventListener* eventListener) {
|
| auto it = m_eventListeners.find(eventListener);
|
| - CHECK(it != m_eventListeners.end());
|
| + CHECK(it != m_eventListeners.end() || m_closing);
|
| m_eventListeners.remove(it);
|
| }
|
|
|
|
|