| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/data_use_measurement/chrome_data_use_ascriber.h" | 5 #include "chrome/browser/data_use_measurement/chrome_data_use_ascriber.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
| 10 #include "chrome/browser/data_use_measurement/chrome_data_use_recorder.h" | 10 #include "chrome/browser/data_use_measurement/chrome_data_use_recorder.h" |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 ChromeDataUseAscriber::DataUseRecorderEntryAsUserData:: | 34 ChromeDataUseAscriber::DataUseRecorderEntryAsUserData:: |
| 35 ~DataUseRecorderEntryAsUserData() {} | 35 ~DataUseRecorderEntryAsUserData() {} |
| 36 | 36 |
| 37 ChromeDataUseAscriber::ChromeDataUseAscriber() { | 37 ChromeDataUseAscriber::ChromeDataUseAscriber() { |
| 38 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 38 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 39 } | 39 } |
| 40 | 40 |
| 41 ChromeDataUseAscriber::~ChromeDataUseAscriber() { | 41 ChromeDataUseAscriber::~ChromeDataUseAscriber() { |
| 42 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 42 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 43 DCHECK(subframe_to_mainframe_map_.empty()); | 43 DCHECK(subframe_to_mainframe_map_.empty()); |
| 44 DCHECK(data_use_recorders_.empty()); | 44 // |data_use_recorders_| can be non empty, when mainframe url requests are |
| 45 // created but no mainframe navigations take place. |
| 46 // TODO(rajendrant): Enable this check when fixed for unittests. |
| 47 // DCHECK(data_use_recorders_.empty()); |
| 45 } | 48 } |
| 46 | 49 |
| 47 ChromeDataUseRecorder* ChromeDataUseAscriber::GetOrCreateDataUseRecorder( | 50 ChromeDataUseRecorder* ChromeDataUseAscriber::GetOrCreateDataUseRecorder( |
| 48 net::URLRequest* request) { | 51 net::URLRequest* request) { |
| 49 DataUseRecorderEntry entry = GetOrCreateDataUseRecorderEntry(request); | 52 DataUseRecorderEntry entry = GetOrCreateDataUseRecorderEntry(request); |
| 50 return entry == data_use_recorders_.end() ? nullptr : &(*entry); | 53 return entry == data_use_recorders_.end() ? nullptr : &(*entry); |
| 51 } | 54 } |
| 52 | 55 |
| 53 ChromeDataUseRecorder* ChromeDataUseAscriber::GetDataUseRecorder( | 56 ChromeDataUseRecorder* ChromeDataUseAscriber::GetDataUseRecorder( |
| 54 const net::URLRequest& request) { | 57 const net::URLRequest& request) { |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 DataUseRecorderEntry entry = CreateNewDataUseRecorder( | 152 DataUseRecorderEntry entry = CreateNewDataUseRecorder( |
| 150 request, | 153 request, |
| 151 content::ResourceRequestInfo::OriginatedFromServiceWorker(request) | 154 content::ResourceRequestInfo::OriginatedFromServiceWorker(request) |
| 152 ? DataUse::TrafficType::SERVICE_WORKER | 155 ? DataUse::TrafficType::SERVICE_WORKER |
| 153 : DataUse::TrafficType::UNKNOWN); | 156 : DataUse::TrafficType::UNKNOWN); |
| 154 DataUse& data_use = entry->data_use(); | 157 DataUse& data_use = entry->data_use(); |
| 155 data_use.set_url(request->url()); | 158 data_use.set_url(request->url()); |
| 156 return entry; | 159 return entry; |
| 157 } | 160 } |
| 158 | 161 |
| 162 void ChromeDataUseAscriber::OnUrlRequestCompleted( |
| 163 const net::URLRequest& request, |
| 164 bool started) { |
| 165 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 166 |
| 167 ChromeDataUseRecorder* recorder = GetDataUseRecorder(request); |
| 168 |
| 169 if (!recorder) |
| 170 return; |
| 171 |
| 172 const content::ResourceRequestInfo* request_info = |
| 173 content::ResourceRequestInfo::ForRequest(&request); |
| 174 if (!request_info || |
| 175 request_info->GetResourceType() != content::RESOURCE_TYPE_MAIN_FRAME) { |
| 176 return; |
| 177 } |
| 178 |
| 179 // If mainframe request was not successful, then NavigationHandle in |
| 180 // DidFinishMainFrameNavigation will not have GlobalRequestID. So we erase the |
| 181 // DataUseRecorderEntry here. |
| 182 if (!request.status().is_success()) |
| 183 pending_navigation_data_use_map_.erase(recorder->main_frame_request_id()); |
| 184 } |
| 185 |
| 159 void ChromeDataUseAscriber::OnUrlRequestDestroyed(net::URLRequest* request) { | 186 void ChromeDataUseAscriber::OnUrlRequestDestroyed(net::URLRequest* request) { |
| 160 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 187 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 161 | 188 |
| 189 // TODO(rajendrant): GetDataUseRecorder is sufficient and |
| 190 // GetOrCreateDataUseRecorderEntry is not needed. The entry gets created in |
| 191 // DataUseAscriber::OnBeforeUrlRequest(). |
| 162 DataUseRecorderEntry entry = GetOrCreateDataUseRecorderEntry(request); | 192 DataUseRecorderEntry entry = GetOrCreateDataUseRecorderEntry(request); |
| 163 | 193 |
| 164 if (entry == data_use_recorders_.end()) | 194 if (entry == data_use_recorders_.end()) |
| 165 return; | 195 return; |
| 166 | 196 |
| 167 DataUseRecorder* recorder = &(*entry); | |
| 168 | |
| 169 RenderFrameHostID frame_key = entry->main_frame_id(); | 197 RenderFrameHostID frame_key = entry->main_frame_id(); |
| 170 auto frame_iter = main_render_frame_data_use_map_.find(frame_key); | 198 auto frame_iter = main_render_frame_data_use_map_.find(frame_key); |
| 171 bool is_in_render_frame_map = | 199 bool is_in_render_frame_map = |
| 172 frame_iter != main_render_frame_data_use_map_.end() && | 200 frame_iter != main_render_frame_data_use_map_.end() && |
| 173 frame_iter->second->HasPendingURLRequest(request); | 201 frame_iter->second->HasPendingURLRequest(request); |
| 174 | 202 |
| 175 const content::ResourceRequestInfo* request_info = | 203 const content::ResourceRequestInfo* request_info = |
| 176 content::ResourceRequestInfo::ForRequest(request); | 204 content::ResourceRequestInfo::ForRequest(request); |
| 177 content::ResourceType resource_type = request_info | 205 bool is_in_pending_navigation_map = |
| 178 ? request_info->GetResourceType() | 206 request_info && |
| 179 : content::RESOURCE_TYPE_LAST_TYPE; | 207 request_info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME && |
| 180 | 208 pending_navigation_data_use_map_.find(entry->main_frame_request_id()) != |
| 181 bool is_in_pending_navigation_map = false; | 209 pending_navigation_data_use_map_.end(); |
| 182 if (request_info && resource_type == content::RESOURCE_TYPE_MAIN_FRAME) { | |
| 183 auto navigation_iter = pending_navigation_data_use_map_.find( | |
| 184 entry->main_frame_request_id()); | |
| 185 is_in_pending_navigation_map = | |
| 186 navigation_iter != pending_navigation_data_use_map_.end(); | |
| 187 | |
| 188 // If request was not successful, then NavigationHandle in | |
| 189 // DidFinishMainFrameNavigation will not have GlobalRequestID. So we erase | |
| 190 // the DataUseRecorderEntry here. | |
| 191 if (is_in_pending_navigation_map && !request->status().is_success()) { | |
| 192 pending_navigation_data_use_map_.erase(navigation_iter); | |
| 193 is_in_pending_navigation_map = false; | |
| 194 } | |
| 195 } | |
| 196 | 210 |
| 197 DataUseAscriber::OnUrlRequestDestroyed(request); | 211 DataUseAscriber::OnUrlRequestDestroyed(request); |
| 198 request->RemoveUserData(DataUseRecorderEntryAsUserData::kUserDataKey); | 212 request->RemoveUserData(DataUseRecorderEntryAsUserData::kUserDataKey); |
| 199 | 213 |
| 200 if (recorder->IsDataUseComplete() && !is_in_render_frame_map && | 214 if (entry->IsDataUseComplete() && !is_in_render_frame_map && |
| 201 !is_in_pending_navigation_map) { | 215 !is_in_pending_navigation_map) { |
| 202 OnDataUseCompleted(entry); | 216 OnDataUseCompleted(entry); |
| 203 data_use_recorders_.erase(entry); | 217 data_use_recorders_.erase(entry); |
| 204 } | 218 } |
| 205 } | 219 } |
| 206 | 220 |
| 207 void ChromeDataUseAscriber::RenderFrameCreated(int render_process_id, | 221 void ChromeDataUseAscriber::RenderFrameCreated(int render_process_id, |
| 208 int render_frame_id, | 222 int render_frame_id, |
| 209 int main_render_process_id, | 223 int main_render_process_id, |
| 210 int main_render_frame_id) { | 224 int main_render_frame_id) { |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 425 int new_render_process_id, | 439 int new_render_process_id, |
| 426 int new_render_frame_id) { | 440 int new_render_frame_id) { |
| 427 if (visible_main_render_frames_.find( | 441 if (visible_main_render_frames_.find( |
| 428 RenderFrameHostID(old_render_process_id, old_render_frame_id)) != | 442 RenderFrameHostID(old_render_process_id, old_render_frame_id)) != |
| 429 visible_main_render_frames_.end()) { | 443 visible_main_render_frames_.end()) { |
| 430 WasShownOrHidden(new_render_process_id, new_render_frame_id, true); | 444 WasShownOrHidden(new_render_process_id, new_render_frame_id, true); |
| 431 } | 445 } |
| 432 } | 446 } |
| 433 | 447 |
| 434 } // namespace data_use_measurement | 448 } // namespace data_use_measurement |
| OLD | NEW |