dom/events/Touch.cpp

branch
TOR_BUG_9701
changeset 8
97036ab72558
equal deleted inserted replaced
-1:000000000000 0:e1e83b60369f
1 /* vim: set shiftwidth=2 tabstop=8 autoindent cindent expandtab: */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5
6 #include "mozilla/dom/Touch.h"
7
8 #include "mozilla/dom/EventTarget.h"
9 #include "mozilla/dom/TouchBinding.h"
10 #include "mozilla/dom/TouchEvent.h"
11 #include "nsGlobalWindow.h"
12 #include "nsContentUtils.h"
13 #include "nsIContent.h"
14
15 namespace mozilla {
16 namespace dom {
17
18 Touch::Touch(EventTarget* aTarget,
19 int32_t aIdentifier,
20 int32_t aPageX,
21 int32_t aPageY,
22 int32_t aScreenX,
23 int32_t aScreenY,
24 int32_t aClientX,
25 int32_t aClientY,
26 int32_t aRadiusX,
27 int32_t aRadiusY,
28 float aRotationAngle,
29 float aForce)
30 {
31 SetIsDOMBinding();
32 mTarget = aTarget;
33 mIdentifier = aIdentifier;
34 mPagePoint = CSSIntPoint(aPageX, aPageY);
35 mScreenPoint = nsIntPoint(aScreenX, aScreenY);
36 mClientPoint = CSSIntPoint(aClientX, aClientY);
37 mRefPoint = nsIntPoint(0, 0);
38 mPointsInitialized = true;
39 mRadius.x = aRadiusX;
40 mRadius.y = aRadiusY;
41 mRotationAngle = aRotationAngle;
42 mForce = aForce;
43
44 mChanged = false;
45 mMessage = 0;
46 nsJSContext::LikelyShortLivingObjectCreated();
47 }
48
49 Touch::Touch(int32_t aIdentifier,
50 nsIntPoint aPoint,
51 nsIntPoint aRadius,
52 float aRotationAngle,
53 float aForce)
54 {
55 SetIsDOMBinding();
56 mIdentifier = aIdentifier;
57 mPagePoint = CSSIntPoint(0, 0);
58 mScreenPoint = nsIntPoint(0, 0);
59 mClientPoint = CSSIntPoint(0, 0);
60 mRefPoint = aPoint;
61 mPointsInitialized = false;
62 mRadius = aRadius;
63 mRotationAngle = aRotationAngle;
64 mForce = aForce;
65
66 mChanged = false;
67 mMessage = 0;
68 nsJSContext::LikelyShortLivingObjectCreated();
69 }
70
71 Touch::~Touch()
72 {
73 }
74
75 // static
76 bool
77 Touch::PrefEnabled(JSContext* aCx, JSObject* aGlobal)
78 {
79 return TouchEvent::PrefEnabled(aCx, aGlobal);
80 }
81
82 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_1(Touch, mTarget)
83
84 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(Touch)
85 NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
86 NS_INTERFACE_MAP_ENTRY(nsISupports)
87 NS_INTERFACE_MAP_END
88
89 NS_IMPL_CYCLE_COLLECTING_ADDREF(Touch)
90 NS_IMPL_CYCLE_COLLECTING_RELEASE(Touch)
91
92 EventTarget*
93 Touch::Target() const
94 {
95 nsCOMPtr<nsIContent> content = do_QueryInterface(mTarget);
96 if (content && content->ChromeOnlyAccess() &&
97 !nsContentUtils::CanAccessNativeAnon()) {
98 return content->FindFirstNonChromeOnlyAccessContent();
99 }
100
101 return mTarget;
102 }
103
104 void
105 Touch::InitializePoints(nsPresContext* aPresContext, WidgetEvent* aEvent)
106 {
107 if (mPointsInitialized) {
108 return;
109 }
110 mClientPoint = Event::GetClientCoords(
111 aPresContext, aEvent, LayoutDeviceIntPoint::FromUntyped(mRefPoint),
112 mClientPoint);
113 mPagePoint = Event::GetPageCoords(
114 aPresContext, aEvent, LayoutDeviceIntPoint::FromUntyped(mRefPoint),
115 mClientPoint);
116 mScreenPoint = Event::GetScreenCoords(aPresContext, aEvent,
117 LayoutDeviceIntPoint::FromUntyped(mRefPoint));
118 mPointsInitialized = true;
119 }
120
121 void
122 Touch::SetTarget(EventTarget* aTarget)
123 {
124 mTarget = aTarget;
125 }
126
127 bool
128 Touch::Equals(Touch* aTouch)
129 {
130 return mRefPoint == aTouch->mRefPoint &&
131 mForce == aTouch->Force() &&
132 mRotationAngle == aTouch->RotationAngle() &&
133 mRadius.x == aTouch->RadiusX() &&
134 mRadius.y == aTouch->RadiusY();
135 }
136
137 JSObject*
138 Touch::WrapObject(JSContext* aCx)
139 {
140 return TouchBinding::Wrap(aCx, this);
141 }
142
143 // Parent ourselves to the window of the target. This achieves the desirable
144 // effects of parenting to the target, but avoids making the touch inaccessible
145 // when the target happens to be NAC and therefore reflected into the XBL scope.
146 EventTarget*
147 Touch::GetParentObject()
148 {
149 if (!mTarget) {
150 return nullptr;
151 }
152 nsCOMPtr<nsPIDOMWindow> outer = do_QueryInterface(mTarget->GetOwnerGlobal());
153 if (!outer) {
154 return nullptr;
155 }
156 MOZ_ASSERT(outer->IsOuterWindow());
157 return static_cast<nsGlobalWindow*>(outer->GetCurrentInnerWindow());
158 }
159
160 } // namespace dom
161 } // namespace mozilla

mercurial