Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(29)

Side by Side Diff: chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc

Issue 2875263003: Support for transfer navigations in data use ascriber (Closed)
Patch Set: rebased Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698