Index: components/webdata/common/web_database_service.cc |
diff --git a/components/webdata/common/web_database_service.cc b/components/webdata/common/web_database_service.cc |
index a1b18895e84c0f788c884b8a7231e78f7319a7fb..88a7c8934c204d03f636e5b8c058d40031340a33 100644 |
--- a/components/webdata/common/web_database_service.cc |
+++ b/components/webdata/common/web_database_service.cc |
@@ -40,7 +40,8 @@ class WebDatabaseService::BackendDelegate : |
WebDatabaseService::WebDatabaseService( |
const base::FilePath& path) |
: path_(path), |
- weak_ptr_factory_(this) { |
+ weak_ptr_factory_(this), |
+ db_loaded_(false) { |
// WebDatabaseService should be instantiated on UI thread. |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
// WebDatabaseService requires DB thread if instantiated. |
@@ -68,6 +69,7 @@ void WebDatabaseService::LoadDatabase() { |
} |
void WebDatabaseService::UnloadDatabase() { |
+ db_loaded_ = false; |
if (!wds_backend_.get()) |
return; |
BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
@@ -76,9 +78,12 @@ void WebDatabaseService::UnloadDatabase() { |
} |
void WebDatabaseService::ShutdownDatabase() { |
+ db_loaded_ = false; |
+ weak_ptr_factory_.InvalidateWeakPtrs(); |
+ loaded_callbacks_.clear(); |
+ error_callbacks_.clear(); |
if (!wds_backend_.get()) |
return; |
- weak_ptr_factory_.InvalidateWeakPtrs(); |
BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
Bind(&WebDataServiceBackend::ShutdownDatabase, |
wds_backend_, false)); |
@@ -140,24 +145,33 @@ void WebDatabaseService::CancelRequest(WebDataServiceBase::Handle h) { |
wds_backend_->request_manager()->CancelRequest(h); |
} |
-void WebDatabaseService::AddObserver(WebDatabaseObserver* observer) { |
- observer_list_.AddObserver(observer); |
+void WebDatabaseService::RegisterDBLoadedCallback( |
+ const base::Callback<void(void)>& callback) { |
+ loaded_callbacks_.push_back(callback); |
} |
-void WebDatabaseService::RemoveObserver(WebDatabaseObserver* observer) { |
- observer_list_.RemoveObserver(observer); |
+void WebDatabaseService::RegisterDBErrorCallback( |
+ const base::Callback<void(sql::InitStatus)>& callback) { |
+ error_callbacks_.push_back(callback); |
} |
void WebDatabaseService::OnDatabaseLoadDone(sql::InitStatus status) { |
if (status == sql::INIT_OK) { |
- // Notify that the database has been initialized. |
- FOR_EACH_OBSERVER(WebDatabaseObserver, |
- observer_list_, |
- WebDatabaseLoaded()); |
+ db_loaded_ = true; |
+ |
+ for (size_t i = 0; i < loaded_callbacks_.size(); i++) { |
+ if (!loaded_callbacks_[i].is_null()) |
+ loaded_callbacks_[i].Run(); |
+ } |
+ |
+ loaded_callbacks_.clear(); |
} else { |
// Notify that the database load failed. |
- FOR_EACH_OBSERVER(WebDatabaseObserver, |
- observer_list_, |
- WebDatabaseLoadFailed(status)); |
+ for (size_t i = 0; i < error_callbacks_.size(); i++) { |
+ if (!error_callbacks_[i].is_null()) |
+ error_callbacks_[i].Run(status); |
+ } |
+ |
+ error_callbacks_.clear(); |
} |
} |