Commit 6c3e8431 authored by nhiroki@chromium.org's avatar nhiroki@chromium.org

ServiceWorker: Clean up ownership management of WebServiceWorkerRegistration

Before the CL[1], Chromium could pass an existing WebServiceWorkerRegistration
to ServiceWorkerRegistration, so ServiceWorkerRegistration needed to confirm
whether its ownership was passed. After the CL, Chromium always passes ownership
and ServiceWorkerRegistration does not have to worry about it.

This CL removes codes for the case that ownership is not passed from Chromium.

[1] https://codereview.chromium.org/1307133003/

BUG=523904

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

git-svn-id: svn://svn.chromium.org/blink/trunk@201219 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 6ec618d4
...@@ -64,11 +64,13 @@ public: ...@@ -64,11 +64,13 @@ public:
: m_resolver(resolver) { } : m_resolver(resolver) { }
~RegistrationCallback() override { } ~RegistrationCallback() override { }
void onSuccess(WebServiceWorkerRegistration* registration) override // Takes ownership of |registrationRaw|.
void onSuccess(WebServiceWorkerRegistration* registrationRaw) override
{ {
OwnPtr<WebServiceWorkerRegistration> registration = adoptPtr(registrationRaw);
if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped())
return; return;
m_resolver->resolve(ServiceWorkerRegistration::take(m_resolver.get(), registration)); m_resolver->resolve(ServiceWorkerRegistration::create(m_resolver->executionContext(), registration.release()));
} }
// Takes ownership of |errorRaw|. // Takes ownership of |errorRaw|.
...@@ -91,8 +93,10 @@ public: ...@@ -91,8 +93,10 @@ public:
: m_resolver(resolver) { } : m_resolver(resolver) { }
~GetRegistrationCallback() override { } ~GetRegistrationCallback() override { }
void onSuccess(WebServiceWorkerRegistration* registration) override // Takes ownership of |registrationRaw|.
void onSuccess(WebServiceWorkerRegistration* registrationRaw) override
{ {
OwnPtr<WebServiceWorkerRegistration> registration = adoptPtr(registrationRaw);
if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped())
return; return;
if (!registration) { if (!registration) {
...@@ -100,7 +104,7 @@ public: ...@@ -100,7 +104,7 @@ public:
m_resolver->resolve(); m_resolver->resolve();
return; return;
} }
m_resolver->resolve(ServiceWorkerRegistration::take(m_resolver.get(), registration)); m_resolver->resolve(ServiceWorkerRegistration::create(m_resolver->executionContext(), registration.release()));
} }
// Takes ownership of |errorRaw|. // Takes ownership of |errorRaw|.
...@@ -151,13 +155,18 @@ public: ...@@ -151,13 +155,18 @@ public:
explicit GetRegistrationForReadyCallback(ReadyProperty* ready) explicit GetRegistrationForReadyCallback(ReadyProperty* ready)
: m_ready(ready) { } : m_ready(ready) { }
~GetRegistrationForReadyCallback() { } ~GetRegistrationForReadyCallback() { }
void onSuccess(WebServiceWorkerRegistration* registration) override
// Takes ownership of |registrationRaw|.
void onSuccess(WebServiceWorkerRegistration* registrationRaw) override
{ {
ASSERT(registration); ASSERT(registrationRaw);
ASSERT(m_ready->state() == ReadyProperty::Pending); ASSERT(m_ready->state() == ReadyProperty::Pending);
OwnPtr<WebServiceWorkerRegistration> registration = adoptPtr(registrationRaw);
if (m_ready->executionContext() && !m_ready->executionContext()->activeDOMObjectsAreStopped()) if (m_ready->executionContext() && !m_ready->executionContext()->activeDOMObjectsAreStopped())
m_ready->resolve(ServiceWorkerRegistration::from(m_ready->executionContext(), registration)); m_ready->resolve(ServiceWorkerRegistration::create(m_ready->executionContext(), registration.release()));
} }
private: private:
Persistent<ReadyProperty> m_ready; Persistent<ReadyProperty> m_ready;
WTF_MAKE_NONCOPYABLE(GetRegistrationForReadyCallback); WTF_MAKE_NONCOPYABLE(GetRegistrationForReadyCallback);
......
...@@ -154,13 +154,13 @@ ScriptPromise ServiceWorkerGlobalScope::skipWaiting(ScriptState* scriptState) ...@@ -154,13 +154,13 @@ ScriptPromise ServiceWorkerGlobalScope::skipWaiting(ScriptState* scriptState)
return promise; return promise;
} }
void ServiceWorkerGlobalScope::setRegistration(WebServiceWorkerRegistration* registration) void ServiceWorkerGlobalScope::setRegistration(WebServiceWorkerRegistration* registrationRaw)
{ {
if (!executionContext()) { ASSERT(registrationRaw);
ServiceWorkerRegistration::dispose(registration); OwnPtr<WebServiceWorkerRegistration> registration = adoptPtr(registrationRaw);
if (!executionContext())
return; return;
} m_registration = ServiceWorkerRegistration::create(executionContext(), registration.release());
m_registration = ServiceWorkerRegistration::from(executionContext(), registration);
} }
bool ServiceWorkerGlobalScope::addEventListener(const AtomicString& eventType, PassRefPtrWillBeRawPtr<EventListener> listener, bool useCapture) bool ServiceWorkerGlobalScope::addEventListener(const AtomicString& eventType, PassRefPtrWillBeRawPtr<EventListener> listener, bool useCapture)
......
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
#include "bindings/core/v8/CallbackPromiseAdapter.h" #include "bindings/core/v8/CallbackPromiseAdapter.h"
#include "bindings/core/v8/ScriptPromise.h" #include "bindings/core/v8/ScriptPromise.h"
#include "bindings/core/v8/ScriptPromiseResolver.h"
#include "bindings/core/v8/ScriptState.h" #include "bindings/core/v8/ScriptState.h"
#include "core/dom/DOMException.h" #include "core/dom/DOMException.h"
#include "core/dom/ExceptionCode.h" #include "core/dom/ExceptionCode.h"
...@@ -63,22 +62,13 @@ void ServiceWorkerRegistration::setActive(WebServiceWorker* serviceWorker) ...@@ -63,22 +62,13 @@ void ServiceWorkerRegistration::setActive(WebServiceWorker* serviceWorker)
m_active = ServiceWorker::from(executionContext(), serviceWorker); m_active = ServiceWorker::from(executionContext(), serviceWorker);
} }
ServiceWorkerRegistration* ServiceWorkerRegistration::from(ExecutionContext* executionContext, WebServiceWorkerRegistration* registration) ServiceWorkerRegistration* ServiceWorkerRegistration::create(ExecutionContext* executionContext, PassOwnPtr<WebServiceWorkerRegistration> webRegistration)
{ {
if (!registration) if (!webRegistration)
return 0; return nullptr;
return getOrCreate(executionContext, registration); ServiceWorkerRegistration* registration = new ServiceWorkerRegistration(executionContext, webRegistration);
} registration->suspendIfNeeded();
return registration;
ServiceWorkerRegistration* ServiceWorkerRegistration::take(ScriptPromiseResolver* resolver, WebServiceWorkerRegistration* registration)
{
return from(resolver->scriptState()->executionContext(), registration);
}
void ServiceWorkerRegistration::dispose(WebServiceWorkerRegistration* registration)
{
if (registration && !registration->proxy())
delete registration;
} }
String ServiceWorkerRegistration::scope() const String ServiceWorkerRegistration::scope() const
...@@ -114,29 +104,14 @@ ScriptPromise ServiceWorkerRegistration::unregister(ScriptState* scriptState) ...@@ -114,29 +104,14 @@ ScriptPromise ServiceWorkerRegistration::unregister(ScriptState* scriptState)
return promise; return promise;
} }
ServiceWorkerRegistration* ServiceWorkerRegistration::getOrCreate(ExecutionContext* executionContext, WebServiceWorkerRegistration* outerRegistration)
{
if (!outerRegistration)
return 0;
ServiceWorkerRegistration* existingRegistration = static_cast<ServiceWorkerRegistration*>(outerRegistration->proxy());
if (existingRegistration) {
ASSERT(existingRegistration->executionContext() == executionContext);
return existingRegistration;
}
ServiceWorkerRegistration* registration = new ServiceWorkerRegistration(executionContext, adoptPtr(outerRegistration));
registration->suspendIfNeeded();
return registration;
}
ServiceWorkerRegistration::ServiceWorkerRegistration(ExecutionContext* executionContext, PassOwnPtr<WebServiceWorkerRegistration> outerRegistration) ServiceWorkerRegistration::ServiceWorkerRegistration(ExecutionContext* executionContext, PassOwnPtr<WebServiceWorkerRegistration> outerRegistration)
: ActiveDOMObject(executionContext) : ActiveDOMObject(executionContext)
, m_outerRegistration(outerRegistration) , m_outerRegistration(outerRegistration)
, m_provider(0) , m_provider(nullptr)
, m_stopped(false) , m_stopped(false)
{ {
ASSERT(m_outerRegistration); ASSERT(m_outerRegistration);
ASSERT(!m_outerRegistration->proxy());
if (!executionContext) if (!executionContext)
return; return;
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#ifndef ServiceWorkerRegistration_h #ifndef ServiceWorkerRegistration_h
#define ServiceWorkerRegistration_h #define ServiceWorkerRegistration_h
#include "bindings/core/v8/ScriptPromiseResolver.h"
#include "core/dom/ActiveDOMObject.h" #include "core/dom/ActiveDOMObject.h"
#include "core/events/EventTarget.h" #include "core/events/EventTarget.h"
#include "modules/serviceworkers/ServiceWorker.h" #include "modules/serviceworkers/ServiceWorker.h"
...@@ -20,7 +21,6 @@ ...@@ -20,7 +21,6 @@
namespace blink { namespace blink {
class ScriptPromise; class ScriptPromise;
class ScriptPromiseResolver;
class ScriptState; class ScriptState;
class WebServiceWorkerProvider; class WebServiceWorkerProvider;
...@@ -43,9 +43,7 @@ public: ...@@ -43,9 +43,7 @@ public:
void setWaiting(WebServiceWorker*) override; void setWaiting(WebServiceWorker*) override;
void setActive(WebServiceWorker*) override; void setActive(WebServiceWorker*) override;
static ServiceWorkerRegistration* from(ExecutionContext*, WebServiceWorkerRegistration*); static ServiceWorkerRegistration* create(ExecutionContext*, PassOwnPtr<WebServiceWorkerRegistration>);
static ServiceWorkerRegistration* take(ScriptPromiseResolver*, WebServiceWorkerRegistration*);
static void dispose(WebServiceWorkerRegistration*);
ServiceWorker* installing() { return m_installing; } ServiceWorker* installing() { return m_installing; }
ServiceWorker* waiting() { return m_waiting; } ServiceWorker* waiting() { return m_waiting; }
...@@ -67,7 +65,6 @@ public: ...@@ -67,7 +65,6 @@ public:
DECLARE_VIRTUAL_TRACE(); DECLARE_VIRTUAL_TRACE();
private: private:
static ServiceWorkerRegistration* getOrCreate(ExecutionContext*, WebServiceWorkerRegistration*);
ServiceWorkerRegistration(ExecutionContext*, PassOwnPtr<WebServiceWorkerRegistration>); ServiceWorkerRegistration(ExecutionContext*, PassOwnPtr<WebServiceWorkerRegistration>);
// ActiveDOMObject overrides. // ActiveDOMObject overrides.
...@@ -90,15 +87,9 @@ public: ...@@ -90,15 +87,9 @@ public:
{ {
HeapVector<Member<ServiceWorkerRegistration>> registrations; HeapVector<Member<ServiceWorkerRegistration>> registrations;
for (WebServiceWorkerRegistration* registration : *webServiceWorkerRegistrations) for (WebServiceWorkerRegistration* registration : *webServiceWorkerRegistrations)
registrations.append(ServiceWorkerRegistration::take(resolver, registration)); registrations.append(ServiceWorkerRegistration::create(resolver->executionContext(), adoptPtr(registration)));
return registrations; return registrations;
} }
static void dispose(PassOwnPtr<WebVector<WebServiceWorkerRegistration*>> webServiceWorkerRegistrations)
{
for (WebServiceWorkerRegistration* registration : *webServiceWorkerRegistrations)
ServiceWorkerRegistration::dispose(registration);
}
}; };
} // namespace blink } // namespace blink
......
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