From 26a029d407be480d791972afb5975cf62c9360a6 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 02:47:55 +0200 Subject: Adding upstream version 124.0.1. Signed-off-by: Daniel Baumann --- dom/animation/ViewTimeline.h | 86 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 dom/animation/ViewTimeline.h (limited to 'dom/animation/ViewTimeline.h') diff --git a/dom/animation/ViewTimeline.h b/dom/animation/ViewTimeline.h new file mode 100644 index 0000000000..a5ede6345d --- /dev/null +++ b/dom/animation/ViewTimeline.h @@ -0,0 +1,86 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_dom_ViewTimeline_h +#define mozilla_dom_ViewTimeline_h + +#include "mozilla/dom/ScrollTimeline.h" + +namespace mozilla::dom { + +/* + * A view progress timeline is a segment of a scroll progress timeline that are + * scoped to the scroll positions in which any part of the associated element’s + * principal box intersects its nearest ancestor scrollport. So ViewTimeline + * is a special case of ScrollTimeline. + */ +class ViewTimeline final : public ScrollTimeline { + template + friend already_AddRefed mozilla::MakeAndAddRef(Args&&... aArgs); + + public: + NS_DECL_ISUPPORTS_INHERITED + NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(ViewTimeline, ScrollTimeline) + + ViewTimeline() = delete; + + // Note: |aSubject| is used as the subject which specifies view-timeline-name + // property, and we use this subject to look up its nearest scroll container. + static already_AddRefed MakeNamed( + Document* aDocument, Element* aSubject, PseudoStyleType aPseudoType, + const StyleViewTimeline& aStyleTimeline); + + static already_AddRefed MakeAnonymous( + Document* aDocument, const NonOwningAnimationTarget& aTarget, + StyleScrollAxis aAxis, const StyleViewTimelineInset& aInset); + + JSObject* WrapObject(JSContext* aCx, + JS::Handle aGivenProto) override { + return nullptr; + } + + bool IsViewTimeline() const override { return true; } + + void ReplacePropertiesWith(Element* aSubjectElement, + PseudoStyleType aPseudoType, + const StyleViewTimeline& aNew); + + private: + ~ViewTimeline() = default; + ViewTimeline(Document* aDocument, const Scroller& aScroller, + StyleScrollAxis aAxis, Element* aSubject, + PseudoStyleType aSubjectPseudoType, + const StyleViewTimelineInset& aInset) + : ScrollTimeline(aDocument, aScroller, aAxis), + mSubject(aSubject), + mSubjectPseudoType(aSubjectPseudoType), + mInset(aInset) {} + + Maybe ComputeOffsets( + const nsIScrollableFrame* aScrollFrame, + layers::ScrollDirection aOrientation) const override; + + ScrollOffsets ComputeInsets(const nsIScrollableFrame* aScrollFrame, + layers::ScrollDirection aOrientation) const; + + // The subject element. + // 1. For view(), the subject element is the animation target. + // 2. For view-timeline property, the subject element is the element who + // defines this property. + RefPtr mSubject; + PseudoStyleType mSubjectPseudoType; + + // FIXME: Bug 1817073. view-timeline-inset is an animatable property. However, + // the inset from view() is not animatable, so for named view timeline, this + // value depends on the animation style. Therefore, we have to check its style + // value when using it. For now, in order to simplify the implementation, we + // make |mInset| be fixed. + StyleViewTimelineInset mInset; +}; + +} // namespace mozilla::dom + +#endif // mozilla_dom_ViewTimeline_h -- cgit v1.2.3