Frozen RenderWidgets are not marked shown (and thus cant be hidden).

Remove TODOs lamenting this obsolete behaviour, and branches on frozen
in the shown/hidden RenderWidget code. Instead DCHECK the RenderWidget
is not frozen when being shown/hidden.

Note that when becoming frozen they will stay in whatever shown/hidden
state they were before being frozen until after they are thawed.

[email protected]

Bug: 419087
Change-Id: I49bc0c4a622485cc0ab5550a11c9f6c07507c7b3
Reviewed-on: https://chromium-review.googlesource.com/c/1455496
Commit-Queue: danakj <[email protected]>
Reviewed-by: Daniel Cheng <[email protected]>
Cr-Commit-Position: refs/heads/master@{#629992}
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index 281cfda..90d4c53 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -876,37 +876,40 @@
 }
 
 void RenderWidget::OnWasHidden() {
+  // A frozen main frame widget will never be hidden since that would require it
+  // to be shown first. It must be thawed before changing visibility.
+  DCHECK(!is_frozen_);
+
   TRACE_EVENT0("renderer", "RenderWidget::OnWasHidden");
-  // Go into a mode where we stop generating paint and scrolling events.
+
   SetHidden(true);
+
   for (auto& observer : render_frames_)
     observer.WasHidden();
 }
 
 void RenderWidget::OnWasShown(base::TimeTicks show_request_timestamp,
                               bool was_evicted) {
+  // A frozen main frame widget does not become shown, since it has no frame
+  // associated with it. It must be thawed before changing visibility.
+  DCHECK(!is_frozen_);
+
   TRACE_EVENT0("renderer", "RenderWidget::OnWasShown");
-  // TODO(danakj): Nothing should happen ideally if the RenderWidget is frozen!
-  // It's not visible! However.. the RenderView needs to see it as visible in
-  // order to make the Page visible /o\ so this is hard. We need to detangle
-  // page visibility from the main widget. https://crbug.com/419087
 
   was_shown_time_ = base::TimeTicks::Now();
-  // See OnWasHidden
+
   SetHidden(false);
-  for (auto& observer : render_frames_)
-    observer.WasShown();
-
-  if (was_evicted) {
-    for (auto& observer : render_frame_proxies_) {
-      observer.WasEvicted();
-    }
-  }
-
   if (!show_request_timestamp.is_null()) {
     layer_tree_view_->layer_tree_host()->RequestPresentationTimeForNextFrame(
         CreateTabSwitchingTimeRecorder(show_request_timestamp));
   }
+
+  for (auto& observer : render_frames_)
+    observer.WasShown();
+  if (was_evicted) {
+    for (auto& observer : render_frame_proxies_)
+      observer.WasEvicted();
+  }
 }
 
 void RenderWidget::OnRequestSetBoundsAck() {
@@ -2399,6 +2402,10 @@
 }
 
 void RenderWidget::SetHidden(bool hidden) {
+  // A frozen main frame widget does not become shown or hidden, since it has
+  // no frame associated with it. It must be thawed before changing visibility.
+  DCHECK(!is_frozen_);
+
   if (is_hidden_ == hidden)
     return;
 
@@ -2424,15 +2431,7 @@
   if (render_widget_scheduling_state_)
     render_widget_scheduling_state_->SetHidden(hidden);
 
-  // TODO(danakj): Frozen RenderWidgets become visible with the RenderView but
-  // they don't need to anymore, since the RenderView's visibility is controlled
-  // separately. However even if they become visible, we don't need to start the
-  // compositor in this case.
-  // If frozen, then hidden changing doesn't change anything with the
-  // compositor since when frozen the compositor is always stopped (until
-  // we WarmupCompositor()).
-  if (!is_frozen_)
-    StartStopCompositor();
+  StartStopCompositor();
 }
 
 void RenderWidget::SetIsFullscreen(bool fullscreen) {