| // Copyright 2016 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "cc/animation/scroll_offset_animations.h" | 
 |  | 
 | #include "cc/animation/animation_host.h" | 
 |  | 
 | namespace cc { | 
 |  | 
 | ScrollOffsetAnimationUpdate::ScrollOffsetAnimationUpdate() {} | 
 |  | 
 | ScrollOffsetAnimationUpdate::ScrollOffsetAnimationUpdate(ElementId element_id) | 
 |     : element_id_(element_id), takeover_(false) {} | 
 |  | 
 | ScrollOffsetAnimations::ScrollOffsetAnimations(AnimationHost* animation_host) | 
 |     : animation_host_(animation_host) {} | 
 |  | 
 | ScrollOffsetAnimations::~ScrollOffsetAnimations() {} | 
 |  | 
 | 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 !element_to_update_map_.empty(); | 
 | } | 
 |  | 
 | void ScrollOffsetAnimations::PushPropertiesTo( | 
 |     ScrollOffsetAnimationsImpl* animations) { | 
 |   DCHECK(animations); | 
 |   if (element_to_update_map_.empty()) | 
 |     return; | 
 |  | 
 |   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_); | 
 |   } | 
 |   element_to_update_map_.clear(); | 
 | } | 
 |  | 
 | }  // namespace cc |