Index: chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc |
diff --git a/chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc b/chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc |
index 7e0c3a2a264cba0c4256380621c5fe2d53bfb2ec..d2fcdfdcba47ad3a5287ea2eb757ecea4c244d59 100644 |
--- a/chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc |
+++ b/chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc |
@@ -41,7 +41,10 @@ ChromeDataUseAscriber::ChromeDataUseAscriber() { |
ChromeDataUseAscriber::~ChromeDataUseAscriber() { |
DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
DCHECK(subframe_to_mainframe_map_.empty()); |
- DCHECK(data_use_recorders_.empty()); |
+ // |data_use_recorders_| can be non empty, when mainframe url requests are |
+ // created but no mainframe navigations take place. |
+ // TODO(rajendrant): Enable this check when fixed for unittests. |
+ // DCHECK(data_use_recorders_.empty()); |
} |
ChromeDataUseRecorder* ChromeDataUseAscriber::GetOrCreateDataUseRecorder( |
@@ -156,16 +159,41 @@ ChromeDataUseAscriber::GetOrCreateDataUseRecorderEntry( |
return entry; |
} |
+void ChromeDataUseAscriber::OnUrlRequestCompleted( |
+ const net::URLRequest& request, |
+ bool started) { |
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
+ |
+ ChromeDataUseRecorder* recorder = GetDataUseRecorder(request); |
+ |
+ if (!recorder) |
+ return; |
+ |
+ const content::ResourceRequestInfo* request_info = |
+ content::ResourceRequestInfo::ForRequest(&request); |
+ if (!request_info || |
+ request_info->GetResourceType() != content::RESOURCE_TYPE_MAIN_FRAME) { |
+ return; |
+ } |
+ |
+ // If mainframe request was not successful, then NavigationHandle in |
+ // DidFinishMainFrameNavigation will not have GlobalRequestID. So we erase the |
+ // DataUseRecorderEntry here. |
+ if (!request.status().is_success()) |
+ pending_navigation_data_use_map_.erase(recorder->main_frame_request_id()); |
+} |
+ |
void ChromeDataUseAscriber::OnUrlRequestDestroyed(net::URLRequest* request) { |
DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
+ // TODO(rajendrant): GetDataUseRecorder is sufficient and |
+ // GetOrCreateDataUseRecorderEntry is not needed. The entry gets created in |
+ // DataUseAscriber::OnBeforeUrlRequest(). |
DataUseRecorderEntry entry = GetOrCreateDataUseRecorderEntry(request); |
if (entry == data_use_recorders_.end()) |
return; |
- DataUseRecorder* recorder = &(*entry); |
- |
RenderFrameHostID frame_key = entry->main_frame_id(); |
auto frame_iter = main_render_frame_data_use_map_.find(frame_key); |
bool is_in_render_frame_map = |
@@ -174,30 +202,16 @@ void ChromeDataUseAscriber::OnUrlRequestDestroyed(net::URLRequest* request) { |
const content::ResourceRequestInfo* request_info = |
content::ResourceRequestInfo::ForRequest(request); |
- content::ResourceType resource_type = request_info |
- ? request_info->GetResourceType() |
- : content::RESOURCE_TYPE_LAST_TYPE; |
- |
- bool is_in_pending_navigation_map = false; |
- if (request_info && resource_type == content::RESOURCE_TYPE_MAIN_FRAME) { |
- auto navigation_iter = pending_navigation_data_use_map_.find( |
- entry->main_frame_request_id()); |
- is_in_pending_navigation_map = |
- navigation_iter != pending_navigation_data_use_map_.end(); |
- |
- // If request was not successful, then NavigationHandle in |
- // DidFinishMainFrameNavigation will not have GlobalRequestID. So we erase |
- // the DataUseRecorderEntry here. |
- if (is_in_pending_navigation_map && !request->status().is_success()) { |
- pending_navigation_data_use_map_.erase(navigation_iter); |
- is_in_pending_navigation_map = false; |
- } |
- } |
+ bool is_in_pending_navigation_map = |
+ request_info && |
+ request_info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME && |
+ pending_navigation_data_use_map_.find(entry->main_frame_request_id()) != |
+ pending_navigation_data_use_map_.end(); |
DataUseAscriber::OnUrlRequestDestroyed(request); |
request->RemoveUserData(DataUseRecorderEntryAsUserData::kUserDataKey); |
- if (recorder->IsDataUseComplete() && !is_in_render_frame_map && |
+ if (entry->IsDataUseComplete() && !is_in_render_frame_map && |
!is_in_pending_navigation_map) { |
OnDataUseCompleted(entry); |
data_use_recorders_.erase(entry); |