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

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

Issue 2413663003: Expose GlobalRequestID in NavigationHandle and ResourceRequestInfo. (Closed)
Patch Set: Remove pending navigation queue. Created 4 years, 1 month 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 "base/memory/ptr_util.h"
8 #include "components/data_use_measurement/core/data_use_recorder.h"
9 #include "components/data_use_measurement/core/data_use_user_data.h"
7 #include "content/public/browser/browser_thread.h" 10 #include "content/public/browser/browser_thread.h"
8 #include "content/public/browser/navigation_handle.h" 11 #include "content/public/browser/navigation_handle.h"
9 #include "content/public/browser/render_frame_host.h" 12 #include "content/public/browser/render_frame_host.h"
13 #include "content/public/browser/resource_request_info.h"
14 #include "net/url_request/url_request.h"
10 15
11 namespace data_use_measurement { 16 namespace data_use_measurement {
12 17
18 // static
19 const void* ChromeDataUseAscriber::DataUseRecorderEntryAsUserData::
20 kUserDataKey = static_cast<void*>(
21 &ChromeDataUseAscriber::DataUseRecorderEntryAsUserData::kUserDataKey);
22
23 ChromeDataUseAscriber::DataUseRecorderEntryAsUserData::
24 DataUseRecorderEntryAsUserData(DataUseRecorderEntry entry)
25 : entry_(entry) {}
26
27 ChromeDataUseAscriber::DataUseRecorderEntryAsUserData::
28 ~DataUseRecorderEntryAsUserData() {}
29
13 ChromeDataUseAscriber::ChromeDataUseAscriber() { 30 ChromeDataUseAscriber::ChromeDataUseAscriber() {
14 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 31 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
15 } 32 }
16 33
17 ChromeDataUseAscriber::~ChromeDataUseAscriber() { 34 ChromeDataUseAscriber::~ChromeDataUseAscriber() {
18 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 35 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
36
RyanSturm 2016/11/07 19:33:19 nit: remove line break
Not at Google. Contact bengr 2016/11/07 22:17:18 Done.
37 DCHECK_EQ(0u, data_use_recorders_.size());
19 } 38 }
20 39
21 DataUseRecorder* ChromeDataUseAscriber::GetDataUseRecorder( 40 DataUseRecorder* ChromeDataUseAscriber::GetDataUseRecorder(
22 net::URLRequest* request) { 41 net::URLRequest* request) {
23 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 42 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
24 return nullptr; 43 return nullptr;
25 } 44 }
26 45
46 void ChromeDataUseAscriber::OnBeforeUrlRequest(net::URLRequest* request) {
47 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
48
49 auto service = static_cast<DataUseUserData*>(
50 request->GetUserData(DataUseUserData::kUserDataKey));
51 if (service)
52 return;
53
54 const content::ResourceRequestInfo* request_info =
55 content::ResourceRequestInfo::ForRequest(request);
56 content::ResourceType resource_type = request_info
57 ? request_info->GetResourceType()
58 : content::RESOURCE_TYPE_LAST_TYPE;
59
60 if (resource_type != content::RESOURCE_TYPE_MAIN_FRAME)
61 return;
62
63 int render_process_id = -1;
64 int render_frame_id = -1;
65 bool has_valid_render_frame_id =
66 content::ResourceRequestInfo::GetRenderFrameForRequest(
67 request, &render_process_id, &render_frame_id);
68 DCHECK(has_valid_render_frame_id);
69 // Browser tests may not set up DataUseWebContentsObservers in which case
70 // this class never sees navigation and frame events so DataUseRecorders
71 // will never be destroyed. To avoid this, we ignore requests whose
72 // render frames don't have a record. However, this can also be caused by
73 // URLRequests racing the frame create events.
74 // TODO(kundaji): Add UMA.
75 if (render_frame_data_use_map_.find(
76 RenderFrameHostID(render_process_id, render_frame_id)) ==
77 render_frame_data_use_map_.end()) {
78 return;
79 }
80
81 auto user_data = static_cast<DataUseRecorderEntryAsUserData*>(
82 request->GetUserData(DataUseRecorderEntryAsUserData::kUserDataKey));
83 if (user_data)
RyanSturm 2016/11/07 19:33:19 nit: Can you add a comment "If this request is alr
Not at Google. Contact bengr 2016/11/07 22:17:18 Done.
84 return;
85
86 DataUseRecorderEntry entry = data_use_recorders_.insert(
87 data_use_recorders_.end(), base::MakeUnique<DataUseRecorder>());
88 request->SetUserData(DataUseRecorderEntryAsUserData::kUserDataKey,
89 new DataUseRecorderEntryAsUserData(entry));
90
91 pending_navigation_data_use_map_.insert(
92 std::make_pair(request_info->GetGlobalRequestID(), entry));
93 }
94
95 void ChromeDataUseAscriber::OnUrlRequestCompleted(net::URLRequest* request,
96 bool started) {
97 const content::ResourceRequestInfo* request_info =
98 content::ResourceRequestInfo::ForRequest(request);
99 content::ResourceType resource_type = request_info
100 ? request_info->GetResourceType()
101 : content::RESOURCE_TYPE_LAST_TYPE;
102
103 if (resource_type == content::RESOURCE_TYPE_MAIN_FRAME) {
104 // If request was not successful, then ReadyToCommitNavigation will not be
105 // called. So delete the pending navigation DataUseRecorderEntry here.
106 if (!request->status().is_success()) {
107 DeletePendingNavigationEntry(request_info->GetGlobalRequestID());
108 }
109 }
110 }
111
27 void ChromeDataUseAscriber::RenderFrameCreated(int render_process_id, 112 void ChromeDataUseAscriber::RenderFrameCreated(int render_process_id,
28 int render_frame_id, 113 int render_frame_id,
29 int parent_render_process_id, 114 int parent_render_process_id,
30 int parent_render_frame_id) { 115 int parent_render_frame_id) {
31 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 116 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
117
118 // TODO(kundaji): Point child render frames to the same DataUseRecorder as
119 // parent render frame.
120 DataUseRecorderEntry entry = data_use_recorders_.insert(
121 data_use_recorders_.end(), base::MakeUnique<DataUseRecorder>());
122 render_frame_data_use_map_.insert(std::make_pair(
123 RenderFrameHostID(render_process_id, render_frame_id), entry));
32 } 124 }
33 125
34 void ChromeDataUseAscriber::RenderFrameDeleted(int render_process_id, 126 void ChromeDataUseAscriber::RenderFrameDeleted(int render_process_id,
35 int render_frame_id, 127 int render_frame_id,
36 int parent_render_process_id, 128 int parent_render_process_id,
37 int parent_render_frame_id) { 129 int parent_render_frame_id) {
38 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 130 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
131 RenderFrameHostID key(render_process_id, render_frame_id);
132 auto frame_iter = render_frame_data_use_map_.find(key);
133 DCHECK(frame_iter != render_frame_data_use_map_.end());
134 DataUseRecorderEntry entry = frame_iter->second;
135 render_frame_data_use_map_.erase(frame_iter);
136 data_use_recorders_.erase(entry);
39 } 137 }
40 138
41 void ChromeDataUseAscriber::DidStartMainFrameNavigation( 139 void ChromeDataUseAscriber::DidStartMainFrameNavigation(
42 GURL gurl, 140 GURL gurl,
43 int render_process_id, 141 int render_process_id,
44 int render_frame_id, 142 int render_frame_id,
45 void* navigation_handle) { 143 void* navigation_handle) {
46 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 144 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
47 } 145 }
48 146
49 void ChromeDataUseAscriber::DidFinishMainFrameNavigation( 147 void ChromeDataUseAscriber::ReadyToCommitMainFrameNavigation(
50 GURL gurl, 148 GURL gurl,
149 content::GlobalRequestID global_request_id,
51 int render_process_id, 150 int render_process_id,
52 int render_frame_id, 151 int render_frame_id,
53 bool is_same_page_navigation, 152 bool is_same_page_navigation,
54 void* navigation_handle) { 153 void* navigation_handle) {
55 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 154 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
155
156 // TODO(kundaji): Move the DataUseRecorderEntry from pending navigation map
157 // to render frame map if |is_same_page_navigation| is true. Otherwise,
158 // merge it with the DataUseRecorderEntry in the render frame map.
159 DeletePendingNavigationEntry(global_request_id);
56 } 160 }
57 161
58 void ChromeDataUseAscriber::DidRedirectMainFrameNavigation( 162 void ChromeDataUseAscriber::DidRedirectMainFrameNavigation(
59 GURL gurl, 163 GURL gurl,
60 int render_process_id, 164 int render_process_id,
61 int render_frame_id, 165 int render_frame_id,
62 void* navigation_handle) { 166 void* navigation_handle) {
63 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 167 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
64 } 168 }
65 169
170 void ChromeDataUseAscriber::DeletePendingNavigationEntry(
171 content::GlobalRequestID global_request_id) {
172 auto navigation_iter =
173 pending_navigation_data_use_map_.find(global_request_id);
174 // Pending navigation entry will not be found if finish navigation
175 // raced the URLRequest.
176 if (navigation_iter != pending_navigation_data_use_map_.end()) {
177 auto entry = navigation_iter->second;
178 pending_navigation_data_use_map_.erase(navigation_iter);
179 data_use_recorders_.erase(entry);
180 }
181 }
182
66 } // namespace data_use_measurement 183 } // namespace data_use_measurement
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698