| Index: third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.cpp
|
| diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.cpp b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.cpp
|
| index 8603e87822df789b5993a8f19731d1b46253bc4f..ef8e865ff9caefbeb9abfe19f19a210b6ed930ae 100644
|
| --- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.cpp
|
| +++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.cpp
|
| @@ -75,7 +75,11 @@ public:
|
| {
|
| if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped())
|
| return;
|
| - m_resolver->reject(ServiceWorkerError::take(m_resolver.get(), error));
|
| + if (error.errorType == WebServiceWorkerError::ErrorTypeType) {
|
| + m_resolver->reject(V8ThrowException::createTypeError(m_resolver->getScriptState()->isolate(), error.message));
|
| + } else {
|
| + m_resolver->reject(ServiceWorkerError::take(m_resolver.get(), error));
|
| + }
|
| }
|
|
|
| private:
|
| @@ -190,71 +194,86 @@ DEFINE_TRACE(ServiceWorkerContainer)
|
| ContextLifecycleObserver::trace(visitor);
|
| }
|
|
|
| -ScriptPromise ServiceWorkerContainer::registerServiceWorker(ScriptState* scriptState, const String& url, const RegistrationOptions& options)
|
| +void ServiceWorkerContainer::registerServiceWorkerImpl(ExecutionContext* executionContext, const KURL& rawScriptURL, const KURL& scope, PassOwnPtr<RegistrationCallbacks> callbacks)
|
| {
|
| - ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
|
| - ScriptPromise promise = resolver->promise();
|
| -
|
| if (!m_provider) {
|
| - resolver->reject(DOMException::create(InvalidStateError, "Failed to register a ServiceWorker: The document is in an invalid state."));
|
| - return promise;
|
| + callbacks->onError(WebServiceWorkerError(WebServiceWorkerError::ErrorTypeState, "Failed to register a ServiceWorker: The document is in an invalid state."));
|
| + return;
|
| }
|
|
|
| - ExecutionContext* executionContext = scriptState->getExecutionContext();
|
| - // FIXME: May be null due to worker termination: http://crbug.com/413518.
|
| - if (!executionContext)
|
| - return ScriptPromise();
|
| -
|
| RefPtr<SecurityOrigin> documentOrigin = executionContext->getSecurityOrigin();
|
| String errorMessage;
|
| // Restrict to secure origins: https://w3c.github.io/webappsec/specs/powerfulfeatures/#settings-privileged
|
| if (!executionContext->isSecureContext(errorMessage)) {
|
| - resolver->reject(DOMException::create(SecurityError, errorMessage));
|
| - return promise;
|
| + callbacks->onError(WebServiceWorkerError(WebServiceWorkerError::ErrorTypeSecurity, errorMessage));
|
| + return;
|
| }
|
|
|
| KURL pageURL = KURL(KURL(), documentOrigin->toString());
|
| if (!SchemeRegistry::shouldTreatURLSchemeAsAllowingServiceWorkers(pageURL.protocol())) {
|
| - resolver->reject(DOMException::create(SecurityError, "Failed to register a ServiceWorker: The URL protocol of the current origin ('" + documentOrigin->toString() + "') is not supported."));
|
| - return promise;
|
| + callbacks->onError(WebServiceWorkerError(WebServiceWorkerError::ErrorTypeSecurity, String("Failed to register a ServiceWorker: The URL protocol of the current origin ('" + documentOrigin->toString() + "') is not supported.")));
|
| + return;
|
| }
|
|
|
| - KURL scriptURL = enteredExecutionContext(scriptState->isolate())->completeURL(url);
|
| + KURL scriptURL = rawScriptURL;
|
| scriptURL.removeFragmentIdentifier();
|
| if (!documentOrigin->canRequest(scriptURL)) {
|
| RefPtr<SecurityOrigin> scriptOrigin = SecurityOrigin::create(scriptURL);
|
| - resolver->reject(DOMException::create(SecurityError, "Failed to register a ServiceWorker: The origin of the provided scriptURL ('" + scriptOrigin->toString() + "') does not match the current origin ('" + documentOrigin->toString() + "')."));
|
| - return promise;
|
| + callbacks->onError(WebServiceWorkerError(WebServiceWorkerError::ErrorTypeSecurity, String("Failed to register a ServiceWorker: The origin of the provided scriptURL ('" + scriptOrigin->toString() + "') does not match the current origin ('" + documentOrigin->toString() + "').")));
|
| + return;
|
| }
|
| if (!SchemeRegistry::shouldTreatURLSchemeAsAllowingServiceWorkers(scriptURL.protocol())) {
|
| - resolver->reject(DOMException::create(SecurityError, "Failed to register a ServiceWorker: The URL protocol of the script ('" + scriptURL.getString() + "') is not supported."));
|
| - return promise;
|
| + callbacks->onError(WebServiceWorkerError(WebServiceWorkerError::ErrorTypeSecurity, String("Failed to register a ServiceWorker: The URL protocol of the script ('" + scriptURL.getString() + "') is not supported.")));
|
| + return;
|
| }
|
|
|
| - KURL patternURL;
|
| - if (options.scope().isNull())
|
| - patternURL = KURL(scriptURL, "./");
|
| - else
|
| - patternURL = enteredExecutionContext(scriptState->isolate())->completeURL(options.scope());
|
| + KURL patternURL = scope;
|
| patternURL.removeFragmentIdentifier();
|
|
|
| if (!documentOrigin->canRequest(patternURL)) {
|
| RefPtr<SecurityOrigin> patternOrigin = SecurityOrigin::create(patternURL);
|
| - resolver->reject(DOMException::create(SecurityError, "Failed to register a ServiceWorker: The origin of the provided scope ('" + patternOrigin->toString() + "') does not match the current origin ('" + documentOrigin->toString() + "')."));
|
| - return promise;
|
| + callbacks->onError(WebServiceWorkerError(WebServiceWorkerError::ErrorTypeSecurity, String("Failed to register a ServiceWorker: The origin of the provided scope ('" + patternOrigin->toString() + "') does not match the current origin ('" + documentOrigin->toString() + "').")));
|
| + return;
|
| }
|
| if (!SchemeRegistry::shouldTreatURLSchemeAsAllowingServiceWorkers(patternURL.protocol())) {
|
| - resolver->reject(DOMException::create(SecurityError, "Failed to register a ServiceWorker: The URL protocol of the scope ('" + patternURL.getString() + "') is not supported."));
|
| - return promise;
|
| + callbacks->onError(WebServiceWorkerError(WebServiceWorkerError::ErrorTypeSecurity, String("Failed to register a ServiceWorker: The URL protocol of the scope ('" + patternURL.getString() + "') is not supported.")));
|
| + return;
|
| }
|
|
|
| WebString webErrorMessage;
|
| if (!m_provider->validateScopeAndScriptURL(patternURL, scriptURL, &webErrorMessage)) {
|
| - resolver->reject(V8ThrowException::createTypeError(scriptState->isolate(), WebString::fromUTF8("Failed to register a ServiceWorker: " + webErrorMessage.utf8())));
|
| + callbacks->onError(WebServiceWorkerError(WebServiceWorkerError::ErrorTypeType, WebString::fromUTF8("Failed to register a ServiceWorker: " + webErrorMessage.utf8())));
|
| + return;
|
| + }
|
| +
|
| + m_provider->registerServiceWorker(patternURL, scriptURL, callbacks.leakPtr());
|
| +}
|
| +
|
| +ScriptPromise ServiceWorkerContainer::registerServiceWorker(ScriptState* scriptState, const String& url, const RegistrationOptions& options)
|
| +{
|
| + ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
|
| + ScriptPromise promise = resolver->promise();
|
| +
|
| + if (!m_provider) {
|
| + resolver->reject(DOMException::create(InvalidStateError, "Failed to register a ServiceWorker: The document is in an invalid state."));
|
| return promise;
|
| }
|
|
|
| - m_provider->registerServiceWorker(patternURL, scriptURL, new RegistrationCallback(resolver));
|
| + ExecutionContext* executionContext = scriptState->getExecutionContext();
|
| + // FIXME: May be null due to worker termination: http://crbug.com/413518.
|
| + if (!executionContext)
|
| + return ScriptPromise();
|
| +
|
| + KURL scriptURL = enteredExecutionContext(scriptState->isolate())->completeURL(url);
|
| + scriptURL.removeFragmentIdentifier();
|
| +
|
| + KURL patternURL;
|
| + if (options.scope().isNull())
|
| + patternURL = KURL(scriptURL, "./");
|
| + else
|
| + patternURL = enteredExecutionContext(scriptState->isolate())->completeURL(options.scope());
|
| +
|
| + registerServiceWorkerImpl(executionContext, scriptURL, patternURL, adoptPtr(new RegistrationCallback(resolver)));
|
|
|
| return promise;
|
| }
|
|
|