| 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 // |data_use_recorders_| can be non empty, when mainframe url requests are | 45 // |data_use_recorders_| can be non empty, when mainframe url requests are |
| 45 // created but no mainframe navigations take place. | 46 // created but no mainframe navigations take place. |
| 46 // TODO(rajendrant): Enable this check when fixed for unittests. | 47 // TODO(rajendrant): Enable this check when fixed for unittests. |
| 47 // DCHECK(data_use_recorders_.empty()); | 48 // DCHECK(data_use_recorders_.empty()); |
| 48 } | 49 } |
| 49 | 50 |
| 50 ChromeDataUseRecorder* ChromeDataUseAscriber::GetOrCreateDataUseRecorder( | 51 ChromeDataUseRecorder* ChromeDataUseAscriber::GetOrCreateDataUseRecorder( |
| 51 net::URLRequest* request) { | 52 net::URLRequest* request) { |
| 52 DataUseRecorderEntry entry = GetOrCreateDataUseRecorderEntry(request); | 53 DataUseRecorderEntry entry = GetOrCreateDataUseRecorderEntry(request); |
| 53 return entry == data_use_recorders_.end() ? nullptr : &(*entry); | 54 return entry == data_use_recorders_.end() ? nullptr : &(*entry); |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 auto frame_iter = main_render_frame_data_use_map_.find(key); | 268 auto frame_iter = main_render_frame_data_use_map_.find(key); |
| 268 DataUseRecorderEntry entry = frame_iter->second; | 269 DataUseRecorderEntry entry = frame_iter->second; |
| 269 if (entry->IsDataUseComplete()) { | 270 if (entry->IsDataUseComplete()) { |
| 270 NotifyDataUseCompleted(entry); | 271 NotifyDataUseCompleted(entry); |
| 271 data_use_recorders_.erase(entry); | 272 data_use_recorders_.erase(entry); |
| 272 } | 273 } |
| 273 main_render_frame_data_use_map_.erase(frame_iter); | 274 main_render_frame_data_use_map_.erase(frame_iter); |
| 274 } | 275 } |
| 275 subframe_to_mainframe_map_.erase(key); | 276 subframe_to_mainframe_map_.erase(key); |
| 276 visible_main_render_frames_.erase(key); | 277 visible_main_render_frames_.erase(key); |
| 278 pending_navigation_global_request_id_.erase(key); |
| 277 } | 279 } |
| 278 | 280 |
| 279 void ChromeDataUseAscriber::DidStartMainFrameNavigation( | 281 void ChromeDataUseAscriber::DidStartMainFrameNavigation( |
| 280 GURL gurl, | 282 GURL gurl, |
| 281 int render_process_id, | 283 int render_process_id, |
| 282 int render_frame_id, | 284 int render_frame_id, |
| 283 void* navigation_handle) { | 285 void* navigation_handle) { |
| 284 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 286 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 285 } | 287 } |
| 286 | 288 |
| 287 void ChromeDataUseAscriber::ReadyToCommitMainFrameNavigation( | 289 void ChromeDataUseAscriber::ReadyToCommitMainFrameNavigation( |
| 288 GURL gurl, | |
| 289 content::GlobalRequestID global_request_id, | 290 content::GlobalRequestID global_request_id, |
| 290 int render_process_id, | 291 int render_process_id, |
| 291 int render_frame_id, | 292 int render_frame_id) { |
| 292 bool is_same_page_navigation, | 293 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 293 void* navigation_handle) { | 294 pending_navigation_global_request_id_.insert( |
| 295 std::make_pair(RenderFrameHostID(render_process_id, render_frame_id), |
| 296 global_request_id)); |
| 297 } |
| 298 |
| 299 void ChromeDataUseAscriber::DidFinishNavigation(int render_process_id, |
| 300 int render_frame_id, |
| 301 GURL gurl, |
| 302 bool is_same_page_navigation, |
| 303 uint32_t page_transition) { |
| 294 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 304 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 295 | 305 |
| 306 RenderFrameHostID mainframe(render_process_id, render_frame_id); |
| 307 |
| 308 // Find the global request id of the pending navigation. |
| 309 auto global_request_id = |
| 310 pending_navigation_global_request_id_.find(mainframe); |
| 311 |
| 312 // TODO(rajendrant): Analyze why global request ID was not found in |
| 313 // pending navigation map, in tests. |
| 314 if (global_request_id == pending_navigation_global_request_id_.end()) |
| 315 return; |
| 316 |
| 296 // Find the DataUseRecorderEntry the frame is associated with | 317 // Find the DataUseRecorderEntry the frame is associated with |
| 297 auto frame_it = main_render_frame_data_use_map_.find( | 318 auto frame_it = main_render_frame_data_use_map_.find(mainframe); |
| 298 RenderFrameHostID(render_process_id, render_frame_id)); | |
| 299 | 319 |
| 300 // Find the pending navigation entry. | 320 // Find the pending navigation entry. |
| 301 auto navigation_iter = | 321 auto navigation_iter = |
| 302 pending_navigation_data_use_map_.find(global_request_id); | 322 pending_navigation_data_use_map_.find(global_request_id->second); |
| 323 pending_navigation_global_request_id_.erase(global_request_id); |
| 324 |
| 303 // We might not find a navigation entry since the pending navigation may not | 325 // We might not find a navigation entry since the pending navigation may not |
| 304 // have caused any HTTP or HTTPS URLRequests to be made. | 326 // have caused any HTTP or HTTPS URLRequests to be made. |
| 305 if (navigation_iter == pending_navigation_data_use_map_.end()) { | 327 if (navigation_iter == pending_navigation_data_use_map_.end()) { |
| 306 // No pending navigation entry to worry about. However, the old frame entry | 328 // No pending navigation entry to worry about. However, the old frame entry |
| 307 // must be removed from frame map, and possibly marked complete and deleted. | 329 // must be removed from frame map, and possibly marked complete and deleted. |
| 308 if (frame_it != main_render_frame_data_use_map_.end()) { | 330 if (frame_it != main_render_frame_data_use_map_.end()) { |
| 309 DataUseRecorderEntry old_frame_entry = frame_it->second; | 331 DataUseRecorderEntry old_frame_entry = frame_it->second; |
| 310 DataUse::TrafficType old_traffic_type = | 332 DataUse::TrafficType old_traffic_type = |
| 311 old_frame_entry->data_use().traffic_type(); | 333 old_frame_entry->data_use().traffic_type(); |
| 334 old_frame_entry->set_page_transition(page_transition); |
| 312 main_render_frame_data_use_map_.erase(frame_it); | 335 main_render_frame_data_use_map_.erase(frame_it); |
| 336 NotifyPageLoadCommit(old_frame_entry); |
| 313 if (old_frame_entry->IsDataUseComplete()) { | 337 if (old_frame_entry->IsDataUseComplete()) { |
| 314 NotifyDataUseCompleted(old_frame_entry); | 338 NotifyDataUseCompleted(old_frame_entry); |
| 315 data_use_recorders_.erase(old_frame_entry); | 339 data_use_recorders_.erase(old_frame_entry); |
| 316 } | 340 } |
| 317 | 341 |
| 318 // Add a new recorder to the render frame map to replace the deleted one. | 342 // Add a new recorder to the render frame map to replace the deleted one. |
| 319 DataUseRecorderEntry entry = data_use_recorders_.emplace( | 343 DataUseRecorderEntry entry = data_use_recorders_.emplace( |
| 320 data_use_recorders_.end(), old_traffic_type); | 344 data_use_recorders_.end(), old_traffic_type); |
| 321 std::pair<int, int> frame_key = | 345 entry->set_main_frame_id(mainframe); |
| 322 RenderFrameHostID(render_process_id, render_frame_id); | 346 main_render_frame_data_use_map_.insert(std::make_pair(mainframe, entry)); |
| 323 entry->set_main_frame_id(frame_key); | |
| 324 main_render_frame_data_use_map_.insert(std::make_pair(frame_key, entry)); | |
| 325 } | 347 } |
| 326 return; | 348 return; |
| 327 } | 349 } |
| 328 | 350 |
| 329 DataUseRecorderEntry entry = navigation_iter->second; | 351 DataUseRecorderEntry entry = navigation_iter->second; |
| 330 pending_navigation_data_use_map_.erase(navigation_iter); | 352 pending_navigation_data_use_map_.erase(navigation_iter); |
| 331 entry->set_main_frame_id( | 353 entry->set_main_frame_id(mainframe); |
| 332 RenderFrameHostID(render_process_id, render_frame_id)); | |
| 333 | 354 |
| 334 // If the frame has already been deleted then mark this navigation as having | 355 // If the frame has already been deleted then mark this navigation as having |
| 335 // completed its data use. | 356 // completed its data use. |
| 336 if (frame_it == main_render_frame_data_use_map_.end()) { | 357 if (frame_it == main_render_frame_data_use_map_.end()) { |
| 358 entry->set_page_transition(page_transition); |
| 359 NotifyPageLoadCommit(entry); |
| 337 if (entry->IsDataUseComplete()) { | 360 if (entry->IsDataUseComplete()) { |
| 338 NotifyDataUseCompleted(entry); | 361 NotifyDataUseCompleted(entry); |
| 339 data_use_recorders_.erase(entry); | 362 data_use_recorders_.erase(entry); |
| 340 } | 363 } |
| 341 return; | 364 return; |
| 342 } | 365 } |
| 343 DataUseRecorderEntry old_frame_entry = frame_it->second; | 366 DataUseRecorderEntry old_frame_entry = frame_it->second; |
| 367 old_frame_entry->set_page_transition(page_transition); |
| 368 NotifyPageLoadCommit(old_frame_entry); |
| 369 |
| 344 if (is_same_page_navigation) { | 370 if (is_same_page_navigation) { |
| 345 old_frame_entry->MergeFrom(&(*entry)); | 371 old_frame_entry->MergeFrom(&(*entry)); |
| 346 | 372 |
| 347 for (auto* request : entry->pending_url_requests()) { | 373 for (auto* request : entry->pending_url_requests()) { |
| 348 request->RemoveUserData(DataUseRecorderEntryAsUserData::kUserDataKey); | 374 request->RemoveUserData(DataUseRecorderEntryAsUserData::kUserDataKey); |
| 349 request->SetUserData( | 375 request->SetUserData( |
| 350 DataUseRecorderEntryAsUserData::kUserDataKey, | 376 DataUseRecorderEntryAsUserData::kUserDataKey, |
| 351 base::MakeUnique<DataUseRecorderEntryAsUserData>(old_frame_entry)); | 377 base::MakeUnique<DataUseRecorderEntryAsUserData>(old_frame_entry)); |
| 352 old_frame_entry->AddPendingURLRequest(request); | 378 old_frame_entry->AddPendingURLRequest(request); |
| 353 } | 379 } |
| 354 | 380 |
| 355 entry->RemoveAllPendingURLRequests(); | 381 entry->RemoveAllPendingURLRequests(); |
| 356 | 382 |
| 357 data_use_recorders_.erase(entry); | 383 data_use_recorders_.erase(entry); |
| 358 } else { | 384 } else { |
| 359 // Navigation is not same page, so remove old entry from | 385 // Navigation is not same page, so remove old entry from |
| 360 // |main_render_frame_data_use_map_|, possibly marking it complete. | 386 // |main_render_frame_data_use_map_|, possibly marking it complete. |
| 361 main_render_frame_data_use_map_.erase(frame_it); | 387 main_render_frame_data_use_map_.erase(frame_it); |
| 362 if (old_frame_entry->IsDataUseComplete()) { | 388 if (old_frame_entry->IsDataUseComplete()) { |
| 363 NotifyDataUseCompleted(old_frame_entry); | 389 NotifyDataUseCompleted(old_frame_entry); |
| 364 data_use_recorders_.erase(old_frame_entry); | 390 data_use_recorders_.erase(old_frame_entry); |
| 365 | 391 |
| 366 if (visible_main_render_frames_.find( | 392 if (visible_main_render_frames_.find(mainframe) != |
| 367 RenderFrameHostID(render_process_id, render_frame_id)) != | |
| 368 visible_main_render_frames_.end()) { | 393 visible_main_render_frames_.end()) { |
| 369 entry->set_is_visible(true); | 394 entry->set_is_visible(true); |
| 370 } | 395 } |
| 371 } | 396 } |
| 372 | 397 |
| 373 DataUse& data_use = entry->data_use(); | 398 DataUse& data_use = entry->data_use(); |
| 374 | 399 |
| 375 DCHECK(!data_use.url().is_valid() || data_use.url() == gurl) | 400 DCHECK(!data_use.url().is_valid() || data_use.url() == gurl) |
| 376 << "is valid: " << data_use.url().is_valid() | 401 << "is valid: " << data_use.url().is_valid() |
| 377 << "; data_use.url(): " << data_use.url().spec() | 402 << "; data_use.url(): " << data_use.url().spec() |
| 378 << "; gurl: " << gurl.spec(); | 403 << "; gurl: " << gurl.spec(); |
| 379 if (!data_use.url().is_valid()) { | 404 if (!data_use.url().is_valid()) { |
| 380 data_use.set_url(gurl); | 405 data_use.set_url(gurl); |
| 381 } | 406 } |
| 382 | 407 |
| 383 main_render_frame_data_use_map_.insert(std::make_pair( | 408 main_render_frame_data_use_map_.insert(std::make_pair(mainframe, entry)); |
| 384 RenderFrameHostID(render_process_id, render_frame_id), entry)); | |
| 385 } | 409 } |
| 386 } | 410 } |
| 387 | 411 |
| 388 void ChromeDataUseAscriber::DidFinishNavigation(int render_process_id, | 412 void ChromeDataUseAscriber::NotifyPageLoadCommit(DataUseRecorderEntry entry) { |
| 389 int render_frame_id, | 413 for (auto& observer : observers_) |
| 390 uint32_t page_transition) { | 414 observer.OnPageLoadCommit(&entry->data_use()); |
| 391 auto frame_it = main_render_frame_data_use_map_.find( | |
| 392 RenderFrameHostID(render_process_id, render_frame_id)); | |
| 393 if (frame_it != main_render_frame_data_use_map_.end()) { | |
| 394 frame_it->second->set_page_transition(page_transition); | |
| 395 | |
| 396 for (auto& observer : observers_) | |
| 397 observer.OnPageLoadCommit(&frame_it->second->data_use()); | |
| 398 } | |
| 399 } | 415 } |
| 400 | 416 |
| 401 void ChromeDataUseAscriber::NotifyDataUseCompleted(DataUseRecorderEntry entry) { | 417 void ChromeDataUseAscriber::NotifyDataUseCompleted(DataUseRecorderEntry entry) { |
| 402 for (auto& observer : observers_) | 418 for (auto& observer : observers_) |
| 403 observer.OnPageLoadComplete(&entry->data_use()); | 419 observer.OnPageLoadComplete(&entry->data_use()); |
| 404 } | 420 } |
| 405 | 421 |
| 406 std::unique_ptr<URLRequestClassifier> | 422 std::unique_ptr<URLRequestClassifier> |
| 407 ChromeDataUseAscriber::CreateURLRequestClassifier() const { | 423 ChromeDataUseAscriber::CreateURLRequestClassifier() const { |
| 408 return base::MakeUnique<ContentURLRequestClassifier>(); | 424 return base::MakeUnique<ContentURLRequestClassifier>(); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 438 visible_main_render_frames_.insert(main_render_frame_host_id); | 454 visible_main_render_frames_.insert(main_render_frame_host_id); |
| 439 } else { | 455 } else { |
| 440 visible_main_render_frames_.erase(main_render_frame_host_id); | 456 visible_main_render_frames_.erase(main_render_frame_host_id); |
| 441 } | 457 } |
| 442 } | 458 } |
| 443 | 459 |
| 444 void ChromeDataUseAscriber::RenderFrameHostChanged(int old_render_process_id, | 460 void ChromeDataUseAscriber::RenderFrameHostChanged(int old_render_process_id, |
| 445 int old_render_frame_id, | 461 int old_render_frame_id, |
| 446 int new_render_process_id, | 462 int new_render_process_id, |
| 447 int new_render_frame_id) { | 463 int new_render_frame_id) { |
| 448 if (visible_main_render_frames_.find( | 464 RenderFrameHostID old_frame(old_render_process_id, old_render_frame_id); |
| 449 RenderFrameHostID(old_render_process_id, old_render_frame_id)) != | 465 if (visible_main_render_frames_.find(old_frame) != |
| 450 visible_main_render_frames_.end()) { | 466 visible_main_render_frames_.end()) { |
| 451 WasShownOrHidden(new_render_process_id, new_render_frame_id, true); | 467 WasShownOrHidden(new_render_process_id, new_render_frame_id, true); |
| 452 } | 468 } |
| 469 auto pending_navigation_iter = |
| 470 pending_navigation_global_request_id_.find(old_frame); |
| 471 if (pending_navigation_iter != pending_navigation_global_request_id_.end()) { |
| 472 pending_navigation_global_request_id_.insert(std::make_pair( |
| 473 RenderFrameHostID(new_render_process_id, new_render_frame_id), |
| 474 pending_navigation_iter->second)); |
| 475 pending_navigation_global_request_id_.erase(pending_navigation_iter); |
| 476 } |
| 453 } | 477 } |
| 454 | 478 |
| 455 } // namespace data_use_measurement | 479 } // namespace data_use_measurement |
| OLD | NEW |