0

[InputVizard] Make is_mobile_optimized part of CompositorFrameMetadata

As per current implementation Viz is notififed about whether a page
`is_mobile_optimized` when Renderer sends the frame metadata to Browser,
and then Browser forwards it to Viz. This currently doesn't work well
when Viz crashes and is setting up the data structures again as part of
startup after crash.

To resolve this we are making `is_mobile_optimized` a part of
CompositorFrameMetadata which helps us avoid the above mentioned problem
and no extra IPC need to be made from Browser to Viz for notifying about
change in `is_mobile_optimized`.

Bug: 402048251
Change-Id: Ib9f48dd5fd8a385ee749654651c87d8b93c6d7cf
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6519777
Reviewed-by: Jonathan Ross <jonross@chromium.org>
Reviewed-by: Antonio Sartori <antoniosartori@chromium.org>
Commit-Queue: Kartar Singh <kartarsingh@google.com>
Cr-Commit-Position: refs/heads/main@{#1459328}
This commit is contained in:
Kartar Singh
2025-05-13 03:15:32 -07:00
committed by Chromium LUCI CQ
parent bc0a76fc70
commit ccc23c7c16
15 changed files with 67 additions and 35 deletions

@ -2639,6 +2639,8 @@ viz::CompositorFrameMetadata LayerTreeHostImpl::MakeCompositorFrameMetadata() {
metadata.display_transform_hint = active_tree_->display_transform_hint();
metadata.is_mobile_optimized = IsMobileOptimized(active_tree_.get());
if (const gfx::DelegatedInkMetadata* delegated_ink_metadata_ptr =
active_tree_->delegated_ink_metadata()) {
std::unique_ptr<gfx::DelegatedInkMetadata> delegated_ink_metadata =

@ -62,11 +62,6 @@ interface RenderInputRouterDelegate {
// Viz needs this to do input handling on it's side.
StateOnTouchTransfer(TouchTransferState state);
// Notifies RenderInputRouter on the VizCompositor thread (corresponding to
// |frame_sink_id|), of changes to a page being mobile site optimized.
NotifySiteIsMobileOptimized(bool is_mobile_optimized,
viz.mojom.FrameSinkId frame_sink_id);
// Notifies RenderInputRouters corresponding to |frame_sink_ids| on the
// VizCompositor thread of changes to |force_enable_zoom| state for
// Accessibility.

@ -44,6 +44,7 @@ CompositorFrameMetadata::CompositorFrameMetadata(
top_controls_visible_height(other.top_controls_visible_height),
preferred_frame_interval(other.preferred_frame_interval),
display_transform_hint(other.display_transform_hint),
is_mobile_optimized(other.is_mobile_optimized),
transition_directives(other.transition_directives),
has_shared_element_resources(other.has_shared_element_resources),
screenshot_destination(other.screenshot_destination),

@ -184,6 +184,9 @@ class VIZ_COMMON_EXPORT CompositorFrameMetadata {
// applicable to frames of the root surface.
gfx::OverlayTransform display_transform_hint = gfx::OVERLAY_TRANSFORM_NONE;
// Please refer RenderFrameMetadata::is_mobile_optimized for detailed comment.
bool is_mobile_optimized = false;
// Contains the metadata required for drawing a delegated ink trail onto the
// end of a rendered ink stroke. This should only be present when two
// conditions are met:

@ -298,8 +298,9 @@ void CompositorFrameSinkSupport::OnSurfaceActivated(Surface* surface) {
if (pending_surfaces_.empty())
UpdateNeedsBeginFramesInternal();
for (const auto& directive :
surface->GetActiveFrameMetadata().transition_directives) {
const CompositorFrameMetadata& active_frame_metadata =
surface->GetActiveFrameMetadata();
for (const auto& directive : active_frame_metadata.transition_directives) {
ProcessCompositorFrameTransitionDirective(directive, surface);
}
@ -343,13 +344,18 @@ void CompositorFrameSinkSupport::OnSurfaceActivated(Surface* surface) {
MaybeEvictSurfaces();
// Update |device_scale_factor_| if it changes with latest activated surface.
float new_device_scale_factor =
surface->GetActiveFrameMetadata().device_scale_factor;
float new_device_scale_factor = active_frame_metadata.device_scale_factor;
if (device_scale_factor_ != new_device_scale_factor) {
frame_sink_manager_->OnFrameSinkDeviceScaleFactorChanged(
surface->surface_id().frame_sink_id(), new_device_scale_factor);
device_scale_factor_ = new_device_scale_factor;
}
if (is_mobile_optimized_ != active_frame_metadata.is_mobile_optimized) {
is_mobile_optimized_ = active_frame_metadata.is_mobile_optimized;
frame_sink_manager_->OnFrameSinkMobileOptimizedChanged(
frame_sink_id_, is_mobile_optimized_);
}
}
void CompositorFrameSinkSupport::OnSurfaceWillDraw(Surface* surface) {

@ -419,6 +419,8 @@ class VIZ_SERVICE_EXPORT CompositorFrameSinkSupport
// Default value is 1.0.
float device_scale_factor_ = 1.0;
bool is_mobile_optimized_ = false;
// By default, this is equivalent to |is_root_|, but may be overridden for
// testing. Generally, for non-roots, there must not be any CopyOutputRequests
// contained within submitted CompositorFrames. Otherwise, unprivileged

@ -854,6 +854,15 @@ void FrameSinkManagerImpl::OnFrameSinkDeviceScaleFactorChanged(
}
}
void FrameSinkManagerImpl::OnFrameSinkMobileOptimizedChanged(
const FrameSinkId& frame_sink_id,
bool is_mobile_optimized) {
for (auto& observer : observer_list_) {
observer.OnFrameSinkMobileOptimizedChanged(frame_sink_id,
is_mobile_optimized);
}
}
void FrameSinkManagerImpl::AddObserver(FrameSinkObserver* obs) {
observer_list_.AddObserver(obs);
}

@ -298,6 +298,9 @@ class VIZ_SERVICE_EXPORT FrameSinkManagerImpl
void OnFrameSinkDeviceScaleFactorChanged(const FrameSinkId& frame_sink_id,
float device_scale_factor);
void OnFrameSinkMobileOptimizedChanged(const FrameSinkId& frame_sink_id,
bool is_mobile_optimized);
void AddObserver(FrameSinkObserver* obs);
void RemoveObserver(FrameSinkObserver* obs);

@ -5,6 +5,8 @@
#ifndef COMPONENTS_VIZ_SERVICE_FRAME_SINKS_FRAME_SINK_OBSERVER_H_
#define COMPONENTS_VIZ_SERVICE_FRAME_SINKS_FRAME_SINK_OBSERVER_H_
#include "components/viz/common/quads/compositor_frame_metadata.h"
namespace viz {
class FrameSinkId;
@ -54,6 +56,12 @@ class FrameSinkObserver {
const FrameSinkId& frame_sink_id,
float device_scale_factor) {}
// Called when the |is_mobile_optimized| related to |frame_sink_id| changes
// with latest activated frame.
virtual void OnFrameSinkMobileOptimizedChanged(
const FrameSinkId& frame_sink_id,
bool is_mobile_optimized) {}
// Called when capturing is started for `frame_sink_id`.
virtual void OnCaptureStarted(const FrameSinkId& frame_sink_id) {}
};

@ -339,6 +339,25 @@ void InputManager::OnFrameSinkDeviceScaleFactorChanged(
rir_iter->second->SetDeviceScaleFactor(device_scale_factor);
}
void InputManager::OnFrameSinkMobileOptimizedChanged(
const FrameSinkId& frame_sink_id,
bool is_mobile_optimized) {
auto rir_itr = rir_map_.find(frame_sink_id);
if (rir_itr == rir_map_.end()) {
return;
}
rir_itr->second->input_router()->NotifySiteIsMobileOptimized(
is_mobile_optimized);
auto metadata_itr = frame_sink_metadata_map_.find(frame_sink_id);
CHECK(metadata_itr != frame_sink_metadata_map_.end());
FrameSinkMetadata& frame_sink_metadata = metadata_itr->second;
CHECK(frame_sink_metadata.is_mobile_optimized != is_mobile_optimized);
frame_sink_metadata.is_mobile_optimized = is_mobile_optimized;
frame_sink_metadata.rir_support->NotifySiteIsMobileOptimized(
is_mobile_optimized);
}
input::TouchEmulator* InputManager::GetTouchEmulator(bool create_if_necessary) {
return nullptr;
}
@ -533,22 +552,6 @@ void InputManager::StateOnTouchTransfer(
#endif
}
void InputManager::NotifySiteIsMobileOptimized(
bool is_mobile_optimized,
const FrameSinkId& frame_sink_id) {
auto itr = rir_map_.find(frame_sink_id);
if (itr == rir_map_.end()) {
return;
}
itr->second->input_router()->NotifySiteIsMobileOptimized(is_mobile_optimized);
auto metadata_itr = frame_sink_metadata_map_.find(frame_sink_id);
CHECK(metadata_itr != frame_sink_metadata_map_.end());
metadata_itr->second.is_mobile_optimized = is_mobile_optimized;
metadata_itr->second.rir_support->NotifySiteIsMobileOptimized(
is_mobile_optimized);
}
void InputManager::ForceEnableZoomStateChanged(
bool force_enable_zoom,
const std::vector<FrameSinkId>& frame_sink_ids) {

@ -89,6 +89,8 @@ class VIZ_SERVICE_EXPORT InputManager
const FrameSinkId& child_frame_sink_id) override;
void OnFrameSinkDeviceScaleFactorChanged(const FrameSinkId& frame_sink_id,
float device_scale_factor) override;
void OnFrameSinkMobileOptimizedChanged(const FrameSinkId& frame_sink_id,
bool is_mobile_optimized) override;
// RenderWidgetHostInputEventRouter::Delegate implementation.
input::TouchEmulator* GetTouchEmulator(bool create_if_necessary) override;
@ -141,8 +143,6 @@ class VIZ_SERVICE_EXPORT InputManager
// input::mojom::RenderInputRouterDelegate implementation.
void StateOnTouchTransfer(input::mojom::TouchTransferStatePtr state) override;
void NotifySiteIsMobileOptimized(bool is_mobile_optimized,
const FrameSinkId& frame_sink_id) override;
void ForceEnableZoomStateChanged(
bool force_enable_zoom,
const std::vector<FrameSinkId>& frame_sink_ids) override;

@ -3812,14 +3812,6 @@ void RenderWidgetHostImpl::OnRenderFrameMetadataChangedAfterActivation(
if (mobile_optimized_state_changed) {
input_router()->NotifySiteIsMobileOptimized(is_mobile_optimized_);
// Notifies Viz only if the page's mobile optimized state has changed, since
// this is only used to set touch ack timeout delay for mobile sites in
// PassthroughTouchEventQueue.
if (auto* delegate_remote =
delegate()->GetRenderInputRouterDelegateRemote()) {
delegate_remote->NotifySiteIsMobileOptimized(is_mobile_optimized_,
frame_sink_id_);
}
if (auto* touch_emulator =
GetTouchEmulator(/*create_if_necessary=*/false)) {
touch_emulator->SetDoubleTapSupportForPageEnabled(!is_mobile_optimized_);

@ -58,6 +58,7 @@ bool StructTraits<viz::mojom::CompositorFrameMetadataDataView,
out->is_handling_animation = data.is_handling_animation();
out->send_frame_token_to_embedder = data.send_frame_token_to_embedder();
out->min_page_scale_factor = data.min_page_scale_factor();
out->is_mobile_optimized = data.is_mobile_optimized();
out->is_software = data.is_software();
if (data.top_controls_visible_height_set()) {
out->top_controls_visible_height.emplace(

@ -151,6 +151,11 @@ struct StructTraits<viz::mojom::CompositorFrameMetadataDataView,
return metadata.display_transform_hint;
}
static bool is_mobile_optimized(
const viz::CompositorFrameMetadata& metadata) {
return metadata.is_mobile_optimized;
}
static const std::unique_ptr<gfx::DelegatedInkMetadata>&
delegated_ink_metadata(const viz::CompositorFrameMetadata& metadata) {
return metadata.delegated_ink_metadata;

@ -58,6 +58,8 @@ struct CompositorFrameMetadata {
gfx.mojom.OverlayTransform display_transform_hint;
bool is_mobile_optimized;
// Contains the metadata required for drawing a delegated ink trail onto the
// end of a rendered ink stroke. This should only be present when two
// conditions are met: