Commit 7ef93a81 authored by Fredrik Söderquist's avatar Fredrik Söderquist Committed by Commit Bot

Only notify once in SVGSMILElement::CreateInstanceTimesFromSyncBase

Notify once at the end up said functions - after all the conditions have
been processed.
Renames AddInstanceTime() to AddInstanceTimeAndUpdate(), and then splits
out a new AddInstanceTime() which just adds the instance time to the
selected instance list.

Bug: 998526
Change-Id: I4d350c7752e95eb87923eab79ec1ad87b1d7f27e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1831816
Commit-Queue: Fredrik Söderquist <fs@opera.com>
Reviewed-by: default avatarStephen Chenney <schenney@chromium.org>
Cr-Commit-Position: refs/heads/master@{#701653}
parent d01a2955
......@@ -80,9 +80,9 @@ class ConditionEventListener final : public NativeEventListener {
void Invoke(ExecutionContext*, Event*) override {
if (!animation_)
return;
animation_->AddInstanceTime(condition_->GetBeginOrEnd(),
animation_->Elapsed() + condition_->Offset(),
SMILTimeOrigin::kEvent);
animation_->AddInstanceTimeAndUpdate(
condition_->GetBeginOrEnd(),
animation_->Elapsed() + condition_->Offset(), SMILTimeOrigin::kEvent);
}
void Trace(blink::Visitor* visitor) override {
......@@ -698,15 +698,20 @@ static void InsertSortedAndUnique(Vector<SMILTimeWithOrigin>& list,
void SVGSMILElement::AddInstanceTime(BeginOrEnd begin_or_end,
SMILTime time,
SMILTimeOrigin origin) {
Vector<SMILTimeWithOrigin>& list =
begin_or_end == kBegin ? begin_times_ : end_times_;
InsertSortedAndUnique(list, SMILTimeWithOrigin(time, origin));
}
void SVGSMILElement::AddInstanceTimeAndUpdate(BeginOrEnd begin_or_end,
SMILTime time,
SMILTimeOrigin origin) {
// Ignore new instance times for 'end' if the element is not active
// and the origin is script.
if (begin_or_end == kEnd && GetActiveState() == kInactive &&
origin == SMILTimeOrigin::kScript)
return;
Vector<SMILTimeWithOrigin>& list =
begin_or_end == kBegin ? begin_times_ : end_times_;
InsertSortedAndUnique(list, SMILTimeWithOrigin(time, origin));
AddInstanceTime(begin_or_end, time, origin);
InstanceListChanged();
if (time_container_)
time_container_->NotifyIntervalsChanged();
......@@ -1152,6 +1157,7 @@ void SVGSMILElement::CreateInstanceTimesFromSyncBase(
const NotifyDependentsInfo& info) {
// FIXME: To be really correct, this should handle updating exising interval
// by changing the associated times instead of creating new ones.
bool instance_lists_changed = false;
for (Condition* condition : conditions_) {
if (!condition->IsSyncBaseFor(timed_element))
continue;
......@@ -1179,6 +1185,13 @@ void SVGSMILElement::CreateInstanceTimesFromSyncBase(
if (!time.IsFinite())
continue;
AddInstanceTime(condition->GetBeginOrEnd(), time, info.origin);
instance_lists_changed = true;
}
if (instance_lists_changed) {
InstanceListChanged();
if (time_container_)
time_container_->NotifyIntervalsChanged();
}
}
......@@ -1195,7 +1208,7 @@ void SVGSMILElement::RemoveSyncBaseDependent(SVGSMILElement& animation) {
}
void SVGSMILElement::BeginByLinkActivation() {
AddInstanceTime(kBegin, Elapsed(), SMILTimeOrigin::kLinkActivation);
AddInstanceTimeAndUpdate(kBegin, Elapsed(), SMILTimeOrigin::kLinkActivation);
}
void SVGSMILElement::EndedActiveInterval() {
......
......@@ -131,7 +131,7 @@ class CORE_EXPORT SVGSMILElement : public SVGElement, public SVGTests {
protected:
enum BeginOrEnd { kBegin, kEnd };
void AddInstanceTime(BeginOrEnd, SMILTime, SMILTimeOrigin);
void AddInstanceTimeAndUpdate(BeginOrEnd, SMILTime, SMILTimeOrigin);
void SetInactive() { active_state_ = kInactive; }
......@@ -169,6 +169,9 @@ class CORE_EXPORT SVGSMILElement : public SVGElement, public SVGTests {
SMILTime RepeatingDuration() const;
const SMILInterval& GetActiveInterval(SMILTime elapsed) const;
void AddInstanceTime(BeginOrEnd begin_or_end,
SMILTime time,
SMILTimeOrigin origin);
void InstanceListChanged();
// This represents conditions on elements begin or end list that need to be
......
......@@ -269,14 +269,14 @@ float SVGAnimationElement::getSimpleDuration(
void SVGAnimationElement::beginElementAt(float offset) {
DCHECK(std::isfinite(offset));
AddInstanceTime(kBegin, Elapsed() + SMILTime::FromSecondsD(offset),
SMILTimeOrigin::kScript);
AddInstanceTimeAndUpdate(kBegin, Elapsed() + SMILTime::FromSecondsD(offset),
SMILTimeOrigin::kScript);
}
void SVGAnimationElement::endElementAt(float offset) {
DCHECK(std::isfinite(offset));
AddInstanceTime(kEnd, Elapsed() + SMILTime::FromSecondsD(offset),
SMILTimeOrigin::kScript);
AddInstanceTimeAndUpdate(kEnd, Elapsed() + SMILTime::FromSecondsD(offset),
SMILTimeOrigin::kScript);
}
void SVGAnimationElement::UpdateAnimationMode() {
......
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