1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
// Copyright 2025 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.
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_ANIMATION_TIMELINE_TRIGGER_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_ANIMATION_TIMELINE_TRIGGER_H_
#include "third_party/blink/renderer/bindings/core/v8/v8_timeline_trigger_options.h"
#include "third_party/blink/renderer/core/animation/animation_trigger.h"
namespace blink {
// https://drafts.csswg.org/web-animations-2/#trigger-state
enum class TimelineTriggerState {
// The initial state of the trigger. The trigger has not yet taken any action.
kIdle,
// The last action taken by the trigger was due to entering the trigger range.
kPrimary,
// The last action taken by the trigger was due to exiting the exit range.
kInverse,
};
enum class TimelineTriggerAction {
// The action to take when entering the trigger range.
kEnter,
// The action to take when exiting the exit range.
kExit
};
class CORE_EXPORT TimelineTrigger : public AnimationTrigger {
DEFINE_WRAPPERTYPEINFO();
public:
using RangeBoundary = V8UnionStringOrTimelineRangeOffset;
using State = TimelineTriggerState;
TimelineTrigger(AnimationTimeline* timeline,
AnimationTrigger::Behavior behavior,
RangeBoundary* range_start,
RangeBoundary* range_end,
RangeBoundary* exit_range_start,
RangeBoundary* exit_range_end);
static TimelineTrigger* Create(ExecutionContext* execution_context,
TimelineTriggerOptions* options,
ExceptionState& exception_state);
// IDL interface
AnimationTimeline* timeline();
const RangeBoundary* rangeStart(ExecutionContext* execution_context);
const RangeBoundary* rangeEnd(ExecutionContext* execution_context);
const RangeBoundary* exitRangeStart(ExecutionContext* execution_context);
const RangeBoundary* exitRangeEnd(ExecutionContext* execution_context);
bool CanTrigger() const override;
bool IsTimelineTrigger() const override;
AnimationTimeline* GetTimelineInternal() { return timeline_.Get(); }
State GetState() { return state_; }
void Update();
void Trace(Visitor* visitor) const override;
// Structure representing the scroll offsets (in px) corresponding to the
// boundaries of the trigger (default) range and the exit range;
struct TriggerBoundaries {
// The start offset of the trigger/default range.
double start = 0.;
// The end offset of the trigger/default range.
double end = 0.;
// The start offset of the exit range.
double exit_start = 0.;
// The end offset of the exit range.
double exit_end = 0.;
double current_offset = 0.;
};
void SetRangeBoundariesForTest(RangeBoundary* start,
RangeBoundary* exit,
RangeBoundary* exit_start,
RangeBoundary* exit_end) {
range_start_ = start;
range_end_ = exit;
exit_range_start_ = exit_start;
exit_range_end_ = exit_end;
}
TriggerBoundaries ComputeTriggerBoundariesForTest(
double current_offset,
Element& timeline_source,
const ScrollTimeline& timeline) {
return ComputeTriggerBoundaries(current_offset, timeline_source, timeline);
}
private:
void DidAddAnimation(Animation* animation,
ExceptionState& exception_state) override;
void DidRemoveAnimation(Animation* animation) override;
// Handles playing an animation which is added to a trigger which has already
// tripped.
void HandlePostTripAdd(Animation* animation, ExceptionState& exception_state);
TriggerBoundaries ComputeTriggerBoundaries(double current_offset,
Element& timeline_source,
const ScrollTimeline& timeline);
std::optional<TimelineTrigger::State> ComputeState();
Member<AnimationTimeline> timeline_;
// The range boundaries at which the trigger takes action, in CSS pixels.
Member<const RangeBoundary> range_start_;
Member<const RangeBoundary> range_end_;
Member<const RangeBoundary> exit_range_start_;
Member<const RangeBoundary> exit_range_end_;
State state_;
};
template <>
struct DowncastTraits<TimelineTrigger> {
static bool AllowFrom(const AnimationTrigger& trigger) {
return trigger.IsTimelineTrigger();
}
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_ANIMATION_TIMELINE_TRIGGER_H_
|