Index: third_party/WebKit/Source/core/dom/ScriptedIdleTaskController.cpp |
diff --git a/third_party/WebKit/Source/core/dom/ScriptedIdleTaskController.cpp b/third_party/WebKit/Source/core/dom/ScriptedIdleTaskController.cpp |
index 263766a0c308be166693dd4591c354f6c0ca793f..07077efb027855cbc9d1782a47951cf0f84b0811 100644 |
--- a/third_party/WebKit/Source/core/dom/ScriptedIdleTaskController.cpp |
+++ b/third_party/WebKit/Source/core/dom/ScriptedIdleTaskController.cpp |
@@ -27,7 +27,7 @@ class IdleRequestCallbackWrapper |
public: |
static PassRefPtr<IdleRequestCallbackWrapper> create( |
ScriptedIdleTaskController::CallbackId id, |
- ScriptedIdleTaskController* controller) { |
+ WTF::WeakPtr<ScriptedIdleTaskController> controller) { |
return adoptRef(new IdleRequestCallbackWrapper(id, controller)); |
} |
virtual ~IdleRequestCallbackWrapper() {} |
@@ -54,15 +54,16 @@ class IdleRequestCallbackWrapper |
void cancel() { m_controller = nullptr; } |
ScriptedIdleTaskController::CallbackId id() const { return m_id; } |
- ScriptedIdleTaskController* controller() const { return m_controller; } |
+ ScriptedIdleTaskController* controller() const { return m_controller.get(); } |
private: |
- IdleRequestCallbackWrapper(ScriptedIdleTaskController::CallbackId id, |
- ScriptedIdleTaskController* controller) |
+ IdleRequestCallbackWrapper( |
+ ScriptedIdleTaskController::CallbackId id, |
+ WTF::WeakPtr<ScriptedIdleTaskController> controller) |
: m_id(id), m_controller(controller) {} |
ScriptedIdleTaskController::CallbackId m_id; |
- Persistent<ScriptedIdleTaskController> m_controller; |
+ WTF::WeakPtr<ScriptedIdleTaskController> m_controller; |
sof
2017/01/06 09:31:04
WeakPersistent<> is used to hold onto GC-managed o
Xiaocheng
2017/01/06 09:56:28
Done.
Thanks!
|
}; |
} // namespace internal |
@@ -72,6 +73,7 @@ ScriptedIdleTaskController::ScriptedIdleTaskController( |
: SuspendableObject(context), |
m_scheduler(Platform::current()->currentThread()->scheduler()), |
m_nextCallbackId(0), |
+ m_weakPtrFactory(this), |
m_suspended(false) { |
suspendIfNeeded(); |
} |
@@ -104,7 +106,8 @@ ScriptedIdleTaskController::registerCallback( |
long long timeoutMillis = options.timeout(); |
RefPtr<internal::IdleRequestCallbackWrapper> callbackWrapper = |
- internal::IdleRequestCallbackWrapper::create(id, this); |
+ internal::IdleRequestCallbackWrapper::create( |
+ id, m_weakPtrFactory.createWeakPtr()); |
m_scheduler->postIdleTask( |
BLINK_FROM_HERE, |
WTF::bind(&internal::IdleRequestCallbackWrapper::idleTaskFired, |
@@ -190,6 +193,7 @@ void ScriptedIdleTaskController::runCallback( |
void ScriptedIdleTaskController::contextDestroyed() { |
m_callbacks.clear(); |
+ m_weakPtrFactory.revokeAll(); |
} |
void ScriptedIdleTaskController::suspend() { |
@@ -210,7 +214,8 @@ void ScriptedIdleTaskController::resume() { |
// Repost idle tasks for any remaining callbacks. |
for (auto& callback : m_callbacks) { |
RefPtr<internal::IdleRequestCallbackWrapper> callbackWrapper = |
- internal::IdleRequestCallbackWrapper::create(callback.key, this); |
+ internal::IdleRequestCallbackWrapper::create( |
+ callback.key, m_weakPtrFactory.createWeakPtr()); |
m_scheduler->postIdleTask( |
BLINK_FROM_HERE, |
WTF::bind(&internal::IdleRequestCallbackWrapper::idleTaskFired, |