[Background Sync] Allow sync manager access from uncontrolled clients

This patch removes the requirement for the caller of a BackgroundSync
manager method to be either a service worker or a controlled client.
Now, uncontrolled clients are also able to access the manager, and Blink
informs the browser whether a registration request came from a Service
Worker or not. (Service Workers are still required to have at least one
active window client in order to register sync events; this is enforced
in the browser).

This is part 1 of a three-part blink-chromium-blink dance.
Part 1: https://codereview.chromium.org/1309393003 (this patch)
Part 2: https://codereview.chromium.org/1316743002
Part 3: https://codereview.chromium.org/1314453003

BUG=518884

Review URL: https://codereview.chromium.org/1309393003

git-svn-id: svn://svn.chromium.org/blink/trunk@201230 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent c120a7e2
......@@ -52,11 +52,8 @@ unsigned long PeriodicSyncManager::minPossiblePeriod()
return kMinPossiblePeriod;
}
ScriptPromise PeriodicSyncManager::registerFunction(ScriptState* scriptState, const PeriodicSyncRegistrationOptions& options)
ScriptPromise PeriodicSyncManager::registerFunction(ScriptState* scriptState, ExecutionContext* context, const PeriodicSyncRegistrationOptions& options)
{
if (!m_registration->active())
return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(AbortError, "Registration failed - no active Service Worker"));
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
......@@ -84,16 +81,13 @@ ScriptPromise PeriodicSyncManager::registerFunction(ScriptState* scriptState, co
networkState,
powerState
);
backgroundSyncProvider()->registerBackgroundSync(webSyncRegistration, m_registration->webRegistration(), new SyncRegistrationCallbacks(resolver, m_registration));
backgroundSyncProvider()->registerBackgroundSync(webSyncRegistration, m_registration->webRegistration(), context->isServiceWorkerGlobalScope(), new SyncRegistrationCallbacks(resolver, m_registration));
return promise;
}
ScriptPromise PeriodicSyncManager::getRegistration(ScriptState* scriptState, const String& syncRegistrationTag)
{
if (!m_registration->active())
return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(AbortError, "Operation failed - no active Service Worker"));
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
......@@ -104,9 +98,6 @@ ScriptPromise PeriodicSyncManager::getRegistration(ScriptState* scriptState, con
ScriptPromise PeriodicSyncManager::getRegistrations(ScriptState* scriptState)
{
if (!m_registration->active())
return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(AbortError, "Operation failed - no active Service Worker"));
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
......@@ -117,9 +108,6 @@ ScriptPromise PeriodicSyncManager::getRegistrations(ScriptState* scriptState)
ScriptPromise PeriodicSyncManager::permissionState(ScriptState* scriptState)
{
if (!m_registration->active())
return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(AbortError, "Operation failed - no active Service Worker"));
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
......
......@@ -11,6 +11,7 @@
namespace blink {
class ExecutionContext;
class PeriodicSyncRegistrationOptions;
class ScriptPromise;
class ScriptState;
......@@ -26,8 +27,7 @@ public:
unsigned long minPossiblePeriod();
ScriptPromise registerFunction(ScriptState*);
ScriptPromise registerFunction(ScriptState*, const PeriodicSyncRegistrationOptions&);
ScriptPromise registerFunction(ScriptState*, ExecutionContext*, const PeriodicSyncRegistrationOptions&);
ScriptPromise getRegistration(ScriptState*, const String&);
ScriptPromise getRegistrations(ScriptState*);
ScriptPromise permissionState(ScriptState*);
......
......@@ -8,7 +8,7 @@
RuntimeEnabled=BackgroundSyncPeriodic,
TypeChecking=Interface,
] interface PeriodicSyncManager {
[CallWith=ScriptState,ImplementedAs=registerFunction] Promise<PeriodicSyncRegistration> register([RuntimeEnabled=BackgroundSyncV2] optional PeriodicSyncRegistrationOptions options);
[CallWith=(ScriptState,ExecutionContext),ImplementedAs=registerFunction] Promise<PeriodicSyncRegistration> register([RuntimeEnabled=BackgroundSyncV2] optional PeriodicSyncRegistrationOptions options);
[CallWith=ScriptState] Promise<PeriodicSyncRegistration> getRegistration(DOMString tag);
[CallWith=ScriptState] Promise<sequence<PeriodicSyncRegistration>> getRegistrations();
[RuntimeEnabled=BackgroundSyncV2, CallWith=ScriptState] Promise<SyncPermissionState> permissionState();
......
......@@ -40,11 +40,8 @@ SyncManager::SyncManager(ServiceWorkerRegistration* registration)
ASSERT(registration);
}
ScriptPromise SyncManager::registerFunction(ScriptState* scriptState, const SyncRegistrationOptions& options)
ScriptPromise SyncManager::registerFunction(ScriptState* scriptState, ExecutionContext* context, const SyncRegistrationOptions& options)
{
if (!m_registration->active())
return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(AbortError, "Registration failed - no active Service Worker"));
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
......@@ -56,16 +53,13 @@ ScriptPromise SyncManager::registerFunction(ScriptState* scriptState, const Sync
WebSyncRegistration::NetworkStateOnline /* networkState */,
WebSyncRegistration::PowerStateAuto /* powerState */
);
backgroundSyncProvider()->registerBackgroundSync(webSyncRegistration, m_registration->webRegistration(), new SyncRegistrationCallbacks(resolver, m_registration));
backgroundSyncProvider()->registerBackgroundSync(webSyncRegistration, m_registration->webRegistration(), context->isServiceWorkerGlobalScope(), new SyncRegistrationCallbacks(resolver, m_registration));
return promise;
}
ScriptPromise SyncManager::getRegistration(ScriptState* scriptState, const String& syncRegistrationId)
{
if (!m_registration->active())
return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(AbortError, "Operation failed - no active Service Worker"));
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
......@@ -76,9 +70,6 @@ ScriptPromise SyncManager::getRegistration(ScriptState* scriptState, const Strin
ScriptPromise SyncManager::getRegistrations(ScriptState* scriptState)
{
if (!m_registration->active())
return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(AbortError, "Operation failed - no active Service Worker"));
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
......@@ -89,9 +80,6 @@ ScriptPromise SyncManager::getRegistrations(ScriptState* scriptState)
ScriptPromise SyncManager::permissionState(ScriptState* scriptState)
{
if (!m_registration->active())
return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(AbortError, "Operation failed - no active Service Worker"));
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
......
......@@ -11,6 +11,7 @@
namespace blink {
class ExecutionContext;
class SyncRegistrationOptions;
class ScriptPromise;
class ScriptState;
......@@ -26,8 +27,7 @@ public:
unsigned long minAllowablePeriod();
ScriptPromise registerFunction(ScriptState*);
ScriptPromise registerFunction(ScriptState*, const SyncRegistrationOptions&);
ScriptPromise registerFunction(ScriptState*, ExecutionContext*, const SyncRegistrationOptions&);
ScriptPromise getRegistration(ScriptState*, const String&);
ScriptPromise getRegistrations(ScriptState*);
ScriptPromise permissionState(ScriptState*);
......
......@@ -14,7 +14,7 @@ enum SyncPermissionState {
RuntimeEnabled=BackgroundSync,
TypeChecking=Interface,
] interface SyncManager {
[CallWith=ScriptState,ImplementedAs=registerFunction] Promise<SyncRegistration> register([RuntimeEnabled=BackgroundSyncV2] optional SyncRegistrationOptions options);
[CallWith=(ScriptState,ExecutionContext),ImplementedAs=registerFunction] Promise<SyncRegistration> register([RuntimeEnabled=BackgroundSyncV2] optional SyncRegistrationOptions options);
[CallWith=ScriptState] Promise<SyncRegistration> getRegistration(DOMString tag);
[CallWith=ScriptState] Promise<sequence<SyncRegistration>> getRegistrations();
[RuntimeEnabled=BackgroundSyncV2, CallWith=ScriptState] Promise<SyncPermissionState> permissionState();
......
......@@ -29,7 +29,14 @@ public:
// Takes ownership of the WebSyncRegistrationCallbacks.
// Does not take ownership of the WebServiceWorkerRegistration.
virtual void registerBackgroundSync(const WebSyncRegistration*, WebServiceWorkerRegistration*, WebSyncRegistrationCallbacks*) = 0;
// TODO(iclelland): Remove the body of this method once it is implemented in all subclasses.
virtual void registerBackgroundSync(const WebSyncRegistration* options, WebServiceWorkerRegistration* serviceWorkerRegistration, bool requestedFromServiceWorker, WebSyncRegistrationCallbacks* callbacks)
{
registerBackgroundSync(options, serviceWorkerRegistration, callbacks);
}
// TODO(iclelland): Remove this deprecated method once the browser implements the 4-argument version.
virtual void registerBackgroundSync(const WebSyncRegistration*, WebServiceWorkerRegistration*, WebSyncRegistrationCallbacks*) { }
// Takes ownership of the WebSyncUnregistrationCallbacks.
// Does not take ownership of the WebServiceWorkerRegistration.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment