зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1774537 - Call SetState with WEEL_SCROLL or KEYBOARD_SCROLL in the case of instant scoll. r=botond
It will ensure an APZ:TransformEnd notification. Differential Revision: https://phabricator.services.mozilla.com/D149495
This commit is contained in:
Родитель
d152ee99bf
Коммит
52a1e4ddb2
|
@ -2006,6 +2006,12 @@ nsEventStatus AsyncPanZoomController::OnKeyboard(const KeyboardInput& aEvent) {
|
|||
distance, ScrollSource::Keyboard);
|
||||
|
||||
CallDispatchScroll(startPoint, endPoint, handoffState);
|
||||
ParentLayerPoint remainingDelta = endPoint - startPoint;
|
||||
if (remainingDelta != delta) {
|
||||
// If any scrolling happened, set KEYBOARD_SCROLL explicitly so that it
|
||||
// will trigger a TransformEnd notification.
|
||||
SetState(KEYBOARD_SCROLL);
|
||||
}
|
||||
|
||||
SetState(NOTHING);
|
||||
|
||||
|
@ -2426,7 +2432,14 @@ nsEventStatus AsyncPanZoomController::OnScrollWheel(
|
|||
ParentLayerPoint startPoint = aEvent.mLocalOrigin;
|
||||
ParentLayerPoint endPoint = aEvent.mLocalOrigin - delta;
|
||||
RecordScrollPayload(aEvent.mTimeStamp);
|
||||
|
||||
CallDispatchScroll(startPoint, endPoint, handoffState);
|
||||
ParentLayerPoint remainingDelta = endPoint - startPoint;
|
||||
if (remainingDelta != delta) {
|
||||
// If any scrolling happened, set KEYBOARD_SCROLL explicitly so that it
|
||||
// will trigger a TransformEnd notification.
|
||||
SetState(WHEEL_SCROLL);
|
||||
}
|
||||
|
||||
SetState(NOTHING);
|
||||
|
||||
|
|
|
@ -77,6 +77,18 @@ function nativeArrowDownKey() {
|
|||
);
|
||||
}
|
||||
|
||||
function nativeArrowUpKey() {
|
||||
switch (getPlatform()) {
|
||||
case "windows":
|
||||
return WIN_VK_UP;
|
||||
case "mac":
|
||||
return MAC_VK_UpArrow;
|
||||
}
|
||||
throw new Error(
|
||||
"Native key events not supported on platform " + getPlatform()
|
||||
);
|
||||
}
|
||||
|
||||
// Given an event target which may be a window or an element, get the associated window.
|
||||
function windowForTarget(aTarget) {
|
||||
if (aTarget.Window && aTarget instanceof aTarget.Window) {
|
||||
|
|
|
@ -0,0 +1,48 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<meta charset="utf-8">
|
||||
<script src="apz_test_utils.js"></script>
|
||||
<script src="apz_test_native_event_utils.js"></script>
|
||||
<script src="/tests/SimpleTest/EventUtils.js"></script>
|
||||
<script src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<script src="/tests/SimpleTest/NativeKeyCodes.js"></script>
|
||||
<script src="/tests/SimpleTest/paint_listener.js"></script>
|
||||
<style>
|
||||
html, body { margin: 0; }
|
||||
|
||||
body {
|
||||
height: 10000px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
async function test() {
|
||||
// Send a native key event which doesn't cause any scroll, so that now
|
||||
// subsequent native key events will be able to be handled by APZ. See bug
|
||||
// 1774519 about what happens without this event.
|
||||
const UpArrowKeyCode = nativeArrowUpKey();
|
||||
await new Promise(resolve => {
|
||||
synthesizeNativeKey(KEYBOARD_LAYOUT_EN_US,
|
||||
UpArrowKeyCode, {} /* no modifier */,
|
||||
"", "", resolve); });
|
||||
|
||||
const transformEndPromise = promiseTransformEnd();
|
||||
const DownArrowKeyCode = nativeArrowDownKey();
|
||||
await new Promise(resolve => {
|
||||
synthesizeNativeKey(KEYBOARD_LAYOUT_EN_US,
|
||||
DownArrowKeyCode, {} /* no modifier */,
|
||||
"", "", resolve); });
|
||||
await transformEndPromise;
|
||||
ok(true, "Got an APZ:TransformEnd ");
|
||||
}
|
||||
|
||||
if (getPlatform() == "mac" || getPlatform() == "windows") {
|
||||
waitUntilApzStable()
|
||||
.then(test)
|
||||
.then(subtestDone, subtestFailed);
|
||||
} else {
|
||||
ok(true, "Skipping test because native key events are not supported on " +
|
||||
getPlatform());
|
||||
subtestDone();
|
||||
}
|
||||
</script>
|
|
@ -0,0 +1,28 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<meta charset="utf-8">
|
||||
<script src="apz_test_utils.js"></script>
|
||||
<script src="apz_test_native_event_utils.js"></script>
|
||||
<script src="/tests/SimpleTest/EventUtils.js"></script>
|
||||
<script src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<script src="/tests/SimpleTest/paint_listener.js"></script>
|
||||
<style>
|
||||
html, body { margin: 0; }
|
||||
|
||||
body {
|
||||
height: 10000px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
async function test() {
|
||||
let transformEndPromise = promiseTransformEnd();
|
||||
await promiseMoveMouseAndScrollWheelOver(document.documentElement, 100, 100);
|
||||
|
||||
await transformEndPromise;
|
||||
ok(true, "Got an APZ:TransformEnd ");
|
||||
}
|
||||
waitUntilApzStable()
|
||||
.then(test)
|
||||
.then(subtestDone, subtestFailed);
|
||||
</script>
|
|
@ -38,6 +38,8 @@ var subtests = [
|
|||
{"file": "helper_scroll_snap_on_page_down_scroll.html"},
|
||||
{"file": "helper_scroll_snap_on_page_down_scroll.html",
|
||||
prefs: [["test.events.async.enabled", true]]},
|
||||
{"file": "helper_transform_end_on_keyboard_scroll.html",
|
||||
prefs: [["general.smoothScroll", false]] },
|
||||
];
|
||||
|
||||
if (isKeyApzEnabled()) {
|
||||
|
|
|
@ -58,6 +58,8 @@ var subtests = [
|
|||
{"file": "helper_relative_scroll_smoothness.html?input-type=wheel&scroll-method=scrollBy", prefs: smoothness_prefs },
|
||||
{"file": "helper_relative_scroll_smoothness.html?input-type=wheel&scroll-method=scrollTo", prefs: smoothness_prefs },
|
||||
{"file": "helper_relative_scroll_smoothness.html?input-type=wheel&scroll-method=scrollTop", prefs: smoothness_prefs },
|
||||
{"file": "helper_transform_end_on_wheel_scroll.html",
|
||||
prefs: [["general.smoothScroll", false]] },
|
||||
];
|
||||
|
||||
// Only Windows has the test api implemented for this test.
|
||||
|
|
Загрузка…
Ссылка в новой задаче