Ensure show/hide are properly called on interstitial pages if present.

In my CL for sending Show/Hide to all frames on a page (https://codereview.chromium.org/298283003), I used the RWH for each RenderFrameHost in the tree. This missed the fact that an interstitial page will be overlayed and not part of the frame tree in WebContents.

BUG=381439

Review URL: https://codereview.chromium.org/321253003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@276463 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index dd371919..f5301e6 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -216,9 +216,13 @@
   rfh->Send(message_copy);
 }
 
-void AddRenderWidgetHostToSet(std::set<RenderWidgetHostImpl*>* set,
-                              RenderFrameHost* rfh) {
-  set->insert(static_cast<RenderFrameHostImpl*>(rfh)->GetRenderWidgetHost());
+void AddRenderWidgetHostViewToSet(std::set<RenderWidgetHostView*>* set,
+                                  RenderFrameHost* rfh) {
+  RenderWidgetHostView* rwhv = static_cast<RenderFrameHostImpl*>(rfh)
+                                   ->frame_tree_node()
+                                   ->render_manager()
+                                   ->GetRenderWidgetHostView();
+  set->insert(rwhv);
 }
 
 }  // namespace
@@ -941,15 +945,14 @@
 void WebContentsImpl::WasShown() {
   controller_.SetActive(true);
 
-  std::set<RenderWidgetHostImpl*> widgets = GetRenderWidgetHostsInTree();
-  for (std::set<RenderWidgetHostImpl*>::iterator iter = widgets.begin();
+  std::set<RenderWidgetHostView*> widgets = GetRenderWidgetHostViewsInTree();
+  for (std::set<RenderWidgetHostView*>::iterator iter = widgets.begin();
        iter != widgets.end();
        iter++) {
-    RenderWidgetHostView* rwhv = (*iter)->GetView();
-    if (rwhv) {
-      rwhv->Show();
+    if (*iter) {
+      (*iter)->Show();
 #if defined(OS_MACOSX)
-      rwhv->SetActive(true);
+      (*iter)->SetActive(true);
 #endif
     }
   }
@@ -979,13 +982,12 @@
     // removes the |GetRenderViewHost()|; then when we actually destroy the
     // window, OnWindowPosChanged() notices and calls WasHidden() (which
     // calls us).
-    std::set<RenderWidgetHostImpl*> widgets = GetRenderWidgetHostsInTree();
-    for (std::set<RenderWidgetHostImpl*>::iterator iter = widgets.begin();
+    std::set<RenderWidgetHostView*> widgets = GetRenderWidgetHostViewsInTree();
+    for (std::set<RenderWidgetHostView*>::iterator iter = widgets.begin();
          iter != widgets.end();
          iter++) {
-      RenderWidgetHostView* rwhv = (*iter)->GetView();
-      if (rwhv)
-        rwhv->Hide();
+      if (*iter)
+        (*iter)->Hide();
     }
   }
 
@@ -1142,9 +1144,15 @@
   observers_.RemoveObserver(observer);
 }
 
-std::set<RenderWidgetHostImpl*> WebContentsImpl::GetRenderWidgetHostsInTree() {
-  std::set<RenderWidgetHostImpl*> set;
-  ForEachFrame(base::Bind(&AddRenderWidgetHostToSet, base::Unretained(&set)));
+std::set<RenderWidgetHostView*>
+WebContentsImpl::GetRenderWidgetHostViewsInTree() {
+  std::set<RenderWidgetHostView*> set;
+  if (ShowingInterstitialPage()) {
+    set.insert(GetRenderWidgetHostView());
+  } else {
+    ForEachFrame(
+        base::Bind(&AddRenderWidgetHostViewToSet, base::Unretained(&set)));
+  }
   return set;
 }