[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() ...@@ -52,11 +52,8 @@ unsigned long PeriodicSyncManager::minPossiblePeriod()
return kMinPossiblePeriod; 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); ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise(); ScriptPromise promise = resolver->promise();
...@@ -84,16 +81,13 @@ ScriptPromise PeriodicSyncManager::registerFunction(ScriptState* scriptState, co ...@@ -84,16 +81,13 @@ ScriptPromise PeriodicSyncManager::registerFunction(ScriptState* scriptState, co
networkState, networkState,
powerState 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; return promise;
} }
ScriptPromise PeriodicSyncManager::getRegistration(ScriptState* scriptState, const String& syncRegistrationTag) 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); ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise(); ScriptPromise promise = resolver->promise();
...@@ -104,9 +98,6 @@ ScriptPromise PeriodicSyncManager::getRegistration(ScriptState* scriptState, con ...@@ -104,9 +98,6 @@ ScriptPromise PeriodicSyncManager::getRegistration(ScriptState* scriptState, con
ScriptPromise PeriodicSyncManager::getRegistrations(ScriptState* scriptState) 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); ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise(); ScriptPromise promise = resolver->promise();
...@@ -117,9 +108,6 @@ ScriptPromise PeriodicSyncManager::getRegistrations(ScriptState* scriptState) ...@@ -117,9 +108,6 @@ ScriptPromise PeriodicSyncManager::getRegistrations(ScriptState* scriptState)
ScriptPromise PeriodicSyncManager::permissionState(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); ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise(); ScriptPromise promise = resolver->promise();
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
namespace blink { namespace blink {
class ExecutionContext;
class PeriodicSyncRegistrationOptions; class PeriodicSyncRegistrationOptions;
class ScriptPromise; class ScriptPromise;
class ScriptState; class ScriptState;
...@@ -26,8 +27,7 @@ public: ...@@ -26,8 +27,7 @@ public:
unsigned long minPossiblePeriod(); unsigned long minPossiblePeriod();
ScriptPromise registerFunction(ScriptState*); ScriptPromise registerFunction(ScriptState*, ExecutionContext*, const PeriodicSyncRegistrationOptions&);
ScriptPromise registerFunction(ScriptState*, const PeriodicSyncRegistrationOptions&);
ScriptPromise getRegistration(ScriptState*, const String&); ScriptPromise getRegistration(ScriptState*, const String&);
ScriptPromise getRegistrations(ScriptState*); ScriptPromise getRegistrations(ScriptState*);
ScriptPromise permissionState(ScriptState*); ScriptPromise permissionState(ScriptState*);
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
RuntimeEnabled=BackgroundSyncPeriodic, RuntimeEnabled=BackgroundSyncPeriodic,
TypeChecking=Interface, TypeChecking=Interface,
] interface PeriodicSyncManager { ] 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<PeriodicSyncRegistration> getRegistration(DOMString tag);
[CallWith=ScriptState] Promise<sequence<PeriodicSyncRegistration>> getRegistrations(); [CallWith=ScriptState] Promise<sequence<PeriodicSyncRegistration>> getRegistrations();
[RuntimeEnabled=BackgroundSyncV2, CallWith=ScriptState] Promise<SyncPermissionState> permissionState(); [RuntimeEnabled=BackgroundSyncV2, CallWith=ScriptState] Promise<SyncPermissionState> permissionState();
......
...@@ -40,11 +40,8 @@ SyncManager::SyncManager(ServiceWorkerRegistration* registration) ...@@ -40,11 +40,8 @@ SyncManager::SyncManager(ServiceWorkerRegistration* registration)
ASSERT(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); ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise(); ScriptPromise promise = resolver->promise();
...@@ -56,16 +53,13 @@ ScriptPromise SyncManager::registerFunction(ScriptState* scriptState, const Sync ...@@ -56,16 +53,13 @@ ScriptPromise SyncManager::registerFunction(ScriptState* scriptState, const Sync
WebSyncRegistration::NetworkStateOnline /* networkState */, WebSyncRegistration::NetworkStateOnline /* networkState */,
WebSyncRegistration::PowerStateAuto /* powerState */ 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; return promise;
} }
ScriptPromise SyncManager::getRegistration(ScriptState* scriptState, const String& syncRegistrationId) 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); ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise(); ScriptPromise promise = resolver->promise();
...@@ -76,9 +70,6 @@ ScriptPromise SyncManager::getRegistration(ScriptState* scriptState, const Strin ...@@ -76,9 +70,6 @@ ScriptPromise SyncManager::getRegistration(ScriptState* scriptState, const Strin
ScriptPromise SyncManager::getRegistrations(ScriptState* scriptState) 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); ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise(); ScriptPromise promise = resolver->promise();
...@@ -89,9 +80,6 @@ ScriptPromise SyncManager::getRegistrations(ScriptState* scriptState) ...@@ -89,9 +80,6 @@ ScriptPromise SyncManager::getRegistrations(ScriptState* scriptState)
ScriptPromise SyncManager::permissionState(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); ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise(); ScriptPromise promise = resolver->promise();
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
namespace blink { namespace blink {
class ExecutionContext;
class SyncRegistrationOptions; class SyncRegistrationOptions;
class ScriptPromise; class ScriptPromise;
class ScriptState; class ScriptState;
...@@ -26,8 +27,7 @@ public: ...@@ -26,8 +27,7 @@ public:
unsigned long minAllowablePeriod(); unsigned long minAllowablePeriod();
ScriptPromise registerFunction(ScriptState*); ScriptPromise registerFunction(ScriptState*, ExecutionContext*, const SyncRegistrationOptions&);
ScriptPromise registerFunction(ScriptState*, const SyncRegistrationOptions&);
ScriptPromise getRegistration(ScriptState*, const String&); ScriptPromise getRegistration(ScriptState*, const String&);
ScriptPromise getRegistrations(ScriptState*); ScriptPromise getRegistrations(ScriptState*);
ScriptPromise permissionState(ScriptState*); ScriptPromise permissionState(ScriptState*);
......
...@@ -14,7 +14,7 @@ enum SyncPermissionState { ...@@ -14,7 +14,7 @@ enum SyncPermissionState {
RuntimeEnabled=BackgroundSync, RuntimeEnabled=BackgroundSync,
TypeChecking=Interface, TypeChecking=Interface,
] interface SyncManager { ] 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<SyncRegistration> getRegistration(DOMString tag);
[CallWith=ScriptState] Promise<sequence<SyncRegistration>> getRegistrations(); [CallWith=ScriptState] Promise<sequence<SyncRegistration>> getRegistrations();
[RuntimeEnabled=BackgroundSyncV2, CallWith=ScriptState] Promise<SyncPermissionState> permissionState(); [RuntimeEnabled=BackgroundSyncV2, CallWith=ScriptState] Promise<SyncPermissionState> permissionState();
......
...@@ -29,7 +29,14 @@ public: ...@@ -29,7 +29,14 @@ public:
// Takes ownership of the WebSyncRegistrationCallbacks. // Takes ownership of the WebSyncRegistrationCallbacks.
// Does not take ownership of the WebServiceWorkerRegistration. // 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. // Takes ownership of the WebSyncUnregistrationCallbacks.
// Does not take ownership of the WebServiceWorkerRegistration. // 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