1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#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 we are the current |RenderFrameHost| frame then notify
// WebContentsObservers about the new 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 the navigation is not in the main frame or if we are a same document
// navigation then we should stop now.
if (!navigation_handle->IsInPrimaryMainFrame() ||
navigation_handle->IsSameDocument()) {
return;
}
// When Edge To Edge on Android is enabled it needs the messaging sent to
// Java.
bool is_not_just_fullscreen =
base::FeatureList::IsEnabled(features::kDrawCutoutEdgeToEdge);
// If we finish a main frame navigation and the |WebDisplayMode| is
// fullscreen then we should make the main frame the current
// |RenderFrameHost|. Note that this is probably not correct; we do not check
// that the navigation completed successfully, nor do we check if the main
// frame is still IsRenderFrameLive().
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 we were the current |RenderFrameHost| then we should clear that.
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) {
// Send an update even when navigating to the same page or doing a reload.
// When we finish navigation we need to push the Safe Area back to the
// client to set env() variables for that frame so it can draw correctly.
SendSafeAreaToFrame(rfh, insets_);
}
return;
}
// If we had a previous frame then we should clear the insets on that frame.
if (current_rfh_)
SendSafeAreaToFrame(current_rfh_.get(), gfx::Insets());
// If the new RenderFrameHost is nullptr we should stop here and notify
// observers that the new viewport fit is kAuto (the default).
if (!rfh) {
current_rfh_ = nullptr;
web_contents_impl_->NotifyViewportFitChanged(
blink::mojom::ViewportFit::kAuto);
return;
}
// Update the |current_rfh_| with the new frame.
current_rfh_ = static_cast<RenderFrameHostImpl*>(rfh)->GetWeakPtr();
// Send the current safe area to the new frame.
SendSafeAreaToFrame(rfh, insets_);
// Notify the WebContentsObservers that the viewport fit value has changed.
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;
}
} // namespace content
|