From df4dfe6cf8f13570279c55cd6f5f155a9a52400e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B4=BA=E6=99=A8=E9=9F=AC?= Date: Thu, 3 Jul 2025 23:16:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=83=A8=E5=88=86=E5=9C=BA?= =?UTF-8?q?=E6=99=AF=E6=89=8B=E5=8A=BF=E6=A0=91=E7=9A=84=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 贺晨韬 --- .../components_ng/event/gesture_event_hub.cpp | 6 ++- .../event/gesture_event_hub_test_three_ng.cpp | 54 +++++++++++++++++++ 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/frameworks/core/components_ng/event/gesture_event_hub.cpp b/frameworks/core/components_ng/event/gesture_event_hub.cpp index 237b9267f4e5..f4c16213c271 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 c90ffd25438d..9335ca583eb6 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 -- Gitee