| Index: cc/animation/scroll_offset_animations.cc
|
| diff --git a/cc/animation/scroll_offset_animations.cc b/cc/animation/scroll_offset_animations.cc
|
| index 1dcda6060bb7643a7c156d727c9f19d5814b61b4..04cf954c6f27ad286dafc83fb3f076a9c81c338c 100644
|
| --- a/cc/animation/scroll_offset_animations.cc
|
| +++ b/cc/animation/scroll_offset_animations.cc
|
| @@ -8,38 +8,61 @@
|
|
|
| namespace cc {
|
|
|
| -ScrollOffsetAnimationUpdate::ScrollOffsetAnimationUpdate(Type type,
|
| - ElementId element_id)
|
| - : type_(type), element_id_(element_id) {}
|
| +ScrollOffsetAnimationUpdate::ScrollOffsetAnimationUpdate() {}
|
| +
|
| +ScrollOffsetAnimationUpdate::ScrollOffsetAnimationUpdate(ElementId element_id)
|
| + : element_id_(element_id), takeover_(false) {}
|
|
|
| ScrollOffsetAnimations::ScrollOffsetAnimations(AnimationHost* animation_host)
|
| : animation_host_(animation_host) {}
|
|
|
| ScrollOffsetAnimations::~ScrollOffsetAnimations() {}
|
|
|
| -void ScrollOffsetAnimations::AddUpdate(ScrollOffsetAnimationUpdate update) {
|
| - queue_.push_back(update);
|
| +ScrollOffsetAnimationUpdate ScrollOffsetAnimations::GetUpdateForElementId(
|
| + ElementId element_id) const {
|
| + DCHECK(element_id);
|
| + auto iter = element_to_update_map_.find(element_id);
|
| + return iter == element_to_update_map_.end()
|
| + ? ScrollOffsetAnimationUpdate(element_id)
|
| + : iter->second;
|
| +}
|
| +
|
| +void ScrollOffsetAnimations::AddAdjustmentUpdate(ElementId element_id,
|
| + gfx::Vector2dF adjustment) {
|
| + DCHECK(element_id);
|
| + ScrollOffsetAnimationUpdate update = GetUpdateForElementId(element_id);
|
| + update.adjustment_ += adjustment;
|
| + element_to_update_map_[element_id] = update;
|
| + animation_host_->SetNeedsCommit();
|
| +}
|
| +
|
| +void ScrollOffsetAnimations::AddTakeoverUpdate(ElementId element_id) {
|
| + DCHECK(element_id);
|
| + ScrollOffsetAnimationUpdate update = GetUpdateForElementId(element_id);
|
| + update.takeover_ = true;
|
| + element_to_update_map_[element_id] = update;
|
| animation_host_->SetNeedsCommit();
|
| }
|
|
|
| bool ScrollOffsetAnimations::HasUpdatesForTesting() const {
|
| - return !queue_.empty();
|
| + return !element_to_update_map_.empty();
|
| }
|
|
|
| void ScrollOffsetAnimations::PushPropertiesTo(
|
| ScrollOffsetAnimationsImpl* animations) {
|
| DCHECK(animations);
|
| - if (queue_.empty())
|
| + if (element_to_update_map_.empty())
|
| return;
|
|
|
| - for (auto& update : queue_) {
|
| - switch (update.type_) {
|
| - case ScrollOffsetAnimationUpdate::Type::SCROLL_OFFSET_CHANGED:
|
| - animations->ScrollAnimationApplyAdjustment(update.element_id_,
|
| - update.adjustment_);
|
| - }
|
| + for (auto& kv : element_to_update_map_) {
|
| + const auto& update = kv.second;
|
| + if (update.takeover_)
|
| + animations->ScrollAnimationAbort(true /*needs_completion*/);
|
| + else
|
| + animations->ScrollAnimationApplyAdjustment(update.element_id_,
|
| + update.adjustment_);
|
| }
|
| - queue_.clear();
|
| + element_to_update_map_.clear();
|
| }
|
|
|
| } // namespace cc
|
|
|