Index: content/browser/loader/resource_dispatcher_host_impl.cc |
diff --git a/content/browser/loader/resource_dispatcher_host_impl.cc b/content/browser/loader/resource_dispatcher_host_impl.cc |
index 68f28111b25fd4ba9949222498e670ae84fdaf07..5789e92a5d92fcd303a89caa0a4343719b76dccd 100644 |
--- a/content/browser/loader/resource_dispatcher_host_impl.cc |
+++ b/content/browser/loader/resource_dispatcher_host_impl.cc |
@@ -452,7 +452,7 @@ ResourceDispatcherHostImpl::ResourceDispatcherHostImpl() |
base::Unretained(this))); |
update_load_states_timer_.reset( |
- new base::RepeatingTimer<ResourceDispatcherHostImpl>()); |
+ new base::OneShotTimer<ResourceDispatcherHostImpl>()); |
} |
ResourceDispatcherHostImpl::~ResourceDispatcherHostImpl() { |
@@ -797,12 +797,8 @@ bool ResourceDispatcherHostImpl::HandleExternalProtocol(ResourceLoader* loader, |
} |
void ResourceDispatcherHostImpl::DidStartRequest(ResourceLoader* loader) { |
- // Make sure we have the load state monitor running |
- if (!update_load_states_timer_->IsRunning()) { |
- update_load_states_timer_->Start( |
- FROM_HERE, TimeDelta::FromMilliseconds(kUpdateLoadStatesIntervalMsec), |
- this, &ResourceDispatcherHostImpl::UpdateLoadInfo); |
- } |
+ if (scheduler_->HasLoadingClients() || loader->request()->has_upload()) |
+ ScheduleUpdateLoadInfo(); |
} |
void ResourceDispatcherHostImpl::DidReceiveRedirect(ResourceLoader* loader, |
@@ -910,7 +906,7 @@ void ResourceDispatcherHostImpl::OnShutdown() { |
// Make sure we shutdown the timer now, otherwise by the time our destructor |
// runs if the timer is still running the Task is deleted twice (once by |
- // the MessageLoop and the second time by RepeatingTimer). |
+ // the MessageLoop and the second time by OneShotTimer). |
update_load_states_timer_.reset(); |
// Clear blocked requests if any left. |
@@ -1751,10 +1747,6 @@ void ResourceDispatcherHostImpl::RemovePendingLoader( |
IncrementOutstandingRequestsMemory(-1, *info); |
pending_loaders_.erase(iter); |
- |
- // If we have no more pending requests, then stop the load state monitor |
- if (pending_loaders_.empty() && update_load_states_timer_) |
- update_load_states_timer_->Stop(); |
} |
void ResourceDispatcherHostImpl::CancelRequest(int child_id, |
@@ -2150,15 +2142,19 @@ ResourceDispatcherHostImpl::GetLoadInfoForAllRoutes() { |
// Populate this map with load state changes, and then send them on to the UI |
// thread where they can be passed along to the respective RVHs. |
scoped_ptr<LoadInfoMap> info_map(new LoadInfoMap()); |
+ bool uploading = false; |
for (const auto& loader : pending_loaders_) { |
- // Also poll for upload progress on this timer and send upload progress ipc |
- // messages to the plugin process. |
- loader.second->ReportUploadProgress(); |
- |
net::URLRequest* request = loader.second->request(); |
net::UploadProgress upload_progress = request->GetUploadProgress(); |
+ // Also poll for upload progress on this timer and send upload progress ipc |
+ // messages to the plugin process. |
+ if (request->has_upload()) { |
+ loader.second->ReportUploadProgress(); |
+ uploading = true; |
+ } |
+ |
LoadInfo load_info; |
load_info.url = request->url(); |
load_info.load_state = request->GetLoadState(); |
@@ -2173,6 +2169,10 @@ ResourceDispatcherHostImpl::GetLoadInfoForAllRoutes() { |
(*info_map)[id] = load_info; |
} |
} |
+ |
+ if (uploading) |
+ ScheduleUpdateLoadInfo(); |
+ |
return info_map.Pass(); |
} |
@@ -2186,6 +2186,9 @@ void ResourceDispatcherHostImpl::UpdateLoadInfo() { |
BrowserThread::UI, FROM_HERE, |
base::Bind(&ResourceDispatcherHostImpl::UpdateLoadInfoOnUIThread, |
base::Passed(&info_map))); |
+ |
+ if (scheduler_->HasLoadingClients()) |
+ ScheduleUpdateLoadInfo(); |
} |
void ResourceDispatcherHostImpl::BlockRequestsForRoute(int child_id, |
@@ -2350,4 +2353,12 @@ int ResourceDispatcherHostImpl::BuildLoadFlagsForRequest( |
return load_flags; |
} |
+void ResourceDispatcherHostImpl::ScheduleUpdateLoadInfo() { |
+ if (!update_load_states_timer_->IsRunning()) { |
+ update_load_states_timer_->Start( |
+ FROM_HERE, TimeDelta::FromMilliseconds(kUpdateLoadStatesIntervalMsec), |
+ this, &ResourceDispatcherHostImpl::UpdateLoadInfo); |
+ } |
+} |
+ |
} // namespace content |