Address Pointer Capture crash during rapid toggles
If an app has pointer capture enabled, and it rapidly toggles capture
off and on, there is a high likelihood for a system crash. We can
deterministically reproduce this case in the tests, so we address that
use case here.
Bug: 230850070
Test: atest inputflinger_tests
Change-Id: I1ecacf468d48b3def30fd5844d2e25128569e289
diff --git a/services/inputflinger/tests/InputDispatcher_test.cpp b/services/inputflinger/tests/InputDispatcher_test.cpp
index a167271..b688898 100644
--- a/services/inputflinger/tests/InputDispatcher_test.cpp
+++ b/services/inputflinger/tests/InputDispatcher_test.cpp
@@ -5671,6 +5671,25 @@
mWindow->consumeCaptureEvent(true);
}
+TEST_F(InputDispatcherPointerCaptureTests, RapidToggleRequests) {
+ requestAndVerifyPointerCapture(mWindow, true);
+
+ // App toggles pointer capture off and on.
+ mDispatcher->requestPointerCapture(mWindow->getToken(), false);
+ mFakePolicy->assertSetPointerCaptureCalled(false);
+
+ mDispatcher->requestPointerCapture(mWindow->getToken(), true);
+ auto enableRequest = mFakePolicy->assertSetPointerCaptureCalled(true);
+
+ // InputReader notifies that the latest "enable" request was processed, while skipping over the
+ // preceding "disable" request.
+ notifyPointerCaptureChanged(enableRequest);
+
+ // Since pointer capture was never disabled during the rapid toggle, the window does not receive
+ // any notifications.
+ mWindow->assertNoEvents();
+}
+
class InputDispatcherUntrustedTouchesTest : public InputDispatcherTest {
protected:
constexpr static const float MAXIMUM_OBSCURING_OPACITY = 0.8;