diff --git a/frameworks/core/components_ng/event/drag_drop_event.cpp b/frameworks/core/components_ng/event/drag_drop_event.cpp index 9b6616d1297510a44dfcbfb00cabe98d4205782a..35fd3a80757c40f80b2b66a93a6f96349f6de5e2 100644 --- a/frameworks/core/components_ng/event/drag_drop_event.cpp +++ b/frameworks/core/components_ng/event/drag_drop_event.cpp @@ -109,7 +109,11 @@ void DragDropEventActuator::InitPanAction() panRecognizer_->SetOnActionEnd( [weakHandler = WeakPtr(dragDropInitiatingHandler_)](GestureEvent& info) { auto handler = weakHandler.Upgrade(); - CHECK_NULL_VOID(handler); + if (!handler) { + TAG_LOGW(AceLogTag::ACE_DRAG, "on action end, frameNode has been destroyed, resetting"); + DragEventActuator::ResetDragStatus(); + return; + } handler->NotifyPanOnActionEnd(info); }); panRecognizer_->SetOnActionCancel( diff --git a/test/unittest/core/event/drag_event/drag_drop_event_test_ng.cpp b/test/unittest/core/event/drag_event/drag_drop_event_test_ng.cpp index 86085fc6da802fb5f3df3aa9044ec125a6cb4588..a32408db695ef258ba9c474cde276b4cac52fc78 100644 --- a/test/unittest/core/event/drag_event/drag_drop_event_test_ng.cpp +++ b/test/unittest/core/event/drag_event/drag_drop_event_test_ng.cpp @@ -994,4 +994,104 @@ HWTEST_F(DragDropEventTestNgIssue, DragDropEventTestNgIssue032, TestSize.Level1) dragDropEventActuator->RestartDragTask(gestureEvent); ASSERT_EQ(dragDropEventActuator->dragDropInitiatingHandler_, nullptr); } + +/** + * @tc.name: DragDropEventTestNgIssue033 + * @tc.desc: Test onActionEnd_ callback when dragDropInitiatingHandler_ is not nullptr. + * @tc.type: FUNC + */ +HWTEST_F(DragDropEventTestNgIssue, DragDropEventTestNgIssue033, TestSize.Level1) +{ + /** + * @tc.steps: step1. create dragDropEventActuator. + * @tc.expected: step1. dragDropEventActuator exit. + */ + auto pipelineContext = MockPipelineContext::GetCurrentContext(); + ASSERT_NE(pipelineContext, nullptr); + auto dragDropManager = AceType::MakeRefPtr(); + ASSERT_NE(dragDropManager, nullptr); + pipelineContext->dragDropManager_ = dragDropManager; + RefPtr rootNode = AceType::MakeRefPtr("root_node", -1, AceType::MakeRefPtr()); + ASSERT_NE(rootNode, nullptr); + auto overlayManager = AceType::MakeRefPtr(AceType::DynamicCast(rootNode)); + ASSERT_NE(overlayManager, nullptr); + pipelineContext->overlayManager_ = overlayManager; + + auto eventHub = AceType::MakeRefPtr(); + ASSERT_NE(eventHub, nullptr); + auto gestureEventHub = AceType::MakeRefPtr(AceType::WeakClaim(AceType::RawPtr(eventHub))); + ASSERT_NE(gestureEventHub, nullptr); + auto frameNode = FrameNode::GetOrCreateFrameNode(V2::IMAGE_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), + []() { return AceType::MakeRefPtr(); }); + ASSERT_NE(frameNode, nullptr); + eventHub->host_ = AceType::WeakClaim(AceType::RawPtr(frameNode)); + auto dragDropEventActuator = + AceType::MakeRefPtr(AceType::WeakClaim(AceType::RawPtr(gestureEventHub))); + ASSERT_NE(dragDropEventActuator, nullptr); + auto handler = dragDropEventActuator->dragDropInitiatingHandler_; + ASSERT_NE(handler, nullptr); + auto machine = handler->initiatingFlow_; + ASSERT_NE(machine, nullptr); + machine->InitializeState(); + dragDropManager->ResetDragging(DragDropMgrState::IDLE); + machine->currentState_ = static_cast(DragDropInitiatingStatus::READY); + /** + * @tc.steps: step2. call onActionEnd_ function. + * @tc.expected: step2. onActionEnd_ exit. + */ + dragDropEventActuator->InitPanAction(); + GestureEvent gestureEvent; + auto callback = *(dragDropEventActuator->panRecognizer_->onActionEnd_); + if (callback) { + callback(gestureEvent); + } + ASSERT_EQ(dragDropEventActuator->dragDropInitiatingHandler_->GetDragDropInitiatingStatus(), + DragDropInitiatingStatus::IDLE); +} + +/** + * @tc.name: DragDropEventTestNgIssue034 + * @tc.desc: Test onActionEnd_ callback when dragDropInitiatingHandler_ is nullptr. + * @tc.type: FUNC + */ +HWTEST_F(DragDropEventTestNgIssue, DragDropEventTestNgIssue034, TestSize.Level1) +{ + /** + * @tc.steps: step1. create dragDropEventActuator. + * @tc.expected: step1. dragDropEventActuator exit. + */ + auto eventHub = AceType::MakeRefPtr(); + ASSERT_NE(eventHub, nullptr); + auto gestureEventHub = AceType::MakeRefPtr(AceType::WeakClaim(AceType::RawPtr(eventHub))); + ASSERT_NE(gestureEventHub, nullptr); + auto frameNode = FrameNode::GetOrCreateFrameNode(V2::IMAGE_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), + []() { return AceType::MakeRefPtr(); }); + ASSERT_NE(frameNode, nullptr); + eventHub->host_ = AceType::WeakClaim(AceType::RawPtr(frameNode)); + auto dragDropEventActuator = + AceType::MakeRefPtr(AceType::WeakClaim(AceType::RawPtr(gestureEventHub))); + ASSERT_NE(dragDropEventActuator, nullptr); + ASSERT_NE(dragDropEventActuator->dragDropInitiatingHandler_, nullptr); + dragDropEventActuator->dragDropInitiatingHandler_ = nullptr; + auto pipeline = NG::PipelineContext::GetCurrentContext(); + ASSERT_NE(pipeline, nullptr); + auto overlayManager = pipeline->GetOverlayManager(); + ASSERT_NE(overlayManager, nullptr); + auto columnNode = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), + AceType::MakeRefPtr(true)); + ASSERT_NE(columnNode, nullptr); + overlayManager->MountPixelMapToRootNode(columnNode); + overlayManager->hasPixelMap_ = true; + /** + * @tc.steps: step2. call onActionEnd_ function. + * @tc.expected: step2. onActionEnd_ exit. + */ + dragDropEventActuator->InitPanAction(); + GestureEvent gestureEvent; + auto callback = *(dragDropEventActuator->panRecognizer_->onActionEnd_); + if (callback) { + callback(gestureEvent); + } + EXPECT_FALSE(overlayManager->hasPixelMap_); +} } // namespace OHOS::Ace::NG \ No newline at end of file