Index: chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java |
index 6131379b02dd45336308a19f1649299252ac7ef0..626036510f85d45b5d9972e8f02a440b59dc83dd 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java |
@@ -49,7 +49,10 @@ import org.chromium.chrome.browser.contextmenu.ContextMenuPopulatorWrapper; |
import org.chromium.chrome.browser.contextmenu.EmptyChromeContextMenuItemDelegate; |
import org.chromium.chrome.browser.fullscreen.FullscreenManager; |
import org.chromium.chrome.browser.help.HelpAndFeedback; |
+import org.chromium.chrome.browser.infobar.ConfirmInfoBar; |
+import org.chromium.chrome.browser.infobar.InfoBar; |
import org.chromium.chrome.browser.infobar.InfoBarContainer; |
+import org.chromium.chrome.browser.infobar.InfoBarListeners; |
import org.chromium.chrome.browser.metrics.UmaSessionStats; |
import org.chromium.chrome.browser.metrics.UmaUtils; |
import org.chromium.chrome.browser.printing.TabPrinter; |
@@ -323,6 +326,11 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
private int mThemeColor; |
/** |
+ * InfoBar triggered by an unresponsive renderer notification. |
+ */ |
+ private InfoBar mRendererUnresponsiveInfoBar; |
+ |
+ /** |
* A default {@link ChromeContextMenuItemDelegate} that supports some of the context menu |
* functionality. |
*/ |
@@ -470,6 +478,7 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
@Override |
public void rendererUnresponsive() { |
super.rendererUnresponsive(); |
+ showUnresponiveRendererInfobar(); |
if (mFullscreenManager == null) return; |
mFullscreenHungRendererToken = |
mFullscreenManager.showControlsPersistentAndClearOldToken( |
@@ -479,6 +488,7 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
@Override |
public void rendererResponsive() { |
super.rendererResponsive(); |
+ dismissUnresponiveRendererInfobar(); |
if (mFullscreenManager == null) return; |
mFullscreenManager.hideControlsPersistent(mFullscreenHungRendererToken); |
mFullscreenHungRendererToken = FullscreenManager.INVALID_TOKEN; |
@@ -2782,6 +2792,43 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
return mParentIntent; |
} |
+ private void showUnresponiveRendererInfobar() { |
+ assert mRendererUnresponsiveInfoBar == null; |
+ mRendererUnresponsiveInfoBar = createUnresponsiveRendererInfobar(); |
+ getInfoBarContainer().addInfoBar(mRendererUnresponsiveInfoBar); |
gone
2015/08/14 21:07:28
You probably want to make a native-side InfoBarDel
jdduke (slow)
2015/08/14 21:22:19
I see, and just host the infobar in the native Tab
gone
2015/08/14 21:31:08
Something like that... This sounds like it'll be a
|
+ } |
+ |
+ private void dismissUnresponiveRendererInfobar() { |
+ if (mRendererUnresponsiveInfoBar == null) return; |
+ getInfoBarContainer().removeInfoBar(mRendererUnresponsiveInfoBar); |
+ mRendererUnresponsiveInfoBar = null; |
+ } |
+ |
+ private InfoBar createUnresponsiveRendererInfobar() { |
+ InfoBarListeners.Confirm killListener = new InfoBarListeners.Confirm() { |
+ @Override |
+ public void onInfoBarDismissed(InfoBar infoBar) {} |
gone
2015/08/14 21:05:43
You probably also want to clear the mRendererUnres
jdduke (slow)
2015/08/14 21:22:18
Done.
|
+ |
+ @Override |
+ public void onConfirmInfoBarButtonClicked(ConfirmInfoBar infoBar, boolean confirm) { |
+ dismissUnresponiveRendererInfobar(); |
+ if (!confirm) return; |
+ if (mNativeTabAndroid == 0) return; |
+ nativeShutdownHungRenderer(mNativeTabAndroid); |
+ } |
+ }; |
+ |
+ final String unresponsiveRendererMessage = |
+ mContext.getResources().getString(R.string.unresponsive_renderer); |
+ final String killButtonText = |
+ mContext.getResources().getString(R.string.unresponsive_renderer_kill); |
+ final String waitButtonText = |
+ mContext.getResources().getString(R.string.unresponsive_renderer_wait); |
+ |
+ return new ConfirmInfoBar(killListener, R.drawable.sad_tab, null, |
+ unresponsiveRendererMessage, null, killButtonText, waitButtonText); |
+ } |
+ |
/** |
* Creates a new tab to be loaded lazily. This can be used for tabs opened in the background |
* that should be loaded when switched to. initialize() needs to be called afterwards to |
@@ -2847,6 +2894,7 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
private native void nativeDetachOverlayContentViewCore(long nativeTabAndroid, |
ContentViewCore content); |
private native boolean nativeHasPrerenderedUrl(long nativeTabAndroid, String url); |
+ private native void nativeShutdownHungRenderer(long nativeTabAndroid); |
private static native void nativeRecordStartupToCommitUma(); |
} |