Index: chrome/browser/chromeos/drive/gdata_wapi_feed_loader.cc |
diff --git a/chrome/browser/chromeos/drive/gdata_wapi_feed_loader.cc b/chrome/browser/chromeos/drive/gdata_wapi_feed_loader.cc |
index 2e0d2d46fb9162c6b7b3fba563845aaa56f9bd81..6166c7596cf4e3af2cd8c053193dab6717706007 100644 |
--- a/chrome/browser/chromeos/drive/gdata_wapi_feed_loader.cc |
+++ b/chrome/browser/chromeos/drive/gdata_wapi_feed_loader.cc |
@@ -743,7 +743,7 @@ void GDataWapiFeedLoader::OnNotifyDocumentFeedFetched( |
return; |
} |
- base::TimeDelta elapsed_time = |
+ base::TimeDelta ui_elapsed_time = |
base::TimeTicks::Now() - ui_state->start_time; |
if (ui_state->num_showing_documents + kFetchUiUpdateStep <= |
@@ -759,13 +759,20 @@ void GDataWapiFeedLoader::OnNotifyDocumentFeedFetched( |
// Heuristically, we use fetched time duration to calculate the next |
// UI update timing. |
base::TimeDelta remaining_duration = |
- ui_state->feed_fetching_elapsed_time - elapsed_time; |
+ ui_state->feed_fetching_elapsed_time - ui_elapsed_time; |
+ base::TimeDelta interval = remaining_duration / num_remaining_ui_updates; |
+ // If UI update is slow for some reason, the interval can be |
+ // negative, or very small. This rarely happens but should be handled. |
+ const int kMinIntervalMs = 10; |
+ if (interval.InMilliseconds() < kMinIntervalMs) |
+ interval = base::TimeDelta::FromMilliseconds(kMinIntervalMs); |
+ |
base::MessageLoopProxy::current()->PostDelayedTask( |
FROM_HERE, |
base::Bind(&GDataWapiFeedLoader::OnNotifyDocumentFeedFetched, |
weak_ptr_factory_.GetWeakPtr(), |
ui_state->weak_ptr_factory.GetWeakPtr()), |
- remaining_duration / num_remaining_ui_updates); |
+ interval); |
} |
} |
} |