void ScriptedAnimationController::dispatchEvents(const AtomicString& eventInterfaceFilter) { WillBeHeapVector<RefPtrWillBeMember<Event> > events; if (eventInterfaceFilter.isEmpty()) { events.swap(m_eventQueue); m_perFrameEvents.clear(); } else { WillBeHeapVector<RefPtrWillBeMember<Event> > remaining; for (auto& event : m_eventQueue) { if (event && event->interfaceName() == eventInterfaceFilter) { m_perFrameEvents.remove(eventTargetKey(event.get())); events.append(event.release()); } else { remaining.append(event.release()); } } remaining.swap(m_eventQueue); } for (size_t i = 0; i < events.size(); ++i) { EventTarget* eventTarget = events[i]->target(); // FIXME: we should figure out how to make dispatchEvent properly virtual to avoid // special casting window. // FIXME: We should not fire events for nodes that are no longer in the tree. if (LocalDOMWindow* window = eventTarget->toDOMWindow()) window->dispatchEvent(events[i], nullptr); else eventTarget->dispatchEvent(events[i]); InspectorInstrumentation::didRemoveEvent(eventTarget, events[i].get()); } }
void ScopedEventQueue::dispatchAllEvents() { WillBeHeapVector<RefPtrWillBeMember<EventDispatchMediator>> queuedEventDispatchMediators; queuedEventDispatchMediators.swap(m_queuedEventDispatchMediators); for (size_t i = 0; i < queuedEventDispatchMediators.size(); i++) dispatchEvent(queuedEventDispatchMediators[i].release()); }
void MediaRecorder::dispatchScheduledEvent() { WillBeHeapVector<RefPtrWillBeMember<Event>> events; events.swap(m_scheduledEvents); for (const auto& event : events) dispatchEvent(event); }
void RTCDataChannel::scheduledEventTimerFired(Timer<RTCDataChannel>*) { WillBeHeapVector<RefPtrWillBeMember<Event>> events; events.swap(m_scheduledEvents); WillBeHeapVector<RefPtrWillBeMember<Event>>::iterator it = events.begin(); for (; it != events.end(); ++it) dispatchEvent((*it).release()); events.clear(); }
void RTCDTMFSender::scheduledEventTimerFired(Timer<RTCDTMFSender>*) { if (m_stopped) return; WillBeHeapVector<RefPtrWillBeMember<Event> > events; events.swap(m_scheduledEvents); WillBeHeapVector<RefPtrWillBeMember<Event> >::iterator it = events.begin(); for (; it != events.end(); ++it) dispatchEvent((*it).release()); }
void RTCPeerConnection::dispatchScheduledEvent() { if (m_stopped) return; WillBeHeapVector<RefPtrWillBeMember<Event> > events; events.swap(m_scheduledEvents); WillBeHeapVector<RefPtrWillBeMember<Event> >::iterator it = events.begin(); for (; it != events.end(); ++it) dispatchEvent((*it).release()); events.clear(); }
void ScriptedAnimationController::dispatchEvents() { WillBeHeapVector<RefPtrWillBeMember<Event> > events; events.swap(m_eventQueue); m_perFrameEvents.clear(); for (size_t i = 0; i < events.size(); ++i) { EventTarget* eventTarget = events[i]->target(); // FIXME: we should figure out how to make dispatchEvent properly virtual to avoid // special casting window. // FIXME: We should not fire events for nodes that are no longer in the tree. if (DOMWindow* window = eventTarget->toDOMWindow()) window->dispatchEvent(events[i], nullptr); else eventTarget->dispatchEvent(events[i]); } }
void HTMLFormattingElementList::ensureNoahsArkCondition(HTMLStackItem* newItem) { WillBeHeapVector<RawPtrWillBeMember<HTMLStackItem> > candidates; tryToEnsureNoahsArkConditionQuickly(newItem, candidates); if (candidates.isEmpty()) return; // We pre-allocate and re-use this second vector to save one malloc per // attribute that we verify. WillBeHeapVector<RawPtrWillBeMember<HTMLStackItem> > remainingCandidates; remainingCandidates.reserveInitialCapacity(candidates.size()); const Vector<Attribute>& attributes = newItem->attributes(); for (size_t i = 0; i < attributes.size(); ++i) { const Attribute& attribute = attributes[i]; for (size_t j = 0; j < candidates.size(); ++j) { HTMLStackItem* candidate = candidates[j]; // These properties should already have been checked by tryToEnsureNoahsArkConditionQuickly. ASSERT(newItem->attributes().size() == candidate->attributes().size()); ASSERT(newItem->localName() == candidate->localName() && newItem->namespaceURI() == candidate->namespaceURI()); Attribute* candidateAttribute = candidate->getAttributeItem(attribute.name()); if (candidateAttribute && candidateAttribute->value() == attribute.value()) remainingCandidates.append(candidate); } if (remainingCandidates.size() < kNoahsArkCapacity) return; candidates.swap(remainingCandidates); remainingCandidates.shrink(0); } // Inductively, we shouldn't spin this loop very many times. It's possible, // however, that we wil spin the loop more than once because of how the // formatting element list gets permuted. for (size_t i = kNoahsArkCapacity - 1; i < candidates.size(); ++i) remove(candidates[i]->element()); }