| Index: components/history/core/browser/history_backend.cc
|
| diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc
|
| index 4ca3a34a6b09f9fc88bc24bf17be752a1d70a8b6..08a9706789d47820a369d0ba7844747ab8d8ca18 100644
|
| --- a/components/history/core/browser/history_backend.cc
|
| +++ b/components/history/core/browser/history_backend.cc
|
| @@ -22,6 +22,7 @@
|
| #include "base/sequenced_task_runner.h"
|
| #include "base/single_thread_task_runner.h"
|
| #include "base/strings/string_util.h"
|
| +#include "base/strings/stringprintf.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| #include "base/time/time.h"
|
| #include "build/build_config.h"
|
| @@ -68,12 +69,14 @@ using base::TimeTicks;
|
| namespace history {
|
|
|
| namespace {
|
| +
|
| void RunUnlessCanceled(
|
| const base::Closure& closure,
|
| const base::CancelableTaskTracker::IsCanceledCallback& is_canceled) {
|
| if (!is_canceled.Run())
|
| closure.Run();
|
| }
|
| +
|
| } // namespace
|
|
|
| // How long we'll wait to do a commit, so that things are batched together.
|
| @@ -648,7 +651,6 @@ void HistoryBackend::InitImpl(
|
| history_database_params.download_interrupt_reason_none,
|
| history_database_params.download_interrupt_reason_crash));
|
|
|
| - // Unretained to avoid a ref loop with db_.
|
| db_->set_error_callback(base::Bind(&HistoryBackend::DatabaseErrorCallback,
|
| base::Unretained(this)));
|
|
|
| @@ -656,10 +658,6 @@ void HistoryBackend::InitImpl(
|
| switch (status) {
|
| case sql::INIT_OK:
|
| break;
|
| - case sql::INIT_TOO_NEW:
|
| - delegate_->NotifyProfileError(status);
|
| - db_.reset();
|
| - return;
|
| case sql::INIT_FAILURE: {
|
| // A null db_ will cause all calls on this object to notice this error
|
| // and to not continue. If the error callback scheduled killing the
|
| @@ -669,7 +667,14 @@ void HistoryBackend::InitImpl(
|
| if (kill_db)
|
| KillHistoryDatabase();
|
| UMA_HISTOGRAM_BOOLEAN("History.AttemptedToFixProfileError", kill_db);
|
| - delegate_->NotifyProfileError(status);
|
| + } // Falls through.
|
| + case sql::INIT_TOO_NEW: {
|
| + const std::string corrupted_file_name =
|
| + history_name.DirName().BaseName().AsUTF8Unsafe() + "/" +
|
| + history_name.BaseName().AsUTF8Unsafe();
|
| + base::StringAppendF(&db_diagnostics_, "Corrupted file: %s\n",
|
| + corrupted_file_name.c_str());
|
| + delegate_->NotifyProfileError(status, db_diagnostics_);
|
| db_.reset();
|
| return;
|
| }
|
| @@ -2410,6 +2415,9 @@ void HistoryBackend::URLsNoLongerBookmarked(const std::set<GURL>& urls) {
|
| void HistoryBackend::DatabaseErrorCallback(int error, sql::Statement* stmt) {
|
| if (!scheduled_kill_db_ && sql::IsErrorCatastrophic(error)) {
|
| scheduled_kill_db_ = true;
|
| +
|
| + db_diagnostics_ = db_->GetDiagnosticInfo(error, stmt);
|
| +
|
| // Don't just do the close/delete here, as we are being called by |db| and
|
| // that seems dangerous.
|
| // TODO(shess): Consider changing KillHistoryDatabase() to use
|
|
|