diff --git a/frameworks/core/components_ng/pattern/bubble/bubble_layout_algorithm.cpp b/frameworks/core/components_ng/pattern/bubble/bubble_layout_algorithm.cpp index 11e8d48ddefa00f8e65d0daa6e51caaf7155a3d8..5290952bfd27834b503439bc35cb990b68b0de68 100644 --- a/frameworks/core/components_ng/pattern/bubble/bubble_layout_algorithm.cpp +++ b/frameworks/core/components_ng/pattern/bubble/bubble_layout_algorithm.cpp @@ -1393,7 +1393,8 @@ OffsetF BubbleLayoutAlgorithm::GetAdjustPosition(std::vector& current OffsetF position; float width = 0.0f; float height = 0.0f; - for (size_t i = 0, len = currentPlacementStates.size(); i < len;) { + size_t len = currentPlacementStates.size(); + for (size_t i = 0; i < len;) { placement_ = currentPlacementStates[i]; if (placement_ == Placement::NONE) { break; @@ -1429,11 +1430,10 @@ OffsetF BubbleLayoutAlgorithm::GetAdjustPosition(std::vector& current } } position = AdjustPosition(childPosition, width, height, targetSpace_.ConvertToPx()); - if (NearEqual(position, OffsetF(0.0f, 0.0f))) { - i += step; - continue; + if ((!NearEqual(position, OffsetF(0.0f, 0.0f))) || (len - i <= step)) { + break; } - break; + i += step; } return position; } diff --git a/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.cpp b/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.cpp index 6f97a7c3bc03c49623654b4c5c3f8745bb0a4bfc..17cb8e0f31cc91d1de8226a862c5866dd9f85b64 100644 --- a/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.cpp +++ b/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.cpp @@ -3031,18 +3031,21 @@ OffsetF MenuLayoutAlgorithm::GetAdjustPosition(std::vector& currentPl { OffsetF childPosition; OffsetF position; - for (size_t i = 0, len = currentPlacementStates.size(); i < len;) { + size_t len = currentPlacementStates.size(); + for (size_t i = 0; i < len;) { placement_ = currentPlacementStates[i]; if (placement_ == Placement::NONE) { break; } childPosition = GetPositionWithPlacement(childSize, topPosition, bottomPosition); position = AdjustPosition(childPosition, childSize.Width(), childSize.Height(), targetSecurity_); - if (NearEqual(position, OffsetF(0.0f, 0.0f))) { - i += step; - continue; + if (!NearEqual(position, OffsetF(0.0f, 0.0f))) { + break; } - break; + if (len - i <= step) { + break; + } + i += step; } return position; } diff --git a/frameworks/core/components_ng/pattern/menu/menu_pattern.cpp b/frameworks/core/components_ng/pattern/menu/menu_pattern.cpp index 6bb5c7ef7739afc047c57b6d9ba4619a0a1696d8..59adee429b8318429ca28232be3919887ae7b4ad 100644 --- a/frameworks/core/components_ng/pattern/menu/menu_pattern.cpp +++ b/frameworks/core/components_ng/pattern/menu/menu_pattern.cpp @@ -822,7 +822,7 @@ void MenuPattern::AddGroupFooterDivider(RefPtr& previousNode, const RefP } } // When the group is not the last item of the menu. - if (parent->GetChildIndex(groupNode) < parent->GetChildren().size() - 1) { + if (parent->GetChildIndex(groupNode) < static_cast(parent->GetChildren().size()) - 1) { UpdateDividerProperty(groupPattern->GetBottomDivider(), property->GetItemGroupDivider()); if (itemDividerMode == DividerMode::FLOATING_ABOVE_MENU) { groupPattern->RemoveBottomDivider(); diff --git a/frameworks/core/components_ng/pattern/menu/sub_menu_layout_algorithm.cpp b/frameworks/core/components_ng/pattern/menu/sub_menu_layout_algorithm.cpp index d1c1da4df7ee89b82056687f6179498af8e16cc6..d780207edea3c0bf517667c680187326756777b3 100644 --- a/frameworks/core/components_ng/pattern/menu/sub_menu_layout_algorithm.cpp +++ b/frameworks/core/components_ng/pattern/menu/sub_menu_layout_algorithm.cpp @@ -178,7 +178,10 @@ float SubMenuLayoutAlgorithm::CalcStackSubMenuPositionYHalfScreenWithPreview( LayoutWrapper* layoutWrapper ) { + CHECK_NULL_RETURN(layoutWrapper, 0.0f); + CHECK_NULL_RETURN(parentMenu, 0.0f); auto parentMenuPattern = parentMenu->GetPattern(); + CHECK_NULL_RETURN(parentMenuPattern, 0.0f); auto parentPlacement = parentMenuPattern->GetLastPlacement().value_or(Placement::NONE); auto firstItemBottomPositionY = GetFirstItemBottomPositionY(parentMenu); float parentMenuBottomY = GetMenuBottomPositionY(parentMenu); @@ -201,7 +204,9 @@ float SubMenuLayoutAlgorithm::CalcStackSubMenuPositionYHalfScreenWithPreview( return lastItemPositionY - size.Height(); } auto subMenuNode = layoutWrapper->GetHostNode(); + CHECK_NULL_RETURN(subMenuNode, 0.0f); auto subMenuPattern = subMenuNode->GetPattern(); + CHECK_NULL_RETURN(subMenuPattern, 0.0f); auto diffY = bottomSpace - size.Height(); subMenuPattern->SetTranslateYForStack(diffY); return wrapperRect_.Top() + param_.topSecurity; @@ -215,7 +220,9 @@ float SubMenuLayoutAlgorithm::CalcStackSubMenuPositionYHalfScreenWithPreview( return wrapperRect_.Bottom() - param_.bottomSecurity - size.Height(); } auto subMenuNode = layoutWrapper->GetHostNode(); + CHECK_NULL_RETURN(subMenuNode, 0.0f); auto subMenuPattern = subMenuNode->GetPattern(); + CHECK_NULL_RETURN(subMenuPattern, 0.0f); auto diffY = size.Height() - bottomSpace; subMenuPattern->SetTranslateYForStack(diffY); return wrapperRect_.Bottom() - param_.bottomSecurity - size.Height(); @@ -311,10 +318,15 @@ float SubMenuLayoutAlgorithm::VerticalLayoutSubMenuHalfScreen( // can't fit in screen, line up with top of the screen return 0.0f; } + CHECK_NULL_RETURN(parentMenuItem, bottomSpace); auto parentItemPattern = parentMenuItem->GetPattern(); + CHECK_NULL_RETURN(parentItemPattern, bottomSpace); auto parentMenu = parentItemPattern->GetMenu(true); + CHECK_NULL_RETURN(parentMenu, bottomSpace); auto parentMenuPattern = parentMenu->GetPattern(); + CHECK_NULL_RETURN(parentMenuPattern, bottomSpace); if (parentMenuPattern->GetPreviewMode() != MenuPreviewMode::NONE) { + CHECK_NULL_RETURN(layoutWrapper, bottomSpace); return CalcStackSubMenuPositionYHalfScreenWithPreview(size, parentMenu, layoutWrapper); } else { return CalcStackSubMenuPositionYHalfScreen(size, parentMenu, parentMenuItem); @@ -339,10 +351,15 @@ float SubMenuLayoutAlgorithm::VerticalLayoutSubMenu(const SizeF& size, float pos // can't fit in screen, line up with top of the screen return wrapperRect_.Top() + paddingTop_; } + CHECK_NULL_RETURN(parentMenuItem, bottomSpace); auto parentItemPattern = parentMenuItem->GetPattern(); + CHECK_NULL_RETURN(parentItemPattern, bottomSpace); auto parentMenu = parentItemPattern->GetMenu(true); + CHECK_NULL_RETURN(parentMenu, bottomSpace); auto parentMenuPattern = parentMenu->GetPattern(); + CHECK_NULL_RETURN(parentMenuPattern, bottomSpace); if (parentMenuPattern->GetPreviewMode() != MenuPreviewMode::NONE) { + CHECK_NULL_RETURN(layoutWrapper, bottomSpace); return CalcStackSubMenuPositionYHalfScreenWithPreview(size, parentMenu, layoutWrapper); } else { return CalcStackSubMenuPositionYHalfScreen(size, parentMenu, parentMenuItem);