Chromium Code Reviews| Index: ios/chrome/browser/reading_list/reading_list_model.cc |
| diff --git a/ios/chrome/browser/reading_list/reading_list_model.cc b/ios/chrome/browser/reading_list/reading_list_model.cc |
| index 2b7e896ad8845ec1738072f502d63e1d723e9755..da06755cfbf9cca4033ef8a61ad3943968a49a31 100644 |
| --- a/ios/chrome/browser/reading_list/reading_list_model.cc |
| +++ b/ios/chrome/browser/reading_list/reading_list_model.cc |
| @@ -4,7 +4,12 @@ |
| #include "ios/chrome/browser/reading_list/reading_list_model.h" |
| +#include "base/logging.h" |
| +#include "base/memory/ptr_util.h" |
| +#include "ios/web/public/web_thread.h" |
|
pavely
2016/11/14 07:45:33
web_tread.h is not used.
Olivier
2016/11/14 11:36:48
Done.
|
| + |
| ReadingListModel::ReadingListModel() : current_batch_updates_count_(0) {} |
| + |
| ReadingListModel::~ReadingListModel() { |
| for (auto& observer : observers_) { |
| observer.ReadingListModelBeingDeleted(this); |
| @@ -13,6 +18,7 @@ ReadingListModel::~ReadingListModel() { |
| // Observer methods. |
| void ReadingListModel::AddObserver(ReadingListModelObserver* observer) { |
| + DCHECK(CalledOnValidThread()); |
| DCHECK(observer); |
| observers_.AddObserver(observer); |
| if (loaded()) { |
| @@ -21,32 +27,56 @@ void ReadingListModel::AddObserver(ReadingListModelObserver* observer) { |
| } |
| void ReadingListModel::RemoveObserver(ReadingListModelObserver* observer) { |
| + DCHECK(CalledOnValidThread()); |
| observers_.RemoveObserver(observer); |
| } |
| // Batch update methods. |
| bool ReadingListModel::IsPerformingBatchUpdates() const { |
| + DCHECK(CalledOnValidThread()); |
| return current_batch_updates_count_ > 0; |
| } |
| std::unique_ptr<ReadingListModel::ScopedReadingListBatchUpdate> |
| +ReadingListModel::CreateBatchToken() { |
| + return base::MakeUnique<ReadingListModel::ScopedReadingListBatchUpdate>(this); |
| +} |
| + |
| +std::unique_ptr<ReadingListModel::ScopedReadingListBatchUpdate> |
| ReadingListModel::BeginBatchUpdates() { |
| - std::unique_ptr<ReadingListModel::ScopedReadingListBatchUpdate> token( |
| - new ReadingListModel::ScopedReadingListBatchUpdate(this)); |
| + DCHECK(CalledOnValidThread()); |
| + auto token = CreateBatchToken(); |
| ++current_batch_updates_count_; |
| if (current_batch_updates_count_ == 1) { |
| - for (auto& observer : observers_) |
| - observer.ReadingListModelBeganBatchUpdates(this); |
| + EnteringBatchUpdates(); |
| } |
| return token; |
| } |
| +void ReadingListModel::EnteringBatchUpdates() { |
| + DCHECK(CalledOnValidThread()); |
| + for (auto& observer : observers_) |
| + observer.ReadingListModelBeganBatchUpdates(this); |
| +} |
| + |
| void ReadingListModel::EndBatchUpdates() { |
| + DCHECK(CalledOnValidThread()); |
| DCHECK(IsPerformingBatchUpdates()); |
| + DCHECK(current_batch_updates_count_ > 0); |
| --current_batch_updates_count_; |
| if (current_batch_updates_count_ == 0) { |
| - for (auto& observer : observers_) |
| - observer.ReadingListModelCompletedBatchUpdates(this); |
| + LeavingBatchUpdates(); |
| } |
| } |
| + |
| +void ReadingListModel::LeavingBatchUpdates() { |
| + DCHECK(CalledOnValidThread()); |
| + for (auto& observer : observers_) |
| + observer.ReadingListModelCompletedBatchUpdates(this); |
| +} |
| + |
| +ReadingListModel::ScopedReadingListBatchUpdate:: |
| + ~ScopedReadingListBatchUpdate() { |
| + model_->EndBatchUpdates(); |
| +} |