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:
Hiroyuki Ikezoe
2026-07-21 10:20:06 +00:00
committed by hikezoe.birchill@mozilla.com
parent 724bca4b40
commit 415d6643aa
4 changed files with 44 additions and 7 deletions
@@ -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
View File
@@ -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);
}
}
+6
View File
@@ -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;
};
/**
+1 -1
View File
@@ -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>