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

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy.java

Issue 2360183003: Do not overwrite tab_state0 during multi-instance migration (Closed)
Patch Set: Record histograms instead of actions Created 4 years, 3 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
« no previous file with comments | « no previous file | chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/MultiInstanceMigrationTest.java » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
}
« no previous file with comments | « no previous file | chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/MultiInstanceMigrationTest.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698