1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #ifndef mozilla_dom_ViewTimeline_h
8 #define mozilla_dom_ViewTimeline_h
10 #include "mozilla/dom/ScrollTimeline.h"
13 class ScrollContainerFrame
;
14 } // namespace mozilla
16 namespace mozilla::dom
{
19 * A view progress timeline is a segment of a scroll progress timeline that are
20 * scoped to the scroll positions in which any part of the associated element’s
21 * principal box intersects its nearest ancestor scrollport. So ViewTimeline
22 * is a special case of ScrollTimeline.
24 class ViewTimeline final
: public ScrollTimeline
{
25 template <typename T
, typename
... Args
>
26 friend already_AddRefed
<T
> mozilla::MakeAndAddRef(Args
&&... aArgs
);
29 NS_DECL_ISUPPORTS_INHERITED
30 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(ViewTimeline
, ScrollTimeline
)
32 ViewTimeline() = delete;
34 // Note: |aSubject| is used as the subject which specifies view-timeline-name
35 // property, and we use this subject to look up its nearest scroll container.
36 static already_AddRefed
<ViewTimeline
> MakeNamed(
37 Document
* aDocument
, Element
* aSubject
,
38 const PseudoStyleRequest
& aPseudoRequest
,
39 const StyleViewTimeline
& aStyleTimeline
);
41 static already_AddRefed
<ViewTimeline
> MakeAnonymous(
42 Document
* aDocument
, const NonOwningAnimationTarget
& aTarget
,
43 StyleScrollAxis aAxis
, const StyleViewTimelineInset
& aInset
);
45 JSObject
* WrapObject(JSContext
* aCx
,
46 JS::Handle
<JSObject
*> aGivenProto
) override
{
50 bool IsViewTimeline() const override
{ return true; }
52 void ReplacePropertiesWith(Element
* aSubjectElement
,
53 const PseudoStyleRequest
& aPseudoRequest
,
54 const StyleViewTimeline
& aNew
);
57 ~ViewTimeline() = default;
58 ViewTimeline(Document
* aDocument
, const Scroller
& aScroller
,
59 StyleScrollAxis aAxis
, Element
* aSubject
,
60 PseudoStyleType aSubjectPseudoType
,
61 const StyleViewTimelineInset
& aInset
)
62 : ScrollTimeline(aDocument
, aScroller
, aAxis
),
64 mSubjectPseudoType(aSubjectPseudoType
),
67 Maybe
<ScrollOffsets
> ComputeOffsets(
68 const ScrollContainerFrame
* aScrollContainerFrame
,
69 layers::ScrollDirection aOrientation
) const override
;
71 ScrollOffsets
ComputeInsets(const ScrollContainerFrame
* aScrollContainerFrame
,
72 layers::ScrollDirection aOrientation
) const;
74 // The subject element.
75 // 1. For view(), the subject element is the animation target.
76 // 2. For view-timeline property, the subject element is the element who
77 // defines this property.
78 RefPtr
<Element
> mSubject
;
79 // FIXME: Bug 1928437. We have to update mSubjectPseudoType to use
80 // PseudoStyleRequest.
81 PseudoStyleType mSubjectPseudoType
;
83 // FIXME: Bug 1817073. view-timeline-inset is an animatable property. However,
84 // the inset from view() is not animatable, so for named view timeline, this
85 // value depends on the animation style. Therefore, we have to check its style
86 // value when using it. For now, in order to simplify the implementation, we
87 // make |mInset| be fixed.
88 StyleViewTimelineInset mInset
;
91 } // namespace mozilla::dom
93 #endif // mozilla_dom_ViewTimeline_h