1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=99: */
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
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7 #include "mozilla/layers/APZCTreeManagerParent.h"
8
9 #include "mozilla/layers/APZCTreeManager.h"
10 #include "mozilla/layers/APZThreadUtils.h"
11
12 namespace mozilla {
13 namespace layers {
14
APZCTreeManagerParent(uint64_t aLayersId,RefPtr<APZCTreeManager> aAPZCTreeManager)15 APZCTreeManagerParent::APZCTreeManagerParent(uint64_t aLayersId, RefPtr<APZCTreeManager> aAPZCTreeManager)
16 : mLayersId(aLayersId)
17 , mTreeManager(aAPZCTreeManager)
18 {
19 MOZ_ASSERT(aAPZCTreeManager != nullptr);
20 }
21
~APZCTreeManagerParent()22 APZCTreeManagerParent::~APZCTreeManagerParent()
23 {
24 }
25
26 void
ChildAdopted(RefPtr<APZCTreeManager> aAPZCTreeManager)27 APZCTreeManagerParent::ChildAdopted(RefPtr<APZCTreeManager> aAPZCTreeManager)
28 {
29 MOZ_ASSERT(aAPZCTreeManager != nullptr);
30 mTreeManager = aAPZCTreeManager;
31 }
32
33 bool
RecvReceiveMultiTouchInputEvent(const MultiTouchInput & aEvent,nsEventStatus * aOutStatus,MultiTouchInput * aOutEvent,ScrollableLayerGuid * aOutTargetGuid,uint64_t * aOutInputBlockId)34 APZCTreeManagerParent::RecvReceiveMultiTouchInputEvent(
35 const MultiTouchInput& aEvent,
36 nsEventStatus* aOutStatus,
37 MultiTouchInput* aOutEvent,
38 ScrollableLayerGuid* aOutTargetGuid,
39 uint64_t* aOutInputBlockId)
40 {
41 MultiTouchInput event = aEvent;
42
43 *aOutStatus = mTreeManager->ReceiveInputEvent(
44 event,
45 aOutTargetGuid,
46 aOutInputBlockId);
47 *aOutEvent = event;
48
49 return true;
50 }
51
52 bool
RecvReceiveMouseInputEvent(const MouseInput & aEvent,nsEventStatus * aOutStatus,MouseInput * aOutEvent,ScrollableLayerGuid * aOutTargetGuid,uint64_t * aOutInputBlockId)53 APZCTreeManagerParent::RecvReceiveMouseInputEvent(
54 const MouseInput& aEvent,
55 nsEventStatus* aOutStatus,
56 MouseInput* aOutEvent,
57 ScrollableLayerGuid* aOutTargetGuid,
58 uint64_t* aOutInputBlockId)
59 {
60 MouseInput event = aEvent;
61
62 *aOutStatus = mTreeManager->ReceiveInputEvent(
63 event,
64 aOutTargetGuid,
65 aOutInputBlockId);
66 *aOutEvent = event;
67
68 return true;
69 }
70
71 bool
RecvReceivePanGestureInputEvent(const PanGestureInput & aEvent,nsEventStatus * aOutStatus,PanGestureInput * aOutEvent,ScrollableLayerGuid * aOutTargetGuid,uint64_t * aOutInputBlockId)72 APZCTreeManagerParent::RecvReceivePanGestureInputEvent(
73 const PanGestureInput& aEvent,
74 nsEventStatus* aOutStatus,
75 PanGestureInput* aOutEvent,
76 ScrollableLayerGuid* aOutTargetGuid,
77 uint64_t* aOutInputBlockId)
78 {
79 PanGestureInput event = aEvent;
80
81 *aOutStatus = mTreeManager->ReceiveInputEvent(
82 event,
83 aOutTargetGuid,
84 aOutInputBlockId);
85 *aOutEvent = event;
86
87 return true;
88 }
89
90 bool
RecvReceivePinchGestureInputEvent(const PinchGestureInput & aEvent,nsEventStatus * aOutStatus,PinchGestureInput * aOutEvent,ScrollableLayerGuid * aOutTargetGuid,uint64_t * aOutInputBlockId)91 APZCTreeManagerParent::RecvReceivePinchGestureInputEvent(
92 const PinchGestureInput& aEvent,
93 nsEventStatus* aOutStatus,
94 PinchGestureInput* aOutEvent,
95 ScrollableLayerGuid* aOutTargetGuid,
96 uint64_t* aOutInputBlockId)
97 {
98 PinchGestureInput event = aEvent;
99
100 *aOutStatus = mTreeManager->ReceiveInputEvent(
101 event,
102 aOutTargetGuid,
103 aOutInputBlockId);
104 *aOutEvent = event;
105
106 return true;
107 }
108
109 bool
RecvReceiveTapGestureInputEvent(const TapGestureInput & aEvent,nsEventStatus * aOutStatus,TapGestureInput * aOutEvent,ScrollableLayerGuid * aOutTargetGuid,uint64_t * aOutInputBlockId)110 APZCTreeManagerParent::RecvReceiveTapGestureInputEvent(
111 const TapGestureInput& aEvent,
112 nsEventStatus* aOutStatus,
113 TapGestureInput* aOutEvent,
114 ScrollableLayerGuid* aOutTargetGuid,
115 uint64_t* aOutInputBlockId)
116 {
117 TapGestureInput event = aEvent;
118
119 *aOutStatus = mTreeManager->ReceiveInputEvent(
120 event,
121 aOutTargetGuid,
122 aOutInputBlockId);
123 *aOutEvent = event;
124
125 return true;
126 }
127
128 bool
RecvReceiveScrollWheelInputEvent(const ScrollWheelInput & aEvent,nsEventStatus * aOutStatus,ScrollWheelInput * aOutEvent,ScrollableLayerGuid * aOutTargetGuid,uint64_t * aOutInputBlockId)129 APZCTreeManagerParent::RecvReceiveScrollWheelInputEvent(
130 const ScrollWheelInput& aEvent,
131 nsEventStatus* aOutStatus,
132 ScrollWheelInput* aOutEvent,
133 ScrollableLayerGuid* aOutTargetGuid,
134 uint64_t* aOutInputBlockId)
135 {
136 ScrollWheelInput event = aEvent;
137
138 *aOutStatus = mTreeManager->ReceiveInputEvent(
139 event,
140 aOutTargetGuid,
141 aOutInputBlockId);
142 *aOutEvent = event;
143
144 return true;
145 }
146
147 bool
RecvZoomToRect(const ScrollableLayerGuid & aGuid,const CSSRect & aRect,const uint32_t & aFlags)148 APZCTreeManagerParent::RecvZoomToRect(
149 const ScrollableLayerGuid& aGuid,
150 const CSSRect& aRect,
151 const uint32_t& aFlags)
152 {
153 if (aGuid.mLayersId != mLayersId) {
154 // Guard against bad data from hijacked child processes
155 NS_ERROR("Unexpected layers id in RecvZoomToRect; dropping message...");
156 return false;
157 }
158
159 mTreeManager->ZoomToRect(aGuid, aRect, aFlags);
160 return true;
161 }
162
163 bool
RecvContentReceivedInputBlock(const uint64_t & aInputBlockId,const bool & aPreventDefault)164 APZCTreeManagerParent::RecvContentReceivedInputBlock(
165 const uint64_t& aInputBlockId,
166 const bool& aPreventDefault)
167 {
168 APZThreadUtils::RunOnControllerThread(
169 NewRunnableMethod<uint64_t, bool>(mTreeManager,
170 &IAPZCTreeManager::ContentReceivedInputBlock,
171 aInputBlockId,
172 aPreventDefault));
173
174 return true;
175 }
176
177 bool
RecvSetTargetAPZC(const uint64_t & aInputBlockId,nsTArray<ScrollableLayerGuid> && aTargets)178 APZCTreeManagerParent::RecvSetTargetAPZC(
179 const uint64_t& aInputBlockId,
180 nsTArray<ScrollableLayerGuid>&& aTargets)
181 {
182 for (size_t i = 0; i < aTargets.Length(); i++) {
183 if (aTargets[i].mLayersId != mLayersId) {
184 // Guard against bad data from hijacked child processes
185 NS_ERROR("Unexpected layers id in RecvSetTargetAPZC; dropping message...");
186 return false;
187 }
188 }
189 APZThreadUtils::RunOnControllerThread(NewRunnableMethod
190 <uint64_t,
191 StoreCopyPassByRRef<nsTArray<ScrollableLayerGuid>>>
192 (mTreeManager, &IAPZCTreeManager::SetTargetAPZC, aInputBlockId, aTargets));
193
194 return true;
195 }
196
197 bool
RecvUpdateZoomConstraints(const ScrollableLayerGuid & aGuid,const MaybeZoomConstraints & aConstraints)198 APZCTreeManagerParent::RecvUpdateZoomConstraints(
199 const ScrollableLayerGuid& aGuid,
200 const MaybeZoomConstraints& aConstraints)
201 {
202 if (aGuid.mLayersId != mLayersId) {
203 // Guard against bad data from hijacked child processes
204 NS_ERROR("Unexpected layers id in RecvUpdateZoomConstraints; dropping message...");
205 return false;
206 }
207
208 mTreeManager->UpdateZoomConstraints(aGuid, aConstraints);
209 return true;
210 }
211
212 bool
RecvCancelAnimation(const ScrollableLayerGuid & aGuid)213 APZCTreeManagerParent::RecvCancelAnimation(const ScrollableLayerGuid& aGuid)
214 {
215 if (aGuid.mLayersId != mLayersId) {
216 // Guard against bad data from hijacked child processes
217 NS_ERROR("Unexpected layers id in RecvCancelAnimation; dropping message...");
218 return false;
219 }
220
221 mTreeManager->CancelAnimation(aGuid);
222 return true;
223 }
224
225 bool
RecvAdjustScrollForSurfaceShift(const ScreenPoint & aShift)226 APZCTreeManagerParent::RecvAdjustScrollForSurfaceShift(const ScreenPoint& aShift)
227 {
228 mTreeManager->AdjustScrollForSurfaceShift(aShift);
229 return true;
230 }
231
232 bool
RecvSetDPI(const float & aDpiValue)233 APZCTreeManagerParent::RecvSetDPI(const float& aDpiValue)
234 {
235 mTreeManager->SetDPI(aDpiValue);
236 return true;
237 }
238
239 bool
RecvSetAllowedTouchBehavior(const uint64_t & aInputBlockId,nsTArray<TouchBehaviorFlags> && aValues)240 APZCTreeManagerParent::RecvSetAllowedTouchBehavior(
241 const uint64_t& aInputBlockId,
242 nsTArray<TouchBehaviorFlags>&& aValues)
243 {
244 APZThreadUtils::RunOnControllerThread(NewRunnableMethod
245 <uint64_t,
246 StoreCopyPassByRRef<nsTArray<TouchBehaviorFlags>>>
247 (mTreeManager,
248 &IAPZCTreeManager::SetAllowedTouchBehavior,
249 aInputBlockId, Move(aValues)));
250
251 return true;
252 }
253
254 bool
RecvStartScrollbarDrag(const ScrollableLayerGuid & aGuid,const AsyncDragMetrics & aDragMetrics)255 APZCTreeManagerParent::RecvStartScrollbarDrag(
256 const ScrollableLayerGuid& aGuid,
257 const AsyncDragMetrics& aDragMetrics)
258 {
259 if (aGuid.mLayersId != mLayersId) {
260 // Guard against bad data from hijacked child processes
261 NS_ERROR("Unexpected layers id in RecvStartScrollbarDrag; dropping message...");
262 return false;
263 }
264
265 APZThreadUtils::RunOnControllerThread(
266 NewRunnableMethod<ScrollableLayerGuid, AsyncDragMetrics>(
267 mTreeManager,
268 &IAPZCTreeManager::StartScrollbarDrag,
269 aGuid, aDragMetrics));
270
271 return true;
272 }
273
274 bool
RecvSetLongTapEnabled(const bool & aTapGestureEnabled)275 APZCTreeManagerParent::RecvSetLongTapEnabled(const bool& aTapGestureEnabled)
276 {
277 mTreeManager->SetLongTapEnabled(aTapGestureEnabled);
278 return true;
279 }
280
281 bool
RecvProcessTouchVelocity(const uint32_t & aTimestampMs,const float & aSpeedY)282 APZCTreeManagerParent::RecvProcessTouchVelocity(
283 const uint32_t& aTimestampMs,
284 const float& aSpeedY)
285 {
286 mTreeManager->ProcessTouchVelocity(aTimestampMs, aSpeedY);
287 return true;
288 }
289
290 bool
RecvUpdateWheelTransaction(const LayoutDeviceIntPoint & aRefPoint,const EventMessage & aEventMessage)291 APZCTreeManagerParent::RecvUpdateWheelTransaction(
292 const LayoutDeviceIntPoint& aRefPoint,
293 const EventMessage& aEventMessage)
294 {
295 mTreeManager->UpdateWheelTransaction(aRefPoint, aEventMessage);
296 return true;
297 }
298
299 bool
RecvTransformEventRefPoint(const LayoutDeviceIntPoint & aRefPoint,LayoutDeviceIntPoint * aOutRefPoint,ScrollableLayerGuid * aOutTargetGuid)300 APZCTreeManagerParent::RecvTransformEventRefPoint(
301 const LayoutDeviceIntPoint& aRefPoint,
302 LayoutDeviceIntPoint* aOutRefPoint,
303 ScrollableLayerGuid* aOutTargetGuid)
304 {
305 LayoutDeviceIntPoint refPoint = aRefPoint;
306 mTreeManager->TransformEventRefPoint(&refPoint, aOutTargetGuid);
307 *aOutRefPoint = refPoint;
308
309 return true;
310 }
311
312 } // namespace layers
313 } // namespace mozilla
314