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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc
diff --git a/chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc b/chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc
index a0ffbc982c28fb0b7af11d84607cff039f697e70..28e78c1e80aa936201bb11f20fb468dacf986549 100644
--- a/chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc
+++ b/chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc
@@ -41,6 +41,7 @@ ChromeDataUseAscriber::ChromeDataUseAscriber() {
ChromeDataUseAscriber::~ChromeDataUseAscriber() {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
DCHECK(subframe_to_mainframe_map_.empty());
+ // DCHECK(pending_navigation_global_request_id_.empty());
// |data_use_recorders_| can be non empty, when mainframe url requests are
// created but no mainframe navigations take place.
// TODO(rajendrant): Enable this check when fixed for unittests.
@@ -274,6 +275,7 @@ void ChromeDataUseAscriber::RenderFrameDeleted(int render_process_id,
}
subframe_to_mainframe_map_.erase(key);
visible_main_render_frames_.erase(key);
+ pending_navigation_global_request_id_.erase(key);
}
void ChromeDataUseAscriber::DidStartMainFrameNavigation(
@@ -285,21 +287,41 @@ void ChromeDataUseAscriber::DidStartMainFrameNavigation(
}
void ChromeDataUseAscriber::ReadyToCommitMainFrameNavigation(
- GURL gurl,
content::GlobalRequestID global_request_id,
int render_process_id,
- int render_frame_id,
- bool is_same_page_navigation,
- void* navigation_handle) {
+ int render_frame_id) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+ pending_navigation_global_request_id_.insert(
+ std::make_pair(RenderFrameHostID(render_process_id, render_frame_id),
+ global_request_id));
+}
+
+void ChromeDataUseAscriber::DidFinishNavigation(int render_process_id,
+ int render_frame_id,
+ GURL gurl,
+ bool is_same_page_navigation,
+ uint32_t page_transition) {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+ RenderFrameHostID mainframe(render_process_id, render_frame_id);
+
+ // Find the global request id of the pending navigation.
+ auto global_request_id =
+ pending_navigation_global_request_id_.find(mainframe);
+
+ // TODO(rajendrant): Analyze why global request ID was not found in
+ // pending navigation map, in tests.
+ if (global_request_id == pending_navigation_global_request_id_.end())
+ return;
+
// Find the DataUseRecorderEntry the frame is associated with
- auto frame_it = main_render_frame_data_use_map_.find(
- RenderFrameHostID(render_process_id, render_frame_id));
+ auto frame_it = main_render_frame_data_use_map_.find(mainframe);
// Find the pending navigation entry.
auto navigation_iter =
- pending_navigation_data_use_map_.find(global_request_id);
+ pending_navigation_data_use_map_.find(global_request_id->second);
+ pending_navigation_global_request_id_.erase(global_request_id);
+
// We might not find a navigation entry since the pending navigation may not
// have caused any HTTP or HTTPS URLRequests to be made.
if (navigation_iter == pending_navigation_data_use_map_.end()) {
@@ -309,7 +331,9 @@ void ChromeDataUseAscriber::ReadyToCommitMainFrameNavigation(
DataUseRecorderEntry old_frame_entry = frame_it->second;
DataUse::TrafficType old_traffic_type =
old_frame_entry->data_use().traffic_type();
+ old_frame_entry->set_page_transition(page_transition);
main_render_frame_data_use_map_.erase(frame_it);
+ NotifyPageLoadCommit(old_frame_entry);
if (old_frame_entry->IsDataUseComplete()) {
NotifyDataUseCompleted(old_frame_entry);
data_use_recorders_.erase(old_frame_entry);
@@ -318,22 +342,21 @@ void ChromeDataUseAscriber::ReadyToCommitMainFrameNavigation(
// Add a new recorder to the render frame map to replace the deleted one.
DataUseRecorderEntry entry = data_use_recorders_.emplace(
data_use_recorders_.end(), old_traffic_type);
- std::pair<int, int> frame_key =
- RenderFrameHostID(render_process_id, render_frame_id);
- entry->set_main_frame_id(frame_key);
- main_render_frame_data_use_map_.insert(std::make_pair(frame_key, entry));
+ entry->set_main_frame_id(mainframe);
+ main_render_frame_data_use_map_.insert(std::make_pair(mainframe, entry));
}
return;
}
DataUseRecorderEntry entry = navigation_iter->second;
pending_navigation_data_use_map_.erase(navigation_iter);
- entry->set_main_frame_id(
- RenderFrameHostID(render_process_id, render_frame_id));
+ entry->set_main_frame_id(mainframe);
// If the frame has already been deleted then mark this navigation as having
// completed its data use.
if (frame_it == main_render_frame_data_use_map_.end()) {
+ entry->set_page_transition(page_transition);
+ NotifyPageLoadCommit(entry);
if (entry->IsDataUseComplete()) {
NotifyDataUseCompleted(entry);
data_use_recorders_.erase(entry);
@@ -341,6 +364,9 @@ void ChromeDataUseAscriber::ReadyToCommitMainFrameNavigation(
return;
}
DataUseRecorderEntry old_frame_entry = frame_it->second;
+ old_frame_entry->set_page_transition(page_transition);
+ NotifyPageLoadCommit(old_frame_entry);
+
if (is_same_page_navigation) {
old_frame_entry->MergeFrom(&(*entry));
@@ -363,8 +389,7 @@ void ChromeDataUseAscriber::ReadyToCommitMainFrameNavigation(
NotifyDataUseCompleted(old_frame_entry);
data_use_recorders_.erase(old_frame_entry);
- if (visible_main_render_frames_.find(
- RenderFrameHostID(render_process_id, render_frame_id)) !=
+ if (visible_main_render_frames_.find(mainframe) !=
visible_main_render_frames_.end()) {
entry->set_is_visible(true);
}
@@ -380,22 +405,13 @@ void ChromeDataUseAscriber::ReadyToCommitMainFrameNavigation(
data_use.set_url(gurl);
}
- main_render_frame_data_use_map_.insert(std::make_pair(
- RenderFrameHostID(render_process_id, render_frame_id), entry));
+ main_render_frame_data_use_map_.insert(std::make_pair(mainframe, entry));
}
}
-void ChromeDataUseAscriber::DidFinishNavigation(int render_process_id,
- int render_frame_id,
- uint32_t page_transition) {
- auto frame_it = main_render_frame_data_use_map_.find(
- RenderFrameHostID(render_process_id, render_frame_id));
- if (frame_it != main_render_frame_data_use_map_.end()) {
- frame_it->second->set_page_transition(page_transition);
-
- for (auto& observer : observers_)
- observer.OnPageLoadCommit(&frame_it->second->data_use());
- }
+void ChromeDataUseAscriber::NotifyPageLoadCommit(DataUseRecorderEntry entry) {
+ for (auto& observer : observers_)
+ observer.OnPageLoadCommit(&entry->data_use());
}
void ChromeDataUseAscriber::NotifyDataUseCompleted(DataUseRecorderEntry entry) {
@@ -445,11 +461,19 @@ void ChromeDataUseAscriber::RenderFrameHostChanged(int old_render_process_id,
int old_render_frame_id,
int new_render_process_id,
int new_render_frame_id) {
- if (visible_main_render_frames_.find(
- RenderFrameHostID(old_render_process_id, old_render_frame_id)) !=
+ RenderFrameHostID old_frame(old_render_process_id, old_render_frame_id);
+ if (visible_main_render_frames_.find(old_frame) !=
visible_main_render_frames_.end()) {
WasShownOrHidden(new_render_process_id, new_render_frame_id, true);
}
+ auto pending_navigation_iter =
+ pending_navigation_global_request_id_.find(old_frame);
+ if (pending_navigation_iter != pending_navigation_global_request_id_.end()) {
+ pending_navigation_global_request_id_.insert(std::make_pair(
+ RenderFrameHostID(new_render_process_id, new_render_frame_id),
+ pending_navigation_iter->second));
+ pending_navigation_global_request_id_.erase(pending_navigation_iter);
+ }
}
} // namespace data_use_measurement

Powered by Google App Engine
This is Rietveld 408576698