| Index: chrome/browser/android/tab_android.cc
|
| diff --git a/chrome/browser/android/tab_android.cc b/chrome/browser/android/tab_android.cc
|
| index 53a53b8906c7edec1bd8883d5fe86cba8281be5e..a862509964ac252ce6c21b0ef6ba428e194652d8 100644
|
| --- a/chrome/browser/android/tab_android.cc
|
| +++ b/chrome/browser/android/tab_android.cc
|
| @@ -12,6 +12,7 @@
|
| #include "cc/layers/layer.h"
|
| #include "chrome/browser/android/chrome_web_contents_delegate_android.h"
|
| #include "chrome/browser/android/compositor/tab_content_manager.h"
|
| +#include "chrome/browser/android/hung_renderer_infobar_delegate.h"
|
| #include "chrome/browser/android/metrics/uma_utils.h"
|
| #include "chrome/browser/android/offline_pages/offline_page_bridge.h"
|
| #include "chrome/browser/android/offline_pages/offline_page_model_factory.h"
|
| @@ -55,6 +56,7 @@
|
| #include "components/bookmarks/managed/managed_bookmark_service.h"
|
| #include "components/dom_distiller/core/url_utils.h"
|
| #include "components/favicon/content/content_favicon_driver.h"
|
| +#include "components/infobars/core/infobar.h"
|
| #include "components/infobars/core/infobar_container.h"
|
| #include "components/navigation_interception/intercept_navigation_delegate.h"
|
| #include "components/navigation_interception/navigation_params.h"
|
| @@ -101,6 +103,16 @@ const int kImageSearchThumbnailMinSize = 300 * 300;
|
| const int kImageSearchThumbnailMaxWidth = 600;
|
| const int kImageSearchThumbnailMaxHeight = 600;
|
|
|
| +infobars::InfoBar* FindHungRendererInfoBar(InfoBarService* infobar_service) {
|
| + DCHECK(infobar_service);
|
| + for (size_t i = 0; i < infobar_service->infobar_count(); ++i) {
|
| + infobars::InfoBar* infobar = infobar_service->infobar_at(i);
|
| + if (infobar->delegate()->AsHungRendererInfoBarDelegate())
|
| + return infobar;
|
| + }
|
| + return nullptr;
|
| +}
|
| +
|
| } // namespace
|
|
|
| TabAndroid* TabAndroid::FromWebContents(content::WebContents* web_contents) {
|
| @@ -842,6 +854,28 @@ bool TabAndroid::HasPrerenderedUrl(JNIEnv* env, jobject obj, jstring url) {
|
| return HasPrerenderedUrl(gurl);
|
| }
|
|
|
| +void TabAndroid::OnRendererUnresponsive(JNIEnv* env, jobject obj) {
|
| + InfoBarService* infobar_service =
|
| + InfoBarService::FromWebContents(web_contents());
|
| + DCHECK(!FindHungRendererInfoBar(infobar_service));
|
| + HungRendererInfoBarDelegate::Create(infobar_service,
|
| + web_contents()->GetRenderProcessHost());
|
| +}
|
| +
|
| +void TabAndroid::OnRendererResponsive(JNIEnv* env, jobject obj) {
|
| + InfoBarService* infobar_service =
|
| + InfoBarService::FromWebContents(web_contents());
|
| + infobars::InfoBar* hung_renderer_infobar =
|
| + FindHungRendererInfoBar(infobar_service);
|
| + if (!hung_renderer_infobar)
|
| + return;
|
| +
|
| + hung_renderer_infobar->delegate()
|
| + ->AsHungRendererInfoBarDelegate()
|
| + ->OnRendererResponsive();
|
| + infobar_service->RemoveInfoBar(hung_renderer_infobar);
|
| +}
|
| +
|
| namespace {
|
|
|
| class ChromeInterceptNavigationDelegate : public InterceptNavigationDelegate {
|
|
|