Index: chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy.java |
index 83e2ae19f84a64a5279f54b00946df6d24d9c75d..3100095057b1a587cff8f536b5e927d4770542b5 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy.java |
@@ -19,6 +19,8 @@ import org.chromium.base.PathUtils; |
import org.chromium.base.StreamUtil; |
import org.chromium.base.ThreadUtils; |
import org.chromium.base.VisibleForTesting; |
+import org.chromium.base.library_loader.LibraryLoader; |
+import org.chromium.base.metrics.RecordHistogram; |
import org.chromium.chrome.browser.TabState; |
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; |
@@ -216,12 +218,27 @@ public class TabbedModeTabPersistencePolicy implements TabPersistencePolicy { |
*/ |
@WorkerThread |
private void performMultiInstanceMigration() { |
- // 1. Rename tab metadata file for tab directory "0". |
+ // 0. Do not rename the old metadata file if the new metadata file already exists. This |
+ // should not happen, but if it does and the metadata file is overwritten then users |
+ // may lose tabs. See crbug.com/649384. |
File stateDir = getOrCreateStateDirectory(); |
- File metadataFile = new File(stateDir, LEGACY_SAVED_STATE_FILE); |
- if (metadataFile.exists()) { |
- if (!metadataFile.renameTo(new File(stateDir, getStateFileName()))) { |
- Log.e(TAG, "Failed to rename file: " + metadataFile); |
+ File newMetadataFile = new File(stateDir, getStateFileName()); |
+ File oldMetadataFile = new File(stateDir, LEGACY_SAVED_STATE_FILE); |
+ if (newMetadataFile.exists()) { |
+ Log.e(TAG, "New metadata file already exists"); |
+ if (LibraryLoader.isInitialized()) { |
+ RecordHistogram.recordBooleanHistogram( |
+ "Android.MultiInstanceMigration.NewMetadataFileExists", true); |
+ } |
+ } else if (oldMetadataFile.exists()) { |
+ // 1. Rename tab metadata file for tab directory "0". |
+ if (!oldMetadataFile.renameTo(newMetadataFile)) { |
+ Log.e(TAG, "Failed to rename file: " + oldMetadataFile); |
+ |
+ if (LibraryLoader.isInitialized()) { |
+ RecordHistogram.recordBooleanHistogram( |
+ "Android.MultiInstanceMigration.FailedToRenameMetadataFile", true); |
+ } |
} |
} |
@@ -236,10 +253,10 @@ public class TabbedModeTabPersistencePolicy implements TabPersistencePolicy { |
if (otherStateDir == null || !otherStateDir.exists()) continue; |
// Rename tab state file. |
- metadataFile = new File(otherStateDir, LEGACY_SAVED_STATE_FILE); |
- if (metadataFile.exists()) { |
- if (!metadataFile.renameTo(new File(stateDir, getStateFileName(i)))) { |
- Log.e(TAG, "Failed to rename file: " + metadataFile); |
+ oldMetadataFile = new File(otherStateDir, LEGACY_SAVED_STATE_FILE); |
+ if (oldMetadataFile.exists()) { |
+ if (!oldMetadataFile.renameTo(new File(stateDir, getStateFileName(i)))) { |
+ Log.e(TAG, "Failed to rename file: " + oldMetadataFile); |
} |
} |