diff options
author | John Reck <jreck@google.com> | 2011-08-22 13:41:23 -0700 |
---|---|---|
committer | John Reck <jreck@google.com> | 2011-08-22 13:55:06 -0700 |
commit | 6c2e2f34718043f36488b4a94879dc2605aaac49 (patch) | |
tree | b035ded93d8f35ab1f952d539a7afdc93a9481fe /src/com | |
parent | 54ed3aa8417f4c6a27eecb9caf10f742a705b6e0 (diff) | |
download | packages_apps_Browser-6c2e2f34718043f36488b4a94879dc2605aaac49.zip packages_apps_Browser-6c2e2f34718043f36488b4a94879dc2605aaac49.tar.gz packages_apps_Browser-6c2e2f34718043f36488b4a94879dc2605aaac49.tar.bz2 |
Add bulletproofing to state recovery
Bug: 5166335
Change-Id: Ife9ef2da7664f8de6b0ff9655611efa78d84df05
Diffstat (limited to 'src/com')
-rw-r--r-- | src/com/android/browser/Browser.java | 5 | ||||
-rw-r--r-- | src/com/android/browser/BrowserActivity.java | 8 | ||||
-rw-r--r-- | src/com/android/browser/Controller.java | 9 | ||||
-rw-r--r-- | src/com/android/browser/CrashRecoveryHandler.java | 20 | ||||
-rw-r--r-- | src/com/android/browser/IntentHandler.java | 1 | ||||
-rw-r--r-- | src/com/android/browser/Tab.java | 20 |
6 files changed, 39 insertions, 24 deletions
diff --git a/src/com/android/browser/Browser.java b/src/com/android/browser/Browser.java index 76aaa0b..add8bdd 100644 --- a/src/com/android/browser/Browser.java +++ b/src/com/android/browser/Browser.java @@ -23,12 +23,9 @@ import android.webkit.CookieSyncManager; public class Browser extends Application { private final static String LOGTAG = "browser"; - - // Set to true to enable extra debugging. - final static boolean DEBUG = false; // Set to true to enable verbose logging. - final static boolean LOGV_ENABLED = DEBUG; + final static boolean LOGV_ENABLED = false; // Set to true to enable extra debug logging. final static boolean LOGD_ENABLED = true; diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java index 690e29f..b86759a 100644 --- a/src/com/android/browser/BrowserActivity.java +++ b/src/com/android/browser/BrowserActivity.java @@ -31,8 +31,6 @@ import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.Window; -import android.view.WindowManager; -import android.view.accessibility.AccessibilityManager; import com.google.common.annotations.VisibleForTesting; @@ -45,8 +43,7 @@ public class BrowserActivity extends Activity { private final static String LOGTAG = "browser"; - private final static boolean LOGV_ENABLED = - com.android.browser.Browser.LOGV_ENABLED; + private final static boolean LOGV_ENABLED = Browser.LOGV_ENABLED; private Controller mController; private UI mUi; @@ -54,7 +51,8 @@ public class BrowserActivity extends Activity { @Override public void onCreate(Bundle icicle) { if (LOGV_ENABLED) { - Log.v(LOGTAG, this + " onStart"); + Log.v(LOGTAG, this + " onStart, has state: " + + (icicle == null ? "false" : "true")); } super.onCreate(icicle); diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java index 84d7e36..3093085 100644 --- a/src/com/android/browser/Controller.java +++ b/src/com/android/browser/Controller.java @@ -635,8 +635,6 @@ public class Controller mNfcHandler.onPause(); WebView.disablePlatformNotifications(); - mCrashRecoveryHandler.backupState(); - } void onSaveInstanceState(Bundle outState) { @@ -852,6 +850,7 @@ public class Controller @Override public void onProgressChanged(Tab tab) { + mCrashRecoveryHandler.backupState(); int newProgress = tab.getLoadProgress(); if (newProgress == 100) { @@ -942,11 +941,7 @@ public class Controller return; } DataController.getInstance(mActivity).updateVisitedHistory(url); - if (!mActivityPaused) { - // Since we clear the state in onPause, don't backup the current - // state if we are already paused - mCrashRecoveryHandler.backupState(); - } + mCrashRecoveryHandler.backupState(); } @Override diff --git a/src/com/android/browser/CrashRecoveryHandler.java b/src/com/android/browser/CrashRecoveryHandler.java index 8cb5929..c2fbbd2 100644 --- a/src/com/android/browser/CrashRecoveryHandler.java +++ b/src/com/android/browser/CrashRecoveryHandler.java @@ -34,6 +34,7 @@ import java.io.IOException; public class CrashRecoveryHandler { + private static final boolean LOGV_ENABLED = Browser.LOGV_ENABLED; private static final String LOGTAG = "BrowserCrashRecovery"; private static final String STATE_FILE = "browser_state.parcel"; private static final String RECOVERY_PREFERENCES = "browser_recovery_prefs"; @@ -84,14 +85,26 @@ public class CrashRecoveryHandler { public void handleMessage(Message msg) { switch (msg.what) { case MSG_WRITE_STATE: + if (LOGV_ENABLED) { + Log.v(LOGTAG, "Saving crash recovery state"); + } Parcel p = Parcel.obtain(); try { Bundle state = (Bundle) msg.obj; state.writeToParcel(p, 0); - File stateFile = new File(mContext.getCacheDir(), STATE_FILE); - FileOutputStream fout = new FileOutputStream(stateFile); + File stateJournal = new File(mContext.getCacheDir(), + STATE_FILE + ".journal"); + FileOutputStream fout = new FileOutputStream(stateJournal); fout.write(p.marshall()); fout.close(); + File stateFile = new File(mContext.getCacheDir(), + STATE_FILE); + if (!stateJournal.renameTo(stateFile)) { + // Failed to rename, try deleting the existing + // file and try again + stateFile.delete(); + stateJournal.renameTo(stateFile); + } } catch (Throwable e) { Log.i(LOGTAG, "Failed to save persistent state", e); } finally { @@ -99,6 +112,9 @@ public class CrashRecoveryHandler { } break; case MSG_CLEAR_STATE: + if (LOGV_ENABLED) { + Log.v(LOGTAG, "Clearing crash recovery state"); + } File state = new File(mContext.getCacheDir(), STATE_FILE); if (state.exists()) { state.delete(); diff --git a/src/com/android/browser/IntentHandler.java b/src/com/android/browser/IntentHandler.java index c76197d..cc6b57c 100644 --- a/src/com/android/browser/IntentHandler.java +++ b/src/com/android/browser/IntentHandler.java @@ -65,6 +65,7 @@ public class IntentHandler { } void onNewIntent(Intent intent) { + mActivity.setIntent(null); Tab current = mTabControl.getCurrentTab(); // When a tab is closed on exit, the current tab index is set to -1. // Reset before proceed as Browser requires the current tab to be set. diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java index d7ce29b..d6106a5 100644 --- a/src/com/android/browser/Tab.java +++ b/src/com/android/browser/Tab.java @@ -56,6 +56,7 @@ import android.webkit.HttpAuthHandler; import android.webkit.SslErrorHandler; import android.webkit.URLUtil; import android.webkit.ValueCallback; +import android.webkit.WebBackForwardList; import android.webkit.WebBackForwardListClient; import android.webkit.WebChromeClient; import android.webkit.WebHistoryItem; @@ -1529,7 +1530,12 @@ class Tab implements PictureListener { mMainView.setPictureListener(this); } if (mSavedState != null) { - mMainView.restoreState(mSavedState); + WebBackForwardList restoredState + = mMainView.restoreState(mSavedState); + if (restoredState == null || restoredState.getSize() == 0) { + Log.w(LOGTAG, "Failed to restore WebView state!"); + loadUrl(mCurrentState.mOriginalUrl, null); + } mSavedState = null; } } @@ -1913,15 +1919,17 @@ class Tab implements PictureListener { if (mMainView == null) { return mSavedState; } - // If the tab is the homepage or has no URL, don't save it - String homepage = BrowserSettings.getInstance().getHomePage(); - if (TextUtils.equals(homepage, mCurrentState.mUrl) - || TextUtils.isEmpty(mCurrentState.mUrl)) { + + if (TextUtils.isEmpty(mCurrentState.mUrl)) { return null; } mSavedState = new Bundle(); - mMainView.saveState(mSavedState); + WebBackForwardList savedList = mMainView.saveState(mSavedState); + if (savedList == null || savedList.getSize() == 0) { + Log.w(LOGTAG, "Failed to save back/forward list for " + + mCurrentState.mUrl); + } mSavedState.putLong(ID, mId); mSavedState.putString(CURRURL, mCurrentState.mUrl); |