Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(141)

Unified Diff: Source/modules/serviceworkers/ServiceWorkerContainer.cpp

Issue 540823003: ServiceWorker: Implement navigator.serviceWorker.getRegistration [3/3] (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
« no previous file with comments | « Source/modules/serviceworkers/ServiceWorkerContainer.h ('k') | Source/modules/serviceworkers/ServiceWorkerContainer.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698