OOPIF-ize hung renderers part 2, attempt 2

The embedder needs access to the RenderWidgetHost in order to
fully implement a "hung page" dialog.

BUG=767526

Change-Id: I2d699d96d3fef88be17c54422578c14310826851
Reviewed-on: https://chromium-review.googlesource.com/896343
Reviewed-by: Fady Samuel <[email protected]>
Reviewed-by: Ted Choc <[email protected]>
Reviewed-by: Peter Kasting <[email protected]>
Reviewed-by: Alex Moshchuk <[email protected]>
Commit-Queue: Avi Drissman <[email protected]>
Cr-Commit-Position: refs/heads/master@{#534113}
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 32983e5..26d22be 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -1668,7 +1668,7 @@
 
 void Browser::RendererUnresponsive(
     WebContents* source,
-    content::RenderProcessHost* render_process_host) {
+    content::RenderWidgetHost* render_widget_host) {
   // Ignore hangs if a tab is blocked.
   int index = tab_strip_model_->GetIndexOfWebContents(source);
   DCHECK_NE(TabStripModel::kNoTab, index);
@@ -1680,7 +1680,7 @@
 
 void Browser::RendererResponsive(
     WebContents* source,
-    content::RenderProcessHost* render_process_host) {
+    content::RenderWidgetHost* render_widget_host) {
   TabDialogs::FromWebContents(source)->HideHungRendererDialog();
 }
 
diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h
index 13511e8a..42b5ca6 100644
--- a/chrome/browser/ui/browser.h
+++ b/chrome/browser/ui/browser.h
@@ -617,10 +617,10 @@
                           content::WebContents* new_contents) override;
   void RendererUnresponsive(
       content::WebContents* source,
-      content::RenderProcessHost* render_process_host) override;
+      content::RenderWidgetHost* render_widget_host) override;
   void RendererResponsive(
       content::WebContents* source,
-      content::RenderProcessHost* render_process_host) override;
+      content::RenderWidgetHost* render_widget_host) override;
   void DidNavigateMainFramePostCommit(
       content::WebContents* web_contents) override;
   content::JavaScriptDialogManager* GetJavaScriptDialogManager(
diff --git a/components/web_contents_delegate_android/web_contents_delegate_android.cc b/components/web_contents_delegate_android/web_contents_delegate_android.cc
index 74a3afc..0d77a10 100644
--- a/components/web_contents_delegate_android/web_contents_delegate_android.cc
+++ b/components/web_contents_delegate_android/web_contents_delegate_android.cc
@@ -169,7 +169,7 @@
 
 void WebContentsDelegateAndroid::RendererUnresponsive(
     WebContents* source,
-    content::RenderProcessHost* render_process_host) {
+    content::RenderWidgetHost* render_widget_host) {
   JNIEnv* env = AttachCurrentThread();
   ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env);
   if (obj.is_null())
@@ -179,7 +179,7 @@
 
 void WebContentsDelegateAndroid::RendererResponsive(
     WebContents* source,
-    content::RenderProcessHost* render_process_host) {
+    content::RenderWidgetHost* render_widget_host) {
   JNIEnv* env = AttachCurrentThread();
   ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env);
   if (obj.is_null())
diff --git a/components/web_contents_delegate_android/web_contents_delegate_android.h b/components/web_contents_delegate_android/web_contents_delegate_android.h
index f8314be..81c3ae00 100644
--- a/components/web_contents_delegate_android/web_contents_delegate_android.h
+++ b/components/web_contents_delegate_android/web_contents_delegate_android.h
@@ -65,10 +65,10 @@
                            double load_progress) override;
   void RendererUnresponsive(
       content::WebContents* source,
-      content::RenderProcessHost* render_process_host) override;
+      content::RenderWidgetHost* render_widget_host) override;
   void RendererResponsive(
       content::WebContents* source,
-      content::RenderProcessHost* render_process_host) override;
+      content::RenderWidgetHost* render_widget_host) override;
   void WebContentsCreated(content::WebContents* source_contents,
                           int opener_render_process_id,
                           int opener_render_frame_id,
diff --git a/content/browser/devtools/devtools_manager_unittest.cc b/content/browser/devtools/devtools_manager_unittest.cc
index b73e83b..a37bd10 100644
--- a/content/browser/devtools/devtools_manager_unittest.cc
+++ b/content/browser/devtools/devtools_manager_unittest.cc
@@ -86,7 +86,7 @@
 
   // Notification that the contents is hung.
   void RendererUnresponsive(WebContents* source,
-                            RenderProcessHost* render_process_host) override {
+                            RenderWidgetHost* render_widget_host) override {
     renderer_unresponsive_received_ = true;
   }
 
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 4eda571..4d3cc523 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -5434,10 +5434,8 @@
 
 void WebContentsImpl::RendererUnresponsive(
     RenderWidgetHostImpl* render_widget_host) {
-  RenderProcessHost* hung_process = render_widget_host->GetProcess();
-
   for (auto& observer : observers_)
-    observer.OnRendererUnresponsive(hung_process);
+    observer.OnRendererUnresponsive(render_widget_host->GetProcess());
 
   if (ShouldIgnoreUnresponsiveRenderer())
     return;
@@ -5446,15 +5444,13 @@
     return;
 
   if (delegate_)
-    delegate_->RendererUnresponsive(this, hung_process);
+    delegate_->RendererUnresponsive(this, render_widget_host);
 }
 
 void WebContentsImpl::RendererResponsive(
     RenderWidgetHostImpl* render_widget_host) {
-  RenderProcessHost* hung_process = render_widget_host->GetProcess();
-
   if (delegate_)
-    delegate_->RendererResponsive(this, hung_process);
+    delegate_->RendererResponsive(this, render_widget_host);
 }
 
 void WebContentsImpl::BeforeUnloadFiredFromRenderManager(
diff --git a/content/public/browser/web_contents_delegate.h b/content/public/browser/web_contents_delegate.h
index 534864d..d5d88e3 100644
--- a/content/public/browser/web_contents_delegate.h
+++ b/content/public/browser/web_contents_delegate.h
@@ -44,7 +44,6 @@
 class ColorChooser;
 class JavaScriptDialogManager;
 class RenderFrameHost;
-class RenderProcessHost;
 class RenderWidgetHost;
 class SessionStorageNamespace;
 class SiteInstance;
@@ -317,13 +316,24 @@
                                   const GURL& target_url,
                                   WebContents* new_contents) {}
 
-  // Notification that a process in the WebContents is hung.
+  // Notification that one of the frames in the WebContents is hung. |source| is
+  // the WebContents that is hung, and |render_widget_host| is the
+  // RenderWidgetHost that, while routing events to it, discovered the hang.
+  //
+  // Useful member functions on |render_widget_host|:
+  // - Getting the hung render process: GetProcess()
+  // - Querying whether the process is still hung: IsCurrentlyUnresponsive()
+  // - Waiting for the process to recover on its own:
+  //     RestartHangMonitorTimeoutIfNecessary()
   virtual void RendererUnresponsive(WebContents* source,
-                                    RenderProcessHost* render_process_host) {}
+                                    RenderWidgetHost* render_widget_host) {}
 
