| 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..9bbb3cd222a5943ffc8d975d7420019be8de9e61 100644 | 
| --- a/ios/chrome/browser/reading_list/reading_list_model.cc | 
| +++ b/ios/chrome/browser/reading_list/reading_list_model.cc | 
| @@ -4,7 +4,11 @@ | 
|  | 
| #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() { | 
| for (auto& observer : observers_) { | 
| observer.ReadingListModelBeingDeleted(this); | 
| @@ -13,6 +17,7 @@ ReadingListModel::~ReadingListModel() { | 
|  | 
| // Observer methods. | 
| void ReadingListModel::AddObserver(ReadingListModelObserver* observer) { | 
| +  DCHECK(CalledOnValidThread()); | 
| DCHECK(observer); | 
| observers_.AddObserver(observer); | 
| if (loaded()) { | 
| @@ -21,32 +26,47 @@ 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::BeginBatchUpdates() { | 
| +  DCHECK(CalledOnValidThread()); | 
| std::unique_ptr<ReadingListModel::ScopedReadingListBatchUpdate> token( | 
| new ReadingListModel::ScopedReadingListBatchUpdate(this)); | 
|  | 
| ++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); | 
| +} | 
|  |