Chromium Code Reviews| 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(); |
| } |