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 |