Skip to content

Commit d34cc44

Browse files
DragonDragonDDDjianliang00
authored andcommitted
[BugFix][RadonFiber] Fix dynamic update transition consumption behavior via env flag
Introduce a new LynxEnv flag to gate the dynamic update transition consumption behavior and align non-fiber paths with expected CSS transition semantics. Key changes: - Add FIX_DYNAMIC_UPDATE_TRANSITION_CONSUME_BUG env key and expose FixDynamicUpdateTransitionConsumeBug() in LynxEnv and ElementManager. - Update FiberElement::UpdateDynamicElementStyleRecursively to keep the old behavior for fiber arch, but gate the early-return transition consumption logic on the new fix flag for non-fiber arch. - Extend FiberElement tests to cover dynamic updates with and without transitions, and to verify the switchable behavior of the new fix flag. TEST: Add and update FiberElement dynamic update transition tests AutoSubmit: true AutoLand: release/3.7, release/3.6 issue: m-6845461642
1 parent c9e59f0 commit d34cc44

6 files changed

Lines changed: 151 additions & 3 deletions

File tree

core/renderer/dom/element_manager.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ ElementManager::ElementManager(
9191
LynxEnv::GetInstance().EnableFiberElementMemoryReport();
9292
fix_radon_inline_convert_bug_ =
9393
LynxEnv::GetInstance().FixRadonInlineConvertBug();
94+
fix_dynamic_update_transition_consume_bug_ =
95+
LynxEnv::GetInstance().FixDynamicUpdateTransitionConsumeBug();
9496
fix_new_fixed_removal_bug_ = LynxEnv::GetInstance().FixNewFixedRemovalBug();
9597
disable_list_callback_if_detached_ =
9698
LynxEnv::GetInstance().DisableListCallbackIfDetached();

core/renderer/dom/element_manager.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1114,6 +1114,9 @@ class ElementManager : public ElementContextDelegate,
11141114
bool FixRadonInlineConvertBug() const {
11151115
return fix_radon_inline_convert_bug_;
11161116
}
1117+
bool FixDynamicUpdateTransitionConsumeBug() const {
1118+
return fix_dynamic_update_transition_consume_bug_;
1119+
}
11171120

11181121
bool FixListCallbackLeakFlag() const { return fix_list_callback_leak_flag_; }
11191122
bool FixNewFixedRemovalBug() const { return fix_new_fixed_removal_bug_; }
@@ -1303,6 +1306,7 @@ class ElementManager : public ElementContextDelegate,
13031306
bool dom_tree_enabled_{true};
13041307
bool fix_new_animator_flush_bug_{true};
13051308
bool fix_radon_inline_convert_bug_{true};
1309+
bool fix_dynamic_update_transition_consume_bug_{true};
13061310
bool fix_new_fixed_removal_bug_{true};
13071311
bool css_fragment_parsing_tasm_worker_thread_{false};
13081312
bool enable_level_order_traversing_{false};

core/renderer/dom/fiber/fiber_element.cc

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3956,9 +3956,20 @@ void FiberElement::UpdateDynamicElementStyleRecursively(uint32_t style,
39563956
return true;
39573957
}
39583958

3959-
if (css_transition_manager_ &&
3960-
css_transition_manager_->NeedsTransition(id)) {
3961-
return true;
3959+
if (css_transition_manager_) {
3960+
if (IsFiberArch()) {
3961+
if (css_transition_manager_->NeedsTransition(id)) {
3962+
return true;
3963+
}
3964+
} else {
3965+
const bool skip_transition =
3966+
element_manager_ &&
3967+
element_manager_->FixDynamicUpdateTransitionConsumeBug();
3968+
if (!skip_transition &&
3969+
css_transition_manager_->NeedsTransition(id)) {
3970+
return true;
3971+
}
3972+
}
39623973
}
39633974

39643975
auto new_flags = DynamicCSSStylesManager::GetValueFlags(

core/renderer/dom/fiber/fiber_element_unittest.cc

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <tuple>
1414

1515
#include "base/include/auto_reset.h"
16+
#include "core/animation/css_transition_manager.h"
1617
#include "core/base/threading/task_runner_manufactor.h"
1718
#include "core/base/threading/vsync_monitor.h"
1819
#include "core/renderer/css/computed_css_style_css_text_helper.h"
@@ -5517,6 +5518,126 @@ TEST_P(FiberElementTest, DynamicViewportUpdate) {
55175518
CSSValue(0.f, CSSValuePattern::CALC), 1));
55185519
}
55195520

5521+
TEST_P(FiberElementTest,
5522+
DynamicViewportUpdate_SkipTransitionConsume_FiberArch) {
5523+
manager->UpdateViewport(100, SLMeasureModeDefinite, 600,
5524+
SLMeasureModeDefinite, false);
5525+
5526+
auto page = manager->CreateFiberPage("page", 11);
5527+
auto element = manager->CreateFiberView();
5528+
element->SetStyle(CSSPropertyID::kPropertyIDWidth, lepus::Value("50vh"));
5529+
5530+
page->InsertNode(element);
5531+
page->FlushActionsAsRoot();
5532+
5533+
element->css_transition_manager_ =
5534+
std::make_unique<animation::CSSTransitionManager>(element.get());
5535+
base::Vector<starlight::TransitionData> transition_data;
5536+
starlight::TransitionData data;
5537+
data.property = starlight::AnimationPropertyType::kWidth;
5538+
transition_data.emplace_back(data);
5539+
element->css_transition_manager_->setTransitionData(transition_data);
5540+
5541+
tasm_mediator.captured_ids_.clear();
5542+
tasm_mediator.captured_bundles_.clear();
5543+
manager->UpdateViewport(200, SLMeasureModeDefinite, 800,
5544+
SLMeasureModeDefinite, false);
5545+
EXPECT_FALSE(HasCaptureSignWithStyleKeyAndValuePattern(
5546+
element->impl_id(), CSSPropertyID::kPropertyIDWidth,
5547+
CSSValue(0.f, CSSValuePattern::VH), 1));
5548+
}
5549+
5550+
TEST_P(FiberElementTest,
5551+
DynamicViewportUpdate_SkipTransitionConsume_RadonArch_FlagOff) {
5552+
manager->UpdateViewport(100, SLMeasureModeDefinite, 600,
5553+
SLMeasureModeDefinite, false);
5554+
5555+
auto page = manager->CreateFiberPage("page", 11);
5556+
auto element = manager->CreateFiberView();
5557+
element->SetStyle(CSSPropertyID::kPropertyIDWidth, lepus::Value("50vh"));
5558+
element->arch_type_ = RadonArch;
5559+
manager->fix_dynamic_update_transition_consume_bug_ = false;
5560+
5561+
page->InsertNode(element);
5562+
page->FlushActionsAsRoot();
5563+
5564+
element->css_transition_manager_ =
5565+
std::make_unique<animation::CSSTransitionManager>(element.get());
5566+
base::Vector<starlight::TransitionData> transition_data;
5567+
starlight::TransitionData data;
5568+
data.property = starlight::AnimationPropertyType::kWidth;
5569+
transition_data.emplace_back(data);
5570+
element->css_transition_manager_->setTransitionData(transition_data);
5571+
5572+
tasm_mediator.captured_ids_.clear();
5573+
tasm_mediator.captured_bundles_.clear();
5574+
manager->UpdateViewport(200, SLMeasureModeDefinite, 800,
5575+
SLMeasureModeDefinite, false);
5576+
EXPECT_FALSE(HasCaptureSignWithStyleKeyAndValuePattern(
5577+
element->impl_id(), CSSPropertyID::kPropertyIDWidth,
5578+
CSSValue(0.f, CSSValuePattern::VH), 1));
5579+
}
5580+
5581+
TEST_P(FiberElementTest,
5582+
DynamicViewportUpdate_SkipTransitionConsume_RadonArch_FlagOn) {
5583+
manager->UpdateViewport(100, SLMeasureModeDefinite, 600,
5584+
SLMeasureModeDefinite, false);
5585+
5586+
auto page = manager->CreateFiberPage("page", 11);
5587+
auto element = manager->CreateFiberView();
5588+
element->SetStyle(CSSPropertyID::kPropertyIDWidth, lepus::Value("50vh"));
5589+
element->arch_type_ = RadonArch;
5590+
manager->fix_dynamic_update_transition_consume_bug_ = true;
5591+
5592+
page->InsertNode(element);
5593+
page->FlushActionsAsRoot();
5594+
5595+
element->css_transition_manager_ =
5596+
std::make_unique<animation::CSSTransitionManager>(element.get());
5597+
base::Vector<starlight::TransitionData> transition_data;
5598+
starlight::TransitionData data;
5599+
data.property = starlight::AnimationPropertyType::kWidth;
5600+
transition_data.emplace_back(data);
5601+
element->css_transition_manager_->setTransitionData(transition_data);
5602+
5603+
tasm_mediator.captured_ids_.clear();
5604+
tasm_mediator.captured_bundles_.clear();
5605+
manager->UpdateViewport(200, SLMeasureModeDefinite, 800,
5606+
SLMeasureModeDefinite, false);
5607+
EXPECT_TRUE(HasCaptureSignWithStyleKeyAndValuePattern(
5608+
element->impl_id(), CSSPropertyID::kPropertyIDWidth,
5609+
CSSValue(0.f, CSSValuePattern::VH), 1));
5610+
}
5611+
5612+
TEST_P(FiberElementTest,
5613+
DynamicViewportUpdate_SkipTransitionConsume_NoNeedTransition) {
5614+
manager->UpdateViewport(100, SLMeasureModeDefinite, 600,
5615+
SLMeasureModeDefinite, false);
5616+
5617+
auto page = manager->CreateFiberPage("page", 11);
5618+
auto element = manager->CreateFiberView();
5619+
element->SetStyle(CSSPropertyID::kPropertyIDWidth, lepus::Value("50vh"));
5620+
5621+
page->InsertNode(element);
5622+
page->FlushActionsAsRoot();
5623+
5624+
element->css_transition_manager_ =
5625+
std::make_unique<animation::CSSTransitionManager>(element.get());
5626+
base::Vector<starlight::TransitionData> transition_data;
5627+
starlight::TransitionData data;
5628+
data.property = starlight::AnimationPropertyType::kOpacity;
5629+
transition_data.emplace_back(data);
5630+
element->css_transition_manager_->setTransitionData(transition_data);
5631+
5632+
tasm_mediator.captured_ids_.clear();
5633+
tasm_mediator.captured_bundles_.clear();
5634+
manager->UpdateViewport(200, SLMeasureModeDefinite, 800,
5635+
SLMeasureModeDefinite, false);
5636+
EXPECT_TRUE(HasCaptureSignWithStyleKeyAndValuePattern(
5637+
element->impl_id(), CSSPropertyID::kPropertyIDWidth,
5638+
CSSValue(0.f, CSSValuePattern::VH), 1));
5639+
}
5640+
55205641
TEST_P(FiberElementTest, DynamicFontScaleUpdate) {
55215642
manager->UpdateViewport(100, SLMeasureModeDefinite, 600,
55225643
SLMeasureModeDefinite, false);

core/renderer/utils/lynx_env.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,12 @@ bool LynxEnv::FixRadonInlineConvertBug() {
586586
return fix_radon_inline_convert_bug;
587587
}
588588

589+
bool LynxEnv::FixDynamicUpdateTransitionConsumeBug() {
590+
static bool fix_dynamic_update_transition_consume_bug =
591+
GetBoolEnv(Key::FIX_DYNAMIC_UPDATE_TRANSITION_CONSUME_BUG, true);
592+
return fix_dynamic_update_transition_consume_bug;
593+
}
594+
589595
bool LynxEnv::EnableFetchAPIStreamingStandard() {
590596
return GetBoolEnv(Key::ENABLE_FETCH_API_STANDARD_STREAMING, false);
591597
}

core/renderer/utils/lynx_env.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ class LYNX_EXPORT_FOR_DEVTOOL LynxEnv {
134134
DISABLE_LIST_CALLBACK_IF_DETACHED,
135135
ENABLE_SHARE_CONTEXT_ICU,
136136
FIX_RADON_INLINE_CONVERT_BUG,
137+
FIX_DYNAMIC_UPDATE_TRANSITION_CONSUME_BUG,
137138
ENABLE_LIST_NEW_ARCHITECTURE,
138139
ENABLE_FETCH_API_STANDARD_STREAMING,
139140
// Please add new enum values above
@@ -276,6 +277,8 @@ class LYNX_EXPORT_FOR_DEVTOOL LynxEnv {
276277
{Key::ENABLE_UNIFY_FIXED_BEHAVIOR, "enable_unify_fixed_behavior"},
277278
{Key::ENABLE_SHARE_CONTEXT_ICU, "enable_share_context_icu"},
278279
{Key::FIX_RADON_INLINE_CONVERT_BUG, "fix_radon_inline_convert_bug"},
280+
{Key::FIX_DYNAMIC_UPDATE_TRANSITION_CONSUME_BUG,
281+
"fix_dynamic_update_transition_consume_bug"},
279282
{Key::FIX_LIST_CALLBACK_LEAK_BUG, "fix_list_callback_leak"},
280283
{Key::ENABLE_LIST_NEW_ARCHITECTURE, "enable_list_new_architecture"},
281284
{Key::ENABLE_FETCH_API_STANDARD_STREAMING,
@@ -432,6 +435,7 @@ class LYNX_EXPORT_FOR_DEVTOOL LynxEnv {
432435
bool EnableHarmonyNewImage();
433436
bool EnableUnifyFixedBehavior();
434437
bool FixRadonInlineConvertBug();
438+
bool FixDynamicUpdateTransitionConsumeBug();
435439
bool EnableFetchAPIStreamingStandard();
436440
bool FixNewFixedRemovalBug();
437441

0 commit comments

Comments
 (0)