diff --git a/frameworks/core/components_ng/event/gesture_event_hub.cpp b/frameworks/core/components_ng/event/gesture_event_hub.cpp index 237b9267f4e56b90c23200e74401a164e86a60ed..f4c16213c271b8fbb2f68ebb2b4f11319138f249 100644 --- a/frameworks/core/components_ng/event/gesture_event_hub.cpp +++ b/frameworks/core/components_ng/event/gesture_event_hub.cpp @@ -27,6 +27,7 @@ namespace OHOS::Ace::NG { constexpr int32_t MAX_FRAME_NODE_DEPTH = 2; +constexpr int32_t MIN_RECOGNIZER_GROUP_LOOP_SIZE = 3; constexpr const char* HIT_TEST_MODE[] = { "HitTestMode.Default", "HitTestMode.Block", @@ -351,6 +352,7 @@ void GestureEventHub::ProcessTouchTestHierarchy(const OffsetF& coordinateOffset, auto userRecognizers = gestureHierarchy_; auto userModifierRecognizers = modifierGestureHierarchy_; userRecognizers.splice(userRecognizers.end(), userModifierRecognizers); + bool overMinRecognizerGroupLoopSize = userRecognizers.size() >= MIN_RECOGNIZER_GROUP_LOOP_SIZE; for (auto const& recognizer : userRecognizers) { if (!recognizer) { continue; @@ -379,12 +381,12 @@ void GestureEventHub::ProcessTouchTestHierarchy(const OffsetF& coordinateOffset, auto checkCurrentRecognizer = false; auto parentRecognizer = recognizer->GetGestureGroup().Upgrade(); if (priority == GesturePriority::Parallel) { - checkCurrentRecognizer = (recognizer == userRecognizers.front()) && + checkCurrentRecognizer = overMinRecognizerGroupLoopSize && (recognizer == userRecognizers.front()) && CheckLastInnerRecognizerCollected(priority, parallelIndex); ProcessParallelPriorityGesture( offset, touchId, targetComponent, host, current, recognizers, parallelIndex, checkCurrentRecognizer); } else { - checkCurrentRecognizer = (recognizer == userRecognizers.front()) && + checkCurrentRecognizer = overMinRecognizerGroupLoopSize && (recognizer == userRecognizers.front()) && CheckLastInnerRecognizerCollected(priority, exclusiveIndex); ProcessExternalExclusiveRecognizer(offset, touchId, targetComponent, host, priority, current, recognizers, exclusiveIndex, checkCurrentRecognizer); diff --git a/test/unittest/core/event/gesture_event_hub_test_three_ng.cpp b/test/unittest/core/event/gesture_event_hub_test_three_ng.cpp index c90ffd25438de3d04d4f88c7f84363931d3e7da5..9335ca583eb607d804038cc3b54bd2c4851e264e 100644 --- a/test/unittest/core/event/gesture_event_hub_test_three_ng.cpp +++ b/test/unittest/core/event/gesture_event_hub_test_three_ng.cpp @@ -1415,4 +1415,58 @@ HWTEST_F(GestureEventHubTestNg, UpdateMenuNode002, TestSize.Level1) EXPECT_EQ(data.menuPositionRight, 0.0f); EXPECT_EQ(data.menuPositionBottom, 0.0f); } + +/** + * @tc.name: MinRecognizerGroupLoopSizeTest001 + * @tc.desc: Test ProcessTouchTestHit + * @tc.type: FUNC + */ +HWTEST_F(GestureEventHubTestNg, MinRecognizerGroupLoopSizeTest001, TestSize.Level1) +{ + /** + * @tc.steps: step1. Create GestureEventHub. + * @tc.expected: gestureEventHub is not null. + */ + auto frameNode = FrameNode::CreateFrameNode("myButton", 100, AceType::MakeRefPtr()); + auto gestureEventHub = frameNode->GetOrCreateGestureEventHub(); + ASSERT_NE(gestureEventHub, nullptr); + OffsetF coordinateOffset; + TouchRestrict touchRestrict; + TouchTestResult innerTargets; + TouchTestResult finalResult; + ResponseLinkResult responseLinkResult; + PointF localPoint; + + /** + * @tc.steps: step2. create userRecognizer and set to gestureHierarchy_. + */ + auto longPressRecognizer = AceType::MakeRefPtr(1, 1, false); + gestureEventHub->gestureHierarchy_.emplace_back(longPressRecognizer); + PanDirection panDirection; + panDirection.type = PanDirection::ALL; + auto panRecognizer = AceType::MakeRefPtr(1, panDirection, 0.0); + panRecognizer->SetPriority(GesturePriority::Parallel); + gestureEventHub->gestureHierarchy_.emplace_back(panRecognizer); + auto clickRecognizer = AceType::MakeRefPtr(); + gestureEventHub->gestureHierarchy_.emplace_back(clickRecognizer); + + auto otherFrameNode = FrameNode::CreateFrameNode("otherButton", + ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr()); + auto otherClickRecognizer = AceType::MakeRefPtr(); + otherClickRecognizer->AttachFrameNode(otherFrameNode); + std::vector> exclusiveRecognizerGroup; + exclusiveRecognizerGroup.push_back(otherClickRecognizer); + auto exclusiveRecognizer = AceType::MakeRefPtr(exclusiveRecognizerGroup); + gestureEventHub->externalExclusiveRecognizer_.push_back(exclusiveRecognizer); + + /** + * @tc.steps: step3. call ProcessTouchTestHit , recognizer is not instance of recognizer group + * @tc.expected: result is false + */ + auto result = gestureEventHub->ProcessTouchTestHit( + coordinateOffset, touchRestrict, innerTargets, finalResult, 2, localPoint, nullptr, responseLinkResult); + auto sizeOfResponseLinkResult = static_cast(responseLinkResult.size()); + EXPECT_FALSE(result); + EXPECT_EQ(sizeOfResponseLinkResult, 3); +} } // namespace OHOS::Ace::NG \ No newline at end of file