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 |