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