WorkerOrWorkletGlobalScope.cpp [plain text]
#include "config.h"
#include "WorkerOrWorkletGlobalScope.h"
#include "WorkerEventLoop.h"
#include "WorkerInspectorController.h"
#include "WorkerOrWorkletScriptController.h"
#include "WorkerOrWorkletThread.h"
#include "WorkerRunLoop.h"
#include <wtf/IsoMallocInlines.h>
namespace WebCore {
WTF_MAKE_ISO_ALLOCATED_IMPL(WorkerOrWorkletGlobalScope);
WorkerOrWorkletGlobalScope::WorkerOrWorkletGlobalScope(WorkerThreadType type, Ref<JSC::VM>&& vm, WorkerOrWorkletThread* thread)
: m_script(makeUnique<WorkerOrWorkletScriptController>(type, WTFMove(vm), this))
, m_thread(thread)
, m_inspectorController(makeUnique<WorkerInspectorController>(*this))
{
}
WorkerOrWorkletGlobalScope::~WorkerOrWorkletGlobalScope() = default;
void WorkerOrWorkletGlobalScope::prepareForDestruction()
{
if (m_defaultTaskGroup) {
m_defaultTaskGroup->markAsReadyToStop();
ASSERT(m_defaultTaskGroup->isStoppedPermanently());
}
stopActiveDOMObjects();
removeAllEventListeners();
if (m_eventLoop)
m_eventLoop->clearMicrotaskQueue();
removeRejectedPromiseTracker();
m_inspectorController->workerTerminating();
}
void WorkerOrWorkletGlobalScope::clearScript()
{
m_script = nullptr;
}
JSC::VM& WorkerOrWorkletGlobalScope::vm()
{
return script()->vm();
}
void WorkerOrWorkletGlobalScope::disableEval(const String& errorMessage)
{
m_script->disableEval(errorMessage);
}
void WorkerOrWorkletGlobalScope::disableWebAssembly(const String& errorMessage)
{
m_script->disableWebAssembly(errorMessage);
}
bool WorkerOrWorkletGlobalScope::isJSExecutionForbidden() const
{
return !m_script || m_script->isExecutionForbidden();
}
EventLoopTaskGroup& WorkerOrWorkletGlobalScope::eventLoop()
{
ASSERT(isContextThread());
if (UNLIKELY(!m_defaultTaskGroup)) {
m_eventLoop = WorkerEventLoop::create(*this);
m_defaultTaskGroup = makeUnique<EventLoopTaskGroup>(*m_eventLoop);
if (activeDOMObjectsAreStopped())
m_defaultTaskGroup->stopAndDiscardAllTasks();
}
return *m_defaultTaskGroup;
}
bool WorkerOrWorkletGlobalScope::isContextThread() const
{
auto* thread = workerOrWorkletThread();
return thread ? thread->thread() == &Thread::current() : isMainThread();
}
void WorkerOrWorkletGlobalScope::postTask(Task&& task)
{
ASSERT(workerOrWorkletThread());
workerOrWorkletThread()->runLoop().postTask(WTFMove(task));
}
}