Fix issue with memory monitor killing background tabs
When multiple tabs are opened in background memory monitor would allow only a
certain number of tabs to load, other tabs would never have a chance to save instances
which can be restored from WebView. We ensure to restore the background tabs from
original URL.
Change-Id: I940d4cd8f3b077d5351cb34ce441bd4b74ae689b
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index 5ee9477..6919300 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -192,6 +192,9 @@
// determine if webview is destroyed to MemoryMonitor
private boolean mWebViewDestroyedByMemoryMonitor;
+ // Tab started initally in background
+ private boolean mBackgroundTab;
+
private String mTouchIconUrl;
private Observable mFirstPixelObservable;
@@ -328,6 +331,7 @@
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
setIsDistillable(false);
+ mBackgroundTab = false;
mInPageLoad = true;
mPageFinished = false;
mFirstVisualPixelPainted = false;
@@ -1175,6 +1179,10 @@
}
Tab(WebViewController wvcontroller, WebView w, Bundle state) {
+ this(wvcontroller, null, state, false);
+ }
+
+ Tab(WebViewController wvcontroller, WebView w, Bundle state, boolean backgroundTab) {
mWebViewController = wvcontroller;
mContext = mWebViewController.getContext();
mSettings = BrowserSettings.getInstance();
@@ -1185,6 +1193,7 @@
mInPageLoad = false;
mInForeground = false;
mWebViewDestroyedByMemoryMonitor = false;
+ mBackgroundTab = backgroundTab;
mDownloadListener = new BrowserDownloadListener() {
public void onDownloadStart(String url, String userAgent,
@@ -1302,18 +1311,9 @@
mMainView.setPictureListener(null);
if (w != null) {
syncCurrentState(w, null);
- } else {
- mCurrentState = new PageState(mContext, mMainView.isPrivateBrowsingEnabled());
-
- if (mWebViewDestroyedByMemoryMonitor) {
- /*
- * If tab was destroyed as a result of the MemoryMonitor
- * then we need to restore the state properties
- * from the old WebView (mMainView)
- */
- syncCurrentState(mMainView, null);
- mWebViewDestroyedByMemoryMonitor = false;
- }
+ } else if(!mWebViewDestroyedByMemoryMonitor) {
+ mCurrentState = new PageState(mContext,
+ mMainView.isPrivateBrowsingEnabled());
}
}
// set the new one
@@ -1340,7 +1340,11 @@
Log.w(LOGTAG, "Failed to restore WebView state!");
loadUrl(mCurrentState.mOriginalUrl, null);
}
+ mWebViewDestroyedByMemoryMonitor = false;
mSavedState = null;
+ } else if(restore && mBackgroundTab && mWebViewDestroyedByMemoryMonitor) {
+ loadUrl(mCurrentState.mOriginalUrl, null);
+ mWebViewDestroyedByMemoryMonitor = false;
}
}
}
diff --git a/src/com/android/browser/TabControl.java b/src/com/android/browser/TabControl.java
index 81da696..91d2bca 100644
--- a/src/com/android/browser/TabControl.java
+++ b/src/com/android/browser/TabControl.java
@@ -249,7 +249,7 @@
final WebView w = createNewWebView(privateBrowsing, backgroundTab);
// Create a new tab and add it to the tab list
- Tab t = new Tab(mController, w, state);
+ Tab t = new Tab(mController, w, state, backgroundTab);
mTabs.add(t);
mTabCountObservable.set(mTabs.size());
if (privateBrowsing) {