diff --git a/frameworks/core/common/builder_util.cpp b/frameworks/core/common/builder_util.cpp index c5c225d4d20e17d0be366f364af47c7a721ae6e4..d6ae9323b92d99ed59a543a4ee2af573f5eec5b0 100644 --- a/frameworks/core/common/builder_util.cpp +++ b/frameworks/core/common/builder_util.cpp @@ -88,6 +88,7 @@ void RemoveBuilderFromContainer(const RefPtr& node, const std::list< void ClearChildInBuilderContainer(int32_t nodeId, std::list>& nodes) { NG::ScopedViewStackProcessor builder; + CHECK_NULL_VOID(!nodes.empty()); auto node = nodes.front(); CHECK_NULL_VOID(node); auto context = node->GetContext(); diff --git a/frameworks/core/interfaces/native/node/frame_node_modifier.cpp b/frameworks/core/interfaces/native/node/frame_node_modifier.cpp index 907c8c1c45bf50eff3adc3759131d7c44851f55a..f257729ceb0a89284cd43e89a11d93dec8ac5674 100644 --- a/frameworks/core/interfaces/native/node/frame_node_modifier.cpp +++ b/frameworks/core/interfaces/native/node/frame_node_modifier.cpp @@ -90,7 +90,7 @@ void AddBuilderNodeInFrameNode(ArkUINodeHandle node, ArkUINodeHandle child) auto childRef = Referenced::Claim(childNode); CHECK_NULL_VOID(childRef); auto parentNode = childRef->GetParent(); - CHECK_NULL_VOID(parentNode && parentNode->GetId() == currentNode->GetId()); + CHECK_NULL_VOID(parentNode && parentNode == currentNode); std::list> nodes; BuilderUtils::GetBuilderNodes(childRef, nodes); BuilderUtils::AddBuilderToParent(childRef->GetParent(), nodes); @@ -136,7 +136,7 @@ void RemoveBuilderNodeInFrameNode(ArkUINodeHandle node, ArkUINodeHandle child) CHECK_NULL_VOID(childNode); auto childRef = Referenced::Claim(childNode); auto parentNode = childRef->GetParent(); - CHECK_NULL_VOID(parentNode && parentNode->GetId() == currentNode->GetId()); + CHECK_NULL_VOID(parentNode && parentNode == currentNode); std::list> nodes; BuilderUtils::GetBuilderNodes(childRef, nodes); BuilderUtils::RemoveBuilderFromParent(parentNode, nodes); diff --git a/frameworks/core/interfaces/native/node/render_node_modifier.cpp b/frameworks/core/interfaces/native/node/render_node_modifier.cpp index b483ebd6fab93ba022322bd5904c9291d5acaf8a..ff4b7b7da0ba42b3cfe92b5e8b86d8c607c8d956 100644 --- a/frameworks/core/interfaces/native/node/render_node_modifier.cpp +++ b/frameworks/core/interfaces/native/node/render_node_modifier.cpp @@ -64,7 +64,7 @@ void AddBuilderNode(ArkUINodeHandle node, ArkUINodeHandle child) auto childRef = Referenced::Claim(childNode); CHECK_NULL_VOID(childRef); auto parentNode = childRef->GetParent(); - CHECK_NULL_VOID(parentNode && parentNode->GetId() == currentNode->GetId()); + CHECK_NULL_VOID(parentNode && parentNode == currentNode); std::list> nodes; BuilderUtils::GetBuilderNodes(childRef, nodes); BuilderUtils::AddBuilderToParent(parentNode, nodes); @@ -99,7 +99,7 @@ void RemoveBuilderNode(ArkUINodeHandle node, ArkUINodeHandle child) auto childRef = Referenced::Claim(childNode); CHECK_NULL_VOID(childRef); auto parentNode = childRef->GetParent(); - CHECK_NULL_VOID(parentNode && parentNode->GetId() == currentNode->GetId()); + CHECK_NULL_VOID(parentNode && parentNode == currentNode); std::list> nodes; BuilderUtils::GetBuilderNodes(childRef, nodes); BuilderUtils::RemoveBuilderFromParent(parentNode, nodes); diff --git a/test/unittest/core/common/builder_util/builder_util_test.cpp b/test/unittest/core/common/builder_util/builder_util_test.cpp index 74baa524c86d033d7f1d938a5f08e32e662f36c3..c5282ce4c90b96d1d0b4b70db458797b4384e6d8 100644 --- a/test/unittest/core/common/builder_util/builder_util_test.cpp +++ b/test/unittest/core/common/builder_util/builder_util_test.cpp @@ -221,6 +221,7 @@ HWTEST_F(BuilderUtilsTest, BuilderUtilsTest003, TestSize.Level1) * @tc.expected: step3. Call BuilderNodeFunc with "__deleteBuilderNode__". */ std::list> nodes; + BuilderUtils::ClearChildInBuilderContainer(UNIQUED_ID_OF_TEST_NODE, nodes); BuilderUtils::GetBuilderNodes(firstNode, nodes); EXPECT_EQ(nodes.size(), 2); EXPECT_CALL(*frontend, BuilderNodeFunc("__deleteBuilderNode__", _)).Times(1); @@ -262,4 +263,59 @@ HWTEST_F(BuilderUtilsTest, BuilderUtilsTest003, TestSize.Level1) BuilderUtils::RemoveBuilderFromParent(nullptr, nullptr); BuilderUtils::RemoveBuilderFromParent(secondedNode, nullptr); } + +/** + * @tc.name: BuilderUtilsTest004 + * @tc.desc: Test when the Tree does not contains valid parent. + * @tc.type: FUNC + */ +HWTEST_F(BuilderUtilsTest, BuilderUtilsTest004, TestSize.Level1) +{ + /** + * @tc.steps: step1. Create some UINode. And Set Second Node as BuilderRootNode; + * @tc.expected: step1. The return value is not null. + */ + auto firstNode = NG::FrameNode::GetOrCreateFrameNode( + TEST_NODE_TAG, UNIQUED_ID_OF_TEST_NODE++, []() { return AceType::MakeRefPtr(); }); + EXPECT_NE(firstNode, nullptr); + auto secondedNode = NG::FrameNode::GetOrCreateFrameNode( + TEST_NODE_TAG, UNIQUED_ID_OF_TEST_NODE++, []() { return AceType::MakeRefPtr(); }); + EXPECT_NE(secondedNode, nullptr); + auto thirdNode = NG::FrameNode::GetOrCreateFrameNode( + TEST_NODE_TAG, UNIQUED_ID_OF_TEST_NODE++, []() { return AceType::MakeRefPtr(); }); + /** + * @tc.steps: step2. Make a tree by the previous Node. + *├─ firstNode + *│ ├─ secondedNode + *│ │ └─ thirdNode (true) + */ + firstNode->AddChild(secondedNode); + secondedNode->AddChild(thirdNode); + thirdNode->SetJsBuilderNodeId(secondedNode->GetId()); + + auto context = AceType::MakeRefPtr(); + EXPECT_NE(context, nullptr); + firstNode->context_ = AceType::RawPtr(context); + secondedNode->context_ = AceType::RawPtr(context); + thirdNode->context_ = AceType::RawPtr(context); + auto frontend = AceType::MakeRefPtr(); + context->weakFrontend_ = AceType::WeakClaim(AceType::RawPtr(frontend)); + + /** + * @tc.steps: step3. Call AddBuilderToParent or RemoveBuilderFromParent without valid parent. + */ + EXPECT_CALL(*frontend, BuilderNodeFunc("__addBuilderNode__", _)).Times(0); + EXPECT_CALL(*frontend, BuilderNodeFunc("__addBuilderNodeToBuilder__", _)).Times(0); + BuilderUtils::AddBuilderToParent(secondedNode, thirdNode); + BuilderUtils::AddBuilderToParent(nullptr, thirdNode); + BuilderUtils::AddBuilderToParent(nullptr, nullptr); + BuilderUtils::AddBuilderToParent(secondedNode, nullptr); + + EXPECT_CALL(*frontend, BuilderNodeFunc("__deleteBuilderNodeFromBuilder__", _)).Times(0); + EXPECT_CALL(*frontend, BuilderNodeFunc("__deleteBuilderNode__", _)).Times(0); + BuilderUtils::RemoveBuilderFromParent(secondedNode, thirdNode); + BuilderUtils::RemoveBuilderFromParent(nullptr, thirdNode); + BuilderUtils::RemoveBuilderFromParent(nullptr, nullptr); + BuilderUtils::RemoveBuilderFromParent(secondedNode, nullptr); +} } // namespace OHOS::Ace