Index: Source/modules/serviceworkers/ServiceWorkerContainer.cpp |
diff --git a/Source/modules/serviceworkers/ServiceWorkerContainer.cpp b/Source/modules/serviceworkers/ServiceWorkerContainer.cpp |
index 0ee4d5dea26eebfa5c5d1d236baeda643e3997a2..b5671144cfdee51148984a291705ad1b645d72f1 100644 |
--- a/Source/modules/serviceworkers/ServiceWorkerContainer.cpp |
+++ b/Source/modules/serviceworkers/ServiceWorkerContainer.cpp |
@@ -54,6 +54,28 @@ |
namespace blink { |
+// This wraps CallbackPromiseAdapter and resolves the promise with undefined |
+// when nullptr is given to onSuccess. |
+class GetRegistrationCallback : public WebServiceWorkerProvider::WebServiceWorkerGetRegistrationCallbacks { |
+public: |
+ explicit GetRegistrationCallback(PassRefPtr<ScriptPromiseResolver> resolver) |
+ : m_resolver(resolver) |
+ , m_adapter(m_resolver) { } |
+ virtual ~GetRegistrationCallback() { } |
+ virtual void onSuccess(WebServiceWorkerRegistration* registration) OVERRIDE |
+ { |
+ if (registration) |
+ m_adapter.onSuccess(registration); |
+ else if (m_resolver->executionContext() && !m_resolver->executionContext()->activeDOMObjectsAreStopped()) |
+ m_resolver->resolve(); |
+ } |
+ virtual void onError(WebServiceWorkerError* error) OVERRIDE { m_adapter.onError(error); } |
+private: |
+ RefPtr<ScriptPromiseResolver> m_resolver; |
+ CallbackPromiseAdapter<ServiceWorkerRegistration, ServiceWorkerError> m_adapter; |
+ WTF_MAKE_NONCOPYABLE(GetRegistrationCallback); |
+}; |
+ |
ServiceWorkerContainer* ServiceWorkerContainer::create(ExecutionContext* executionContext) |
{ |
return new ServiceWorkerContainer(executionContext); |
@@ -163,6 +185,32 @@ ScriptPromise ServiceWorkerContainer::unregisterServiceWorker(ScriptState* scrip |
return promise; |
} |
+ScriptPromise ServiceWorkerContainer::getRegistration(ScriptState* scriptState, const String& documentURL) |
+{ |
+ ASSERT(RuntimeEnabledFeatures::serviceWorkerEnabled()); |
+ RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState); |
+ ScriptPromise promise = resolver->promise(); |
+ |
+ // FIXME: This should use the container's execution context, not |
+ // the callers. |
+ ExecutionContext* executionContext = scriptState->executionContext(); |
+ RefPtr<SecurityOrigin> documentOrigin = executionContext->securityOrigin(); |
+ String errorMessage; |
+ if (!documentOrigin->canAccessFeatureRequiringSecureOrigin(errorMessage)) { |
+ resolver->reject(DOMException::create(NotSupportedError, errorMessage)); |
+ return promise; |
+ } |
+ |
+ KURL completedURL = executionContext->completeURL(documentURL); |
+ if (!documentOrigin->canRequest(completedURL)) { |
+ resolver->reject(DOMException::create(SecurityError, "The documentURL must match the current origin.")); |
+ return promise; |
+ } |
+ m_provider->getRegistration(completedURL, new GetRegistrationCallback(resolver)); |
+ |
+ return promise; |
+} |
+ |
ServiceWorkerContainer::ReadyProperty* ServiceWorkerContainer::createReadyProperty() |
{ |
return new ReadyProperty(executionContext(), this, ReadyProperty::Ready); |