summaryrefslogtreecommitdiff
path: root/Source/WebCore/bindings/js/JSDOMGlobalObjectTask.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/bindings/js/JSDOMGlobalObjectTask.cpp')
-rw-r--r--Source/WebCore/bindings/js/JSDOMGlobalObjectTask.cpp41
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