| 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) | 
|  |