| Index: Source/modules/serviceworkers/NavigatorServiceWorker.cpp
 | 
| diff --git a/Source/modules/serviceworkers/NavigatorServiceWorker.cpp b/Source/modules/serviceworkers/NavigatorServiceWorker.cpp
 | 
| index 738d83f14d8ecc959ff03f2d7667515e0280e891..0372350c99e15676c046f4b98725451902529c33 100644
 | 
| --- a/Source/modules/serviceworkers/NavigatorServiceWorker.cpp
 | 
| +++ b/Source/modules/serviceworkers/NavigatorServiceWorker.cpp
 | 
| @@ -32,6 +32,7 @@
 | 
|  
 | 
|  #include "RuntimeEnabledFeatures.h"
 | 
|  #include "V8ServiceWorker.h"
 | 
| +#include "bindings/V8DOMError.h"
 | 
|  #include "bindings/v8/CallbackPromiseAdapter.h"
 | 
|  #include "bindings/v8/ScriptPromiseResolver.h"
 | 
|  #include "core/dom/Document.h"
 | 
| @@ -43,6 +44,7 @@
 | 
|  #include "core/loader/FrameLoaderClient.h"
 | 
|  #include "core/workers/SharedWorker.h"
 | 
|  #include "modules/serviceworkers/ServiceWorker.h"
 | 
| +#include "modules/serviceworkers/ServiceWorkerError.h"
 | 
|  #include "public/platform/WebServiceWorkerProvider.h"
 | 
|  #include "public/platform/WebServiceWorkerProviderClient.h"
 | 
|  #include "public/platform/WebString.h"
 | 
| @@ -99,30 +101,30 @@ ScriptPromise NavigatorServiceWorker::registerServiceWorker(ExecutionContext* co
 | 
|  ScriptPromise NavigatorServiceWorker::registerServiceWorker(ExecutionContext* executionContext, const String& pattern, const String& scriptSrc, ExceptionState& es)
 | 
|  {
 | 
|      ASSERT(RuntimeEnabledFeatures::serviceWorkerEnabled());
 | 
| -    Frame* frame = m_navigator->frame();
 | 
| +    ScriptPromise promise = ScriptPromise::createPending(executionContext);
 | 
| +    RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(promise, executionContext);
 | 
|  
 | 
| +    Frame* frame = m_navigator->frame();
 | 
|      if (!frame) {
 | 
| -        es.throwDOMException(InvalidStateError, "No document available.");
 | 
| -        return ScriptPromise();
 | 
| +        resolver->reject(DOMError::create(InvalidStateError, "No document available."));
 | 
| +        return promise;
 | 
|      }
 | 
|  
 | 
|      RefPtr<SecurityOrigin> documentOrigin = frame->document()->securityOrigin();
 | 
|  
 | 
|      KURL patternURL = executionContext->completeURL(pattern);
 | 
| -    if (documentOrigin->canRequest(patternURL)) {
 | 
| -        es.throwSecurityError("Can only register for patterns in the document's origin.");
 | 
| -        return ScriptPromise();
 | 
| +    if (!documentOrigin->canRequest(patternURL)) {
 | 
| +        resolver->reject(DOMError::create(SecurityError, "Can only register for patterns in the document's origin."));
 | 
| +        return promise;
 | 
|      }
 | 
|  
 | 
|      KURL scriptURL = executionContext->completeURL(scriptSrc);
 | 
| -    if (documentOrigin->canRequest(scriptURL)) {
 | 
| -        es.throwSecurityError("Script must be in document's origin.");
 | 
| -        return ScriptPromise();
 | 
| +    if (!documentOrigin->canRequest(scriptURL)) {
 | 
| +        resolver->reject(DOMError::create(SecurityError, "Script must be in document's origin."));
 | 
| +        return promise;
 | 
|      }
 | 
|  
 | 
| -    ScriptPromise promise = ScriptPromise::createPending(executionContext);
 | 
| -    RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(promise, executionContext);
 | 
| -    ensureProvider()->registerServiceWorker(patternURL, scriptURL, new CallbackPromiseAdapter<ServiceWorker, ServiceWorker>(resolver, executionContext));
 | 
| +    ensureProvider()->registerServiceWorker(patternURL, scriptURL, new CallbackPromiseAdapter<ServiceWorker, ServiceWorkerError>(resolver, executionContext));
 | 
|      return promise;
 | 
|  }
 | 
|  
 | 
| @@ -134,23 +136,25 @@ ScriptPromise NavigatorServiceWorker::unregisterServiceWorker(ExecutionContext*
 | 
|  ScriptPromise NavigatorServiceWorker::unregisterServiceWorker(ExecutionContext* executionContext, const String& pattern, ExceptionState& es)
 | 
|  {
 | 
|      ASSERT(RuntimeEnabledFeatures::serviceWorkerEnabled());
 | 
| +    ScriptPromise promise = ScriptPromise::createPending(executionContext);
 | 
| +    RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(promise, executionContext);
 | 
| +
 | 
|      Frame* frame = m_navigator->frame();
 | 
|      if (!frame) {
 | 
| -        es.throwDOMException(InvalidStateError, "No document available.");
 | 
| -        return ScriptPromise();
 | 
| +        resolver->reject(DOMError::create(InvalidStateError, "No document available."));
 | 
| +        return promise;
 | 
|      }
 | 
|  
 | 
|      RefPtr<SecurityOrigin> documentOrigin = frame->document()->securityOrigin();
 | 
|  
 | 
|      KURL patternURL = executionContext->completeURL(pattern);
 | 
| -    if (documentOrigin->canRequest(patternURL)) {
 | 
| -        es.throwSecurityError("Can only unregister for patterns in the document's origin.");
 | 
| -        return ScriptPromise();
 | 
| +    if (!documentOrigin->canRequest(patternURL)) {
 | 
| +        resolver->reject(DOMError::create(SecurityError, "Can only unregister for patterns in the document's origin."));
 | 
| +
 | 
| +        return promise;
 | 
|      }
 | 
|  
 | 
| -    ScriptPromise promise = ScriptPromise::createPending(executionContext);
 | 
| -    RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(promise, executionContext);
 | 
| -    ensureProvider()->unregisterServiceWorker(patternURL, new CallbackPromiseAdapter<ServiceWorker, ServiceWorker>(resolver, executionContext));
 | 
| +    ensureProvider()->unregisterServiceWorker(patternURL, new CallbackPromiseAdapter<ServiceWorker, ServiceWorkerError>(resolver, executionContext));
 | 
|      return promise;
 | 
|  }
 | 
|  
 | 
| 
 |