blob: 0ed920fd269e3dca4be02b3837d4e88ee95e4a57 [file] [log] [blame]
// Copyright (c) 2017 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 "third_party/blink/renderer/core/scroll/smooth_scroll_sequencer.h"
#include "third_party/blink/renderer/core/scroll/programmatic_scroll_animator.h"
#include "third_party/blink/renderer/core/scroll/scrollable_area.h"
namespace blink {
void SequencedScroll::Trace(blink::Visitor* visitor) {
visitor->Trace(scrollable_area);
}
void SmoothScrollSequencer::QueueAnimation(ScrollableArea* scrollable,
ScrollOffset offset,
ScrollBehavior behavior) {
if (scrollable->ClampScrollOffset(offset) != scrollable->GetScrollOffset())
queue_.push_back(new SequencedScroll(scrollable, offset, behavior));
}
void SmoothScrollSequencer::RunQueuedAnimations() {
if (queue_.IsEmpty()) {
current_scrollable_ = nullptr;
return;
}
SequencedScroll* sequenced_scroll = queue_.back();
queue_.pop_back();
current_scrollable_ = sequenced_scroll->scrollable_area;
current_scrollable_->SetScrollOffset(sequenced_scroll->scroll_offset,
kSequencedScroll,
sequenced_scroll->scroll_behavior);
}
void SmoothScrollSequencer::AbortAnimations() {
if (current_scrollable_) {
current_scrollable_->CancelProgrammaticScrollAnimation();
current_scrollable_ = nullptr;
}
queue_.clear();
}
void SmoothScrollSequencer::DidDisposeScrollableArea(
const ScrollableArea& area) {
for (Member<SequencedScroll>& sequenced_scroll : queue_) {
if (sequenced_scroll->scrollable_area.Get() == &area) {
AbortAnimations();
break;
}
}
}
void SmoothScrollSequencer::Trace(blink::Visitor* visitor) {
visitor->Trace(queue_);
visitor->Trace(current_scrollable_);
}
} // namespace blink