Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4076)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java

Issue 1299513002: [Android] Add support for a hung renderer dialog (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();
}

Powered by Google App Engine
This is Rietveld 408576698