void AsyncCallTracker::didEnqueueEvent(EventTarget* eventTarget, Event* event)
{
    ASSERT(eventTarget->executionContext());
    ASSERT(m_debuggerAgent->trackingAsyncCalls());
    int operationId = m_debuggerAgent->traceAsyncOperationStarting(event->type());
    ExecutionContextData* data = createContextDataIfNeeded(eventTarget->executionContext());
    data->m_eventCallChains.set(event, operationId);
}
void AsyncCallTracker::didRequestAnimationFrame(ExecutionContext* context, int callbackId)
{
    ASSERT(context);
    ASSERT(m_debuggerAgent->trackingAsyncCalls());
    int operationId = m_debuggerAgent->traceAsyncOperationStarting(requestAnimationFrameName);
    ASSERT(callbackId > 0);
    ExecutionContextData* data = createContextDataIfNeeded(context);
    data->m_animationFrameCallChains.set(callbackId, operationId);
}
void AsyncCallTracker::didPostExecutionContextTask(ExecutionContext* context, ExecutionContextTask* task)
{
    ASSERT(context);
    ASSERT(m_debuggerAgent->trackingAsyncCalls());
    if (task->taskNameForInstrumentation().isEmpty())
        return;
    int operationId = m_debuggerAgent->traceAsyncOperationStarting(task->taskNameForInstrumentation());
    ExecutionContextData* data = createContextDataIfNeeded(context);
    data->m_executionContextTaskCallChains.set(task, operationId);
}
void AsyncCallTracker::willLoadXHR(XMLHttpRequest* xhr, ThreadableLoaderClient*, const AtomicString&, const KURL&, bool async, PassRefPtr<FormData>, const HTTPHeaderMap&, bool)
{
    ASSERT(xhr->executionContext());
    ASSERT(m_debuggerAgent->trackingAsyncCalls());
    if (!async)
        return;
    int operationId = m_debuggerAgent->traceAsyncOperationStarting(xhrSendName);
    ExecutionContextData* data = createContextDataIfNeeded(xhr->executionContext());
    data->m_xhrCallChains.set(xhr, operationId);
}
void AsyncCallTracker::didEnqueueMutationRecord(ExecutionContext* context, MutationObserver* observer)
{
    ASSERT(context);
    ASSERT(m_debuggerAgent->trackingAsyncCalls());
    ExecutionContextData* data = createContextDataIfNeeded(context);
    if (data->m_mutationObserverCallChains.contains(observer))
        return;
    int operationId = m_debuggerAgent->traceAsyncOperationStarting(enqueueMutationRecordName);
    data->m_mutationObserverCallChains.set(observer, operationId);
}
int AsyncCallTracker::traceAsyncOperationStarting(ExecutionContext* context, const String& operationName, int prevOperationId)
{
    ASSERT(context);
    ASSERT(m_debuggerAgent->trackingAsyncCalls());
    if (prevOperationId)
        traceAsyncOperationCompleted(context, prevOperationId);
    int operationId = m_debuggerAgent->traceAsyncOperationStarting(operationName);
    ExecutionContextData* data = createContextDataIfNeeded(context);
    data->m_asyncOperations.set(operationId, operationId);
    return operationId;
}
void AsyncCallTracker::didEnqueueEvent(EventTarget* eventTarget, Event* event)
{
    ASSERT(eventTarget->executionContext());
    ASSERT(m_debuggerAgent->trackingAsyncCalls());
    Optional<ScriptForbiddenScope::AllowUserAgentScript> allowScripting;
    if (isMainThread())
        allowScripting.emplace();
    int operationId = m_debuggerAgent->traceAsyncOperationStarting(event->type());
    ExecutionContextData* data = createContextDataIfNeeded(eventTarget->executionContext());
    data->m_eventCallChains.set(event, operationId);
}
void AsyncCallTracker::didInstallTimer(ExecutionContext* context, int timerId, int timeout, bool singleShot)
{
    ASSERT(context);
    ASSERT(m_debuggerAgent->trackingAsyncCalls());
    int operationId = m_debuggerAgent->traceAsyncOperationStarting(singleShot ? setTimeoutName : setIntervalName);
    ASSERT(timerId > 0);
    ExecutionContextData* data = createContextDataIfNeeded(context);
    data->m_timerCallChains.set(timerId, operationId);
    if (!singleShot)
        data->m_intervalTimerIds.add(timerId);
}
void AsyncCallTracker::didEnqueueMutationRecord(ExecutionContext* context, MutationObserver* observer)
{
    ASSERT(context);
    ASSERT(m_debuggerAgent->trackingAsyncCalls());
    ExecutionContextData* data = createContextDataIfNeeded(context);
    if (data->m_mutationObserverCallChains.contains(observer))
        return;
    Optional<ScriptForbiddenScope::AllowUserAgentScript> allowScripting;
    if (isMainThread())
        allowScripting.emplace();
    int operationId = m_debuggerAgent->traceAsyncOperationStarting(enqueueMutationRecordName);
    data->m_mutationObserverCallChains.set(observer, operationId);
}