Move WidgetMsg_WasShown/WidgetMsg_WasHidden to blink's Widget mojom
This CL converts WidgetMsg_WasShown/WidgetMsg_WasHidden IPCs to
blink's Widget mojom and moves some implementation including
is_hidden into WidgetBase, and moves
ContentToVisibleTimeReporter class to blink.
Bug: 1102446
Change-Id: I40bf1444627fdac5a96becef0907f5662a6a45e4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2377630
Commit-Queue: Miyoung Shin <[email protected]>
Reviewed-by: Kinuko Yasuda <[email protected]>
Reviewed-by: Dave Tapuska <[email protected]>
Cr-Commit-Position: refs/heads/master@{#807798}
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc
index 88683fb..92ec2024 100644
--- a/content/renderer/pepper/pepper_plugin_instance_impl.cc
+++ b/content/renderer/pepper/pepper_plugin_instance_impl.cc
@@ -554,7 +554,7 @@
if (render_frame_) { // NULL in tests or if the frame has been destroyed.
render_frame_->PepperInstanceCreated(this);
view_data_.is_page_visible =
- !render_frame_->GetLocalRootRenderWidget()->is_hidden();
+ !render_frame_->GetLocalRootRenderWidget()->GetWebWidget()->IsHidden();
// Set the initial focus.
SetContentAreaFocus(
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 9321f1e..087da06e 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -1549,7 +1549,8 @@
std::move(params->frame_widget), std::move(params->widget_host),
std::move(params->widget),
/*is_for_nested_main_frame=*/params->type !=
- mojom::ViewWidgetType::kTopLevel);
+ mojom::ViewWidgetType::kTopLevel,
+ /*hidden=*/true);
render_widget->InitForMainFrame(std::move(show_callback), web_frame_widget,
params->visual_properties.screen_info,
@@ -1714,7 +1715,8 @@
std::move(widget_params->frame_widget_host),
std::move(widget_params->frame_widget),
std::move(widget_params->widget_host), std::move(widget_params->widget),
- /*is_for_nested_main_frame=*/false);
+ /*is_for_nested_main_frame=*/false,
+ /*hidden=*/true);
render_widget->InitForMainFrame(
RenderWidget::ShowCallback(), web_frame_widget,
@@ -1763,8 +1765,8 @@
render_widget.get(), web_frame,
std::move(widget_params->frame_widget_host),
std::move(widget_params->frame_widget),
- std::move(widget_params->widget_host),
- std::move(widget_params->widget));
+ std::move(widget_params->widget_host), std::move(widget_params->widget),
+ /*hidden=*/true);
// Adds a reference on RenderWidget, making it self-referencing. So it
// will not be destroyed by scoped_refptr unless Close() has been called
@@ -5140,7 +5142,7 @@
}
bool RenderFrameImpl::IsHidden() {
- return GetLocalRootRenderWidget()->is_hidden();
+ return GetLocalRootRenderWidget()->GetWebWidget()->IsHidden();
}
bool RenderFrameImpl::IsLocalRoot() const {
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index c3d11c6b..c09a38f 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -306,10 +306,6 @@
// Virtual for web tests to inject their own behaviour into the WebLocalFrame.
virtual void Initialize(blink::WebFrame* parent);
- // Notifications from RenderWidget.
- void WasHidden();
- void WasShown();
-
// Start/Stop loading notifications.
// TODO(nasko): Those are page-level methods at this time and come from
// WebViewClient. We should move them to be WebLocalFrameClient calls and put
@@ -770,6 +766,8 @@
const std::string& output_device_id) override;
void DidMeaningfulLayout(blink::WebMeaningfulLayout layout_type) override;
void DidCommitAndDrawCompositorFrame() override;
+ void WasHidden() override;
+ void WasShown() override;
// Binds to the fullscreen service in the browser.
void BindFullscreen(
diff --git a/content/renderer/render_frame_impl_browsertest.cc b/content/renderer/render_frame_impl_browsertest.cc
index e71a1b5..55bd0f34 100644
--- a/content/renderer/render_frame_impl_browsertest.cc
+++ b/content/renderer/render_frame_impl_browsertest.cc
@@ -51,6 +51,7 @@
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/loader/previews_state.h"
#include "third_party/blink/public/mojom/frame/frame_owner_properties.mojom.h"
+#include "third_party/blink/public/mojom/page/record_content_to_visible_time_request.mojom.h"
#include "third_party/blink/public/platform/web_runtime_features.h"
#include "third_party/blink/public/platform/web_string.h"
#include "third_party/blink/public/platform/web_url.h"
@@ -71,7 +72,6 @@
constexpr int32_t kSubframeRouteId = 20;
constexpr int32_t kSubframeWidgetRouteId = 21;
constexpr int32_t kFrameProxyRouteId = 22;
-constexpr int32_t kEmbeddedSubframeRouteId = 23;
const char kParentFrameHTML[] = "Parent frame <iframe name='frame'></iframe>";
@@ -109,6 +109,19 @@
widget_params->routing_id = kSubframeWidgetRouteId;
widget_params->visual_properties.new_size = gfx::Size(100, 100);
+ widget_remote_.reset();
+ mojo::PendingAssociatedReceiver<blink::mojom::Widget>
+ blink_widget_receiver =
+ widget_remote_.BindNewEndpointAndPassDedicatedReceiver();
+
+ mojo::AssociatedRemote<blink::mojom::WidgetHost> blink_widget_host;
+ mojo::PendingAssociatedReceiver<blink::mojom::WidgetHost>
+ blink_widget_host_receiver =
+ blink_widget_host.BindNewEndpointAndPassDedicatedReceiver();
+
+ widget_params->widget = std::move(blink_widget_receiver);
+ widget_params->widget_host = blink_widget_host.Unbind();
+
FrameReplicationState frame_replication_state;
frame_replication_state.name = "frame";
frame_replication_state.unique_name = "frame-uniqueName";
@@ -158,6 +171,10 @@
content::RenderWidget* frame_widget() const { return frame_->render_widget_; }
+ mojo::AssociatedRemote<blink::mojom::Widget>& widget_remote() {
+ return widget_remote_;
+ }
+
static url::Origin GetOriginForFrame(TestRenderFrame* frame) {
return url::Origin(frame->GetWebFrame()->GetSecurityOrigin());
}
@@ -169,6 +186,7 @@
private:
TestRenderFrame* frame_;
FakeCompositorDependencies compositor_deps_;
+ mojo::AssociatedRemote<blink::mojom::Widget> widget_remote_;
};
class RenderFrameTestObserver : public RenderFrameObserver {
@@ -247,49 +265,12 @@
TEST_F(RenderFrameImplTest, FrameWasShown) {
RenderFrameTestObserver observer(frame());
- WidgetMsg_WasShown was_shown_message(0, base::TimeTicks(),
- false /* was_evicted */,
- {} /* tab_switch_start_state */);
- frame_widget()->OnMessageReceived(was_shown_message);
+ widget_remote()->WasShown(
+ {} /* record_tab_switch_time_request */, false /* was_evicted=*/,
+ blink::mojom::RecordContentToVisibleTimeRequestPtr());
+ base::RunLoop().RunUntilIdle();
- EXPECT_FALSE(frame_widget()->is_hidden());
- EXPECT_TRUE(observer.visible());
-}
-
-// Verify that a local subframe of a frame with a RenderWidget processes a
-// WasShown message.
-TEST_F(RenderFrameImplTest, LocalChildFrameWasShown) {
- mojo::PendingRemote<service_manager::mojom::InterfaceProvider>
- stub_interface_provider;
- ignore_result(stub_interface_provider.InitWithNewPipeAndPassReceiver());
- mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>
- stub_browser_interface_broker;
- ignore_result(stub_browser_interface_broker.InitWithNewPipeAndPassReceiver());
-
- // Create and initialize a local child frame of the simulated OOPIF, which
- // is a grandchild of the remote main frame.
- RenderFrameImpl* grandchild =
- RenderFrameImpl::Create(frame()->render_view(), kEmbeddedSubframeRouteId,
- std::move(stub_interface_provider),
- std::move(stub_browser_interface_broker),
- base::UnguessableToken::Create());
- blink::WebLocalFrame* parent_web_frame = frame()->GetWebFrame();
-
- parent_web_frame->CreateLocalChild(
- blink::mojom::TreeScopeType::kDocument, grandchild,
- grandchild->blink_interface_registry_.get(),
- base::UnguessableToken::Create());
- grandchild->in_frame_tree_ = true;
- grandchild->Initialize(parent_web_frame);
-
- RenderFrameTestObserver observer(grandchild);
-
- WidgetMsg_WasShown was_shown_message(0, base::TimeTicks(),
- false /* was_evicted */,
- {} /* tab_switch_start_state */);
- frame_widget()->OnMessageReceived(was_shown_message);
-
- EXPECT_FALSE(frame_widget()->is_hidden());
+ EXPECT_FALSE(frame_widget()->GetWebWidget()->IsHidden());
EXPECT_TRUE(observer.visible());
}
diff --git a/content/renderer/render_frame_proxy.h b/content/renderer/render_frame_proxy.h
index 68070242..1ab0597 100644
--- a/content/renderer/render_frame_proxy.h
+++ b/content/renderer/render_frame_proxy.h
@@ -197,11 +197,10 @@
void PageScaleFactorChanged(float page_scale_factor,
bool is_pinch_gesture_active) override;
viz::FrameSinkId GetFrameSinkId() override;
+ void WasEvicted() override;
void DidStartLoading();
- void WasEvicted();
-
bool is_pinch_gesture_active_for_testing() {
return pending_visual_properties_.is_pinch_gesture_active;
}
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index d43a6a7..2c44f3b 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -775,7 +775,6 @@
RenderWidget* popup_widget = RenderWidget::CreateForPopup(
widget_routing_id, opener_render_widget->compositor_deps(),
- /*hidden=*/false,
/*never_composited=*/false);
// The returned WebPagePopup is self-referencing, so the pointer here is not
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index 2515a47..2a4104e 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -228,29 +228,25 @@
bool never_composited) {
if (g_create_render_widget_for_frame) {
return g_create_render_widget_for_frame(widget_routing_id, compositor_deps,
- /*hidden=*/true, never_composited);
+ never_composited);
}
return std::make_unique<RenderWidget>(widget_routing_id, compositor_deps,
- /*hidden=*/true, never_composited);
+ never_composited);
}
RenderWidget* RenderWidget::CreateForPopup(
int32_t widget_routing_id,
CompositorDependencies* compositor_deps,
- bool hidden,
bool never_composited) {
- return new RenderWidget(widget_routing_id, compositor_deps, hidden,
- never_composited);
+ return new RenderWidget(widget_routing_id, compositor_deps, never_composited);
}
RenderWidget::RenderWidget(int32_t widget_routing_id,
CompositorDependencies* compositor_deps,
- bool hidden,
bool never_composited)
: routing_id_(widget_routing_id),
compositor_deps_(compositor_deps),
- is_hidden_(hidden),
never_composited_(never_composited) {
DCHECK_NE(routing_id_, MSG_ROUTING_NONE);
DCHECK(RenderThread::IsMainThread());
@@ -316,7 +312,7 @@
webwidget_ = web_widget;
if (auto* scheduler_state = GetWebWidget()->RendererWidgetSchedulingState())
- scheduler_state->SetHidden(is_hidden());
+ scheduler_state->SetHidden(web_widget->IsHidden());
InitCompositing(screen_info);
@@ -325,7 +321,7 @@
// for a provisional frame, this importantly starts the compositor before
// the frame is inserted into the frame tree, which impacts first paint
// metrics.
- if (!is_hidden_ && !never_composited_)
+ if (!web_widget->IsHidden() && !never_composited_)
web_widget->SetCompositorVisible(true);
}
@@ -340,8 +336,6 @@
bool handled = false;
IPC_BEGIN_MESSAGE_MAP(RenderWidget, message)
IPC_MESSAGE_HANDLER(WidgetMsg_Close, OnClose)
- IPC_MESSAGE_HANDLER(WidgetMsg_WasHidden, OnWasHidden)
- IPC_MESSAGE_HANDLER(WidgetMsg_WasShown, OnWasShown)
IPC_MESSAGE_HANDLER(WidgetMsg_SetBounds_ACK, OnRequestSetBoundsAck)
IPC_MESSAGE_HANDLER(WidgetMsg_SetViewportIntersection,
OnSetViewportIntersection)
@@ -432,50 +426,6 @@
}
}
-void RenderWidget::OnWasHidden() {
- // A provisional frame widget will never be hidden since that would require it
- // to be shown first. A frame must be attached to the frame tree before
- // changing visibility.
- DCHECK(!IsForProvisionalFrame());
-
- TRACE_EVENT0("renderer", "RenderWidget::OnWasHidden");
-
- SetHidden(true);
-
- tab_switch_time_recorder_.TabWasHidden();
-
- for (auto& observer : render_frames_)
- observer.WasHidden();
-}
-
-void RenderWidget::OnWasShown(
- base::TimeTicks show_request_timestamp,
- bool was_evicted,
- const blink::mojom::RecordContentToVisibleTimeRequestPtr&
- record_tab_switch_time_request) {
- // The frame must be attached to the frame tree (which makes it no longer
- // provisional) before changing visibility.
- DCHECK(!IsForProvisionalFrame());
-
- TRACE_EVENT_WITH_FLOW0("renderer", "RenderWidget::OnWasShown", routing_id(),
- TRACE_EVENT_FLAG_FLOW_IN);
-
- SetHidden(false);
- if (record_tab_switch_time_request) {
- layer_tree_host_->RequestPresentationTimeForNextFrame(
- tab_switch_time_recorder_.TabWasShown(
- false /* has_saved_frames */,
- record_tab_switch_time_request.Clone(), show_request_timestamp));
- }
-
- for (auto& observer : render_frames_)
- observer.WasShown();
- if (was_evicted) {
- for (auto& observer : render_frame_proxies_)
- observer.WasEvicted();
- }
-}
-
void RenderWidget::OnRequestSetBoundsAck() {
DCHECK(pending_window_rect_count_);
pending_window_rect_count_--;
@@ -962,30 +912,6 @@
}
}
-void RenderWidget::SetHidden(bool hidden) {
- // A provisional frame widget will never be shown or hidden, as the frame must
- // be attached to the frame tree before changing visibility.
- DCHECK(!IsForProvisionalFrame());
-
- if (is_hidden_ == hidden)
- return;
-
- // The status has changed. Tell the RenderThread about it and ensure
- // throttled acks are released in case frame production ceases.
- is_hidden_ = hidden;
-
- if (auto* scheduler_state = GetWebWidget()->RendererWidgetSchedulingState())
- scheduler_state->SetHidden(hidden);
-
- // If the renderer was hidden, resolve any pending synthetic gestures so they
- // aren't blocked waiting for a compositor frame to be generated.
- if (is_hidden_)
- webwidget_->FlushInputProcessedCallback();
-
- if (!never_composited_)
- webwidget_->SetCompositorVisible(!is_hidden_);
-}
-
void RenderWidget::UpdateSelectionBounds() {
GetWebWidget()->UpdateSelectionBounds();
}
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h
index 911fcde0..6043c66 100644
--- a/content/renderer/render_widget.h
+++ b/content/renderer/render_widget.h
@@ -32,7 +32,6 @@
#include "components/viz/common/surfaces/local_surface_id.h"
#include "content/common/buildflags.h"
#include "content/common/content_export.h"
-#include "content/common/content_to_visible_time_reporter.h"
#include "content/common/drag_event_source_info.h"
#include "content/common/renderer.mojom-forward.h"
#include "content/public/common/drop_data.h"
@@ -114,7 +113,6 @@
public:
RenderWidget(int32_t widget_routing_id,
CompositorDependencies* compositor_deps,
- bool hidden,
bool never_composited);
~RenderWidget() override;
@@ -135,7 +133,6 @@
using CreateRenderWidgetFunction =
std::unique_ptr<RenderWidget> (*)(int32_t routing_id,
CompositorDependencies*,
- bool hidden,
bool never_composited);
// Overrides the implementation of CreateForFrame() function below. Used by
// web tests to return a partial fake of RenderWidget.
@@ -157,7 +154,6 @@
// destruction via ClosePopupWidgetSoon().
static RenderWidget* CreateForPopup(int32_t widget_routing_id,
CompositorDependencies* compositor_deps,
- bool hidden,
bool never_composited);
// Initialize a new RenderWidget for a popup. The |show_callback| is called
@@ -207,7 +203,6 @@
blink::WebInputMethodController* GetInputMethodController() const;
const gfx::Size& size() const { return size_; }
- bool is_hidden() const { return is_hidden_; }
// A main frame RenderWidget is destroyed and recreated using the same routing
// id. So messages en route to a destroyed RenderWidget may end up being
@@ -360,11 +355,6 @@
// RenderWidget IPC message handlers.
void OnClose();
void OnCreatingNewAck();
- void OnWasHidden();
- void OnWasShown(base::TimeTicks show_request_timestamp,
- bool was_evicted,
- const blink::mojom::RecordContentToVisibleTimeRequestPtr&
- record_tab_switch_time_request);
void OnRequestSetBoundsAck();
void OnSetViewportIntersection(
@@ -379,11 +369,6 @@
const gfx::PointF& screen_point,
blink::WebDragOperation drag_operation);
- // Sets the "hidden" state of this widget. All modification of is_hidden_
- // should use this method so that we can properly inform the RenderThread of
- // our state.
- void SetHidden(bool hidden);
-
// Set the pending window rect.
// Because the real render_widget is hosted in another process, there is
// a time period where we may have set a new window rect which has not yet
@@ -452,9 +437,6 @@
// - Rounding issues with OOPIFs (??).
gfx::Size size_;
- // Indicates that we shouldn't bother generated paint events.
- bool is_hidden_;
-
// Indicates that we are never visible, so never produce graphical output.
const bool never_composited_;
@@ -523,9 +505,6 @@
// session, this info is sent to the browser along with other drag/drop info.
DragEventSourceInfo possible_drag_event_info_;
- // Object to record tab switch time into this RenderWidget
- ContentToVisibleTimeReporter tab_switch_time_recorder_;
-
// Browser controls params such as top and bottom controls heights, whether
// controls shrink blink size etc.
cc::BrowserControlsParams browser_controls_params_;
diff --git a/content/renderer/render_widget_fullscreen_pepper.cc b/content/renderer/render_widget_fullscreen_pepper.cc
index a0f21f8..8488787 100644
--- a/content/renderer/render_widget_fullscreen_pepper.cc
+++ b/content/renderer/render_widget_fullscreen_pepper.cc
@@ -203,10 +203,7 @@
mojo::PendingAssociatedRemote<blink::mojom::WidgetHost> mojo_widget_host,
mojo::PendingAssociatedReceiver<blink::mojom::Widget> mojo_widget,
blink::WebURL main_frame_url)
- : RenderWidget(routing_id,
- compositor_deps,
- /*hidden=*/false,
- /*never_composited=*/false),
+ : RenderWidget(routing_id, compositor_deps, /*never_composited=*/false),
plugin_(plugin),
mouse_lock_dispatcher_(
std::make_unique<FullscreenMouseLockDispatcher>(this)),
diff --git a/content/renderer/render_widget_unittest.cc b/content/renderer/render_widget_unittest.cc
index 1a1860b..2e3101b 100644
--- a/content/renderer/render_widget_unittest.cc
+++ b/content/renderer/render_widget_unittest.cc
@@ -152,7 +152,6 @@
explicit InteractiveRenderWidget(CompositorDependencies* compositor_deps)
: RenderWidget(++next_routing_id_,
compositor_deps,
- /*is_hidden=*/false,
/*never_composited=*/false) {}
void Init(blink::WebWidget* widget, const blink::ScreenInfo& screen_info) {
@@ -591,11 +590,6 @@
RenderWidgetUnittest::SetUp();
viz::ParentLocalSurfaceIdAllocator allocator;
- WidgetMsg_WasShown msg(widget()->routing_id(),
- /*show_request_timestamp=*/base::TimeTicks(),
- /*was_evicted=*/false,
- /*record_tab_switch_time_request=*/{});
- widget()->OnMessageReceived(msg);
// TODO(danakj): This usually happens through
// RenderWidget::UpdateVisualProperties() and we are cutting past that for