void DOMWindowEventQueue::dispatchEvent(Event* event) { EventTarget* eventTarget = event->target(); InspectorInstrumentation::AsyncTask asyncTask( eventTarget->getExecutionContext(), event); if (LocalDOMWindow* window = eventTarget->toLocalDOMWindow()) window->dispatchEvent(event, nullptr); else eventTarget->dispatchEvent(event); }
void GenericEventQueue::cancelAllEvents() { m_timer.stop(); for (const auto& pendingEvent : m_pendingEvents) { Event* event = pendingEvent.get(); TRACE_EVENT_ASYNC_END2("event", "GenericEventQueue:enqueueEvent", event, "type", event->type().ascii(), "status", "cancelled"); EventTarget* target = event->target() ? event->target() : m_owner.get(); InspectorInstrumentation::asyncTaskCanceled(target->getExecutionContext(), event); } m_pendingEvents.clear(); }
bool GenericEventQueue::cancelEvent(Event* event) { bool found = m_pendingEvents.contains(event); if (found) { EventTarget* target = event->target() ? event->target() : m_owner.get(); InspectorInstrumentation::asyncTaskCanceled(target->getExecutionContext(), event); m_pendingEvents.remove(m_pendingEvents.find(event)); TRACE_EVENT_ASYNC_END2("event", "GenericEventQueue:enqueueEvent", event, "type", event->type().ascii(), "status", "cancelled"); } if (m_pendingEvents.isEmpty()) m_timer.stop(); return found; }
void GenericEventQueue::timerFired(Timer<GenericEventQueue>*) { ASSERT(!m_timer.isActive()); ASSERT(!m_pendingEvents.isEmpty()); HeapVector<Member<Event>> pendingEvents; m_pendingEvents.swap(pendingEvents); for (const auto& pendingEvent : pendingEvents) { Event* event = pendingEvent.get(); EventTarget* target = event->target() ? event->target() : m_owner.get(); CString type(event->type().ascii()); InspectorInstrumentation::AsyncTask asyncTask(target->getExecutionContext(), event); TRACE_EVENT_ASYNC_STEP_INTO1("event", "GenericEventQueue:enqueueEvent", event, "dispatch", "type", type); target->dispatchEvent(pendingEvent); TRACE_EVENT_ASYNC_END1("event", "GenericEventQueue:enqueueEvent", event, "type", type); } }
bool GenericEventQueue::enqueueEvent(Event* event) { if (m_isClosed) return false; if (event->target() == m_owner) event->setTarget(nullptr); TRACE_EVENT_ASYNC_BEGIN1("event", "GenericEventQueue:enqueueEvent", event, "type", event->type().ascii()); EventTarget* target = event->target() ? event->target() : m_owner.get(); InspectorInstrumentation::asyncTaskScheduled(target->getExecutionContext(), event->type(), event); m_pendingEvents.append(event); if (!m_timer.isActive()) m_timer.startOneShot(0, BLINK_FROM_HERE); return true; }