1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 #include "ScrollPositionUpdate.h"
9 #include "mozilla/Assertions.h"
13 static ScrollGenerationCounter sGenerationCounter
;
15 ScrollPositionUpdate::ScrollPositionUpdate()
16 : mType(ScrollUpdateType::Absolute
),
17 mScrollMode(ScrollMode::Normal
),
18 mScrollOrigin(ScrollOrigin::None
),
19 mTriggeredByScript(ScrollTriggeredByScript::No
) {}
22 ScrollPositionUpdate
ScrollPositionUpdate::NewScrollframe(
23 nsPoint aInitialPosition
) {
24 ScrollPositionUpdate ret
;
25 ret
.mScrollGeneration
= sGenerationCounter
.NewMainThreadGeneration();
26 ret
.mScrollMode
= ScrollMode::Instant
;
27 ret
.mDestination
= CSSPoint::FromAppUnits(aInitialPosition
);
32 ScrollPositionUpdate
ScrollPositionUpdate::NewScroll(ScrollOrigin aOrigin
,
33 nsPoint aDestination
) {
34 MOZ_ASSERT(aOrigin
!= ScrollOrigin::NotSpecified
);
35 MOZ_ASSERT(aOrigin
!= ScrollOrigin::None
);
37 ScrollPositionUpdate ret
;
38 ret
.mScrollGeneration
= sGenerationCounter
.NewMainThreadGeneration();
39 ret
.mType
= ScrollUpdateType::Absolute
;
40 ret
.mScrollMode
= ScrollMode::Instant
;
41 ret
.mScrollOrigin
= aOrigin
;
42 ret
.mDestination
= CSSPoint::FromAppUnits(aDestination
);
47 ScrollPositionUpdate
ScrollPositionUpdate::NewRelativeScroll(
48 nsPoint aSource
, nsPoint aDestination
) {
49 ScrollPositionUpdate ret
;
50 ret
.mScrollGeneration
= sGenerationCounter
.NewMainThreadGeneration();
51 ret
.mType
= ScrollUpdateType::Relative
;
52 ret
.mScrollMode
= ScrollMode::Instant
;
53 ret
.mScrollOrigin
= ScrollOrigin::Relative
;
54 ret
.mDestination
= CSSPoint::FromAppUnits(aDestination
);
55 ret
.mSource
= CSSPoint::FromAppUnits(aSource
);
60 ScrollPositionUpdate
ScrollPositionUpdate::NewSmoothScroll(
61 ScrollMode aMode
, ScrollOrigin aOrigin
, nsPoint aDestination
,
62 ScrollTriggeredByScript aTriggeredByScript
,
63 UniquePtr
<ScrollSnapTargetIds
> aSnapTargetIds
) {
64 MOZ_ASSERT(aOrigin
!= ScrollOrigin::NotSpecified
);
65 MOZ_ASSERT(aOrigin
!= ScrollOrigin::None
);
66 MOZ_ASSERT(aMode
== ScrollMode::Smooth
|| aMode
== ScrollMode::SmoothMsd
);
68 ScrollPositionUpdate ret
;
69 ret
.mScrollGeneration
= sGenerationCounter
.NewMainThreadGeneration();
70 ret
.mType
= ScrollUpdateType::Absolute
;
71 ret
.mScrollMode
= aMode
;
72 ret
.mScrollOrigin
= aOrigin
;
73 ret
.mDestination
= CSSPoint::FromAppUnits(aDestination
);
74 ret
.mTriggeredByScript
= aTriggeredByScript
;
76 ret
.mSnapTargetIds
= *aSnapTargetIds
;
82 ScrollPositionUpdate
ScrollPositionUpdate::NewPureRelativeScroll(
83 ScrollOrigin aOrigin
, ScrollMode aMode
, const nsPoint
& aDelta
) {
84 MOZ_ASSERT(aOrigin
!= ScrollOrigin::NotSpecified
);
85 MOZ_ASSERT(aOrigin
!= ScrollOrigin::None
);
87 ScrollPositionUpdate ret
;
88 ret
.mScrollGeneration
= sGenerationCounter
.NewMainThreadGeneration();
89 ret
.mType
= ScrollUpdateType::PureRelative
;
90 ret
.mScrollMode
= aMode
;
91 ret
.mScrollOrigin
= aOrigin
;
92 ret
.mDelta
= CSSPoint::FromAppUnits(aDelta
);
97 ScrollPositionUpdate
ScrollPositionUpdate::NewMergeableScroll(
98 ScrollOrigin aOrigin
, nsPoint aDestination
) {
99 MOZ_ASSERT(aOrigin
== ScrollOrigin::AnchorAdjustment
);
101 ScrollPositionUpdate ret
;
102 ret
.mScrollGeneration
= sGenerationCounter
.NewMainThreadGeneration();
103 ret
.mType
= ScrollUpdateType::MergeableAbsolute
;
104 ret
.mScrollMode
= ScrollMode::Instant
;
105 ret
.mScrollOrigin
= aOrigin
;
106 ret
.mDestination
= CSSPoint::FromAppUnits(aDestination
);
110 bool ScrollPositionUpdate::operator==(
111 const ScrollPositionUpdate
& aOther
) const {
112 // instances are immutable, and all the fields are set when the generation
113 // is set. So if the generation matches, these instances are identical.
114 return mScrollGeneration
== aOther
.mScrollGeneration
;
117 MainThreadScrollGeneration
ScrollPositionUpdate::GetGeneration() const {
118 return mScrollGeneration
;
121 ScrollUpdateType
ScrollPositionUpdate::GetType() const { return mType
; }
123 ScrollMode
ScrollPositionUpdate::GetMode() const { return mScrollMode
; }
125 ScrollOrigin
ScrollPositionUpdate::GetOrigin() const { return mScrollOrigin
; }
127 CSSPoint
ScrollPositionUpdate::GetDestination() const {
128 MOZ_ASSERT(mType
== ScrollUpdateType::Absolute
||
129 mType
== ScrollUpdateType::MergeableAbsolute
||
130 mType
== ScrollUpdateType::Relative
);
134 CSSPoint
ScrollPositionUpdate::GetSource() const {
135 MOZ_ASSERT(mType
== ScrollUpdateType::Relative
);
139 CSSPoint
ScrollPositionUpdate::GetDelta() const {
140 MOZ_ASSERT(mType
== ScrollUpdateType::PureRelative
);
144 std::ostream
& operator<<(std::ostream
& aStream
,
145 const ScrollPositionUpdate
& aUpdate
) {
146 aStream
<< "{ gen=" << aUpdate
.mScrollGeneration
147 << ", type=" << (int)aUpdate
.mType
148 << ", mode=" << (int)aUpdate
.mScrollMode
149 << ", origin=" << (int)aUpdate
.mScrollOrigin
150 << ", dst=" << aUpdate
.mDestination
<< ", src=" << aUpdate
.mSource
151 << ", delta=" << aUpdate
.mDelta
152 << ", triggered by script=" << aUpdate
.WasTriggeredByScript() << " }";
156 } // namespace mozilla