| 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 073ec3b759bcd874dbe77596632d27bf012f54d7..98244e9013cdfd1f2def4a625da16174debb424c 100644 | 
| --- a/ios/chrome/browser/reading_list/reading_list_model.cc | 
| +++ b/ios/chrome/browser/reading_list/reading_list_model.cc | 
| @@ -4,11 +4,16 @@ | 
|  | 
| #include "ios/chrome/browser/reading_list/reading_list_model.h" | 
|  | 
| +#include "base/logging.h" | 
| +#include "ios/web/public/web_thread.h" | 
| + | 
| ReadingListModel::ReadingListModel() : current_batch_updates_count_(0) {} | 
| + | 
| ReadingListModel::~ReadingListModel() {} | 
|  | 
| // Observer methods. | 
| void ReadingListModel::AddObserver(ReadingListModelObserver* observer) { | 
| +  DCHECK_CURRENTLY_ON(web::WebThread::UI); | 
| DCHECK(observer); | 
| observers_.AddObserver(observer); | 
| if (loaded()) { | 
| @@ -17,32 +22,46 @@ void ReadingListModel::AddObserver(ReadingListModelObserver* observer) { | 
| } | 
|  | 
| void ReadingListModel::RemoveObserver(ReadingListModelObserver* observer) { | 
| +  DCHECK_CURRENTLY_ON(web::WebThread::UI); | 
| observers_.RemoveObserver(observer); | 
| } | 
|  | 
| // Batch update methods. | 
| bool ReadingListModel::IsPerformingBatchUpdates() const { | 
| +  DCHECK_CURRENTLY_ON(web::WebThread::UI); | 
| return current_batch_updates_count_ > 0; | 
| } | 
|  | 
| std::unique_ptr<ReadingListModel::ScopedReadingListBatchUpdate> | 
| ReadingListModel::BeginBatchUpdates() { | 
| +  DCHECK_CURRENTLY_ON(web::WebThread::UI); | 
| std::unique_ptr<ReadingListModel::ScopedReadingListBatchUpdate> token( | 
| new ReadingListModel::ScopedReadingListBatchUpdate(this)); | 
|  | 
| ++current_batch_updates_count_; | 
| if (current_batch_updates_count_ == 1) { | 
| -    FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, | 
| -                      ReadingListModelBeganBatchUpdates(this)); | 
| +    EnteringBatchUpdates(); | 
| } | 
| return token; | 
| } | 
|  | 
| +void ReadingListModel::EnteringBatchUpdates() { | 
| +  DCHECK_CURRENTLY_ON(web::WebThread::UI); | 
| +  FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, | 
| +                    ReadingListModelBeganBatchUpdates(this)); | 
| +} | 
| + | 
| void ReadingListModel::EndBatchUpdates() { | 
| +  DCHECK_CURRENTLY_ON(web::WebThread::UI); | 
| DCHECK(IsPerformingBatchUpdates()); | 
| --current_batch_updates_count_; | 
| if (current_batch_updates_count_ == 0) { | 
| -    FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, | 
| -                      ReadingListModelCompletedBatchUpdates(this)); | 
| +    LeavingBatchUpdates(); | 
| } | 
| } | 
| + | 
| +void ReadingListModel::LeavingBatchUpdates() { | 
| +  DCHECK_CURRENTLY_ON(web::WebThread::UI); | 
| +  FOR_EACH_OBSERVER(ReadingListModelObserver, observers_, | 
| +                    ReadingListModelCompletedBatchUpdates(this)); | 
| +} | 
|  |