Commit 2a2e0d5c authored by Fredrik Söderquist's avatar Fredrik Söderquist Committed by Commit Bot

Split out event dispatch from SVGSMILElement::UpdateActiveState

This will allow disabling event dispatching altogether in cases where we
can reliably do that (SVGImage). It may also help with not sending
events when seeking the timeline.

Bug: 1021630, 1039886
Change-Id: I82e7b453b3b6abb1d71d064c33c89db7657c8b06
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2007572Reviewed-by: default avatarPhilip Rogers <pdr@chromium.org>
Commit-Queue: Fredrik Söderquist <fs@opera.com>
Cr-Commit-Position: refs/heads/master@{#733399}
parent cf037f07
......@@ -456,7 +456,9 @@ void SMILTimeContainer::UpdateIntervals(SMILTime document_time) {
while (priority_queue_.Min() <= document_time) {
SVGSMILElement* element = priority_queue_.MinElement();
element->UpdateInterval(document_time);
element->UpdateActiveState(document_time);
auto events_to_dispatch = element->UpdateActiveState(document_time);
if (events_to_dispatch)
element->DispatchEvents(events_to_dispatch);
SMILTime next_interval_time =
element->ComputeNextIntervalTime(document_time);
priority_queue_.Update(next_interval_time, element);
......
......@@ -1056,7 +1056,8 @@ bool SVGSMILElement::IsContributing(SMILTime elapsed) const {
GetActiveState() == kFrozen;
}
void SVGSMILElement::UpdateActiveState(SMILTime elapsed) {
SVGSMILElement::EventDispatchMask SVGSMILElement::UpdateActiveState(
SMILTime elapsed) {
const bool was_active = GetActiveState() == kActive;
active_state_ = DetermineActiveState(interval_, elapsed);
const bool is_active = GetActiveState() == kActive;
......@@ -1064,14 +1065,15 @@ void SVGSMILElement::UpdateActiveState(SMILTime elapsed) {
interval_has_changed_ && previous_interval_.end == interval_.begin;
interval_has_changed_ = false;
unsigned events_to_dispatch = kDispatchNoEvent;
if ((was_active && !is_active) || interval_restart) {
ScheduleEvent(event_type_names::kEndEvent);
events_to_dispatch |= kDispatchEndEvent;
EndedActiveInterval();
}
if (IsContributing(elapsed)) {
if (!was_active || interval_restart) {
ScheduleEvent(event_type_names::kBeginEvent);
events_to_dispatch |= kDispatchBeginEvent;
StartedActiveInterval();
}
......@@ -1079,10 +1081,31 @@ void SVGSMILElement::UpdateActiveState(SMILTime elapsed) {
if (progress_state.repeat &&
progress_state.repeat != last_progress_.repeat) {
NotifyDependentsOnRepeat(progress_state.repeat, elapsed);
ScheduleRepeatEvents();
events_to_dispatch |= kDispatchRepeatEvent;
}
last_progress_ = progress_state;
}
return static_cast<EventDispatchMask>(events_to_dispatch);
}
void SVGSMILElement::DispatchEvents(EventDispatchMask events_to_dispatch) {
// The ordering is based on the usual order in which these events should be
// dispatched (and should match the order the flags are set in
// UpdateActiveState().
if (events_to_dispatch & kDispatchEndEvent) {
EnqueueEvent(*Event::Create(event_type_names::kEndEvent),
TaskType::kDOMManipulation);
}
if (events_to_dispatch & kDispatchBeginEvent) {
EnqueueEvent(*Event::Create(event_type_names::kBeginEvent),
TaskType::kDOMManipulation);
}
if (events_to_dispatch & kDispatchRepeatEvent) {
EnqueueEvent(*Event::Create(event_type_names::kRepeatEvent),
TaskType::kDOMManipulation);
EnqueueEvent(*Event::Create(AtomicString("repeatn")),
TaskType::kDOMManipulation);
}
}
void SVGSMILElement::UpdateProgressState(SMILTime presentation_time) {
......@@ -1202,19 +1225,6 @@ void SVGSMILElement::EndedActiveInterval() {
RemoveInstanceTimesWithOrigin(end_times_, SMILTimeOrigin::kScript);
}
void SVGSMILElement::ScheduleRepeatEvents() {
ScheduleEvent(event_type_names::kRepeatEvent);
ScheduleEvent(AtomicString("repeatn"));
}
void SVGSMILElement::ScheduleEvent(const AtomicString& event_type) {
DCHECK(event_type == event_type_names::kEndEvent ||
event_type == event_type_names::kBeginEvent ||
event_type == event_type_names::kRepeatEvent ||
event_type == "repeatn");
EnqueueEvent(*Event::Create(event_type), TaskType::kDOMManipulation);
}
bool SVGSMILElement::HasValidTarget() const {
return targetElement() && targetElement()->InActiveDocument();
}
......
......@@ -82,7 +82,14 @@ class CORE_EXPORT SVGSMILElement : public SVGElement, public SVGTests {
SMILTime SimpleDuration() const;
void UpdateInterval(SMILTime presentation_time);
void UpdateActiveState(SMILTime elapsed);
enum EventDispatchMask {
kDispatchNoEvent = 0,
kDispatchBeginEvent = 1u << 0,
kDispatchRepeatEvent = 1u << 1,
kDispatchEndEvent = 1u << 2,
};
EventDispatchMask UpdateActiveState(SMILTime elapsed);
void DispatchEvents(EventDispatchMask);
void UpdateProgressState(SMILTime presentation_time);
bool IsHigherPriorityThan(const SVGSMILElement* other,
SMILTime presentation_time) const;
......@@ -102,9 +109,6 @@ class CORE_EXPORT SVGSMILElement : public SVGElement, public SVGTests {
wtf_size_t& PriorityQueueHandle() { return queue_handle_; }
void ScheduleEvent(const AtomicString& event_type);
void ScheduleRepeatEvents();
void Trace(blink::Visitor*) override;
protected:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment