| Index: Source/modules/serviceworkers/ServiceWorkerContainer.cpp
|
| diff --git a/Source/modules/serviceworkers/ServiceWorkerContainer.cpp b/Source/modules/serviceworkers/ServiceWorkerContainer.cpp
|
| index be2a0a8785d3ed7374eda6447310306503d8eead..2a6352767a6c3b46e0efe5176a073b3160816f66 100644
|
| --- a/Source/modules/serviceworkers/ServiceWorkerContainer.cpp
|
| +++ b/Source/modules/serviceworkers/ServiceWorkerContainer.cpp
|
| @@ -48,12 +48,10 @@
|
| #include "platform/RuntimeEnabledFeatures.h"
|
| #include "public/platform/WebServiceWorker.h"
|
| #include "public/platform/WebServiceWorkerProvider.h"
|
| +#include "public/platform/WebServiceWorkerRegistration.h"
|
| #include "public/platform/WebString.h"
|
| #include "public/platform/WebURL.h"
|
|
|
| -using blink::WebServiceWorker;
|
| -using blink::WebServiceWorkerProvider;
|
| -
|
| namespace blink {
|
|
|
| ServiceWorkerContainer* ServiceWorkerContainer::create(ExecutionContext* executionContext)
|
| @@ -80,6 +78,7 @@ void ServiceWorkerContainer::trace(Visitor* visitor)
|
| visitor->trace(m_controller);
|
| visitor->trace(m_installing);
|
| visitor->trace(m_waiting);
|
| + visitor->trace(m_readyRegistration);
|
| visitor->trace(m_ready);
|
| }
|
|
|
| @@ -195,32 +194,39 @@ static void deleteIfNoExistingOwner(WebServiceWorker* serviceWorker)
|
| delete serviceWorker;
|
| }
|
|
|
| -void ServiceWorkerContainer::setActive(WebServiceWorker* serviceWorker)
|
| +static void deleteIfNoExistingOwner(WebServiceWorkerRegistration* registration)
|
| +{
|
| + if (registration && !registration->proxy())
|
| + delete registration;
|
| +}
|
| +
|
| +void ServiceWorkerContainer::setReadyRegistration(WebServiceWorkerRegistration* registration)
|
| {
|
| if (!executionContext()) {
|
| - deleteIfNoExistingOwner(serviceWorker);
|
| + deleteIfNoExistingOwner(registration);
|
| return;
|
| }
|
| - RefPtrWillBeRawPtr<ServiceWorker> previousReadyWorker = m_active;
|
| - m_active = ServiceWorker::from(executionContext(), serviceWorker);
|
| - checkReadyChanged(previousReadyWorker.release());
|
| -}
|
|
|
| -void ServiceWorkerContainer::checkReadyChanged(PassRefPtrWillBeRawPtr<ServiceWorker> previousReadyWorker)
|
| -{
|
| - ServiceWorker* currentReadyWorker = m_active.get();
|
| + ServiceWorkerRegistration* readyRegistration = ServiceWorkerRegistration::from(executionContext(), registration);
|
| + ASSERT(readyRegistration->active());
|
|
|
| - if (previousReadyWorker == currentReadyWorker)
|
| + if (m_readyRegistration) {
|
| + ASSERT(m_readyRegistration == readyRegistration);
|
| + ASSERT(m_ready->state() == ReadyProperty::Resolved);
|
| return;
|
| -
|
| - if (m_ready->state() != ReadyProperty::Pending) {
|
| - // Already resolved Promises are now stale because the
|
| - // ready worker changed
|
| - m_ready = createReadyProperty();
|
| }
|
|
|
| - if (currentReadyWorker)
|
| - m_ready->resolve(currentReadyWorker);
|
| + m_readyRegistration = readyRegistration;
|
| + m_ready->resolve(readyRegistration);
|
| +}
|
| +
|
| +void ServiceWorkerContainer::setActive(WebServiceWorker* serviceWorker)
|
| +{
|
| + if (!executionContext()) {
|
| + deleteIfNoExistingOwner(serviceWorker);
|
| + return;
|
| + }
|
| + m_active = ServiceWorker::from(executionContext(), serviceWorker);
|
| }
|
|
|
| void ServiceWorkerContainer::setController(WebServiceWorker* serviceWorker)
|
|
|