diff --git a/frameworks/bridge/declarative_frontend/jsview/js_web.cpp b/frameworks/bridge/declarative_frontend/jsview/js_web.cpp index d470886b946a9200c8c2a6d93db4d796502b2c3d..f7f4c1af6a03cd1d0062ddecba5521b5deb6ab7f 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_web.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_web.cpp @@ -3931,9 +3931,10 @@ void JSWeb::BackgroundColor(const JSCallbackInfo& info) } Color backgroundColor; if (!ParseJsColor(info[0], backgroundColor)) { - backgroundColor = WebModel::GetInstance()->GetDefaultBackgroundColor(); + WebModel::GetInstance()->SetDefaultBackgroundColor(); + } else { + WebModel::GetInstance()->SetBackgroundColor(backgroundColor); } - WebModel::GetInstance()->SetBackgroundColor(backgroundColor); } void JSWeb::InitialScale(float scale) diff --git a/frameworks/core/components_ng/pattern/web/cross_platform/web_pattern.cpp b/frameworks/core/components_ng/pattern/web/cross_platform/web_pattern.cpp index 3e689474c15d1c9382caa2c08d53a22fc7f60797..3617d6ce131da857f41c4bb01d931297bdc02aa1 100644 --- a/frameworks/core/components_ng/pattern/web/cross_platform/web_pattern.cpp +++ b/frameworks/core/components_ng/pattern/web/cross_platform/web_pattern.cpp @@ -1426,4 +1426,9 @@ void WebPattern::OnEnableFollowSystemFontWeightUpdate(bool value) { // cross platform is not support now; } + +void WebPattern::SetDefaultBackgroundColor() +{ + // cross platform is not support now; +} } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/web/cross_platform/web_pattern.h b/frameworks/core/components_ng/pattern/web/cross_platform/web_pattern.h index c80f3c7ffae8fc46ccf2b339a57423599af07a15..e7d36985cf42719116180e550ae6deccfec3636a 100644 --- a/frameworks/core/components_ng/pattern/web/cross_platform/web_pattern.h +++ b/frameworks/core/components_ng/pattern/web/cross_platform/web_pattern.h @@ -503,7 +503,7 @@ public: const ScriptItemsByOrder& scriptItemsByOrder); void OnWebMediaAVSessionEnabledUpdate(bool enable); - + void SetDefaultBackgroundColor(); private: void RegistVirtualKeyBoardListener(); bool ProcessVirtualKeyBoard(int32_t width, int32_t height, double keyboard); @@ -688,6 +688,7 @@ private: int32_t rootLayerHeight_ = 0; bool richTextInit_ = false; ACE_DISALLOW_COPY_AND_MOVE(WebPattern); + bool needSetDefaultBackgroundColor_ = false; }; } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/web/web_model.h b/frameworks/core/components_ng/pattern/web/web_model.h index 0150754fd88fc07c622ff0fbce7688639e1b0b29..b82f520f6adcd21d9b492be4b1a339495de1d0c6 100644 --- a/frameworks/core/components_ng/pattern/web/web_model.h +++ b/frameworks/core/components_ng/pattern/web/web_model.h @@ -208,6 +208,7 @@ public: virtual void SetEnableDataDetector(bool isEnabled) {}; virtual void SetDataDetectorConfig(const TextDetectConfig& config) {}; virtual void SetEnableFollowSystemFontWeight(bool enableFollowSystemFontWeight) {}; + virtual void SetDefaultBackgroundColor() {}; private: static std::unique_ptr instance_; static std::mutex mutex_; diff --git a/frameworks/core/components_ng/pattern/web/web_model_ng.cpp b/frameworks/core/components_ng/pattern/web/web_model_ng.cpp index 81b38692379f9669ea412b50bc882f59977daf85..ed2bf8c031390782bb2964698191a492e7b95342 100644 --- a/frameworks/core/components_ng/pattern/web/web_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/web/web_model_ng.cpp @@ -709,6 +709,13 @@ void WebModelNG::SetBackgroundColor(Color backgroundColor) webPattern->UpdateBackgroundColor(backgroundColor.GetValue()); } +void WebModelNG::SetDefaultBackgroundColor() +{ + auto webPattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern(); + CHECK_NULL_VOID(webPattern); + webPattern->SetDefaultBackgroundColor(); +} + void WebModelNG::InitialScale(float scale) { auto webPattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern(); diff --git a/frameworks/core/components_ng/pattern/web/web_model_ng.h b/frameworks/core/components_ng/pattern/web/web_model_ng.h index b339d777b1c465f5634e7215eeb413382b96fc48..5f6cfb48dbad053c0dde1e5d0d976b5aa2ea11e9 100644 --- a/frameworks/core/components_ng/pattern/web/web_model_ng.h +++ b/frameworks/core/components_ng/pattern/web/web_model_ng.h @@ -121,6 +121,7 @@ public: void SetPermissionRequestEventId(std::function&& jsCallback) override; void SetScreenCaptureRequestEventId(std::function&& jsCallback) override; void SetBackgroundColor(Color backgroundColor) override; + void SetDefaultBackgroundColor() override; void InitialScale(float scale) override; void SetSearchResultReceiveEventId(std::function&& jsCallback) override; void SetWebDebuggingAccessEnabled(bool isWebDebuggingAccessEnabled) override; diff --git a/frameworks/core/components_ng/pattern/web/web_pattern.cpp b/frameworks/core/components_ng/pattern/web/web_pattern.cpp index ee1f7ab7998af5aaf26ba5c0a4367ad7309a830e..91642d080ea32494513234099905f62e83dd6850 100644 --- a/frameworks/core/components_ng/pattern/web/web_pattern.cpp +++ b/frameworks/core/components_ng/pattern/web/web_pattern.cpp @@ -2917,6 +2917,7 @@ void WebPattern::OnPinchSmoothModeEnabledUpdate(bool value) void WebPattern::OnBackgroundColorUpdate(int32_t value) { + needSetDefaultBackgroundColor_ = false; UpdateBackgroundColorRightNow(value); if (delegate_) { delegate_->UpdateBackgroundColor(value); @@ -3272,8 +3273,8 @@ void WebPattern::OnModifyDone() delegate_->SetEnhanceSurfaceFlag(isEnhanceSurface_); delegate_->SetPopup(isPopup_); delegate_->SetParentNWebId(parentNWebId_); - delegate_->SetBackgroundColor(GetBackgroundColorValue( - static_cast(renderContext->GetBackgroundColor().value_or(Color::WHITE).GetValue()))); + delegate_->SetBackgroundColor(GetBackgroundColorValue(static_cast( + renderContext->GetBackgroundColor().value_or(GetDefaultBackgroundColor()).GetValue()))); if (isEnhanceSurface_) { auto drawSize = Size(1, 1); delegate_->SetDrawSize(drawSize); @@ -3334,8 +3335,8 @@ void WebPattern::OnModifyDone() bool isApiGteTwelve = AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE); - delegate_->UpdateBackgroundColor(GetBackgroundColorValue( - static_cast(renderContext->GetBackgroundColor().value_or(Color::WHITE).GetValue()))); + delegate_->UpdateBackgroundColor(GetBackgroundColorValue(static_cast( + renderContext->GetBackgroundColor().value_or(GetDefaultBackgroundColor()).GetValue()))); delegate_->UpdateJavaScriptEnabled(GetJsEnabledValue(true)); delegate_->UpdateBlockNetworkImage(!GetOnLineImageAccessEnabledValue(true)); delegate_->UpdateLoadsImagesAutomatically(GetImageAccessEnabledValue(true)); @@ -3418,8 +3419,11 @@ void WebPattern::OnModifyDone() } } - if (!GetBackgroundColor()) { - UpdateBackgroundColorRightNow(GetDefaultBackgroundColor().GetValue()); + // Set the default background color when the component did not set backgroundColor() + // or needSetDefaultBackgroundColor_ is true. + if (!renderContext->GetBackgroundColor() || needSetDefaultBackgroundColor_) { + UpdateBackgroundColor(GetDefaultBackgroundColor().GetValue()); + needSetDefaultBackgroundColor_ = true; } // Initialize events such as keyboard, focus, etc. @@ -7549,4 +7553,9 @@ bool WebPattern::UpdateKeyboardSafeArea(bool hideOrClose, double height) return true; } +void WebPattern::SetDefaultBackgroundColor() +{ + needSetDefaultBackgroundColor_ = true; +} + } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/web/web_pattern.h b/frameworks/core/components_ng/pattern/web/web_pattern.h index 503701c46061d577a8e94bb10d00a688dbb6ee50..fe249cd658ece2bb8b2614cd93e56a4f724d715b 100644 --- a/frameworks/core/components_ng/pattern/web/web_pattern.h +++ b/frameworks/core/components_ng/pattern/web/web_pattern.h @@ -789,6 +789,7 @@ public: void InitDataDetector(); void CloseDataDetectorMenu(); + void SetDefaultBackgroundColor(); private: friend class WebContextSelectOverlay; friend class WebSelectOverlay; @@ -1265,6 +1266,7 @@ private: bool isRotating_ {false}; int32_t rotationEndCallbackId_ = 0; + bool needSetDefaultBackgroundColor_ = false; protected: OnCreateMenuCallback onCreateMenuCallback_; OnMenuItemClickCallback onMenuItemClick_; diff --git a/test/unittest/core/pattern/web/web_model_test_ng.cpp b/test/unittest/core/pattern/web/web_model_test_ng.cpp index bbd82cf80be3afd69020ec56b10bb23e4494cb91..b08c6769da7271053519ad82f91fe6f905409b8d 100644 --- a/test/unittest/core/pattern/web/web_model_test_ng.cpp +++ b/test/unittest/core/pattern/web/web_model_test_ng.cpp @@ -3312,4 +3312,26 @@ HWTEST_F(WebModelTestNg, SetMediaOptions001, TestSize.Level1) EXPECT_EQ(webPattern->GetOrCreateWebProperty()->CheckAudioExclusive(true), true); #endif } + +/** + * @tc.name: SetDefaultBackgroundColor001 + * @tc.desc: Test Test web_model_ng.cpp + * @tc.type: FUNC + */ +HWTEST_F(WebModelTestNg, SetDefaultBackgroundColor001, TestSize.Level1) +{ +#ifdef OHOS_STANDARD_SYSTEM + auto* stack = ViewStackProcessor::GetInstance(); + auto nodeId = stack->ClaimNodeId(); + auto frameNode = + FrameNode::GetOrCreateFrameNode(V2::WEB_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr(); }); + ASSERT_NE(frameNode, nullptr); + stack->Push(frameNode); + auto webPattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern(); + + WebModelNG webModelNG; + webModelNG.SetDefaultBackgroundColor(); + EXPECT_EQ(webPattern->needSetDefaultBackgroundColor_, true); +#endif +} } // namespace OHOS::Ace::NG diff --git a/test/unittest/core/pattern/web/web_pattern_test_ng.cpp b/test/unittest/core/pattern/web/web_pattern_test_ng.cpp index 25e3abb0a4eadb49d224be5d0320d8277a4d45d7..a71753d30ffa9a8b1cd711c3a87feaab3b588c2d 100755 --- a/test/unittest/core/pattern/web/web_pattern_test_ng.cpp +++ b/test/unittest/core/pattern/web/web_pattern_test_ng.cpp @@ -2714,4 +2714,201 @@ HWTEST_F(WebPatternTestNg, InitDataDetector_001, TestSize.Level1) ASSERT_EQ(ret, false); #endif } -} // namespace OHOS::Ace::NG \ No newline at end of file + +/** + * @tc.name: SetDefaultBackgroundColor001 + * @tc.desc: SetDefaultBackgroundColor. + * @tc.type: FUNC + */ +HWTEST_F(WebPatternTestNg, SetDefaultBackgroundColor001, TestSize.Level1) +{ +#ifdef OHOS_STANDARD_SYSTEM + auto* stack = ViewStackProcessor::GetInstance(); + ASSERT_NE(stack, nullptr); + auto nodeId = stack->ClaimNodeId(); + auto frameNode = + FrameNode::GetOrCreateFrameNode( + V2::WEB_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr(); }); + stack->Push(frameNode); + auto webPattern = frameNode->GetPattern(); + ASSERT_NE(webPattern, nullptr); + webPattern->SetDefaultBackgroundColor(); + EXPECT_EQ(webPattern->needSetDefaultBackgroundColor_, true); + + webPattern->OnBackgroundColorUpdate(Color::RED.GetValue()); + EXPECT_EQ(webPattern->needSetDefaultBackgroundColor_, false); +#endif +} + +/** + * @tc.name: DarkModeBackgroundColor001 + * @tc.desc: Test DarkModeBackgroundColor001. + * @tc.type: FUNC + */ +HWTEST_F(WebPatternTestNg, DarkModeBackgroundColor001, TestSize.Level1) +{ +#ifdef OHOS_STANDARD_SYSTEM + auto* stack = ViewStackProcessor::GetInstance(); + ASSERT_NE(stack, nullptr); + auto nodeId = stack->ClaimNodeId(); + auto frameNode = + FrameNode::GetOrCreateFrameNode( + V2::WEB_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr(); }); + stack->Push(frameNode); + auto webPattern = frameNode->GetPattern(); + ASSERT_NE(webPattern, nullptr); + webPattern->OnModifyDone(); + ASSERT_NE(webPattern->delegate_, nullptr); + ASSERT_NE(webPattern->GetHost()->GetRenderContext(), nullptr); + EXPECT_EQ(webPattern->needSetDefaultBackgroundColor_, false); + EXPECT_FALSE(webPattern->GetHost()->GetRenderContext()->GetBackgroundColor()); + + // Test that the default background color is based on darkMode() and forceDarkAccess() + // when not set backgroundColor(). + webPattern->UpdateDarkMode(WebDarkMode::On); + webPattern->UpdateForceDarkAccess(true); + webPattern->OnModifyDone(); + EXPECT_EQ(webPattern->needSetDefaultBackgroundColor_, true); + EXPECT_EQ(webPattern->GetHost()->GetRenderContext()->GetBackgroundColor(), Color::BLACK); + + webPattern->UpdateForceDarkAccess(false); + webPattern->OnModifyDone(); + EXPECT_EQ(webPattern->needSetDefaultBackgroundColor_, true); + EXPECT_EQ(webPattern->GetHost()->GetRenderContext()->GetBackgroundColor(), Color::WHITE); + + webPattern->UpdateDarkMode(WebDarkMode::Off); + webPattern->UpdateForceDarkAccess(true); + webPattern->OnModifyDone(); + EXPECT_EQ(webPattern->needSetDefaultBackgroundColor_, true); + EXPECT_EQ(webPattern->GetHost()->GetRenderContext()->GetBackgroundColor(), Color::WHITE); + + webPattern->UpdateBackgroundColor(Color::RED.GetValue()); + webPattern->OnModifyDone(); + EXPECT_EQ(webPattern->needSetDefaultBackgroundColor_, false); + EXPECT_EQ(webPattern->GetHost()->GetRenderContext()->GetBackgroundColor(), Color::RED); + + webPattern->SetDefaultBackgroundColor(); + webPattern->OnModifyDone(); + EXPECT_EQ(webPattern->needSetDefaultBackgroundColor_, true); + EXPECT_EQ(webPattern->GetHost()->GetRenderContext()->GetBackgroundColor(), Color::WHITE); + + webPattern->UpdateDarkMode(WebDarkMode::On); + webPattern->OnModifyDone(); + EXPECT_EQ(webPattern->needSetDefaultBackgroundColor_, true); + EXPECT_EQ(webPattern->GetHost()->GetRenderContext()->GetBackgroundColor(), Color::BLACK); + + webPattern->UpdateBackgroundColor(Color::RED.GetValue()); + webPattern->OnModifyDone(); + EXPECT_EQ(webPattern->needSetDefaultBackgroundColor_, false); + EXPECT_EQ(webPattern->GetHost()->GetRenderContext()->GetBackgroundColor(), Color::RED); +#endif +} + +/** + * @tc.name: DarkModeBackgroundColor002 + * @tc.desc: Test DarkModeBackgroundColor002. + * @tc.type: FUNC + */ +HWTEST_F(WebPatternTestNg, DarkModeBackgroundColor002, TestSize.Level1) +{ +#ifdef OHOS_STANDARD_SYSTEM + auto* stack = ViewStackProcessor::GetInstance(); + ASSERT_NE(stack, nullptr); + auto nodeId = stack->ClaimNodeId(); + auto frameNode = + FrameNode::GetOrCreateFrameNode( + V2::WEB_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr(); }); + stack->Push(frameNode); + auto webPattern = frameNode->GetPattern(); + ASSERT_NE(webPattern, nullptr); + webPattern->OnModifyDone(); + ASSERT_NE(webPattern->delegate_, nullptr); + ASSERT_NE(webPattern->GetHost()->GetRenderContext(), nullptr); + EXPECT_EQ(webPattern->needSetDefaultBackgroundColor_, false); + EXPECT_FALSE(webPattern->GetHost()->GetRenderContext()->GetBackgroundColor()); + + // Tests that when the backgroundColor is set to null or undefined, + // it resets the backgroundColor to the default color. + webPattern->SetDefaultBackgroundColor(); + webPattern->UpdateDarkMode(WebDarkMode::On); + webPattern->UpdateForceDarkAccess(true); + webPattern->OnModifyDone(); + EXPECT_EQ(webPattern->needSetDefaultBackgroundColor_, true); + EXPECT_EQ(webPattern->GetHost()->GetRenderContext()->GetBackgroundColor(), Color::BLACK); + + webPattern->UpdateBackgroundColor(Color::RED.GetValue()); + webPattern->OnModifyDone(); + EXPECT_EQ(webPattern->needSetDefaultBackgroundColor_, false); + EXPECT_EQ(webPattern->GetHost()->GetRenderContext()->GetBackgroundColor(), Color::RED); + + webPattern->UpdateForceDarkAccess(false); + webPattern->OnModifyDone(); + EXPECT_EQ(webPattern->needSetDefaultBackgroundColor_, false); + EXPECT_EQ(webPattern->GetHost()->GetRenderContext()->GetBackgroundColor(), Color::RED); + + webPattern->SetDefaultBackgroundColor(); + webPattern->OnModifyDone(); + EXPECT_EQ(webPattern->needSetDefaultBackgroundColor_, true); + EXPECT_EQ(webPattern->GetHost()->GetRenderContext()->GetBackgroundColor(), Color::WHITE); + + webPattern->UpdateForceDarkAccess(true); + webPattern->OnModifyDone(); + EXPECT_EQ(webPattern->needSetDefaultBackgroundColor_, true); + EXPECT_EQ(webPattern->GetHost()->GetRenderContext()->GetBackgroundColor(), Color::BLACK); + + webPattern->UpdateBackgroundColor(Color::BLUE.GetValue()); + webPattern->OnModifyDone(); + EXPECT_EQ(webPattern->needSetDefaultBackgroundColor_, false); + EXPECT_EQ(webPattern->GetHost()->GetRenderContext()->GetBackgroundColor(), Color::BLUE); +#endif +} + +/** + * @tc.name: DarkModeBackgroundColor003 + * @tc.desc: Test DarkModeBackgroundColor003. + * @tc.type: FUNC + */ +HWTEST_F(WebPatternTestNg, DarkModeBackgroundColor003, TestSize.Level1) +{ +#ifdef OHOS_STANDARD_SYSTEM + auto* stack = ViewStackProcessor::GetInstance(); + ASSERT_NE(stack, nullptr); + auto nodeId = stack->ClaimNodeId(); + auto frameNode = + FrameNode::GetOrCreateFrameNode( + V2::WEB_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr(); }); + stack->Push(frameNode); + auto webPattern = frameNode->GetPattern(); + ASSERT_NE(webPattern, nullptr); + webPattern->OnModifyDone(); + ASSERT_NE(webPattern->delegate_, nullptr); + ASSERT_NE(webPattern->GetHost()->GetRenderContext(), nullptr); + EXPECT_EQ(webPattern->needSetDefaultBackgroundColor_, false); + EXPECT_FALSE(webPattern->GetHost()->GetRenderContext()->GetBackgroundColor()); + + // In the case of richText, tests that when renderContext sets the backgroundColor, GetBackgroundColor() is null, + // the defaultBackgroundColor will not be set. + webPattern->GetHost()->GetRenderContext()->UpdateBackgroundColor(Color::BLUE); + webPattern->UpdateDarkMode(WebDarkMode::Off); + webPattern->UpdateForceDarkAccess(true); + webPattern->OnModifyDone(); + EXPECT_EQ(webPattern->needSetDefaultBackgroundColor_, false); + EXPECT_EQ(webPattern->GetHost()->GetRenderContext()->GetBackgroundColor(), Color::BLUE); + + webPattern->OnBackgroundColorUpdate(Color::RED.GetValue()); + webPattern->OnModifyDone(); + EXPECT_EQ(webPattern->needSetDefaultBackgroundColor_, false); + EXPECT_EQ(webPattern->GetHost()->GetRenderContext()->GetBackgroundColor(), Color::RED); + + webPattern->SetDefaultBackgroundColor(); + webPattern->OnModifyDone(); + EXPECT_EQ(webPattern->needSetDefaultBackgroundColor_, true); + EXPECT_EQ(webPattern->GetHost()->GetRenderContext()->GetBackgroundColor(), Color::WHITE); + + webPattern->UpdateDarkMode(WebDarkMode::On); + webPattern->OnModifyDone(); + EXPECT_EQ(webPattern->needSetDefaultBackgroundColor_, true); + EXPECT_EQ(webPattern->GetHost()->GetRenderContext()->GetBackgroundColor(), Color::BLACK); +#endif +} +} // namespace OHOS::Ace::NG