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