Index: Source/modules/serviceworkers/ServiceWorkerRegistration.cpp |
diff --git a/Source/modules/serviceworkers/ServiceWorkerRegistration.cpp b/Source/modules/serviceworkers/ServiceWorkerRegistration.cpp |
index ed64100f932e181505add1178506e4b8efb8f8f9..a697c7f5d524d9873b1c9938373ed09ccaa08a3a 100644 |
--- a/Source/modules/serviceworkers/ServiceWorkerRegistration.cpp |
+++ b/Source/modules/serviceworkers/ServiceWorkerRegistration.cpp |
@@ -88,7 +88,7 @@ PassRefPtrWillBeRawPtr<ServiceWorkerRegistration> ServiceWorkerRegistration::tak |
{ |
if (!registration) |
return nullptr; |
- return create(resolver->scriptState()->executionContext(), adoptPtr(registration)); |
+ return getOrCreate(resolver->scriptState()->executionContext(), adoptPtr(registration)); |
} |
void ServiceWorkerRegistration::dispose(WebType* registration) |
@@ -123,8 +123,18 @@ ScriptPromise ServiceWorkerRegistration::unregister(ScriptState* scriptState) |
return promise; |
} |
-PassRefPtrWillBeRawPtr<ServiceWorkerRegistration> ServiceWorkerRegistration::create(ExecutionContext* executionContext, PassOwnPtr<WebServiceWorkerRegistration> outerRegistration) |
+PassRefPtrWillBeRawPtr<ServiceWorkerRegistration> ServiceWorkerRegistration::getOrCreate(ExecutionContext* executionContext, PassOwnPtr<WebServiceWorkerRegistration> outerRegistration) |
{ |
+ if (!outerRegistration) |
+ return nullptr; |
+ |
+ WebServiceWorkerRegistrationProxy* proxy = outerRegistration->proxy(); |
+ ServiceWorkerRegistration* existingRegistration = proxy ? proxy->unwrap() : 0; |
+ if (existingRegistration) { |
+ ASSERT(existingRegistration->executionContext() == executionContext); |
+ return existingRegistration; |
+ } |
+ |
RefPtrWillBeRawPtr<ServiceWorkerRegistration> registration = adoptRefWillBeRefCountedGarbageCollected(new ServiceWorkerRegistration(executionContext, outerRegistration)); |
registration->suspendIfNeeded(); |
return registration.release(); |
@@ -132,6 +142,7 @@ PassRefPtrWillBeRawPtr<ServiceWorkerRegistration> ServiceWorkerRegistration::cre |
ServiceWorkerRegistration::ServiceWorkerRegistration(ExecutionContext* executionContext, PassOwnPtr<WebServiceWorkerRegistration> outerRegistration) |
: ActiveDOMObject(executionContext) |
+ , WebServiceWorkerRegistrationProxy(this) |
, m_outerRegistration(outerRegistration) |
, m_provider(0) |
{ |