Commit 88ef783a authored by nhiroki@chromium.org's avatar nhiroki@chromium.org

ServiceWorker: Prevent premature garbage collection on ServiceWorkerRegistration

Before this patch, the ServiceWorkerRegistration object could be garbage
collected prematurely and it caused renderer crash.

This change keeps the registration object alive until stop() is called, and
notifies WebServiceWorkerRegistration of the stop event.


BUG=396400
TEST=https://codereview.chromium.org/466723002/

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

git-svn-id: svn://svn.chromium.org/blink/trunk@180265 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent a957931c
...@@ -147,6 +147,7 @@ ServiceWorkerRegistration::ServiceWorkerRegistration(ExecutionContext* execution ...@@ -147,6 +147,7 @@ ServiceWorkerRegistration::ServiceWorkerRegistration(ExecutionContext* execution
, WebServiceWorkerRegistrationProxy(this) , WebServiceWorkerRegistrationProxy(this)
, m_outerRegistration(outerRegistration) , m_outerRegistration(outerRegistration)
, m_provider(0) , m_provider(0)
, m_stopped(false)
{ {
ASSERT(m_outerRegistration); ASSERT(m_outerRegistration);
ScriptWrappable::init(this); ScriptWrappable::init(this);
...@@ -166,4 +167,17 @@ void ServiceWorkerRegistration::trace(Visitor* visitor) ...@@ -166,4 +167,17 @@ void ServiceWorkerRegistration::trace(Visitor* visitor)
EventTargetWithInlineData::trace(visitor); EventTargetWithInlineData::trace(visitor);
} }
bool ServiceWorkerRegistration::hasPendingActivity() const
{
return !m_stopped;
}
void ServiceWorkerRegistration::stop()
{
if (m_stopped)
return;
m_stopped = true;
m_outerRegistration->proxyStopped();
}
} // namespace blink } // namespace blink
...@@ -63,11 +63,17 @@ private: ...@@ -63,11 +63,17 @@ private:
static PassRefPtrWillBeRawPtr<ServiceWorkerRegistration> getOrCreate(ExecutionContext*, WebServiceWorkerRegistration*); static PassRefPtrWillBeRawPtr<ServiceWorkerRegistration> getOrCreate(ExecutionContext*, WebServiceWorkerRegistration*);
ServiceWorkerRegistration(ExecutionContext*, PassOwnPtr<WebServiceWorkerRegistration>); ServiceWorkerRegistration(ExecutionContext*, PassOwnPtr<WebServiceWorkerRegistration>);
// ActiveDOMObject overrides.
virtual bool hasPendingActivity() const OVERRIDE;
virtual void stop() OVERRIDE;
OwnPtr<WebServiceWorkerRegistration> m_outerRegistration; OwnPtr<WebServiceWorkerRegistration> m_outerRegistration;
WebServiceWorkerProvider* m_provider; WebServiceWorkerProvider* m_provider;
RefPtrWillBeMember<ServiceWorker> m_installing; RefPtrWillBeMember<ServiceWorker> m_installing;
RefPtrWillBeMember<ServiceWorker> m_waiting; RefPtrWillBeMember<ServiceWorker> m_waiting;
RefPtrWillBeMember<ServiceWorker> m_active; RefPtrWillBeMember<ServiceWorker> m_active;
bool m_stopped;
}; };
} // namespace blink } // namespace blink
......
...@@ -17,6 +17,7 @@ public: ...@@ -17,6 +17,7 @@ public:
virtual void setProxy(WebServiceWorkerRegistrationProxy*) { } virtual void setProxy(WebServiceWorkerRegistrationProxy*) { }
virtual WebServiceWorkerRegistrationProxy* proxy() { return 0; } virtual WebServiceWorkerRegistrationProxy* proxy() { return 0; }
virtual void proxyStopped() { }
virtual WebURL scope() const { return WebURL(); } virtual WebURL scope() const { return WebURL(); }
}; };
......
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