diff options
Diffstat (limited to 'Source/WebCore/bindings/js/JSDOMGlobalObjectTask.cpp')
-rw-r--r-- | Source/WebCore/bindings/js/JSDOMGlobalObjectTask.cpp | 41 |
1 files changed, 19 insertions, 22 deletions
diff --git a/Source/WebCore/bindings/js/JSDOMGlobalObjectTask.cpp b/Source/WebCore/bindings/js/JSDOMGlobalObjectTask.cpp index 847dbd164..0be269683 100644 --- a/Source/WebCore/bindings/js/JSDOMGlobalObjectTask.cpp +++ b/Source/WebCore/bindings/js/JSDOMGlobalObjectTask.cpp @@ -38,9 +38,9 @@ namespace WebCore { class JSGlobalObjectCallback final : public RefCounted<JSGlobalObjectCallback>, private ActiveDOMCallback { public: - static PassRefPtr<JSGlobalObjectCallback> create(JSDOMGlobalObject* globalObject, PassRefPtr<Microtask> task) + static Ref<JSGlobalObjectCallback> create(JSDOMGlobalObject* globalObject, Ref<Microtask>&& task) { - return adoptRef(new JSGlobalObjectCallback(globalObject, task)); + return adoptRef(*new JSGlobalObjectCallback(globalObject, WTFMove(task))); } void call() @@ -48,8 +48,10 @@ public: if (!canInvokeCallback()) return; - Ref<JSGlobalObjectCallback> protect(*this); - JSLockHolder lock(m_globalObject->vm()); + Ref<JSGlobalObjectCallback> protectedThis(*this); + VM& vm = m_globalObject->vm(); + JSLockHolder lock(vm); + auto scope = DECLARE_THROW_SCOPE(vm); ExecState* exec = m_globalObject->globalExec(); @@ -60,37 +62,32 @@ public: // When on the main thread (e.g. the document's thread), we need to make sure to // push the current ExecState on to the JSMainThreadExecState stack. - if (context->isDocument()) { - JSMainThreadExecState currentState(exec); - m_task->run(exec); - } else + if (context->isDocument()) + JSMainThreadExecState::runTask(exec, m_task); + else m_task->run(exec); + ASSERT_UNUSED(scope, !scope.exception()); } private: - JSGlobalObjectCallback(JSDOMGlobalObject* globalObject, PassRefPtr<Microtask> task) + JSGlobalObjectCallback(JSDOMGlobalObject* globalObject, Ref<Microtask>&& task) : ActiveDOMCallback(globalObject->scriptExecutionContext()) , m_globalObject(globalObject->vm(), globalObject) - , m_task(task) + , m_task(WTFMove(task)) { } Strong<JSDOMGlobalObject> m_globalObject; - RefPtr<Microtask> m_task; + Ref<Microtask> m_task; }; -JSGlobalObjectTask::JSGlobalObjectTask(JSDOMGlobalObject* globalObject, PassRefPtr<Microtask> task) - : m_callback(JSGlobalObjectCallback::create(globalObject, task)) -{ -} - -JSGlobalObjectTask::~JSGlobalObjectTask() -{ -} - -void JSGlobalObjectTask::performTask(ScriptExecutionContext*) +JSGlobalObjectTask::JSGlobalObjectTask(JSDOMGlobalObject* globalObject, Ref<Microtask>&& task) + : ScriptExecutionContext::Task({ }) { - m_callback->call(); + RefPtr<JSGlobalObjectCallback> callback = JSGlobalObjectCallback::create(globalObject, WTFMove(task)); + m_task = [callback] (ScriptExecutionContext&) { + callback->call(); + }; } } // namespace WebCore |