#include "content/browser/display_cutout/display_cutout_host_impl.h"
#include "content/browser/display_cutout/display_cutout_constants.h"
#include "content/browser/display_cutout/safe_area_insets_host.h"
#include "content/browser/renderer_host/render_frame_host_impl.h"
#include "content/browser/web_contents/web_contents_impl.h"
#include "content/public/browser/navigation_handle.h"
#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
namespace content {
DisplayCutoutHostImpl::DisplayCutoutHostImpl(WebContentsImpl* web_contents)
: SafeAreaInsetsHost(web_contents) {}
DisplayCutoutHostImpl::~DisplayCutoutHostImpl() = default;
void DisplayCutoutHostImpl::ViewportFitChangedForFrame(
RenderFrameHost* rfh,
blink::mojom::ViewportFit value) {
if (GetValueOrDefault(rfh) == value)
return;
values_[rfh] = value;
if (current_rfh_.get() == rfh)
web_contents_impl_->NotifyViewportFitChanged(value);
}
void DisplayCutoutHostImpl::DidAcquireFullscreen(RenderFrameHost* rfh) {
SetCurrentRenderFrameHost(rfh);
}
void DisplayCutoutHostImpl::DidExitFullscreen() {
SetCurrentRenderFrameHost(nullptr);
}
void DisplayCutoutHostImpl::DidFinishNavigation(
NavigationHandle* navigation_handle) {
if (!navigation_handle->IsInPrimaryMainFrame() ||
navigation_handle->IsSameDocument()) {
return;
}
bool is_not_just_fullscreen =
base::FeatureList::IsEnabled(features::kDrawCutoutEdgeToEdge);
blink::mojom::DisplayMode mode = web_contents_impl_->GetDisplayMode();
if (is_not_just_fullscreen ||
mode == blink::mojom::DisplayMode::kFullscreen) {
SetCurrentRenderFrameHost(web_contents_impl_->GetPrimaryMainFrame());
}
}
void DisplayCutoutHostImpl::RenderFrameDeleted(RenderFrameHost* rfh) {
values_.erase(rfh);
if (current_rfh_.get() == rfh)
SetCurrentRenderFrameHost(nullptr);
}
void DisplayCutoutHostImpl::RenderFrameCreated(RenderFrameHost* rfh) {
ViewportFitChangedForFrame(rfh, blink::mojom::ViewportFit::kAuto);
}
void DisplayCutoutHostImpl::SetDisplayCutoutSafeArea(gfx::Insets insets) {
insets_ = insets;
if (current_rfh_)
SendSafeAreaToFrame(current_rfh_.get(), insets);
}
void DisplayCutoutHostImpl::SetCurrentRenderFrameHost(RenderFrameHost* rfh) {
if (current_rfh_.get() == rfh) {
if (rfh) {
SendSafeAreaToFrame(rfh, insets_);
}
return;
}
if (current_rfh_)
SendSafeAreaToFrame(current_rfh_.get(), gfx::Insets());
if (!rfh) {
current_rfh_ = nullptr;
web_contents_impl_->NotifyViewportFitChanged(
blink::mojom::ViewportFit::kAuto);
return;
}
current_rfh_ = static_cast<RenderFrameHostImpl*>(rfh)->GetWeakPtr();
SendSafeAreaToFrame(rfh, insets_);
web_contents_impl_->NotifyViewportFitChanged(GetValueOrDefault(rfh));
}
blink::mojom::ViewportFit DisplayCutoutHostImpl::GetValueOrDefault(
RenderFrameHost* rfh) const {
auto value = values_.find(rfh);
if (value != values_.end())
return value->second;
return blink::mojom::ViewportFit::kAuto;
}
}