Chromium Code Reviews| 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> | |
| 8 | |
| 7 #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" | |
| 8 #include "components/data_use_measurement/content/content_url_request_classifier .h" | 11 #include "components/data_use_measurement/content/content_url_request_classifier .h" |
| 9 #include "components/data_use_measurement/core/data_use_recorder.h" | 12 #include "components/data_use_measurement/core/data_use_recorder.h" |
| 10 #include "components/data_use_measurement/core/data_use_user_data.h" | 13 #include "components/data_use_measurement/core/data_use_user_data.h" |
| 11 #include "components/data_use_measurement/core/url_request_classifier.h" | 14 #include "components/data_use_measurement/core/url_request_classifier.h" |
| 12 #include "content/public/browser/browser_thread.h" | 15 #include "content/public/browser/browser_thread.h" |
| 13 #include "content/public/browser/navigation_handle.h" | 16 #include "content/public/browser/navigation_handle.h" |
| 14 #include "content/public/browser/render_frame_host.h" | 17 #include "content/public/browser/render_frame_host.h" |
| 15 #include "content/public/browser/resource_request_info.h" | 18 #include "content/public/browser/resource_request_info.h" |
| 16 #include "content/public/common/browser_side_navigation_policy.h" | 19 #include "content/public/common/browser_side_navigation_policy.h" |
| 20 #include "ipc/ipc_message.h" | |
| 17 #include "net/url_request/url_request.h" | 21 #include "net/url_request/url_request.h" |
| 18 | 22 |
| 19 namespace data_use_measurement { | 23 namespace data_use_measurement { |
| 20 | 24 |
| 21 // static | 25 // static |
| 22 const void* ChromeDataUseAscriber::DataUseRecorderEntryAsUserData:: | 26 const void* ChromeDataUseAscriber::DataUseRecorderEntryAsUserData:: |
| 23 kUserDataKey = static_cast<void*>( | 27 kUserDataKey = static_cast<void*>( |
| 24 &ChromeDataUseAscriber::DataUseRecorderEntryAsUserData::kUserDataKey); | 28 &ChromeDataUseAscriber::DataUseRecorderEntryAsUserData::kUserDataKey); |
| 25 | 29 |
| 26 ChromeDataUseAscriber::DataUseRecorderEntryAsUserData:: | 30 ChromeDataUseAscriber::DataUseRecorderEntryAsUserData:: |
| 27 DataUseRecorderEntryAsUserData(DataUseRecorderEntry entry) | 31 DataUseRecorderEntryAsUserData(DataUseRecorderEntry entry) |
| 28 : entry_(entry) {} | 32 : entry_(entry) {} |
| 29 | 33 |
| 30 ChromeDataUseAscriber::DataUseRecorderEntryAsUserData:: | 34 ChromeDataUseAscriber::DataUseRecorderEntryAsUserData:: |
| 31 ~DataUseRecorderEntryAsUserData() {} | 35 ~DataUseRecorderEntryAsUserData() {} |
| 32 | 36 |
| 33 ChromeDataUseAscriber::ChromeDataUseAscriber() { | 37 ChromeDataUseAscriber::ChromeDataUseAscriber() { |
| 34 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 38 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 35 } | 39 } |
| 36 | 40 |
| 37 ChromeDataUseAscriber::~ChromeDataUseAscriber() { | 41 ChromeDataUseAscriber::~ChromeDataUseAscriber() { |
| 38 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 42 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 39 DCHECK_EQ(0u, data_use_recorders_.size()); | 43 DCHECK_EQ(0u, data_use_recorders_.size()); |
| 40 } | 44 } |
| 41 | 45 |
| 42 DataUseRecorder* ChromeDataUseAscriber::GetDataUseRecorder( | 46 ChromeDataUseRecorder* ChromeDataUseAscriber::GetDataUseRecorder( |
| 43 net::URLRequest* request) { | 47 net::URLRequest* request, |
| 48 bool can_create_new) { | |
| 49 DataUseRecorderEntry entry = GetDataUseRecorderEntry(request, can_create_new); | |
| 50 return entry == data_use_recorders_.end() ? nullptr : &(*entry); | |
| 51 } | |
| 52 | |
| 53 ChromeDataUseAscriber::DataUseRecorderEntry | |
| 54 ChromeDataUseAscriber::GetDataUseRecorderEntry(net::URLRequest* request, | |
| 55 bool can_create_new) { | |
| 44 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 56 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 45 return nullptr; | 57 |
| 58 // TODO(ryansturm): Handle PlzNavigate (http://crbug/664233). | |
| 59 if (content::IsBrowserSideNavigationEnabled()) | |
| 60 return data_use_recorders_.end(); | |
| 61 | |
| 62 // If a DataUseRecorder has already been set as user data, then return that. | |
| 63 auto user_data = static_cast<DataUseRecorderEntryAsUserData*>( | |
| 64 request->GetUserData(DataUseRecorderEntryAsUserData::kUserDataKey)); | |
| 65 if (user_data) | |
| 66 return user_data->recorder_entry(); | |
| 67 | |
| 68 if (!can_create_new) | |
| 69 return data_use_recorders_.end(); | |
| 70 | |
| 71 // If request is associated with a ChromeService, create a new | |
| 72 // DataUseRecorder for it. There is no reason to aggregate URLRequests | |
| 73 // from ChromeServices into the same DataUseRecorder instance. | |
| 74 DataUseUserData* service = static_cast<DataUseUserData*>( | |
| 75 request->GetUserData(DataUseUserData::kUserDataKey)); | |
| 76 if (service) { | |
| 77 DataUseRecorderEntry entry = CreateNewDataUseRecorder(request); | |
| 78 | |
| 79 entry->data_use().set_description( | |
| 80 DataUseUserData::GetServiceNameAsString(service->service_name())); | |
| 81 return entry; | |
| 82 } | |
| 83 | |
| 84 int render_process_id = -1; | |
| 85 int render_frame_id = -1; | |
| 86 bool has_valid_frame = content::ResourceRequestInfo::GetRenderFrameForRequest( | |
| 87 request, &render_process_id, &render_frame_id); | |
| 88 if (has_valid_frame && | |
| 89 render_frame_id != SpecialRoutingIDs::MSG_ROUTING_NONE) { | |
| 90 DCHECK(render_process_id >= 0 || render_frame_id >= 0); | |
| 91 | |
| 92 // Browser tests may not set up DataUseWebContentsObservers in which case | |
| 93 // this class never sees navigation and frame events so DataUseRecorders | |
| 94 // will never be destroyed. To avoid this, we ignore requests whose | |
| 95 // render frames don't have a record. However, this can also be caused by | |
| 96 // URLRequests racing the frame create events. | |
| 97 // TODO(kundaji): Add UMA. | |
| 98 RenderFrameHostID frame_key(render_process_id, render_frame_id); | |
| 99 auto frame_iter = render_frame_data_use_map_.find(frame_key); | |
| 100 if (frame_iter == render_frame_data_use_map_.end()) { | |
| 101 return data_use_recorders_.end(); | |
| 102 } | |
| 103 | |
| 104 const content::ResourceRequestInfo* request_info = | |
| 105 content::ResourceRequestInfo::ForRequest(request); | |
| 106 content::ResourceType resource_type = | |
| 107 request_info ? request_info->GetResourceType() | |
| 108 : content::RESOURCE_TYPE_LAST_TYPE; | |
| 109 | |
| 110 if (resource_type == content::RESOURCE_TYPE_MAIN_FRAME) { | |
| 111 content::GlobalRequestID navigation_key = | |
| 112 request_info->GetGlobalRequestID(); | |
| 113 | |
| 114 DataUseRecorderEntry new_entry = CreateNewDataUseRecorder(request); | |
| 115 new_entry->set_main_frame_request_id(navigation_key); | |
| 116 pending_navigation_data_use_map_.insert( | |
| 117 std::make_pair(navigation_key, new_entry)); | |
| 118 | |
| 119 return new_entry; | |
| 120 } | |
| 121 | |
| 122 DCHECK(frame_iter != render_frame_data_use_map_.end()); | |
| 123 auto entry = frame_iter->second; | |
| 124 request->SetUserData(DataUseRecorderEntryAsUserData::kUserDataKey, | |
| 125 new DataUseRecorderEntryAsUserData(entry)); | |
| 126 entry->AddPendingURLRequest(request); | |
| 127 return entry; | |
| 128 } | |
| 129 | |
| 130 // Create a new DataUseRecorder for all other requests. | |
| 131 DataUseRecorderEntry entry = CreateNewDataUseRecorder(request); | |
| 132 DataUse& data_use = entry->data_use(); | |
| 133 data_use.set_url(request->url()); | |
| 134 return entry; | |
| 46 } | 135 } |
| 47 | 136 |
| 48 void ChromeDataUseAscriber::OnBeforeUrlRequest(net::URLRequest* request) { | 137 void ChromeDataUseAscriber::OnBeforeUrlRequest(net::URLRequest* request) { |
| 49 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 138 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 139 DataUseAscriber::OnBeforeUrlRequest(request); | |
| 50 | 140 |
| 51 // TODO(kundaji): Handle PlzNavigate. | 141 // TODO(kundaji): Handle PlzNavigate. |
| 52 if (content::IsBrowserSideNavigationEnabled()) | 142 if (content::IsBrowserSideNavigationEnabled()) |
| 53 return; | 143 return; |
| 54 | 144 |
| 55 auto service = static_cast<DataUseUserData*>( | 145 auto service = static_cast<DataUseUserData*>( |
| 56 request->GetUserData(DataUseUserData::kUserDataKey)); | 146 request->GetUserData(DataUseUserData::kUserDataKey)); |
| 57 if (service) | 147 if (service) |
| 58 return; | 148 return; |
| 59 | 149 |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 84 return; | 174 return; |
| 85 } | 175 } |
| 86 | 176 |
| 87 // If this request is already being tracked, do not create a new entry. | 177 // If this request is already being tracked, do not create a new entry. |
| 88 auto user_data = static_cast<DataUseRecorderEntryAsUserData*>( | 178 auto user_data = static_cast<DataUseRecorderEntryAsUserData*>( |
| 89 request->GetUserData(DataUseRecorderEntryAsUserData::kUserDataKey)); | 179 request->GetUserData(DataUseRecorderEntryAsUserData::kUserDataKey)); |
| 90 if (user_data) | 180 if (user_data) |
| 91 return; | 181 return; |
| 92 | 182 |
| 93 DataUseRecorderEntry entry = data_use_recorders_.insert( | 183 DataUseRecorderEntry entry = data_use_recorders_.insert( |
| 94 data_use_recorders_.end(), base::MakeUnique<DataUseRecorder>()); | 184 data_use_recorders_.end(), ChromeDataUseRecorder()); |
| 95 request->SetUserData(DataUseRecorderEntryAsUserData::kUserDataKey, | 185 request->SetUserData(DataUseRecorderEntryAsUserData::kUserDataKey, |
| 96 new DataUseRecorderEntryAsUserData(entry)); | 186 new DataUseRecorderEntryAsUserData(entry)); |
| 97 pending_navigation_data_use_map_.insert( | 187 pending_navigation_data_use_map_.insert( |
| 98 std::make_pair(request_info->GetGlobalRequestID(), entry)); | 188 std::make_pair(request_info->GetGlobalRequestID(), entry)); |
| 99 } | 189 } |
| 100 | 190 |
| 101 void ChromeDataUseAscriber::OnUrlRequestDestroyed(net::URLRequest* request) { | 191 void ChromeDataUseAscriber::OnUrlRequestDestroyed(net::URLRequest* request) { |
| 192 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | |
| 193 | |
| 194 DataUseRecorderEntry entry = GetDataUseRecorderEntry(request, true); | |
| 195 | |
| 196 if (entry == data_use_recorders_.end()) | |
| 197 return; | |
| 198 | |
| 199 DataUseRecorder* recorder = &(*entry); | |
| 200 | |
| 201 RenderFrameHostID frame_key = entry->main_frame_id(); | |
| 202 auto frame_iter = render_frame_data_use_map_.find(frame_key); | |
| 203 bool is_in_render_frame_map = | |
| 204 frame_iter != render_frame_data_use_map_.end() && | |
| 205 frame_iter->second->HasPendingURLRequest(request); | |
| 206 | |
| 102 const content::ResourceRequestInfo* request_info = | 207 const content::ResourceRequestInfo* request_info = |
| 103 content::ResourceRequestInfo::ForRequest(request); | 208 content::ResourceRequestInfo::ForRequest(request); |
| 104 content::ResourceType resource_type = request_info | 209 content::ResourceType resource_type = request_info |
| 105 ? request_info->GetResourceType() | 210 ? request_info->GetResourceType() |
| 106 : content::RESOURCE_TYPE_LAST_TYPE; | 211 : content::RESOURCE_TYPE_LAST_TYPE; |
| 107 if (resource_type == content::RESOURCE_TYPE_MAIN_FRAME) { | 212 |
| 108 // If request was not successful, then ReadyToCommitNavigation will not be | 213 bool is_in_pending_navigation_map = false; |
| 109 // called. So delete the pending navigation DataUseRecorderEntry here. | 214 if (request_info && resource_type == content::RESOURCE_TYPE_MAIN_FRAME) { |
| 110 if (!request->status().is_success()) { | 215 auto navigation_iter = pending_navigation_data_use_map_.find( |
| 111 DeletePendingNavigationEntry(request_info->GetGlobalRequestID()); | 216 entry->main_frame_request_id()); |
| 217 is_in_pending_navigation_map = | |
| 218 navigation_iter != pending_navigation_data_use_map_.end(); | |
| 219 | |
| 220 // If request was not successful, then NavigationHandle in | |
| 221 // DidFinishMainFrameNavigation will not have GlobalRequestID. So we erase | |
| 222 // the DataUseRecorderEntry here. | |
| 223 if (is_in_pending_navigation_map && !request->status().is_success()) { | |
| 224 pending_navigation_data_use_map_.erase(navigation_iter); | |
| 225 is_in_pending_navigation_map = false; | |
| 112 } | 226 } |
| 113 } | 227 } |
| 228 | |
| 229 DataUseAscriber::OnUrlRequestDestroyed(request); | |
| 230 request->RemoveUserData(DataUseRecorderEntryAsUserData::kUserDataKey); | |
| 231 | |
| 232 if (recorder->IsDataUseComplete() && !is_in_render_frame_map && | |
| 233 !is_in_pending_navigation_map) { | |
| 234 OnDataUseCompleted(entry); | |
| 235 data_use_recorders_.erase(entry); | |
| 236 } | |
| 114 } | 237 } |
| 115 | 238 |
| 116 void ChromeDataUseAscriber::RenderFrameCreated(int render_process_id, | 239 void ChromeDataUseAscriber::RenderFrameCreated(int render_process_id, |
| 117 int render_frame_id, | 240 int render_frame_id, |
| 118 int parent_render_process_id, | 241 int parent_render_process_id, |
| 119 int parent_render_frame_id) { | 242 int parent_render_frame_id) { |
| 120 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 243 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 121 | 244 |
| 122 // TODO(kundaji): Point child render frames to the same DataUseRecorder as | 245 if (content::IsBrowserSideNavigationEnabled()) |
| 123 // parent render frame. | 246 return; |
| 124 DataUseRecorderEntry entry = data_use_recorders_.insert( | 247 |
| 125 data_use_recorders_.end(), base::MakeUnique<DataUseRecorder>()); | 248 if (parent_render_process_id != -1 && parent_render_frame_id != -1) { |
| 126 render_frame_data_use_map_.insert(std::make_pair( | 249 // Create an entry in |render_frame_data_use_map_| for this frame with |
| 127 RenderFrameHostID(render_process_id, render_frame_id), entry)); | 250 // the same DataUseRecorderEntry as its parent frame. |
| 251 auto frame_iter = render_frame_data_use_map_.find( | |
| 252 RenderFrameHostID(parent_render_process_id, parent_render_frame_id)); | |
| 253 | |
| 254 DCHECK(frame_iter != render_frame_data_use_map_.end()); | |
| 255 | |
| 256 DataUseRecorderEntry entry = frame_iter->second; | |
| 257 render_frame_data_use_map_.insert(std::make_pair( | |
| 258 RenderFrameHostID(render_process_id, render_frame_id), entry)); | |
| 259 } else { | |
| 260 auto frame_iter = render_frame_data_use_map_.find( | |
| 261 RenderFrameHostID(render_process_id, render_frame_id)); | |
| 262 DCHECK(frame_iter == render_frame_data_use_map_.end()); | |
| 263 DataUseRecorderEntry entry = CreateNewDataUseRecorder(nullptr); | |
| 264 entry->set_main_frame_id( | |
| 265 RenderFrameHostID(render_process_id, render_frame_id)); | |
| 266 render_frame_data_use_map_.insert(std::make_pair( | |
| 267 RenderFrameHostID(render_process_id, render_frame_id), entry)); | |
| 268 } | |
| 128 } | 269 } |
| 129 | 270 |
| 130 void ChromeDataUseAscriber::RenderFrameDeleted(int render_process_id, | 271 void ChromeDataUseAscriber::RenderFrameDeleted(int render_process_id, |
| 131 int render_frame_id, | 272 int render_frame_id, |
| 132 int parent_render_process_id, | 273 int parent_render_process_id, |
| 133 int parent_render_frame_id) { | 274 int parent_render_frame_id) { |
| 134 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 275 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 276 | |
| 277 if (content::IsBrowserSideNavigationEnabled()) | |
| 278 return; | |
| 279 | |
| 135 RenderFrameHostID key(render_process_id, render_frame_id); | 280 RenderFrameHostID key(render_process_id, render_frame_id); |
| 136 auto frame_iter = render_frame_data_use_map_.find(key); | 281 auto frame_iter = render_frame_data_use_map_.find(key); |
| 282 | |
| 137 DCHECK(frame_iter != render_frame_data_use_map_.end()); | 283 DCHECK(frame_iter != render_frame_data_use_map_.end()); |
| 284 | |
| 138 DataUseRecorderEntry entry = frame_iter->second; | 285 DataUseRecorderEntry entry = frame_iter->second; |
| 286 DataUseRecorder* recorder = &(*entry); | |
| 287 | |
| 288 if (parent_render_process_id == -1 && parent_render_frame_id == -1 && | |
| 289 recorder->IsDataUseComplete()) { | |
| 290 OnDataUseCompleted(entry); | |
| 291 data_use_recorders_.erase(entry); | |
| 292 } | |
| 293 | |
| 139 render_frame_data_use_map_.erase(frame_iter); | 294 render_frame_data_use_map_.erase(frame_iter); |
| 140 | |
| 141 data_use_recorders_.erase(entry); | |
| 142 } | 295 } |
| 143 | 296 |
| 144 void ChromeDataUseAscriber::DidStartMainFrameNavigation( | 297 void ChromeDataUseAscriber::DidStartMainFrameNavigation( |
| 145 GURL gurl, | 298 GURL gurl, |
| 146 int render_process_id, | 299 int render_process_id, |
| 147 int render_frame_id, | 300 int render_frame_id, |
| 148 void* navigation_handle) { | 301 void* navigation_handle) { |
| 149 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 302 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 150 } | 303 } |
| 151 | 304 |
| 152 void ChromeDataUseAscriber::ReadyToCommitMainFrameNavigation( | 305 void ChromeDataUseAscriber::ReadyToCommitMainFrameNavigation( |
| 153 GURL gurl, | 306 GURL gurl, |
| 154 content::GlobalRequestID global_request_id, | 307 content::GlobalRequestID global_request_id, |
| 155 int render_process_id, | 308 int render_process_id, |
| 156 int render_frame_id, | 309 int render_frame_id, |
| 157 bool is_same_page_navigation, | 310 bool is_same_page_navigation, |
| 158 void* navigation_handle) { | 311 void* navigation_handle) { |
| 159 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 312 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 160 | 313 |
| 161 // TODO(kundaji): Move the DataUseRecorderEntry from pending navigation map | 314 // Find the DataUseRecorderEntry the frame is associated with |
| 162 // to render frame map if |is_same_page_navigation| is true. Otherwise, | 315 auto frame_it = render_frame_data_use_map_.find( |
| 163 // merge it with the DataUseRecorderEntry in the render frame map. | 316 RenderFrameHostID(render_process_id, render_frame_id)); |
| 164 DeletePendingNavigationEntry(global_request_id); | 317 |
| 318 // Find the pending navigation entry. | |
| 319 auto navigation_iter = | |
| 320 pending_navigation_data_use_map_.find(global_request_id); | |
| 321 // We might not find a navigation entry since the pending navigation may not | |
| 322 // have caused any HTTP or HTTPS URLRequests to be made. | |
| 323 if (navigation_iter == pending_navigation_data_use_map_.end()) { | |
| 324 // No pending navigation entry to worry about. However, the old frame entry | |
| 325 // must be removed from frame map, and possibly marked complete and deleted. | |
| 326 if (frame_it != render_frame_data_use_map_.end()) { | |
| 327 DataUseRecorderEntry old_frame_entry = frame_it->second; | |
| 328 render_frame_data_use_map_.erase(frame_it); | |
| 329 if (old_frame_entry->IsDataUseComplete()) { | |
| 330 OnDataUseCompleted(old_frame_entry); | |
| 331 data_use_recorders_.erase(old_frame_entry); | |
| 332 } | |
| 333 | |
| 334 // Add a new recorder to the render frame map to replace the deleted one. | |
| 335 DataUseRecorderEntry entry = data_use_recorders_.insert( | |
| 336 data_use_recorders_.end(), ChromeDataUseRecorder()); | |
| 337 render_frame_data_use_map_.insert(std::make_pair( | |
| 338 RenderFrameHostID(render_process_id, render_frame_id), entry)); | |
| 339 } | |
| 340 return; | |
| 341 } | |
| 342 | |
| 343 DataUseRecorderEntry entry = navigation_iter->second; | |
| 344 pending_navigation_data_use_map_.erase(navigation_iter); | |
| 345 entry->set_main_frame_id( | |
| 346 RenderFrameHostID(render_process_id, render_frame_id)); | |
| 347 | |
| 348 // If the frame has already been deleted then mark this navigation as having | |
| 349 // completed its data use. | |
| 350 if (frame_it == render_frame_data_use_map_.end()) { | |
| 351 if (entry->IsDataUseComplete()) { | |
| 352 OnDataUseCompleted(entry); | |
| 353 data_use_recorders_.erase(entry); | |
| 354 } | |
| 355 return; | |
| 356 } | |
| 357 DataUseRecorderEntry old_frame_entry = frame_it->second; | |
| 358 if (is_same_page_navigation) { | |
| 359 old_frame_entry->MergeFrom(&(*entry)); | |
| 360 | |
| 361 for (auto request : entry->pending_url_requests()) { | |
| 362 request->RemoveUserData(DataUseRecorderEntryAsUserData::kUserDataKey); | |
| 363 request->SetUserData(DataUseRecorderEntryAsUserData::kUserDataKey, | |
| 364 new DataUseRecorderEntryAsUserData(old_frame_entry)); | |
| 365 old_frame_entry->AddPendingURLRequest(request); | |
| 366 } | |
| 367 | |
| 368 entry->RemoveAllPendingURLRequests(); | |
| 369 | |
| 370 data_use_recorders_.erase(entry); | |
| 371 } else { | |
| 372 // Navigation is not same page, so remove old entry from | |
| 373 // |render_frame_data_use_map_|, possibly marking it complete. | |
| 374 render_frame_data_use_map_.erase(frame_it); | |
| 375 if (old_frame_entry->IsDataUseComplete()) { | |
| 376 OnDataUseCompleted(old_frame_entry); | |
| 377 data_use_recorders_.erase(old_frame_entry); | |
| 378 } | |
| 379 | |
| 380 DataUse& data_use = entry->data_use(); | |
| 381 | |
| 382 DCHECK(!data_use.url().is_valid() || data_use.url() == gurl) | |
| 383 << "is valid: " << data_use.url().is_valid() | |
| 384 << "; data_use.url(): " << data_use.url().spec() | |
| 385 << "; gurl: " << gurl.spec(); | |
| 386 if (!data_use.url().is_valid()) { | |
| 387 data_use.set_url(gurl); | |
| 388 } | |
| 389 | |
| 390 render_frame_data_use_map_.insert(std::make_pair( | |
| 391 RenderFrameHostID(render_process_id, render_frame_id), entry)); | |
| 392 } | |
| 165 } | 393 } |
| 166 | 394 |
| 167 void ChromeDataUseAscriber::DidRedirectMainFrameNavigation( | 395 void ChromeDataUseAscriber::OnDataUseCompleted(DataUseRecorderEntry entry) { |
| 168 GURL gurl, | 396 // TODO(ryansturm): Notify observers that data use is complete. |
| 169 int render_process_id, | |
| 170 int render_frame_id, | |
| 171 void* navigation_handle) { | |
| 172 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | |
| 173 } | |
| 174 | |
| 175 void ChromeDataUseAscriber::DeletePendingNavigationEntry( | |
| 176 content::GlobalRequestID global_request_id) { | |
| 177 auto navigation_iter = | |
| 178 pending_navigation_data_use_map_.find(global_request_id); | |
| 179 // Pending navigation entry will not be found if finish navigation | |
| 180 // raced the URLRequest. | |
| 181 if (navigation_iter != pending_navigation_data_use_map_.end()) { | |
| 182 auto entry = navigation_iter->second; | |
| 183 pending_navigation_data_use_map_.erase(navigation_iter); | |
| 184 data_use_recorders_.erase(entry); | |
| 185 } | |
| 186 } | 397 } |
| 187 | 398 |
| 188 std::unique_ptr<URLRequestClassifier> | 399 std::unique_ptr<URLRequestClassifier> |
| 189 ChromeDataUseAscriber::CreateURLRequestClassifier() const { | 400 ChromeDataUseAscriber::CreateURLRequestClassifier() const { |
| 190 return base::MakeUnique<ContentURLRequestClassifier>(); | 401 return base::MakeUnique<ContentURLRequestClassifier>(); |
| 191 } | 402 } |
| 192 | 403 |
| 404 ChromeDataUseAscriber::DataUseRecorderEntry | |
| 405 ChromeDataUseAscriber::CreateNewDataUseRecorder(net::URLRequest* request) { | |
| 406 DataUseRecorderEntry entry = data_use_recorders_.insert( | |
|
RyanSturm
2016/12/01 00:40:46
I think these two inserts (here and above) are sli
Not at Google. Contact bengr
2016/12/01 01:23:39
Done.
| |
| 407 data_use_recorders_.end(), ChromeDataUseRecorder()); | |
| 408 if (request) { | |
| 409 entry->AddPendingURLRequest(request); | |
| 410 request->SetUserData(DataUseRecorderEntryAsUserData::kUserDataKey, | |
| 411 new DataUseRecorderEntryAsUserData(entry)); | |
| 412 } | |
| 413 return entry; | |
| 414 } | |
| 415 | |
| 193 } // namespace data_use_measurement | 416 } // namespace data_use_measurement |
| OLD | NEW |