-  // Notification that a process in the WebContents is no longer hung.
+  // Notification that a process in the WebContents is no longer hung. |source|
+  // is the WebContents that was hung, and |render_widget_host| is the
+  // RenderWidgetHost that was passed in an earlier call to
+  // RendererUnresponsive().
   virtual void RendererResponsive(WebContents* source,
-                                  RenderProcessHost* render_process_host) {}
+                                  RenderWidgetHost* render_widget_host) {}
 
   // Invoked when a main fram navigation occurs.
   virtual void DidNavigateMainFramePostCommit(WebContents* source) {}
diff --git a/content/shell/browser/shell.cc b/content/shell/browser/shell.cc
index 26dbae4..24d14f19 100644
--- a/content/shell/browser/shell.cc
+++ b/content/shell/browser/shell.cc
@@ -489,7 +489,7 @@
 }
 
 void Shell::RendererUnresponsive(WebContents* source,
-                                 RenderProcessHost* render_process_host) {
+                                 RenderWidgetHost* render_widget_host) {
   BlinkTestController* blink_test_controller = BlinkTestController::Get();
   if (blink_test_controller && switches::IsRunLayoutTestSwitchPresent())
     blink_test_controller->RendererUnresponsive();
diff --git a/content/shell/browser/shell.h b/content/shell/browser/shell.h
index 7a36cb4b..6cda9f3b 100644
--- a/content/shell/browser/shell.h
+++ b/content/shell/browser/shell.h
@@ -163,7 +163,7 @@
                               int32_t line_no,
                               const base::string16& source_id) override;
   void RendererUnresponsive(WebContents* source,
-                            RenderProcessHost* render_process_host) override;
+                            RenderWidgetHost* render_widget_host) override;
   void ActivateContents(WebContents* contents) override;
   bool ShouldAllowRunningInsecureContent(content::WebContents* web_contents,
                                          bool allowed_per_prefs,
diff --git a/extensions/browser/guest_view/web_view/web_view_guest.cc b/extensions/browser/guest_view/web_view/web_view_guest.cc
index d285e81..f7e112bb 100644
--- a/extensions/browser/guest_view/web_view/web_view_guest.cc
+++ b/extensions/browser/guest_view/web_view/web_view_guest.cc
@@ -677,18 +677,20 @@
 // 'unresponsive' events.
 void WebViewGuest::RendererResponsive(
     WebContents* source,
-    content::RenderProcessHost* render_process_host) {
+    content::RenderWidgetHost* render_widget_host) {
   auto args = std::make_unique<base::DictionaryValue>();
-  args->SetInteger(webview::kProcessId, render_process_host->GetID());
+  args->SetInteger(webview::kProcessId,
+                   render_widget_host->GetProcess()->GetID());
   DispatchEventToView(std::make_unique<GuestViewEvent>(
       webview::kEventResponsive, std::move(args)));
 }
 
 void WebViewGuest::RendererUnresponsive(
     WebContents* source,
-    content::RenderProcessHost* render_process_host) {
+    content::RenderWidgetHost* render_widget_host) {
   auto args = std::make_unique<base::DictionaryValue>();
-  args->SetInteger(webview::kProcessId, render_process_host->GetID());
+  args->SetInteger(webview::kProcessId,
+                   render_widget_host->GetProcess()->GetID());
   DispatchEventToView(std::make_unique<GuestViewEvent>(
       webview::kEventUnresponsive, std::move(args)));
 }
diff --git a/extensions/browser/guest_view/web_view/web_view_guest.h b/extensions/browser/guest_view/web_view/web_view_guest.h
index 19d8302d..c1c25e6 100644
--- a/extensions/browser/guest_view/web_view/web_view_guest.h
+++ b/extensions/browser/guest_view/web_view/web_view_guest.h
@@ -211,12 +211,11 @@
   void LoadProgressChanged(content::WebContents* source, double progress) final;
   bool PreHandleGestureEvent(content::WebContents* source,
                              const blink::WebGestureEvent& event) final;
-  void RendererResponsive(
-      content::WebContents* source,
-      content::RenderProcessHost* render_process_host) final;
+  void RendererResponsive(content::WebContents* source,
+                          content::RenderWidgetHost* render_widget_host) final;
   void RendererUnresponsive(
       content::WebContents* source,
-      content::RenderProcessHost* render_process_host) final;
+      content::RenderWidgetHost* render_widget_host) final;
   void RequestMediaAccessPermission(
       content::WebContents* source,
       const content::MediaStreamRequest& request,