已关闭
fix select标签弹出后不失焦 #78296
jiangjiacheng创建于 2025年12月25日关闭于 1月25日
fix select标签弹出后不失焦 #78296
已关闭
共 2 个文件变更+40-5
| @@ -401,14 +401,46 @@ HWTEST_F(WebPatternPartOneTest, NotifyMenuLifeCycleEvent_001, TestSize.Level1) | |||
| 401 | webPattern->NotifyMenuLifeCycleEvent(MenuLifeCycleEvent::ABOUT_TO_APPEAR); | 401 | webPattern->NotifyMenuLifeCycleEvent(MenuLifeCycleEvent::ABOUT_TO_APPEAR); |
| 402 | EXPECT_TRUE(webPattern->isMenuShownFromWeb_); | 402 | EXPECT_TRUE(webPattern->isMenuShownFromWeb_); |
| 403 | webPattern->isFocus_ = true; | 403 | webPattern->isFocus_ = true; |
| 404 | - webPattern->NotifyMenuLifeCycleEvent(MenuLifeCycleEvent::ON_DID_DISAPPEAR); | 404 | + webPattern->NotifyMenuLifeCycleEvent(MenuLifeCycleEvent::ON_WILL_DISAPPEAR); |
| 405 | EXPECT_FALSE(webPattern->isMenuShownFromWeb_); | 405 | EXPECT_FALSE(webPattern->isMenuShownFromWeb_); |
| 406 | webPattern->isFocus_ = false; | 406 | webPattern->isFocus_ = false; |
| 407 | - webPattern->NotifyMenuLifeCycleEvent(MenuLifeCycleEvent::ON_DID_DISAPPEAR); | 407 | + webPattern->NotifyMenuLifeCycleEvent(MenuLifeCycleEvent::ON_WILL_DISAPPEAR); |
| 408 | EXPECT_EQ(webPattern->delegate_->blurReason_, OHOS::NWeb::BlurReason::VIEW_SWITCH); | 408 | EXPECT_EQ(webPattern->delegate_->blurReason_, OHOS::NWeb::BlurReason::VIEW_SWITCH); |
| 409 | 409 | ||
| 410 | } | 410 | } |
| 411 | 411 | ||
| 412 | +/** | ||
| 413 | + * @tc.name: NotifyMenuLifeCycleEvent_002 | ||
| 414 | + * @tc.desc: NotifyMenuLifeCycleEvent. | ||
| 415 | + * @tc.type: FUNC | ||
| 416 | + */ | ||
| 417 | +HWTEST_F(WebPatternPartOneTest, NotifyMenuLifeCycleEvent_002, TestSize.Level1) | ||
| 418 | +{ | ||
| 419 | + | ||
| 420 | + auto* stack = ViewStackProcessor::GetInstance(); | ||
| 421 | + EXPECT_NE(stack, nullptr); | ||
| 422 | + auto nodeId = stack->ClaimNodeId(); | ||
| 423 | + auto frameNode = | ||
| 424 | + FrameNode::GetOrCreateFrameNode(V2::WEB_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<WebPattern>(); }); | ||
| 425 | + EXPECT_NE(frameNode, nullptr); | ||
| 426 | + stack->Push(frameNode); | ||
| 427 | + auto webPattern = frameNode->GetPattern<WebPattern>(); | ||
| 428 | + ASSERT_NE(webPattern, nullptr); | ||
| 429 | + webPattern->OnModifyDone(); | ||
| 430 | + ASSERT_NE(webPattern->delegate_, nullptr); | ||
| 431 | + webPattern->selectPopupMenuShowing_ = true; | ||
| 432 | + webPattern->NotifyMenuLifeCycleEvent(MenuLifeCycleEvent::ABOUT_TO_APPEAR); | ||
| 433 | + EXPECT_FALSE(webPattern->isMenuShownFromWeb_); | ||
| 434 | + webPattern->selectPopupMenuShowing_ = false; | ||
| 435 | + webPattern->NotifyMenuLifeCycleEvent(MenuLifeCycleEvent::ABOUT_TO_APPEAR); | ||
| 436 | + EXPECT_TRUE(webPattern->isMenuShownFromWeb_); | ||
| 437 | + webPattern->NotifyMenuLifeCycleEvent(MenuLifeCycleEvent::ON_WILL_DISAPPEAR); | ||
| 438 | + EXPECT_FALSE(webPattern->isMenuShownFromWeb_); | ||
| 439 | + webPattern->NotifyMenuLifeCycleEvent(MenuLifeCycleEvent::ON_WILL_DISAPPEAR); | ||
| 440 | + EXPECT_TRUE(webPattern->isLastEventMenuClose_); | ||
| 441 | + | ||
| 442 | +} | ||
| 443 | + | ||
| 412 | /** | 444 | /** |
| 413 | * @tc.name: ShowPreviewMenu_001 | 445 | * @tc.name: ShowPreviewMenu_001 |
| 414 | * @tc.desc: ShowPreviewMenu. | 446 | * @tc.desc: ShowPreviewMenu. |


🤖 AI 代码检视意见(回复本评论可解决检视意见,点击被检视代码行左侧的小头像可收起检视意见)
🟠 潜在的并发数据竞态
位置:
L1186-L1188| 严重程度: High❓ 问题描述
代码直接读取成员变量
selectPopupMenuShowing_而未使用内存屏障或原子操作。在典型的Web组件架构中,Web内核(渲染进程/线程)通常通过回调通知UI线程更新状态。如果selectPopupMenuShowing_是在Web内核线程中被设置,而在此处(通常在UI线程)被读取,这将构成C++内存模型下的数据竞争,导致未定义行为或读取到陈旧值。💡 修复建议
确保
selectPopupMenuShowing_的声明和访问是线程安全的。如果该变量可能被多线程访问,请将其声明为std::atomic<bool>或者在读写操作时使用互斥锁保护。此外,建议添加断言确保该方法在预期的线程(UI线程)上执行。// 在头文件中声明 std::atomic<bool> selectPopupMenuShowing_ {false}; // 或者确保单线程访问 CHECK_RUN_ON(UIThread); if (selectPopupMenuShowing_.load(std::memory_order_acquire)) { ... }