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

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: 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 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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698