Index: chrome/browser/browsing_data/cookies_tree_model.cc |
diff --git a/chrome/browser/browsing_data/cookies_tree_model.cc b/chrome/browser/browsing_data/cookies_tree_model.cc |
index 8deb087ada30b5d027e63159f07750d21d53f6fe..9c36bb498a9079a3e9ca99db585da38f49680b4b 100644 |
--- a/chrome/browser/browsing_data/cookies_tree_model.cc |
+++ b/chrome/browser/browsing_data/cookies_tree_model.cc |
@@ -910,12 +910,17 @@ CookieTreeNode::DetailedInfo CookieTreeFlashLSONode::GetDetailedInfo() const { |
CookiesTreeModel::ScopedBatchUpdateNotifier::ScopedBatchUpdateNotifier( |
CookiesTreeModel* model, CookieTreeNode* node) |
: model_(model), node_(node), batch_in_progress_(false) { |
+ model_->RecordBatchSeen(); |
} |
CookiesTreeModel::ScopedBatchUpdateNotifier::~ScopedBatchUpdateNotifier() { |
if (batch_in_progress_) { |
model_->NotifyObserverTreeNodeChanged(node_); |
model_->NotifyObserverEndBatch(); |
+ } else { |
+ // If no batch started, and this is the last batch, give the model a chance |
+ // to send out a final notification. |
+ model_->MaybeNotifyBatchesEnded(); |
} |
} |
@@ -938,7 +943,10 @@ CookiesTreeModel::CookiesTreeModel( |
special_storage_policy_(special_storage_policy), |
#endif |
group_by_cookie_source_(group_by_cookie_source), |
- batch_update_(0) { |
+ batches_expected_(0), |
+ batches_seen_(0), |
+ batches_started_(0), |
+ batches_ended_(0) { |
data_container_->Init(this); |
} |
@@ -1017,6 +1025,7 @@ void CookiesTreeModel::DeleteCookieNode(CookieTreeNode* cookie_node) { |
void CookiesTreeModel::UpdateSearchResults(const base::string16& filter) { |
CookieTreeNode* root = GetRoot(); |
+ SetBatchExpectation(1, true); |
ScopedBatchUpdateNotifier notifier(this, root); |
int num_children = root->child_count(); |
notifier.StartBatchUpdate(); |
@@ -1425,9 +1434,24 @@ void CookiesTreeModel::PopulateFlashLSOInfoWithFilter( |
} |
} |
+void CookiesTreeModel::SetBatchExpectation(int batches_expected, bool reset) { |
+ batches_expected_ = batches_expected; |
+ if (reset) { |
+ batches_seen_ = 0; |
+ batches_started_ = 0; |
+ batches_ended_ = 0; |
+ } else { |
+ MaybeNotifyBatchesEnded(); |
+ } |
+} |
+ |
+void CookiesTreeModel::RecordBatchSeen() { |
+ batches_seen_++; |
+} |
+ |
void CookiesTreeModel::NotifyObserverBeginBatch() { |
// Only notify the model once if we're batching in a nested manner. |
- if (batch_update_++ == 0) { |
+ if (batches_started_++ == 0) { |
FOR_EACH_OBSERVER(Observer, |
cookies_observer_list_, |
TreeModelBeginBatch(this)); |
@@ -1435,9 +1459,15 @@ void CookiesTreeModel::NotifyObserverBeginBatch() { |
} |
void CookiesTreeModel::NotifyObserverEndBatch() { |
+ batches_ended_++; |
+ MaybeNotifyBatchesEnded(); |
+} |
+ |
+void CookiesTreeModel::MaybeNotifyBatchesEnded() { |
// Only notify the observers if this is the outermost call to EndBatch() if |
// called in a nested manner. |
- if (--batch_update_ == 0) { |
+ if (batches_ended_ == batches_started_ && |
+ batches_seen_ == batches_expected_) { |
FOR_EACH_OBSERVER(Observer, |
cookies_observer_list_, |
TreeModelEndBatch(this)); |