Bug 2055733 - Preserve touch tilt and altitude/azimuth angles through the APZ round-trip. r=edgar
Differential Revision: https://phabricator.services.mozilla.com/D312639
This commit is contained in:
committed by
hikezoe.birchill@mozilla.com
parent
724bca4b40
commit
415d6643aa
@@ -8,6 +8,8 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=2013990
|
||||
<title>Test for Bug 2013990</title>
|
||||
<script src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<script src="/tests/SimpleTest/EventUtils.js"></script>
|
||||
<script src="/tests/SimpleTest/paint_listener.js"></script>
|
||||
<script src="apz_test_utils.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
|
||||
<style>
|
||||
#target {
|
||||
@@ -24,9 +26,13 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=2013990
|
||||
<script type="text/javascript">
|
||||
|
||||
/** Test for Bug 2013990 */
|
||||
add_task(async function test_pointer_touch_tiltX_tiltY() {
|
||||
add_setup(async function () {
|
||||
await waitUntilApzStable();
|
||||
});
|
||||
|
||||
async function checkTiltXTiltY() {
|
||||
let target = document.getElementById("target");
|
||||
let promise = new Promise((resolve) => {
|
||||
let target = document.getElementById("target");
|
||||
target.addEventListener("pointerdown", (e) => {
|
||||
is(e.tiltX, 45, "check tiltX");
|
||||
is(e.tiltY, 0, "check tiltY");
|
||||
@@ -37,11 +43,11 @@ add_task(async function test_pointer_touch_tiltX_tiltY() {
|
||||
});
|
||||
synthesizeTouchAtCenter(target, { tiltX: 45, tiltY: 0 });
|
||||
await promise;
|
||||
});
|
||||
}
|
||||
|
||||
add_task(async function test_pointer_touch_altitude_azimuth() {
|
||||
async function checkAltitudeAzimuth() {
|
||||
let target = document.getElementById("target");
|
||||
let promise = new Promise((resolve) => {
|
||||
let target = document.getElementById("target");
|
||||
target.addEventListener("pointerdown", (e) => {
|
||||
is(e.altitudeAngle, 1.2, "check altitudeAngle");
|
||||
is(e.azimuthAngle, 6, "check azimuthAngle");
|
||||
@@ -52,6 +58,20 @@ add_task(async function test_pointer_touch_altitude_azimuth() {
|
||||
});
|
||||
synthesizeTouchAtCenter(target, { altitudeAngle: 1.2, azimuthAngle: 6 });
|
||||
await promise;
|
||||
}
|
||||
|
||||
add_task(async function test_pointer_touch_tiltX_tiltY() {
|
||||
await SpecialPowers.pushPrefEnv({set: [["test.events.async.enabled", false]]});
|
||||
await checkTiltXTiltY();
|
||||
await SpecialPowers.pushPrefEnv({set: [["test.events.async.enabled", true]]});
|
||||
await checkTiltXTiltY();
|
||||
});
|
||||
|
||||
add_task(async function test_pointer_touch_altitude_azimuth() {
|
||||
await SpecialPowers.pushPrefEnv({set: [["test.events.async.enabled", false]]});
|
||||
await checkAltitudeAzimuth();
|
||||
await SpecialPowers.pushPrefEnv({set: [["test.events.async.enabled", true]]});
|
||||
await checkAltitudeAzimuth();
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
+12
-1
@@ -83,7 +83,11 @@ already_AddRefed<Touch> SingleTouchData::ToNewDOMTouch() const {
|
||||
LayoutDeviceIntPoint::Truncate(mScreenPoint.x, mScreenPoint.y),
|
||||
LayoutDeviceIntPoint::Truncate(mRadius.width, mRadius.height),
|
||||
mRotationAngle, mForce);
|
||||
touch->mTilt.emplace(mTiltX, mTiltY);
|
||||
if (mAngle) {
|
||||
touch->mAngle = mAngle;
|
||||
} else {
|
||||
touch->mTilt.emplace(mTiltX, mTiltY);
|
||||
}
|
||||
touch->twist = mTwist;
|
||||
return touch.forget();
|
||||
}
|
||||
@@ -148,6 +152,13 @@ MultiTouchInput::MultiTouchInput(const WidgetTouchEvent& aTouchEvent)
|
||||
PixelCastJustification::LayoutDeviceIsScreenForUntransformedEvent),
|
||||
ScreenSize((float)radiusX, (float)radiusY), rotationAngle, force);
|
||||
|
||||
if (domTouch->mTilt) {
|
||||
data.mTiltX = domTouch->mTilt->mX;
|
||||
data.mTiltY = domTouch->mTilt->mY;
|
||||
}
|
||||
data.mTwist = domTouch->twist;
|
||||
data.mAngle = domTouch->mAngle;
|
||||
|
||||
mTouches.AppendElement(data);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include "mozilla/DefineEnum.h"
|
||||
#include "mozilla/EventForwards.h"
|
||||
#include "mozilla/Maybe.h"
|
||||
#include "mozilla/MouseEvents.h" // for WidgetPointerHelper::Angle
|
||||
#include "mozilla/ScrollTypes.h"
|
||||
#include "mozilla/TextEvents.h"
|
||||
#include "mozilla/TimeStamp.h"
|
||||
@@ -204,6 +205,11 @@ class SingleTouchData {
|
||||
int32_t mTiltX = 0;
|
||||
int32_t mTiltY = 0;
|
||||
int32_t mTwist = 0;
|
||||
|
||||
// Altitude and azimuth angles of the touch, mirroring dom::Touch's mAngle. A
|
||||
// touch carries either these angles or mTiltX/mTiltY, not both; when set they
|
||||
// take precedence over the tilt values.
|
||||
Maybe<WidgetPointerHelper::Angle> mAngle;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -889,7 +889,7 @@ DEFINE_IPC_SERIALIZER_WITH_FIELDS(mozilla::SingleTouchData::HistoricalTouchData,
|
||||
DEFINE_IPC_SERIALIZER_WITH_FIELDS(mozilla::SingleTouchData, mHistoricalData,
|
||||
mIdentifier, mScreenPoint, mLocalScreenPoint,
|
||||
mRadius, mRotationAngle, mForce, mTiltX,
|
||||
mTiltY, mTwist);
|
||||
mTiltY, mTwist, mAngle);
|
||||
|
||||
template <>
|
||||
struct ParamTraits<mozilla::MultiTouchInput::MultiTouchType>
|
||||
|
||||
Reference in New Issue
Block a user