blob: ff4bd83a6434b81bb9d4007371d5209b09823c70 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "config.h"
#include "modules/background_sync/SyncCallbacks.h"
#include "bindings/core/v8/ScriptPromiseResolver.h"
#include "modules/background_sync/PeriodicSyncRegistration.h"
#include "modules/background_sync/SyncError.h"
#include "modules/background_sync/SyncRegistration.h"
#include "modules/serviceworkers/ServiceWorkerRegistration.h"
#include "wtf/OwnPtr.h"
#include "wtf/PassOwnPtr.h"
namespace blink {
SyncRegistrationCallbacks::SyncRegistrationCallbacks(ScriptPromiseResolver* resolver, ServiceWorkerRegistration* serviceWorkerRegistration)
: m_resolver(resolver)
, m_serviceWorkerRegistration(serviceWorkerRegistration)
{
ASSERT(m_resolver);
ASSERT(m_serviceWorkerRegistration);
}
SyncRegistrationCallbacks::~SyncRegistrationCallbacks()
{
}
void SyncRegistrationCallbacks::onSuccess(WebPassOwnPtr<WebSyncRegistration> webSyncRegistration)
{
if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) {
return;
}
OwnPtr<WebSyncRegistration> registration = webSyncRegistration.release();
if (!registration) {
m_resolver->resolve(v8::Null(m_resolver->scriptState()->isolate()));
return;
}
switch (registration->periodicity) {
case WebSyncRegistration::PeriodicityPeriodic:
m_resolver->resolve(PeriodicSyncRegistration::take(m_resolver.get(), registration.release(), m_serviceWorkerRegistration));
break;
case WebSyncRegistration::PeriodicityOneShot:
m_resolver->resolve(SyncRegistration::take(m_resolver.get(), registration.release(), m_serviceWorkerRegistration));
break;
}
}
void SyncRegistrationCallbacks::onError(const WebSyncError& error)
{
if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) {
return;
}
m_resolver->reject(SyncError::take(m_resolver.get(), error));
}
SyncNotifyWhenDoneCallbacks::SyncNotifyWhenDoneCallbacks(ScriptPromiseResolver* resolver, ServiceWorkerRegistration* serviceWorkerRegistration)
: m_resolver(resolver)
, m_serviceWorkerRegistration(serviceWorkerRegistration)
{
ASSERT(m_resolver);
ASSERT(m_serviceWorkerRegistration);
}
SyncNotifyWhenDoneCallbacks::~SyncNotifyWhenDoneCallbacks()
{
}
void SyncNotifyWhenDoneCallbacks::onSuccess(bool status)
{
if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) {
return;
}
m_resolver->resolve(status);
}
void SyncNotifyWhenDoneCallbacks::onError(const WebSyncError& error)
{
if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) {
return;
}
m_resolver->reject(SyncError::take(m_resolver.get(), error));
}
SyncUnregistrationCallbacks::SyncUnregistrationCallbacks(ScriptPromiseResolver* resolver, ServiceWorkerRegistration* serviceWorkerRegistration)
: m_resolver(resolver)
, m_serviceWorkerRegistration(serviceWorkerRegistration)
{
ASSERT(m_resolver);
ASSERT(m_serviceWorkerRegistration);
}
SyncUnregistrationCallbacks::~SyncUnregistrationCallbacks()
{
}
void SyncUnregistrationCallbacks::onSuccess(bool status)
{
if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) {
return;
}
m_resolver->resolve(status);
}
void SyncUnregistrationCallbacks::onError(const WebSyncError& error)
{
if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) {
return;
}
m_resolver->reject(SyncError::take(m_resolver.get(), error));
}
SyncGetRegistrationsCallbacks::SyncGetRegistrationsCallbacks(ScriptPromiseResolver* resolver, ServiceWorkerRegistration* serviceWorkerRegistration)
: m_resolver(resolver)
, m_serviceWorkerRegistration(serviceWorkerRegistration)
{
ASSERT(m_resolver);
ASSERT(m_serviceWorkerRegistration);
}
SyncGetRegistrationsCallbacks::~SyncGetRegistrationsCallbacks()
{
}
void SyncGetRegistrationsCallbacks::onSuccess(const WebVector<WebSyncRegistration*>& webSyncRegistrations)
{
Vector<OwnPtr<WebSyncRegistration>> registrations;
for (WebSyncRegistration* r : webSyncRegistrations) {
registrations.append(adoptPtr(r));
}
if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) {
return;
}
if (webSyncRegistrations.size() && webSyncRegistrations[0]->periodicity == WebSyncRegistration::PeriodicityOneShot) {
Vector<SyncRegistration*> syncRegistrations;
for (auto& r : registrations) {
SyncRegistration* reg = SyncRegistration::take(m_resolver.get(), r.release(), m_serviceWorkerRegistration);
syncRegistrations.append(reg);
}
m_resolver->resolve(syncRegistrations);
} else {
Vector<PeriodicSyncRegistration*> syncRegistrations;
for (auto& r : registrations) {
PeriodicSyncRegistration* reg = PeriodicSyncRegistration::take(m_resolver.get(), r.release(), m_serviceWorkerRegistration);
syncRegistrations.append(reg);
}
m_resolver->resolve(syncRegistrations);
}
}
void SyncGetRegistrationsCallbacks::onError(const WebSyncError& error)
{
if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) {
return;
}
m_resolver->reject(SyncError::take(m_resolver.get(), error));
}
SyncGetPermissionStatusCallbacks::SyncGetPermissionStatusCallbacks(ScriptPromiseResolver* resolver, ServiceWorkerRegistration* serviceWorkerRegistration)
: m_resolver(resolver)
, m_serviceWorkerRegistration(serviceWorkerRegistration)
{
ASSERT(m_resolver);
ASSERT(m_serviceWorkerRegistration);
}
SyncGetPermissionStatusCallbacks::~SyncGetPermissionStatusCallbacks()
{
}
void SyncGetPermissionStatusCallbacks::onSuccess(WebSyncPermissionStatus status)
{
if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) {
return;
}
m_resolver->resolve(permissionString(status));
}
void SyncGetPermissionStatusCallbacks::onError(const WebSyncError& error)
{
if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) {
return;
}
m_resolver->reject(SyncError::take(m_resolver.get(), error));
}
// static
String SyncGetPermissionStatusCallbacks::permissionString(WebSyncPermissionStatus status)
{
switch (status) {
case WebSyncPermissionStatusGranted:
return "granted";
case WebSyncPermissionStatusDenied:
return "denied";
case WebSyncPermissionStatusPrompt:
return "prompt";
}
ASSERT_NOT_REACHED();
return "denied";
}
} // namespace blink