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,