| Index: Source/core/workers/WorkerGlobalScope.cpp
|
| diff --git a/Source/core/workers/WorkerGlobalScope.cpp b/Source/core/workers/WorkerGlobalScope.cpp
|
| index 1c0e3df625225876635810a810df379f5f1de242..bb5558f8c3c93e269f4580741cdb7dd66b3555e1 100644
|
| --- a/Source/core/workers/WorkerGlobalScope.cpp
|
| +++ b/Source/core/workers/WorkerGlobalScope.cpp
|
| @@ -68,23 +68,6 @@
|
|
|
| namespace blink {
|
|
|
| -class CloseWorkerGlobalScopeTask : public ExecutionContextTask {
|
| -public:
|
| - static PassOwnPtr<CloseWorkerGlobalScopeTask> create()
|
| - {
|
| - return adoptPtr(new CloseWorkerGlobalScopeTask);
|
| - }
|
| -
|
| - virtual void performTask(ExecutionContext *context)
|
| - {
|
| - WorkerGlobalScope* workerGlobalScope = toWorkerGlobalScope(context);
|
| - // Notify parent that this context is closed. Parent is responsible for calling WorkerThread::stop().
|
| - workerGlobalScope->thread()->workerReportingProxy().workerGlobalScopeClosed();
|
| - }
|
| -
|
| - virtual bool isCleanupTask() const { return true; }
|
| -};
|
| -
|
| WorkerGlobalScope::WorkerGlobalScope(const KURL& url, const String& userAgent, WorkerThread* thread, double timeOrigin, const SecurityOrigin* starterOrigin, PassOwnPtrWillBeRawPtr<WorkerClients> workerClients)
|
| : m_url(url)
|
| , m_userAgent(userAgent)
|
| @@ -176,14 +159,8 @@ WorkerLocation* WorkerGlobalScope::location() const
|
|
|
| void WorkerGlobalScope::close()
|
| {
|
| - if (m_closing)
|
| - return;
|
| -
|
| - // Let current script run to completion but prevent future script evaluations.
|
| - // After m_closing is set, all the tasks in the queue continue to be fetched but only
|
| - // tasks with isCleanupTask()==true will be executed.
|
| + // Let current script run to completion, but tell the worker micro task runner to tear down the thread after this task.
|
| m_closing = true;
|
| - postTask(FROM_HERE, CloseWorkerGlobalScopeTask::create());
|
| }
|
|
|
| WorkerConsole* WorkerGlobalScope::console()
|
| @@ -216,6 +193,11 @@ void WorkerGlobalScope::clearInspector()
|
| void WorkerGlobalScope::dispose()
|
| {
|
| ASSERT(thread()->isCurrentThread());
|
| + stopActiveDOMObjects();
|
| +
|
| + // Event listeners would keep DOMWrapperWorld objects alive for too long. Also, they have references to JS objects,
|
| + // which become dangling once Heap is destroyed.
|
| + removeAllEventListeners();
|
|
|
| clearScript();
|
| clearInspector();
|
|
|