Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f43064b4 authored by Daniel Norman's avatar Daniel Norman Committed by Automerger Merge Worker
Browse files

Lower severity for invalid accessibility hover event stream to ERROR. am:...

Lower severity for invalid accessibility hover event stream to ERROR. am: 2f99cdb9 am: b63e604f am: b72bb660

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/native/+/24300485



Change-Id: Ia1ee0e5d14d90fdf9d7a6f14125f2692033dce21
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 3cee7572 b72bb660
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -668,7 +668,15 @@ std::vector<TouchedWindow> getHoveringWindowsLocked(const TouchState* oldState,
        } else {
            // This pointer was already sent to the window. Use ACTION_HOVER_MOVE.
            if (CC_UNLIKELY(maskedAction != AMOTION_EVENT_ACTION_HOVER_MOVE)) {
                LOG(FATAL) << "Expected ACTION_HOVER_MOVE instead of " << entry.getDescription();
                android::base::LogSeverity severity = android::base::LogSeverity::FATAL;
                if (entry.flags & AMOTION_EVENT_FLAG_IS_ACCESSIBILITY_EVENT) {
                    // The Accessibility injected touch exploration event stream
                    // has known inconsistencies, so log ERROR instead of
                    // crashing the device with FATAL.
                    // TODO(b/286037469): Move a11y severity back to FATAL.
                    severity = android::base::LogSeverity::ERROR;
                }
                LOG(severity) << "Expected ACTION_HOVER_MOVE instead of " << entry.getDescription();
            }
            touchedWindow.targetFlags = InputTarget::Flags::DISPATCH_AS_IS;
        }
+23 −0
Original line number Diff line number Diff line
@@ -3407,6 +3407,29 @@ TEST_F(InputDispatcherTest, HoverExitIsSentToRemovedWindow) {
    window->consumeMotionEvent(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_EXIT));
}

/**
 * Test that invalid HOVER events sent by accessibility do not cause a fatal crash.
 */
TEST_F(InputDispatcherTest, InvalidA11yHoverStreamDoesNotCrash) {
    std::shared_ptr<FakeApplicationHandle> application = std::make_shared<FakeApplicationHandle>();
    sp<FakeWindowHandle> window =
            sp<FakeWindowHandle>::make(application, mDispatcher, "Window", ADISPLAY_ID_DEFAULT);
    window->setFrame(Rect(0, 0, 1200, 800));
    mDispatcher->setFocusedApplication(ADISPLAY_ID_DEFAULT, application);
    mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}});

    MotionEventBuilder hoverEnterBuilder =
            MotionEventBuilder(AMOTION_EVENT_ACTION_HOVER_ENTER, AINPUT_SOURCE_MOUSE)
                    .pointer(PointerBuilder(0, ToolType::MOUSE).x(300).y(400))
                    .addFlag(AMOTION_EVENT_FLAG_IS_ACCESSIBILITY_EVENT);
    ASSERT_EQ(InputEventInjectionResult::SUCCEEDED,
              injectMotionEvent(mDispatcher, hoverEnterBuilder.build()));
    ASSERT_EQ(InputEventInjectionResult::SUCCEEDED,
              injectMotionEvent(mDispatcher, hoverEnterBuilder.build()));
    window->consumeMotionEvent(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER));
    window->consumeMotionEvent(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER));
}

/**
 * If mouse is hovering when the touch goes down, the hovering should be stopped via HOVER_EXIT.
 */