Backed out changeset 496886cb30a5 (bug 1867152) for bc failures on browser_user_input...
[gecko.git] / layout / generic / ScrollPositionUpdate.cpp
blob9607d2d18a60fd0c410bfb20d6841ab2532d1b4c
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"
7 #include <ostream>
9 #include "mozilla/Assertions.h"
11 namespace mozilla {
13 static ScrollGenerationCounter sGenerationCounter;
15 ScrollPositionUpdate::ScrollPositionUpdate()
16 : mType(ScrollUpdateType::Absolute),
17 mScrollMode(ScrollMode::Normal),
18 mScrollOrigin(ScrollOrigin::None),
19 mTriggeredByScript(ScrollTriggeredByScript::No) {}
21 /*static*/
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;
31 /*static*/
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);
43 return ret;
46 /*static*/
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;
59 /*static*/
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;
75 if (aSnapTargetIds) {
76 ret.mSnapTargetIds = *aSnapTargetIds;
78 return ret;
81 /*static*/
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);
93 return ret;
96 /*static*/
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);
107 return ret;
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);
131 return mDestination;
134 CSSPoint ScrollPositionUpdate::GetSource() const {
135 MOZ_ASSERT(mType == ScrollUpdateType::Relative);
136 return mSource;
139 CSSPoint ScrollPositionUpdate::GetDelta() const {
140 MOZ_ASSERT(mType == ScrollUpdateType::PureRelative);
141 return mDelta;
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() << " }";
153 return aStream;
156 } // namespace mozilla