This source file includes following definitions.
- create
- detachClient
- registerServiceWorker
- unregisterServiceWorker
#include "config.h"
#include "modules/serviceworkers/ServiceWorkerContainer.h"
#include "RuntimeEnabledFeatures.h"
#include "bindings/v8/CallbackPromiseAdapter.h"
#include "bindings/v8/ScriptPromiseResolver.h"
#include "core/dom/ExecutionContext.h"
#include "modules/serviceworkers/RegistrationOptionList.h"
#include "modules/serviceworkers/ServiceWorker.h"
#include "modules/serviceworkers/ServiceWorkerContainerClient.h"
#include "modules/serviceworkers/ServiceWorkerError.h"
#include "public/platform/WebServiceWorkerProvider.h"
#include "public/platform/WebString.h"
#include "public/platform/WebURL.h"
using blink::WebServiceWorkerProvider;
namespace WebCore {
PassRefPtr<ServiceWorkerContainer> ServiceWorkerContainer::create(ExecutionContext* executionContext)
{
return adoptRef(new ServiceWorkerContainer(executionContext));
}
ServiceWorkerContainer::~ServiceWorkerContainer()
{
}
void ServiceWorkerContainer::detachClient()
{
if (m_provider) {
m_provider->setClient(0);
m_provider = 0;
}
}
ScriptPromise ServiceWorkerContainer::registerServiceWorker(ExecutionContext* executionContext, const String& url, const Dictionary& dictionary)
{
RegistrationOptionList options(dictionary);
ASSERT(RuntimeEnabledFeatures::serviceWorkerEnabled());
RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(executionContext);
ScriptPromise promise = resolver->promise();
if (!m_provider) {
resolver->reject(DOMError::create(InvalidStateError, "No associated provider is available"));
return promise;
}
RefPtr<SecurityOrigin> documentOrigin = executionContext->securityOrigin();
KURL patternURL = executionContext->completeURL(options.scope);
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(url);
if (!documentOrigin->canRequest(scriptURL)) {
resolver->reject(DOMError::create(SecurityError, "Script must be in document's origin."));
return promise;
}
m_provider->registerServiceWorker(patternURL, scriptURL, new CallbackPromiseAdapter<ServiceWorker, ServiceWorkerError>(resolver, executionContext));
return promise;
}
ScriptPromise ServiceWorkerContainer::unregisterServiceWorker(ExecutionContext* executionContext, const String& pattern)
{
ASSERT(RuntimeEnabledFeatures::serviceWorkerEnabled());
RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(executionContext);
ScriptPromise promise = resolver->promise();
if (!m_provider) {
resolver->reject(DOMError::create(InvalidStateError, "No associated provider is available"));
return promise;
}
RefPtr<SecurityOrigin> documentOrigin = executionContext->securityOrigin();
KURL patternURL = executionContext->completeURL(pattern);
if (!pattern.isEmpty() && !documentOrigin->canRequest(patternURL)) {
resolver->reject(DOMError::create(SecurityError, "Can only unregister for patterns in the document's origin."));
return promise;
}
m_provider->unregisterServiceWorker(patternURL, new CallbackPromiseAdapter<ServiceWorker, ServiceWorkerError>(resolver, executionContext));
return promise;
}
ServiceWorkerContainer::ServiceWorkerContainer(ExecutionContext* executionContext)
: m_provider(0)
{
ScriptWrappable::init(this);
if (!executionContext)
return;
if (ServiceWorkerContainerClient* client = ServiceWorkerContainerClient::from(executionContext)) {
m_provider = client->provider();
if (m_provider)
m_provider->setClient(this);
}
}
}