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/. */
4
5 #include "ScrollPositionUpdate.h"
6
7 #include <ostream>
8
9 #include "mozilla/Assertions.h"
10
11 namespace mozilla {
12
13 static ScrollGenerationCounter sGenerationCounter;
14
ScrollPositionUpdate()15 ScrollPositionUpdate::ScrollPositionUpdate()
16 : mType(ScrollUpdateType::Absolute),
17 mScrollMode(ScrollMode::Normal),
18 mScrollOrigin(ScrollOrigin::None),
19 mTriggeredByScript(ScrollTriggeredByScript::No) {}
20
21 /*static*/
NewScrollframe(nsPoint aInitialPosition)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);
28 return ret;
29 }
30
31 /*static*/
NewScroll(ScrollOrigin aOrigin,nsPoint aDestination)32 ScrollPositionUpdate ScrollPositionUpdate::NewScroll(ScrollOrigin aOrigin,
33 nsPoint aDestination) {
34 MOZ_ASSERT(aOrigin != ScrollOrigin::NotSpecified);
35 MOZ_ASSERT(aOrigin != ScrollOrigin::None);
36
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);
43 return ret;
44 }
45
46 /*static*/
NewRelativeScroll(nsPoint aSource,nsPoint 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);
56 return ret;
57 }
58
59 /*static*/
NewSmoothScroll(ScrollOrigin aOrigin,nsPoint aDestination,ScrollTriggeredByScript aTriggeredByScript)60 ScrollPositionUpdate ScrollPositionUpdate::NewSmoothScroll(
61 ScrollOrigin aOrigin, nsPoint aDestination,
62 ScrollTriggeredByScript aTriggeredByScript) {
63 MOZ_ASSERT(aOrigin != ScrollOrigin::NotSpecified);
64 MOZ_ASSERT(aOrigin != ScrollOrigin::None);
65
66 ScrollPositionUpdate ret;
67 ret.mScrollGeneration = sGenerationCounter.NewMainThreadGeneration();
68 ret.mType = ScrollUpdateType::Absolute;
69 ret.mScrollMode = ScrollMode::SmoothMsd;
70 ret.mScrollOrigin = aOrigin;
71 ret.mDestination = CSSPoint::FromAppUnits(aDestination);
72 ret.mTriggeredByScript = aTriggeredByScript;
73 return ret;
74 }
75
76 /*static*/
NewPureRelativeScroll(ScrollOrigin aOrigin,ScrollMode aMode,const nsPoint & aDelta)77 ScrollPositionUpdate ScrollPositionUpdate::NewPureRelativeScroll(
78 ScrollOrigin aOrigin, ScrollMode aMode, const nsPoint& aDelta) {
79 MOZ_ASSERT(aOrigin != ScrollOrigin::NotSpecified);
80 MOZ_ASSERT(aOrigin != ScrollOrigin::None);
81
82 ScrollPositionUpdate ret;
83 ret.mScrollGeneration = sGenerationCounter.NewMainThreadGeneration();
84 ret.mType = ScrollUpdateType::PureRelative;
85 ret.mScrollMode = aMode;
86 ret.mScrollOrigin = aOrigin;
87 ret.mDelta = CSSPoint::FromAppUnits(aDelta);
88 return ret;
89 }
90
operator ==(const ScrollPositionUpdate & aOther) const91 bool ScrollPositionUpdate::operator==(
92 const ScrollPositionUpdate& aOther) const {
93 // instances are immutable, and all the fields are set when the generation
94 // is set. So if the generation matches, these instances are identical.
95 return mScrollGeneration == aOther.mScrollGeneration;
96 }
97
GetGeneration() const98 MainThreadScrollGeneration ScrollPositionUpdate::GetGeneration() const {
99 return mScrollGeneration;
100 }
101
GetType() const102 ScrollUpdateType ScrollPositionUpdate::GetType() const { return mType; }
103
GetMode() const104 ScrollMode ScrollPositionUpdate::GetMode() const { return mScrollMode; }
105
GetOrigin() const106 ScrollOrigin ScrollPositionUpdate::GetOrigin() const { return mScrollOrigin; }
107
GetDestination() const108 CSSPoint ScrollPositionUpdate::GetDestination() const {
109 MOZ_ASSERT(mType == ScrollUpdateType::Absolute ||
110 mType == ScrollUpdateType::Relative);
111 return mDestination;
112 }
113
GetSource() const114 CSSPoint ScrollPositionUpdate::GetSource() const {
115 MOZ_ASSERT(mType == ScrollUpdateType::Relative);
116 return mSource;
117 }
118
GetDelta() const119 CSSPoint ScrollPositionUpdate::GetDelta() const {
120 MOZ_ASSERT(mType == ScrollUpdateType::PureRelative);
121 return mDelta;
122 }
123
operator <<(std::ostream & aStream,const ScrollPositionUpdate & aUpdate)124 std::ostream& operator<<(std::ostream& aStream,
125 const ScrollPositionUpdate& aUpdate) {
126 aStream << "{ gen=" << aUpdate.mScrollGeneration
127 << ", type=" << (int)aUpdate.mType
128 << ", mode=" << (int)aUpdate.mScrollMode
129 << ", origin=" << (int)aUpdate.mScrollOrigin
130 << ", dst=" << aUpdate.mDestination << ", src=" << aUpdate.mSource
131 << ", delta=" << aUpdate.mDelta
132 << ", triggered by script=" << aUpdate.WasTriggeredByScript() << " }";
133 return aStream;
134 }
135
136 } // namespace mozilla
137