Chromium Code Reviews| Index: Source/modules/serviceworkers/ServiceWorker.cpp |
| diff --git a/Source/modules/serviceworkers/ServiceWorker.cpp b/Source/modules/serviceworkers/ServiceWorker.cpp |
| index 012f548ad6ea65cd94eccba47b332889e2864b63..f5f4ff17968abb4468556b0b92165c2d24b7236b 100644 |
| --- a/Source/modules/serviceworkers/ServiceWorker.cpp |
| +++ b/Source/modules/serviceworkers/ServiceWorker.cpp |
| @@ -139,19 +139,21 @@ PassRefPtrWillBeRawPtr<ServiceWorker> ServiceWorker::from(ExecutionContext* exec |
| if (!worker) |
| return nullptr; |
| - blink::WebServiceWorkerProxy* proxy = worker->proxy(); |
| - ServiceWorker* existingServiceWorker = proxy ? proxy->unwrap() : 0; |
| - if (existingServiceWorker) { |
| - ASSERT(existingServiceWorker->executionContext() == executionContext); |
| - return existingServiceWorker; |
| + RefPtr<ServiceWorker> serviceWorker = createIfNeeded(executionContext, worker); |
| + if (serviceWorker->m_proxyState == Initial) { |
| + // If a new worker was created, it's in the initial state here and |
| + // should be changed to the ready state immediately. |
|
falken
2014/08/08 10:09:02
This comment kind of repeats the code and doesn't
nhiroki
2014/08/08 10:36:24
Done.
|
| + serviceWorker->setProxyState(Ready); |
| } |
| - |
| - return create(executionContext, adoptPtr(worker)); |
| + return serviceWorker.release(); |
| } |
| PassRefPtrWillBeRawPtr<ServiceWorker> ServiceWorker::take(ScriptPromiseResolver* resolver, WebType* worker) |
| { |
| - RefPtrWillBeRawPtr<ServiceWorker> serviceWorker = ServiceWorker::from(resolver->scriptState()->executionContext(), worker); |
| + if (!worker) |
| + return nullptr; |
| + |
| + RefPtrWillBeRawPtr<ServiceWorker> serviceWorker = ServiceWorker::createIfNeeded(resolver->scriptState()->executionContext(), worker); |
| ScriptState::Scope scope(resolver->scriptState()); |
| if (serviceWorker->m_proxyState == Initial) |
| serviceWorker->waitOnPromise(resolver->promise()); |
| @@ -170,7 +172,7 @@ void ServiceWorker::setProxyState(ProxyState state) |
| return; |
| switch (m_proxyState) { |
| case Initial: |
| - ASSERT(state == RegisterPromisePending || state == ContextStopped); |
| + ASSERT(state != Initial); |
|
falken
2014/08/08 10:09:02
Better to be explicit here and whitelist the allow
nhiroki
2014/08/08 10:36:24
Done.
|
| break; |
| case RegisterPromisePending: |
| ASSERT(state == Ready || state == ContextStopped); |
| @@ -222,9 +224,19 @@ void ServiceWorker::stop() |
| setProxyState(ContextStopped); |
| } |
| -PassRefPtrWillBeRawPtr<ServiceWorker> ServiceWorker::create(ExecutionContext* executionContext, PassOwnPtr<blink::WebServiceWorker> outerWorker) |
| +PassRefPtrWillBeRawPtr<ServiceWorker> ServiceWorker::createIfNeeded(ExecutionContext* executionContext, WebType* outerWorker) |
|
falken
2014/08/08 10:09:02
I'm not a fan of this name, you might expect it to
nhiroki
2014/08/08 10:36:24
SGTM. Renamed it to "getOrCreate".
|
| { |
| - RefPtrWillBeRawPtr<ServiceWorker> worker = adoptRefWillBeRefCountedGarbageCollected(new ServiceWorker(executionContext, outerWorker)); |
| + if (!outerWorker) |
| + return nullptr; |
| + |
| + blink::WebServiceWorkerProxy* proxy = outerWorker->proxy(); |
| + ServiceWorker* existingServiceWorker = proxy ? proxy->unwrap() : 0; |
| + if (existingServiceWorker) { |
| + ASSERT(existingServiceWorker->executionContext() == executionContext); |
| + return existingServiceWorker; |
| + } |
| + |
| + RefPtrWillBeRawPtr<ServiceWorker> worker = adoptRefWillBeRefCountedGarbageCollected(new ServiceWorker(executionContext, adoptPtr(outerWorker))); |
| worker->suspendIfNeeded(); |
| return worker.release(); |
| } |