| 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 2cf800aaa50bd884b0c3b0a065fe5130fef47938..19be8e00c7fd37efde2c43a51d679f4a3e2d90ab 100644
 | 
| --- a/chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc
 | 
| +++ b/chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc
 | 
| @@ -195,30 +195,36 @@ void ChromeDataUseAscriber::OnUrlRequestDestroyed(net::URLRequest* request) {
 | 
|    for (auto& observer : observers_)
 | 
|      observer.OnPageResourceLoad(*request, &entry->data_use());
 | 
|  
 | 
| -  bool will_datause_complete = false;
 | 
| +  const auto frame_iter =
 | 
| +      main_render_frame_data_use_map_.find(entry->main_frame_id());
 | 
| +
 | 
| +  // Check whether the frame is tracked in the main render frame map, and if it
 | 
| +  // is, check if |entry| is currently tracked by that frame.
 | 
| +  bool frame_is_tracked = frame_iter != main_render_frame_data_use_map_.end() &&
 | 
| +                          frame_iter->second == entry;
 | 
| +
 | 
| +  // For non-main frame requests, the page load can only be tracked in the frame
 | 
| +  // map.
 | 
| +  bool page_load_is_tracked = frame_is_tracked;
 | 
| +
 | 
|    const content::ResourceRequestInfo* request_info =
 | 
|        content::ResourceRequestInfo::ForRequest(request);
 | 
|  
 | 
| -  if (request_info &&
 | 
| +  // If the frame is not tracked, but this is a main frame request, it might be
 | 
| +  // the case that the navigation has not commit yet.
 | 
| +  if (!frame_is_tracked && request_info &&
 | 
|        request_info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME) {
 | 
| -    will_datause_complete =
 | 
| -        pending_navigation_data_use_map_.find(entry->main_frame_request_id()) ==
 | 
| +    page_load_is_tracked =
 | 
| +        pending_navigation_data_use_map_.find(entry->main_frame_request_id()) !=
 | 
|          pending_navigation_data_use_map_.end();
 | 
| -  } else {
 | 
| -    // Non-mainframe, Services, and other requests.
 | 
| -    const auto frame_iter =
 | 
| -        main_render_frame_data_use_map_.find(entry->main_frame_id());
 | 
| -    will_datause_complete =
 | 
| -        frame_iter == main_render_frame_data_use_map_.end() ||
 | 
| -        !frame_iter->second->HasPendingURLRequest(request);
 | 
|    }
 | 
|  
 | 
|    DataUseAscriber::OnUrlRequestDestroyed(request);
 | 
| -  request->RemoveUserData(DataUseRecorderEntryAsUserData::kUserDataKey);
 | 
|  
 | 
| -  if (entry->IsDataUseComplete() && will_datause_complete) {
 | 
| +  // If all requests are done for |entry| and no more requests can be attributed
 | 
| +  // to it, it is safe to delete.
 | 
| +  if (entry->IsDataUseComplete() && !page_load_is_tracked) {
 | 
|      NotifyDataUseCompleted(entry);
 | 
| -    main_render_frame_data_use_map_.erase(entry->main_frame_id());
 | 
|      data_use_recorders_.erase(entry);
 | 
|    }
 | 
|  }
 | 
| 
 |