diff --git a/frameworks/core/components_ng/pattern/menu/wrapper/menu_wrapper_pattern.cpp b/frameworks/core/components_ng/pattern/menu/wrapper/menu_wrapper_pattern.cpp index 770a4a549640b8a76a6fc53e4afbaf3a4f5bbc87..a12abd608ab72d09097b1f228ab502b8f736c33b 100644 --- a/frameworks/core/components_ng/pattern/menu/wrapper/menu_wrapper_pattern.cpp +++ b/frameworks/core/components_ng/pattern/menu/wrapper/menu_wrapper_pattern.cpp @@ -787,7 +787,6 @@ bool MenuWrapperPattern::OnDirtyLayoutWrapperSwap(const RefPtr& d CHECK_NULL_RETURN(pipeline, false); auto theme = pipeline->GetTheme(); CHECK_NULL_RETURN(theme, false); - auto expandDisplay = theme->GetExpandDisplay(); auto menuNode = DynamicCast(host->GetChildAtIndex(0)); CHECK_NULL_RETURN(menuNode, false); auto menuPattern = AceType::DynamicCast(menuNode->GetPattern()); @@ -796,11 +795,7 @@ bool MenuWrapperPattern::OnDirtyLayoutWrapperSwap(const RefPtr& d auto layoutProperty = menuPattern->GetLayoutProperty(); CHECK_NULL_RETURN(layoutProperty, false); isShowInSubWindow_ = layoutProperty->GetShowInSubWindowValue(true); - if (host->IsOnMainTree() && - ((IsContextMenu() && !IsHide()) || (((expandDisplay || isOpenMenu_) && isShowInSubWindow_) && !IsHide()) || - GetIsSelectOverlaySubWindowWrapper())) { - SetHotAreas(dirty); - } + SetHotAreas(dirty); MarkAllMenuNoDraggable(); MarkWholeSubTreeNoDraggable(GetPreview()); if (!GetHoverScaleInterruption()) { @@ -818,13 +813,9 @@ bool MenuWrapperPattern::IsNeedSetHotAreas(const RefPtr& layoutWr CHECK_NULL_RETURN(pipeline, false); auto theme = pipeline->GetTheme(); CHECK_NULL_RETURN(theme, false); - bool menuNotNeedsHotAreas = (layoutWrapper->GetAllChildrenWithBuild().empty() || !IsContextMenu()) && - !((theme->GetExpandDisplay() || isOpenMenu_) && isShowInSubWindow_); - if (menuNotNeedsHotAreas && !GetIsSelectOverlaySubWindowWrapper()) { - return false; - } - - return true; + auto container = AceEngine::Get().GetContainer(pipeline->GetInstanceId()); + CHECK_NULL_RETURN(container, false); + return host->IsOnMainTree() && !IsHide() && container->IsSubContainer(); } void MenuWrapperPattern::AddTargetWindowHotArea(std::vector& rects) diff --git a/test/unittest/core/pattern/menu/menuwrapper_test_ng.cpp b/test/unittest/core/pattern/menu/menuwrapper_test_ng.cpp index e8b228ff1f3003cb92a9853990fe0cccb48b1336..a9607ba2971a4e9ee165fe9130c692aa9c3a8df9 100644 --- a/test/unittest/core/pattern/menu/menuwrapper_test_ng.cpp +++ b/test/unittest/core/pattern/menu/menuwrapper_test_ng.cpp @@ -1419,6 +1419,87 @@ HWTEST_F(MenuWrapperTestNg, MenuWrapperPatternTestNg030, TestSize.Level1) EXPECT_FALSE(wrapperPattern->OnDirtyLayoutWrapperSwap(layoutWrapper, configDirtySwap)); } +/** + * @tc.name: IsNeedSetHotAreas001 + * @tc.desc: test IsNeedSetHotAreas + * @tc.type: FUNC + */ +HWTEST_F(MenuWrapperTestNg, IsNeedSetHotAreas001, TestSize.Level1) +{ + /** + * @tc.steps: step1. Create layoutWrapper + * @tc.expected: layoutWrapper null + */ + auto wrapperNode = + FrameNode::CreateFrameNode(V2::MENU_WRAPPER_ETS_TAG, 1, AceType::MakeRefPtr(1)); + auto geometryNode = AceType::MakeRefPtr(); + auto layoutProp = AceType::MakeRefPtr(); + auto menuItemGroupPattern = AceType::MakeRefPtr(); + auto menuItemGroup = FrameNode::CreateFrameNode(V2::MENU_ITEM_GROUP_ETS_TAG, -1, menuItemGroupPattern); + auto* layoutWrapperNode = new LayoutWrapperNode(menuItemGroup, geometryNode, layoutProp); + RefPtr layoutWrapper = layoutWrapperNode->GetOrCreateChildByIndex(0, false); + EXPECT_EQ(layoutWrapper, nullptr); + + /** + * @tc.steps: step2. Create menuNode + * @tc.expected: menuPattern is not null + */ + MenuModelNG model; + model.Create(); + auto menuNode = AceType::DynamicCast(ViewStackProcessor::GetInstance()->Finish()); + ASSERT_NE(menuNode, nullptr); + auto menuPattern = menuNode->GetPattern(); + ASSERT_NE(menuPattern, nullptr); + auto layoutProperty = menuPattern->GetLayoutProperty(); + ASSERT_NE(layoutProperty, nullptr); + + auto menuItem = AceType::MakeRefPtr("", -1, menuPattern); + menuItem->MountToParent(wrapperNode); + auto itemGeoNode = AceType::MakeRefPtr(); + itemGeoNode->SetFrameSize(SizeF(MENU_ITEM_SIZE_WIDTH, MENU_ITEM_SIZE_HEIGHT)); + auto firstChildLayoutWrapper = AceType::MakeRefPtr(menuItem, itemGeoNode, layoutProp); + + layoutWrapperNode->AppendChild(firstChildLayoutWrapper); + layoutWrapper = layoutWrapperNode->GetOrCreateChildByIndex(0, false); + EXPECT_EQ(layoutWrapper, firstChildLayoutWrapper); + + auto themeManager = AceType::MakeRefPtr(); + MockPipelineContext::GetCurrent()->SetThemeManager(themeManager); + auto theme = AceType::MakeRefPtr(); + EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(theme)); + + /** + * @tc.steps: step3. test IsNeedSetHotAreas + * @tc.expected: IsNeedSetHotAreas is false + */ + auto wrapperPattern = wrapperNode->GetPattern(); + ASSERT_NE(wrapperPattern, nullptr); + EXPECT_FALSE(wrapperPattern->IsNeedSetHotAreas(layoutWrapper)); + + /** + * @tc.steps: step4. wrapperPattern->menuStatus_ is MenuStatus::SHOW + * @tc.expected: IsNeedSetHotAreas is false + */ + wrapperPattern->menuStatus_ = MenuStatus::SHOW; + EXPECT_FALSE(wrapperPattern->IsNeedSetHotAreas(layoutWrapper)); + + /** + * @tc.steps: step5. wrapperNode->onMainTree_ is true + * @tc.expected: IsNeedSetHotAreas is false + */ + wrapperNode->onMainTree_ = true; + EXPECT_FALSE(wrapperPattern->IsNeedSetHotAreas(layoutWrapper)); + + /** + * @tc.steps: step6. isSubContainer_ is true + * @tc.expected: IsNeedSetHotAreas is true + */ + RefPtr pipelineContext = wrapperNode->GetContextRefPtr(); + auto containerId = pipelineContext->GetInstanceId(); + AceType::DynamicCast(AceEngine::Get().GetContainer(containerId))->isSubContainer_ = true; + EXPECT_TRUE(wrapperPattern->IsNeedSetHotAreas(layoutWrapper)); +} + /** * @tc.name: MenuWrapperPatternTestNg031 * @tc.desc: test OnDirtyLayoutWrapperSwap