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