| 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(pending_navigation_global_request_id_.empty()); |
| 44 DCHECK(data_use_recorders_.empty()); | 45 DCHECK(data_use_recorders_.empty()); |
| 45 } | 46 } |
| 46 | 47 |
| 47 ChromeDataUseRecorder* ChromeDataUseAscriber::GetOrCreateDataUseRecorder( | 48 ChromeDataUseRecorder* ChromeDataUseAscriber::GetOrCreateDataUseRecorder( |
| 48 net::URLRequest* request) { | 49 net::URLRequest* request) { |
| 49 DataUseRecorderEntry entry = GetOrCreateDataUseRecorderEntry(request); | 50 DataUseRecorderEntry entry = GetOrCreateDataUseRecorderEntry(request); |
| 50 return entry == data_use_recorders_.end() ? nullptr : &(*entry); | 51 return entry == data_use_recorders_.end() ? nullptr : &(*entry); |
| 51 } | 52 } |
| 52 | 53 |
| 53 ChromeDataUseRecorder* ChromeDataUseAscriber::GetDataUseRecorder( | 54 ChromeDataUseRecorder* ChromeDataUseAscriber::GetDataUseRecorder( |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 244 auto frame_iter = main_render_frame_data_use_map_.find(key); | 245 auto frame_iter = main_render_frame_data_use_map_.find(key); |
| 245 DataUseRecorderEntry entry = frame_iter->second; | 246 DataUseRecorderEntry entry = frame_iter->second; |
| 246 if (entry->IsDataUseComplete()) { | 247 if (entry->IsDataUseComplete()) { |
| 247 OnDataUseCompleted(entry); | 248 OnDataUseCompleted(entry); |
| 248 data_use_recorders_.erase(entry); | 249 data_use_recorders_.erase(entry); |
| 249 } | 250 } |
| 250 main_render_frame_data_use_map_.erase(frame_iter); | 251 main_render_frame_data_use_map_.erase(frame_iter); |
| 251 } | 252 } |
| 252 subframe_to_mainframe_map_.erase(key); | 253 subframe_to_mainframe_map_.erase(key); |
| 253 visible_main_render_frames_.erase(key); | 254 visible_main_render_frames_.erase(key); |
| 255 pending_navigation_global_request_id_.erase(key); |
| 254 } | 256 } |
| 255 | 257 |
| 256 void ChromeDataUseAscriber::DidStartMainFrameNavigation( | 258 void ChromeDataUseAscriber::DidStartMainFrameNavigation( |
| 257 GURL gurl, | 259 GURL gurl, |
| 258 int render_process_id, | 260 int render_process_id, |
| 259 int render_frame_id, | 261 int render_frame_id, |
| 260 void* navigation_handle) { | 262 void* navigation_handle) { |
| 261 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 263 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 262 } | 264 } |
| 263 | 265 |
| 264 void ChromeDataUseAscriber::ReadyToCommitMainFrameNavigation( | 266 void ChromeDataUseAscriber::ReadyToCommitMainFrameNavigation( |
| 265 GURL gurl, | |
| 266 content::GlobalRequestID global_request_id, | 267 content::GlobalRequestID global_request_id, |
| 267 int render_process_id, | 268 int render_process_id, |
| 268 int render_frame_id, | 269 int render_frame_id) { |
| 269 bool is_same_page_navigation, | 270 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 270 void* navigation_handle) { | 271 pending_navigation_global_request_id_.insert( |
| 272 std::make_pair(RenderFrameHostID(render_process_id, render_frame_id), |
| 273 global_request_id)); |
| 274 } |
| 275 |
| 276 void ChromeDataUseAscriber::DidFinishNavigation(int render_process_id, |
| 277 int render_frame_id, |
| 278 GURL gurl, |
| 279 bool is_same_page_navigation, |
| 280 uint32_t page_transition) { |
| 271 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 281 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 272 | 282 |
| 283 RenderFrameHostID mainframe(render_process_id, render_frame_id); |
| 284 |
| 285 // Find the global request id of the pending navigation. |
| 286 auto global_request_id = |
| 287 pending_navigation_global_request_id_.find(mainframe); |
| 288 DCHECK(global_request_id != pending_navigation_global_request_id_.end()); |
| 289 |
| 273 // Find the DataUseRecorderEntry the frame is associated with | 290 // Find the DataUseRecorderEntry the frame is associated with |
| 274 auto frame_it = main_render_frame_data_use_map_.find( | 291 auto frame_it = main_render_frame_data_use_map_.find(mainframe); |
| 275 RenderFrameHostID(render_process_id, render_frame_id)); | |
| 276 | 292 |
| 277 // Find the pending navigation entry. | 293 // Find the pending navigation entry. |
| 278 auto navigation_iter = | 294 auto navigation_iter = |
| 279 pending_navigation_data_use_map_.find(global_request_id); | 295 pending_navigation_data_use_map_.find(global_request_id->second); |
| 296 pending_navigation_global_request_id_.erase(global_request_id); |
| 297 |
| 280 // We might not find a navigation entry since the pending navigation may not | 298 // We might not find a navigation entry since the pending navigation may not |
| 281 // have caused any HTTP or HTTPS URLRequests to be made. | 299 // have caused any HTTP or HTTPS URLRequests to be made. |
| 282 if (navigation_iter == pending_navigation_data_use_map_.end()) { | 300 if (navigation_iter == pending_navigation_data_use_map_.end()) { |
| 283 // No pending navigation entry to worry about. However, the old frame entry | 301 // No pending navigation entry to worry about. However, the old frame entry |
| 284 // must be removed from frame map, and possibly marked complete and deleted. | 302 // must be removed from frame map, and possibly marked complete and deleted. |
| 285 if (frame_it != main_render_frame_data_use_map_.end()) { | 303 if (frame_it != main_render_frame_data_use_map_.end()) { |
| 286 DataUseRecorderEntry old_frame_entry = frame_it->second; | 304 DataUseRecorderEntry old_frame_entry = frame_it->second; |
| 305 old_frame_entry->set_page_transition(page_transition); |
| 287 main_render_frame_data_use_map_.erase(frame_it); | 306 main_render_frame_data_use_map_.erase(frame_it); |
| 288 if (old_frame_entry->IsDataUseComplete()) { | 307 if (old_frame_entry->IsDataUseComplete()) { |
| 289 OnDataUseCompleted(old_frame_entry); | 308 OnDataUseCompleted(old_frame_entry); |
| 290 data_use_recorders_.erase(old_frame_entry); | 309 data_use_recorders_.erase(old_frame_entry); |
| 291 } | 310 } |
| 292 | 311 |
| 293 // Add a new recorder to the render frame map to replace the deleted one. | 312 // Add a new recorder to the render frame map to replace the deleted one. |
| 294 DataUseRecorderEntry entry = data_use_recorders_.emplace( | 313 DataUseRecorderEntry entry = data_use_recorders_.emplace( |
| 295 data_use_recorders_.end()); | 314 data_use_recorders_.end()); |
| 296 std::pair<int, int> frame_key = | 315 entry->set_main_frame_id(mainframe); |
| 297 RenderFrameHostID(render_process_id, render_frame_id); | 316 main_render_frame_data_use_map_.insert(std::make_pair(mainframe, entry)); |
| 298 entry->set_main_frame_id(frame_key); | |
| 299 main_render_frame_data_use_map_.insert(std::make_pair(frame_key, entry)); | |
| 300 } | 317 } |
| 301 return; | 318 return; |
| 302 } | 319 } |
| 303 | 320 |
| 304 DataUseRecorderEntry entry = navigation_iter->second; | 321 DataUseRecorderEntry entry = navigation_iter->second; |
| 305 pending_navigation_data_use_map_.erase(navigation_iter); | 322 pending_navigation_data_use_map_.erase(navigation_iter); |
| 306 entry->set_main_frame_id( | 323 entry->set_main_frame_id(mainframe); |
| 307 RenderFrameHostID(render_process_id, render_frame_id)); | |
| 308 | 324 |
| 309 // If the frame has already been deleted then mark this navigation as having | 325 // If the frame has already been deleted then mark this navigation as having |
| 310 // completed its data use. | 326 // completed its data use. |
| 311 if (frame_it == main_render_frame_data_use_map_.end()) { | 327 if (frame_it == main_render_frame_data_use_map_.end()) { |
| 312 if (entry->IsDataUseComplete()) { | 328 if (entry->IsDataUseComplete()) { |
| 329 entry->set_page_transition(page_transition); |
| 313 OnDataUseCompleted(entry); | 330 OnDataUseCompleted(entry); |
| 314 data_use_recorders_.erase(entry); | 331 data_use_recorders_.erase(entry); |
| 315 } | 332 } |
| 316 return; | 333 return; |
| 317 } | 334 } |
| 318 DataUseRecorderEntry old_frame_entry = frame_it->second; | 335 DataUseRecorderEntry old_frame_entry = frame_it->second; |
| 336 old_frame_entry->set_page_transition(page_transition); |
| 337 |
| 319 if (is_same_page_navigation) { | 338 if (is_same_page_navigation) { |
| 320 old_frame_entry->MergeFrom(&(*entry)); | 339 old_frame_entry->MergeFrom(&(*entry)); |
| 321 | 340 |
| 322 for (auto* request : entry->pending_url_requests()) { | 341 for (auto* request : entry->pending_url_requests()) { |
| 323 request->RemoveUserData(DataUseRecorderEntryAsUserData::kUserDataKey); | 342 request->RemoveUserData(DataUseRecorderEntryAsUserData::kUserDataKey); |
| 324 request->SetUserData( | 343 request->SetUserData( |
| 325 DataUseRecorderEntryAsUserData::kUserDataKey, | 344 DataUseRecorderEntryAsUserData::kUserDataKey, |
| 326 base::MakeUnique<DataUseRecorderEntryAsUserData>(old_frame_entry)); | 345 base::MakeUnique<DataUseRecorderEntryAsUserData>(old_frame_entry)); |
| 327 old_frame_entry->AddPendingURLRequest(request); | 346 old_frame_entry->AddPendingURLRequest(request); |
| 328 } | 347 } |
| 329 | 348 |
| 330 entry->RemoveAllPendingURLRequests(); | 349 entry->RemoveAllPendingURLRequests(); |
| 331 | 350 |
| 332 data_use_recorders_.erase(entry); | 351 data_use_recorders_.erase(entry); |
| 333 } else { | 352 } else { |
| 334 // Navigation is not same page, so remove old entry from | 353 // Navigation is not same page, so remove old entry from |
| 335 // |main_render_frame_data_use_map_|, possibly marking it complete. | 354 // |main_render_frame_data_use_map_|, possibly marking it complete. |
| 336 main_render_frame_data_use_map_.erase(frame_it); | 355 main_render_frame_data_use_map_.erase(frame_it); |
| 337 if (old_frame_entry->IsDataUseComplete()) { | 356 if (old_frame_entry->IsDataUseComplete()) { |
| 338 OnDataUseCompleted(old_frame_entry); | 357 OnDataUseCompleted(old_frame_entry); |
| 339 data_use_recorders_.erase(old_frame_entry); | 358 data_use_recorders_.erase(old_frame_entry); |
| 340 | 359 |
| 341 if (visible_main_render_frames_.find( | 360 if (visible_main_render_frames_.find(mainframe) != |
| 342 RenderFrameHostID(render_process_id, render_frame_id)) != | |
| 343 visible_main_render_frames_.end()) { | 361 visible_main_render_frames_.end()) { |
| 344 entry->set_is_visible(true); | 362 entry->set_is_visible(true); |
| 345 } | 363 } |
| 346 } | 364 } |
| 347 | 365 |
| 348 DataUse& data_use = entry->data_use(); | 366 DataUse& data_use = entry->data_use(); |
| 349 | 367 |
| 350 DCHECK(!data_use.url().is_valid() || data_use.url() == gurl) | 368 DCHECK(!data_use.url().is_valid() || data_use.url() == gurl) |
| 351 << "is valid: " << data_use.url().is_valid() | 369 << "is valid: " << data_use.url().is_valid() |
| 352 << "; data_use.url(): " << data_use.url().spec() | 370 << "; data_use.url(): " << data_use.url().spec() |
| 353 << "; gurl: " << gurl.spec(); | 371 << "; gurl: " << gurl.spec(); |
| 354 if (!data_use.url().is_valid()) { | 372 if (!data_use.url().is_valid()) { |
| 355 data_use.set_url(gurl); | 373 data_use.set_url(gurl); |
| 356 } | 374 } |
| 357 | 375 |
| 358 main_render_frame_data_use_map_.insert(std::make_pair( | 376 main_render_frame_data_use_map_.insert(std::make_pair(mainframe, entry)); |
| 359 RenderFrameHostID(render_process_id, render_frame_id), entry)); | |
| 360 } | 377 } |
| 361 } | 378 } |
| 362 | 379 |
| 363 void ChromeDataUseAscriber::DidFinishNavigation(int render_process_id, | |
| 364 int render_frame_id, | |
| 365 uint32_t page_transition) { | |
| 366 auto frame_it = main_render_frame_data_use_map_.find( | |
| 367 RenderFrameHostID(render_process_id, render_frame_id)); | |
| 368 if (frame_it != main_render_frame_data_use_map_.end()) { | |
| 369 frame_it->second->set_page_transition(page_transition); | |
| 370 } | |
| 371 } | |
| 372 | |
| 373 void ChromeDataUseAscriber::OnDataUseCompleted(DataUseRecorderEntry entry) { | 380 void ChromeDataUseAscriber::OnDataUseCompleted(DataUseRecorderEntry entry) { |
| 374 // TODO(ryansturm): Notify observers that data use is complete. | 381 // TODO(ryansturm): Notify observers that data use is complete. |
| 375 } | 382 } |
| 376 | 383 |
| 377 std::unique_ptr<URLRequestClassifier> | 384 std::unique_ptr<URLRequestClassifier> |
| 378 ChromeDataUseAscriber::CreateURLRequestClassifier() const { | 385 ChromeDataUseAscriber::CreateURLRequestClassifier() const { |
| 379 return base::MakeUnique<ContentURLRequestClassifier>(); | 386 return base::MakeUnique<ContentURLRequestClassifier>(); |
| 380 } | 387 } |
| 381 | 388 |
| 382 ChromeDataUseAscriber::DataUseRecorderEntry | 389 ChromeDataUseAscriber::DataUseRecorderEntry |
| (...skipping 24 matching lines...) Expand all Loading... |
| 407 visible_main_render_frames_.insert(main_render_frame_host_id); | 414 visible_main_render_frames_.insert(main_render_frame_host_id); |
| 408 } else { | 415 } else { |
| 409 visible_main_render_frames_.erase(main_render_frame_host_id); | 416 visible_main_render_frames_.erase(main_render_frame_host_id); |
| 410 } | 417 } |
| 411 } | 418 } |
| 412 | 419 |
| 413 void ChromeDataUseAscriber::RenderFrameHostChanged(int old_render_process_id, | 420 void ChromeDataUseAscriber::RenderFrameHostChanged(int old_render_process_id, |
| 414 int old_render_frame_id, | 421 int old_render_frame_id, |
| 415 int new_render_process_id, | 422 int new_render_process_id, |
| 416 int new_render_frame_id) { | 423 int new_render_frame_id) { |
| 417 if (visible_main_render_frames_.find( | 424 RenderFrameHostID old_frame(old_render_process_id, old_render_frame_id); |
| 418 RenderFrameHostID(old_render_process_id, old_render_frame_id)) != | 425 if (visible_main_render_frames_.find(old_frame) != |
| 419 visible_main_render_frames_.end()) { | 426 visible_main_render_frames_.end()) { |
| 420 WasShownOrHidden(new_render_process_id, new_render_frame_id, true); | 427 WasShownOrHidden(new_render_process_id, new_render_frame_id, true); |
| 421 } | 428 } |
| 429 auto pending_navigation_iter = |
| 430 pending_navigation_global_request_id_.find(old_frame); |
| 431 if (pending_navigation_iter != pending_navigation_global_request_id_.end()) { |
| 432 pending_navigation_global_request_id_.insert(std::make_pair( |
| 433 RenderFrameHostID(new_render_process_id, new_render_frame_id), |
| 434 pending_navigation_iter->second)); |
| 435 pending_navigation_global_request_id_.erase(pending_navigation_iter); |
| 436 } |
| 422 } | 437 } |
| 423 | 438 |
| 424 } // namespace data_use_measurement | 439 } // namespace data_use_measurement |
| OLD | NEW |