diff --git a/blink/renderer/core/exported/web_view_impl.cc b/blink/renderer/core/exported/web_view_impl.cc index 0cf2eb089c7795d4343667cf49ab2dde08acc621..73e1dfac823b0ba82b32e8ed73f074569418884b 100644 --- a/blink/renderer/core/exported/web_view_impl.cc +++ b/blink/renderer/core/exported/web_view_impl.cc @@ -200,6 +200,10 @@ #include "content/public/common/content_switches.h" #endif +#ifdef OHOS_DISPLAY_CUTOUT +#include "third_party/blink/renderer/core/frame/display_cutout_client_impl.h" +#endif + // Get rid of WTF's pow define so we can use std::pow. #undef pow #include // for std::pow @@ -3857,6 +3861,12 @@ void WebViewImpl::PageScaleFactorChanged() { SetDeviceEmulationTransform(device_emulation_transform); } } + +#ifdef OHOS_DISPLAY_CUTOUT + if (auto* local_frame = DynamicTo(GetPage()->MainFrame())) { + DisplayCutoutClientImpl::UpdateSafeArea(local_frame); + } +#endif } void WebViewImpl::OutermostMainFrameScrollOffsetChanged() { diff --git a/blink/renderer/core/frame/display_cutout_client_impl.cc b/blink/renderer/core/frame/display_cutout_client_impl.cc index e72e483ac1fef87d033c9ed8aadb9359fb1d8305..9ad8d5640667e4b3ec3b8571d908bd89fff235ff 100644 --- a/blink/renderer/core/frame/display_cutout_client_impl.cc +++ b/blink/renderer/core/frame/display_cutout_client_impl.cc @@ -8,6 +8,11 @@ #include "third_party/blink/renderer/core/css/style_engine.h" #include "third_party/blink/renderer/core/frame/local_frame.h" +#ifdef OHOS_DISPLAY_CUTOUT +#include "third_party/blink/renderer/core/page/page.h" +#include "ui/gfx/geometry/insets.h" +#endif + namespace blink { DisplayCutoutClientImpl::DisplayCutoutClientImpl( @@ -24,12 +29,36 @@ void DisplayCutoutClientImpl::BindMojoReceiver( MakeGarbageCollected(frame, std::move(receiver)); } +#ifdef OHOS_DISPLAY_CUTOUT +void DisplayCutoutClientImpl::UpdateSafeArea(LocalFrame* frame) { + if (!frame || !frame->GetDocument() || !frame->GetPage()) return; + + DocumentStyleEnvironmentVariables& vars = + frame->GetDocument()->GetStyleEngine().EnsureEnvironmentVariables(); + gfx::Insets safe_area = frame->GetPage()->SafeAreaScaled(); + LOG(DEBUG) << __func__ << " " << safe_area.ToString();; + + vars.SetVariable(UADefinedVariable::kSafeAreaInsetTop, + StyleEnvironmentVariables::FormatPx(safe_area.top())); + vars.SetVariable(UADefinedVariable::kSafeAreaInsetLeft, + StyleEnvironmentVariables::FormatPx(safe_area.left())); + vars.SetVariable(UADefinedVariable::kSafeAreaInsetBottom, + StyleEnvironmentVariables::FormatPx(safe_area.bottom())); + vars.SetVariable(UADefinedVariable::kSafeAreaInsetRight, + StyleEnvironmentVariables::FormatPx(safe_area.right())); +} +#endif + void DisplayCutoutClientImpl::SetSafeArea(const gfx::Insets& safe_area) { +#ifdef OHOS_DISPLAY_CUTOUT + if (frame_->GetPage()) { + frame_->GetPage()->SetSafeArea(safe_area); + } + DisplayCutoutClientImpl::UpdateSafeArea(frame_); +#else DocumentStyleEnvironmentVariables& vars = frame_->GetDocument()->GetStyleEngine().EnsureEnvironmentVariables(); -#ifdef OHOS_DISPLAY_CUTOUT - LOG(INFO) << __func__ << " " << safe_area.ToString(); -#endif + vars.SetVariable(UADefinedVariable::kSafeAreaInsetTop, StyleEnvironmentVariables::FormatPx(safe_area.top())); vars.SetVariable(UADefinedVariable::kSafeAreaInsetLeft, @@ -38,6 +67,7 @@ void DisplayCutoutClientImpl::SetSafeArea(const gfx::Insets& safe_area) { StyleEnvironmentVariables::FormatPx(safe_area.bottom())); vars.SetVariable(UADefinedVariable::kSafeAreaInsetRight, StyleEnvironmentVariables::FormatPx(safe_area.right())); +#endif } void DisplayCutoutClientImpl::Trace(Visitor* visitor) const { diff --git a/blink/renderer/core/frame/display_cutout_client_impl.h b/blink/renderer/core/frame/display_cutout_client_impl.h index 2549f6ce8fe87364b02d673ad4d2253989d6df37..ad733e464b8edca388e0d45e7374ea54414d68ca 100644 --- a/blink/renderer/core/frame/display_cutout_client_impl.h +++ b/blink/renderer/core/frame/display_cutout_client_impl.h @@ -37,6 +37,10 @@ class CORE_EXPORT DisplayCutoutClientImpl final void Trace(Visitor*) const; +#ifdef OHOS_DISPLAY_CUTOUT + static void UpdateSafeArea(LocalFrame* frame); +#endif + private: Member frame_; diff --git a/blink/renderer/core/page/page.cc b/blink/renderer/core/page/page.cc index 766ad13e9a7b49e25168ae46d088cd99ecb22fd1..efad5155b5d229306e489af09dabc89c1737ef6d 100644 --- a/blink/renderer/core/page/page.cc +++ b/blink/renderer/core/page/page.cc @@ -1145,6 +1145,15 @@ void Page::UpdateLifecycle(LocalFrame& root, } } +#ifdef OHOS_DISPLAY_CUTOUT +gfx::Insets Page::SafeAreaScaled() const { + if (PageScaleFactor() == 0.0f) { + return safe_area_; + } + return gfx::ScaleToFlooredInsets(safe_area_, 1 / PageScaleFactor()); +} +#endif + template class CORE_TEMPLATE_EXPORT Supplement; const char InternalSettingsPageSupplementBase::kSupplementName[] = diff --git a/blink/renderer/core/page/page.h b/blink/renderer/core/page/page.h index 577187aafcd96a3f044eb041b7f253821da28f63..1b7b56ca4e79ffe1eb0a2126726626fac8432ef5 100644 --- a/blink/renderer/core/page/page.h +++ b/blink/renderer/core/page/page.h @@ -61,6 +61,10 @@ #include "third_party/blink/renderer/platform/wtf/forward.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" +#ifdef OHOS_DISPLAY_CUTOUT +#include "ui/gfx/geometry/insets.h" +#endif + namespace cc { class AnimationHost; } @@ -424,6 +428,11 @@ class CORE_EXPORT Page final : public GarbageCollected, return *v8_compile_hints_; } +#ifdef OHOS_DISPLAY_CUTOUT + gfx::Insets SafeAreaScaled() const; + void SetSafeArea(gfx::Insets safe_area) { safe_area_ = safe_area; } +#endif + private: friend class ScopedPagePauser; @@ -567,6 +576,10 @@ class CORE_EXPORT Page final : public GarbageCollected, // browser side FrameTree has the FrameTree::Type of kFencedFrame. bool is_fenced_frame_tree_ = false; +#ifdef OHOS_DISPLAY_CUTOUT + gfx::Insets safe_area_; +#endif + // This tracks the mode that the fenced frame is set to. blink::FencedFrame::DeprecatedFencedFrameMode fenced_frame_mode_ = blink::FencedFrame::DeprecatedFencedFrameMode::kDefault;