| Index: chrome/browser/diagnostics/sqlite_diagnostics.cc
 | 
| diff --git a/chrome/browser/diagnostics/sqlite_diagnostics.cc b/chrome/browser/diagnostics/sqlite_diagnostics.cc
 | 
| index 81753a87f793d706d43d297f2ce402974e9c400a..2cd1ca14aafdb8fb003e0cf77c76b186bd73c002 100644
 | 
| --- a/chrome/browser/diagnostics/sqlite_diagnostics.cc
 | 
| +++ b/chrome/browser/diagnostics/sqlite_diagnostics.cc
 | 
| @@ -47,12 +47,45 @@ namespace {
 | 
|  // Generic diagnostic test class for checking SQLite database integrity.
 | 
|  class SqliteIntegrityTest : public DiagnosticsTest {
 | 
|   public:
 | 
| +  // These are bit flags, so each value should be a power of two.
 | 
| +  enum Flags {
 | 
| +    NO_FLAGS_SET = 0,
 | 
| +    CRITICAL = 0x01,
 | 
| +    REMOVE_IF_CORRUPT = 0x02,
 | 
| +  };
 | 
|  
 | 
| -  SqliteIntegrityTest(bool critical,
 | 
| +  SqliteIntegrityTest(uint32 flags,
 | 
|                        const std::string& id,
 | 
|                        const std::string& title,
 | 
|                        const base::FilePath& db_path)
 | 
| -      : DiagnosticsTest(id, title), critical_(critical), db_path_(db_path) {}
 | 
| +      : DiagnosticsTest(id, title),
 | 
| +        flags_(flags),
 | 
| +        db_path_(db_path) {}
 | 
| +
 | 
| +  virtual bool RecoveryImpl(DiagnosticsModel::Observer* observer) OVERRIDE {
 | 
| +    int outcome_code = GetOutcomeCode();
 | 
| +    if (flags_ & REMOVE_IF_CORRUPT) {
 | 
| +      switch (outcome_code) {
 | 
| +        case DIAG_SQLITE_ERROR_HANDLER_CALLED:
 | 
| +        case DIAG_SQLITE_CANNOT_OPEN_DB:
 | 
| +        case DIAG_SQLITE_DB_LOCKED:
 | 
| +        case DIAG_SQLITE_PRAGMA_FAILED:
 | 
| +        case DIAG_SQLITE_DB_CORRUPTED:
 | 
| +          LOG(WARNING) << "Removing broken SQLite database: "
 | 
| +                       << db_path_.value();
 | 
| +          base::DeleteFile(db_path_, false);
 | 
| +          break;
 | 
| +        case DIAG_SQLITE_SUCCESS:
 | 
| +        case DIAG_SQLITE_FILE_NOT_FOUND_OK:
 | 
| +        case DIAG_SQLITE_FILE_NOT_FOUND:
 | 
| +          break;
 | 
| +        default:
 | 
| +          DCHECK(false) << "Invalid outcome code: " << outcome_code;
 | 
| +          break;
 | 
| +      }
 | 
| +    }
 | 
| +    return true;
 | 
| +  }
 | 
|  
 | 
|    virtual bool ExecuteImpl(DiagnosticsModel::Observer* observer) OVERRIDE {
 | 
|      // If we're given an absolute path, use it. If not, then assume it's under
 | 
| @@ -64,7 +97,7 @@ class SqliteIntegrityTest : public DiagnosticsTest {
 | 
|        path = db_path_;
 | 
|  
 | 
|      if (!base::PathExists(path)) {
 | 
| -      if (critical_) {
 | 
| +      if (flags_ & CRITICAL) {
 | 
|          RecordOutcome(DIAG_SQLITE_FILE_NOT_FOUND,
 | 
|                        "File not found",
 | 
|                        DiagnosticsModel::TEST_FAIL_CONTINUE);
 | 
| @@ -178,7 +211,7 @@ class SqliteIntegrityTest : public DiagnosticsTest {
 | 
|      DISALLOW_COPY_AND_ASSIGN(ErrorRecorder);
 | 
|    };
 | 
|  
 | 
| -  bool critical_;
 | 
| +  uint32 flags_;
 | 
|    base::FilePath db_path_;
 | 
|    DISALLOW_COPY_AND_ASSIGN(SqliteIntegrityTest);
 | 
|  };
 | 
| @@ -186,21 +219,21 @@ class SqliteIntegrityTest : public DiagnosticsTest {
 | 
|  }  // namespace
 | 
|  
 | 
|  DiagnosticsTest* MakeSqliteWebDbTest() {
 | 
| -  return new SqliteIntegrityTest(true,
 | 
| +  return new SqliteIntegrityTest(SqliteIntegrityTest::CRITICAL,
 | 
|                                   kSQLiteIntegrityWebTest,
 | 
|                                   "Web Database",
 | 
|                                   base::FilePath(kWebDataFilename));
 | 
|  }
 | 
|  
 | 
|  DiagnosticsTest* MakeSqliteCookiesDbTest() {
 | 
| -  return new SqliteIntegrityTest(true,
 | 
| +  return new SqliteIntegrityTest(SqliteIntegrityTest::CRITICAL,
 | 
|                                   kSQLiteIntegrityCookieTest,
 | 
|                                   "Cookies Database",
 | 
|                                   base::FilePath(chrome::kCookieFilename));
 | 
|  }
 | 
|  
 | 
|  DiagnosticsTest* MakeSqliteHistoryDbTest() {
 | 
| -  return new SqliteIntegrityTest(true,
 | 
| +  return new SqliteIntegrityTest(SqliteIntegrityTest::CRITICAL,
 | 
|                                   kSQLiteIntegrityHistoryTest,
 | 
|                                   "History Database",
 | 
|                                   base::FilePath(chrome::kHistoryFilename));
 | 
| @@ -208,14 +241,14 @@ DiagnosticsTest* MakeSqliteHistoryDbTest() {
 | 
|  
 | 
|  DiagnosticsTest* MakeSqliteArchivedHistoryDbTest() {
 | 
|    return new SqliteIntegrityTest(
 | 
| -      false,
 | 
| +      SqliteIntegrityTest::NO_FLAGS_SET,
 | 
|        kSQLiteIntegrityArchivedHistoryTest,
 | 
|        "Archived History Database",
 | 
|        base::FilePath(chrome::kArchivedHistoryFilename));
 | 
|  }
 | 
|  
 | 
|  DiagnosticsTest* MakeSqliteThumbnailsDbTest() {
 | 
| -  return new SqliteIntegrityTest(false,
 | 
| +  return new SqliteIntegrityTest(SqliteIntegrityTest::NO_FLAGS_SET,
 | 
|                                   kSQLiteIntegrityThumbnailsTest,
 | 
|                                   "Thumbnails Database",
 | 
|                                   base::FilePath(chrome::kThumbnailsFilename));
 | 
| @@ -225,7 +258,7 @@ DiagnosticsTest* MakeSqliteAppCacheDbTest() {
 | 
|    base::FilePath appcache_dir(content::kAppCacheDirname);
 | 
|    base::FilePath appcache_db =
 | 
|        appcache_dir.Append(appcache::kAppCacheDatabaseName);
 | 
| -  return new SqliteIntegrityTest(false,
 | 
| +  return new SqliteIntegrityTest(SqliteIntegrityTest::NO_FLAGS_SET,
 | 
|                                   kSQLiteIntegrityAppCacheTest,
 | 
|                                   "Application Cache Database",
 | 
|                                   appcache_db);
 | 
| @@ -235,7 +268,7 @@ DiagnosticsTest* MakeSqliteWebDatabaseTrackerDbTest() {
 | 
|    base::FilePath databases_dir(webkit_database::kDatabaseDirectoryName);
 | 
|    base::FilePath tracker_db =
 | 
|        databases_dir.Append(webkit_database::kTrackerDatabaseFileName);
 | 
| -  return new SqliteIntegrityTest(false,
 | 
| +  return new SqliteIntegrityTest(SqliteIntegrityTest::NO_FLAGS_SET,
 | 
|                                   kSQLiteIntegrityDatabaseTrackerTest,
 | 
|                                   "Database Tracker Database",
 | 
|                                   tracker_db);
 | 
| @@ -244,7 +277,7 @@ DiagnosticsTest* MakeSqliteWebDatabaseTrackerDbTest() {
 | 
|  #if defined(OS_CHROMEOS)
 | 
|  DiagnosticsTest* MakeSqliteNssCertDbTest() {
 | 
|    base::FilePath home_dir = file_util::GetHomeDir();
 | 
| -  return new SqliteIntegrityTest(false,
 | 
| +  return new SqliteIntegrityTest(SqliteIntegrityTest::REMOVE_IF_CORRUPT,
 | 
|                                   kSQLiteIntegrityNSSCertTest,
 | 
|                                   "NSS Certificate Database",
 | 
|                                   home_dir.Append(chromeos::kNssCertDbPath));
 | 
| @@ -252,7 +285,7 @@ DiagnosticsTest* MakeSqliteNssCertDbTest() {
 | 
|  
 | 
|  DiagnosticsTest* MakeSqliteNssKeyDbTest() {
 | 
|    base::FilePath home_dir = file_util::GetHomeDir();
 | 
| -  return new SqliteIntegrityTest(false,
 | 
| +  return new SqliteIntegrityTest(SqliteIntegrityTest::REMOVE_IF_CORRUPT,
 | 
|                                   kSQLiteIntegrityNSSKeyTest,
 | 
|                                   "NSS Key Database",
 | 
|                                   home_dir.Append(chromeos::kNssKeyDbPath));
 | 
| 
 |