Index: Source/modules/serviceworkers/ServiceWorker.cpp |
diff --git a/Source/modules/serviceworkers/ServiceWorker.cpp b/Source/modules/serviceworkers/ServiceWorker.cpp |
index 2c746c86e95806abdc2ee3f7cfc4caa2224232aa..fb74bbd4f9ae7c9956728371fb1889627ed19cdc 100644 |
--- a/Source/modules/serviceworkers/ServiceWorker.cpp |
+++ b/Source/modules/serviceworkers/ServiceWorker.cpp |
@@ -260,8 +260,33 @@ ServiceWorker::ServiceWorker(ExecutionContext* executionContext, PassOwnPtr<WebS |
, m_outerWorker(worker) |
, m_proxyState(Initial) |
{ |
+#if ENABLE(OILPAN) |
+ ThreadState::current()->registerPreFinalizer(*this); |
+#endif |
ASSERT(m_outerWorker); |
m_outerWorker->setProxy(this); |
} |
+ServiceWorker::~ServiceWorker() |
+{ |
+#if ENABLE(OILPAN) |
+ ASSERT(!m_outerWorker); |
+#endif |
+} |
+ |
+void ServiceWorker::dispose() |
+{ |
+ // With Oilpan enabled, the observable lifetime of a ServiceWorker |
+ // must not extend beyond when it has been deemed to be unreachable |
+ // by the garbage collector. The embedder must be detached before |
+ // it is eventually (lazily) swept, so as to prevent that. Otherwise |
+ // the embedder might risk accessing a to-be-finalized object that |
+ // is not in a valid state. |
+ // |
+ // The dispose() method is hooked up to the garbage collector by |
+ // way of a "pre finalizer", a method that is run after marking |
+ // has completed, but before any sweeping takes place. |
+ m_outerWorker.clear(); |
+} |
+ |
} // namespace blink |