From aed9c54d8e67bb683a5a415b3775525a3ac00508 Mon Sep 17 00:00:00 2001 From: John Reck Date: Fri, 27 May 2011 16:08:53 -0700 Subject: Prevent crashing in CrashRecoveryHandler Catch Throwable instead of Exception Don't save screenshots for crash recovery Change-Id: I22c36dc644ae597c609880d2ced79436918d83a6 --- src/com/android/browser/BrowserActivity.java | 4 ++-- src/com/android/browser/Controller.java | 4 ++-- src/com/android/browser/CrashRecoveryHandler.java | 5 ++--- src/com/android/browser/Tab.java | 12 +++++++++--- src/com/android/browser/TabControl.java | 6 ++++-- 5 files changed, 19 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java index 963f29f..dbcae2e 100644 --- a/src/com/android/browser/BrowserActivity.java +++ b/src/com/android/browser/BrowserActivity.java @@ -115,7 +115,7 @@ public class BrowserActivity extends Activity { protected void onNewIntent(Intent intent) { if (ACTION_RESTART.equals(intent.getAction())) { Bundle outState = new Bundle(); - mController.onSaveInstanceState(outState); + mController.onSaveInstanceState(outState, true); finish(); getApplicationContext().startActivity( new Intent(getApplicationContext(), BrowserActivity.class) @@ -166,7 +166,7 @@ public class BrowserActivity extends Activity { if (LOGV_ENABLED) { Log.v(LOGTAG, "BrowserActivity.onSaveInstanceState: this=" + this); } - mController.onSaveInstanceState(outState); + mController.onSaveInstanceState(outState, true); } @Override diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java index e089f5d..1f5c8f0 100644 --- a/src/com/android/browser/Controller.java +++ b/src/com/android/browser/Controller.java @@ -616,7 +616,7 @@ public class Controller mCrashRecoveryHandler.clearState(); } - void onSaveInstanceState(Bundle outState) { + void onSaveInstanceState(Bundle outState, boolean saveImages) { // the default implementation requires each view to have an id. As the // browser handles the state itself and it doesn't use id for the views, // don't call the default implementation. Otherwise it will trigger the @@ -624,7 +624,7 @@ public class Controller // focused view XXX has no id". // Save all the tabs - mTabControl.saveState(outState); + mTabControl.saveState(outState, saveImages); // Save time so that we know how old incognito tabs (if any) are. outState.putSerializable("lastActiveDate", Calendar.getInstance()); } diff --git a/src/com/android/browser/CrashRecoveryHandler.java b/src/com/android/browser/CrashRecoveryHandler.java index 9e98e76..60e39da 100644 --- a/src/com/android/browser/CrashRecoveryHandler.java +++ b/src/com/android/browser/CrashRecoveryHandler.java @@ -22,7 +22,6 @@ import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.os.Bundle; -import android.os.Debug; import android.os.Parcel; import android.util.Log; @@ -45,7 +44,7 @@ public class CrashRecoveryHandler { public void backupState() { final Bundle state = new Bundle(); - mController.onSaveInstanceState(state); + mController.onSaveInstanceState(state, false); final Context context = mController.getActivity(); new Thread() { @Override @@ -57,7 +56,7 @@ public class CrashRecoveryHandler { Context.MODE_PRIVATE); fout.write(p.marshall()); fout.close(); - } catch (Exception e) { + } catch (Throwable e) { Log.i(LOGTAG, "Failed to save persistent state", e); } finally { p.recycle(); diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java index 4097334..98d209e 100644 --- a/src/com/android/browser/Tab.java +++ b/src/com/android/browser/Tab.java @@ -1706,6 +1706,15 @@ class Tab { return mSavedState; } + Bundle getSavedState(boolean saveImages) { + if (saveImages && mScreenshot != null) { + Bundle b = new Bundle(mSavedState); + b.putParcelable(SCREENSHOT, mScreenshot); + return b; + } + return mSavedState; + } + /** * Set the saved state. */ @@ -1739,9 +1748,6 @@ class Tab { if (mParent != null) { mSavedState.putLong(PARENTTAB, mParent.mId); } - if (mScreenshot != null) { - mSavedState.putParcelable(SCREENSHOT, mScreenshot); - } mSavedState.putBoolean(USERAGENT, mSettings.hasDesktopUseragent(getWebView())); return true; diff --git a/src/com/android/browser/TabControl.java b/src/com/android/browser/TabControl.java index 1fe9053..0aaf3d6 100644 --- a/src/com/android/browser/TabControl.java +++ b/src/com/android/browser/TabControl.java @@ -272,15 +272,17 @@ class TabControl { * position sorted array of tab ids * for each tab id, save the tab state * @param outState + * @param saveImages */ - void saveState(Bundle outState) { + void saveState(Bundle outState, boolean saveImages) { final int numTabs = getTabCount(); long[] ids = new long[numTabs]; int i = 0; for (Tab tab : mTabs) { ids[i++] = tab.getId(); if (tab.saveState()) { - outState.putBundle(Long.toString(tab.getId()), tab.getSavedState()); + outState.putBundle(Long.toString(tab.getId()), + tab.getSavedState(saveImages)); } } outState.putLongArray(POSITIONS, ids); -- cgit v1.1