Chromium Code Reviews| Index: Source/core/workers/Worker.cpp |
| diff --git a/Source/core/workers/Worker.cpp b/Source/core/workers/Worker.cpp |
| index e5c76ceee5e97e9c068fbeca9e1892668cac78d6..d2e3bde5815525ee54d42e5b9b3f97ba5efa31a5 100644 |
| --- a/Source/core/workers/Worker.cpp |
| +++ b/Source/core/workers/Worker.cpp |
| @@ -50,7 +50,7 @@ inline Worker::Worker(ExecutionContext* context) |
| ScriptWrappable::init(this); |
| } |
| -PassRefPtr<Worker> Worker::create(ExecutionContext* context, const String& url, ExceptionState& exceptionState) |
| +PassRefPtrWillBeRawPtr<Worker> Worker::create(ExecutionContext* context, const String& url, ExceptionState& exceptionState) |
| { |
| ASSERT(isMainThread()); |
| Document* document = toDocument(context); |
| @@ -62,7 +62,7 @@ PassRefPtr<Worker> Worker::create(ExecutionContext* context, const String& url, |
| WorkerGlobalScopeProxyProvider* proxyProvider = WorkerGlobalScopeProxyProvider::from(*document->page()); |
| ASSERT(proxyProvider); |
| - RefPtr<Worker> worker = adoptRef(new Worker(context)); |
| + RefPtrWillBeRawPtr<Worker> worker = adoptRefCountedWillBeRefCountedGarbageCollected(new Worker(context)); |
| worker->suspendIfNeeded(); |
| @@ -103,7 +103,12 @@ void Worker::postMessage(PassRefPtr<SerializedScriptValue> message, const Messag |
| void Worker::terminate() |
| { |
| - m_contextProxy->terminateWorkerGlobalScope(); |
| + // NOTE: oilpan: if the Worker fails to fully construct (e.g., invalid URL), |
|
sof
2014/02/24 12:53:29
I'll remove this comment before finalizing; just w
|
| + // it'll be without a 'context proxy' object but in the heap. If the document |
| + // is detached prior to the next GC, it stops active DOM objects, which |
| + // will run into a null ptr crash here. Hence, the need for the check. |
| + if (m_contextProxy) |
| + m_contextProxy->terminateWorkerGlobalScope(); |
|
haraken
2014/02/24 13:28:36
Don't you need to clear m_contextProxy in terminat
|
| } |
| void Worker::stop() |
| @@ -137,4 +142,9 @@ void Worker::notifyFinished() |
| unsetPendingActivity(this); |
| } |
| +void Worker::trace(Visitor* visitor) |
| +{ |
| + visitor->trace(m_scriptLoader); |
| +} |
| + |
| } // namespace WebCore |