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

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

Issue 2874353002: PlzNavigate support in data use ascriber (Closed)
Patch Set: more fixes 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
« no previous file with comments | « no previous file | chrome/browser/data_use_measurement/chrome_data_use_ascriber_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 ChromeDataUseRecorder* ChromeDataUseAscriber::GetOrCreateDataUseRecorder( 50 ChromeDataUseRecorder* ChromeDataUseAscriber::GetOrCreateDataUseRecorder(
51 net::URLRequest* request) { 51 net::URLRequest* request) {
52 DataUseRecorderEntry entry = GetOrCreateDataUseRecorderEntry(request); 52 DataUseRecorderEntry entry = GetOrCreateDataUseRecorderEntry(request);
53 return entry == data_use_recorders_.end() ? nullptr : &(*entry); 53 return entry == data_use_recorders_.end() ? nullptr : &(*entry);
54 } 54 }
55 55
56 ChromeDataUseRecorder* ChromeDataUseAscriber::GetDataUseRecorder( 56 ChromeDataUseRecorder* ChromeDataUseAscriber::GetDataUseRecorder(
57 const net::URLRequest& request) { 57 const net::URLRequest& request) {
58 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 58 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
59 59
60 // TODO(ryansturm): Handle PlzNavigate (http://crbug/664233).
61 if (content::IsBrowserSideNavigationEnabled())
62 return nullptr;
63
64 // If a DataUseRecorder has already been set as user data, then return that. 60 // If a DataUseRecorder has already been set as user data, then return that.
65 auto* user_data = static_cast<DataUseRecorderEntryAsUserData*>( 61 auto* user_data = static_cast<DataUseRecorderEntryAsUserData*>(
66 request.GetUserData(DataUseRecorderEntryAsUserData::kUserDataKey)); 62 request.GetUserData(DataUseRecorderEntryAsUserData::kUserDataKey));
67 return user_data ? &(*user_data->recorder_entry()) : nullptr; 63 return user_data ? &(*user_data->recorder_entry()) : nullptr;
68 } 64 }
69 65
70 ChromeDataUseAscriber::DataUseRecorderEntry 66 ChromeDataUseAscriber::DataUseRecorderEntry
71 ChromeDataUseAscriber::GetOrCreateDataUseRecorderEntry( 67 ChromeDataUseAscriber::GetOrCreateDataUseRecorderEntry(
72 net::URLRequest* request) { 68 net::URLRequest* request) {
73 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 69 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
74 70
75 // TODO(ryansturm): Handle PlzNavigate (http://crbug/664233).
76 if (content::IsBrowserSideNavigationEnabled())
77 return data_use_recorders_.end();
78
79 // If a DataUseRecorder has already been set as user data, then return that. 71 // If a DataUseRecorder has already been set as user data, then return that.
80 auto* user_data = static_cast<DataUseRecorderEntryAsUserData*>( 72 auto* user_data = static_cast<DataUseRecorderEntryAsUserData*>(
81 request->GetUserData(DataUseRecorderEntryAsUserData::kUserDataKey)); 73 request->GetUserData(DataUseRecorderEntryAsUserData::kUserDataKey));
82 if (user_data) 74 if (user_data)
83 return user_data->recorder_entry(); 75 return user_data->recorder_entry();
84 76
85 // If request is associated with a ChromeService, create a new 77 // If request is associated with a ChromeService, create a new
86 // DataUseRecorder for it. There is no reason to aggregate URLRequests 78 // DataUseRecorder for it. There is no reason to aggregate URLRequests
87 // from ChromeServices into the same DataUseRecorder instance. 79 // from ChromeServices into the same DataUseRecorder instance.
88 DataUseUserData* service = static_cast<DataUseUserData*>( 80 DataUseUserData* service = static_cast<DataUseUserData*>(
89 request->GetUserData(DataUseUserData::kUserDataKey)); 81 request->GetUserData(DataUseUserData::kUserDataKey));
90 if (service) { 82 if (service) {
91 DataUseRecorderEntry entry = 83 DataUseRecorderEntry entry =
92 CreateNewDataUseRecorder(request, DataUse::TrafficType::SERVICES); 84 CreateNewDataUseRecorder(request, DataUse::TrafficType::SERVICES);
93 entry->data_use().set_description( 85 entry->data_use().set_description(
94 DataUseUserData::GetServiceNameAsString(service->service_name())); 86 DataUseUserData::GetServiceNameAsString(service->service_name()));
95 return entry; 87 return entry;
96 } 88 }
97 89
90 const content::ResourceRequestInfo* request_info =
91 content::ResourceRequestInfo::ForRequest(request);
92 if (!request_info ||
93 request_info->GetGlobalRequestID() == content::GlobalRequestID()) {
94 // Create a new DataUseRecorder for all other requests.
95 DataUseRecorderEntry entry =
96 CreateNewDataUseRecorder(request, DataUse::TrafficType::UNKNOWN);
97 DataUse& data_use = entry->data_use();
98 data_use.set_url(request->url());
99 return entry;
100 }
101
102 if (request_info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME) {
RyanSturm 2017/05/22 17:22:05 Should this clause be before the other clause you
rajendrant 2017/05/24 07:14:09 I guess, your question is about the following bug
RyanSturm 2017/05/24 16:08:44 sgtm.
103 DataUseRecorderEntry new_entry =
104 CreateNewDataUseRecorder(request, DataUse::TrafficType::USER_TRAFFIC);
105 new_entry->set_main_frame_request_id(request_info->GetGlobalRequestID());
106 pending_navigation_data_use_map_.insert(
107 std::make_pair(request_info->GetGlobalRequestID(), new_entry));
108 return new_entry;
109 }
110
98 int render_process_id = -1; 111 int render_process_id = -1;
99 int render_frame_id = -1; 112 int render_frame_id = -1;
100 bool has_valid_frame = content::ResourceRequestInfo::GetRenderFrameForRequest( 113 bool has_valid_frame = content::ResourceRequestInfo::GetRenderFrameForRequest(
101 request, &render_process_id, &render_frame_id); 114 request, &render_process_id, &render_frame_id);
102 if (has_valid_frame && 115 if (has_valid_frame &&
103 render_frame_id != SpecialRoutingIDs::MSG_ROUTING_NONE) { 116 render_frame_id != SpecialRoutingIDs::MSG_ROUTING_NONE) {
104 DCHECK(render_process_id >= 0 || render_frame_id >= 0); 117 DCHECK(render_process_id >= 0 || render_frame_id >= 0);
105 118
106 // Browser tests may not set up DataUseWebContentsObservers in which case 119 // Browser tests may not set up DataUseWebContentsObservers in which case
107 // this class never sees navigation and frame events so DataUseRecorders 120 // this class never sees navigation and frame events so DataUseRecorders
108 // will never be destroyed. To avoid this, we ignore requests whose 121 // will never be destroyed. To avoid this, we ignore requests whose
109 // render frames don't have a record. However, this can also be caused by 122 // render frames don't have a record. However, this can also be caused by
110 // URLRequests racing the frame create events. 123 // URLRequests racing the frame create events.
111 // TODO(kundaji): Add UMA. 124 // TODO(kundaji): Add UMA.
112 RenderFrameHostID frame_key(render_process_id, render_frame_id); 125 RenderFrameHostID frame_key(render_process_id, render_frame_id);
113 auto main_frame_key_iter = subframe_to_mainframe_map_.find(frame_key); 126 auto main_frame_key_iter = subframe_to_mainframe_map_.find(frame_key);
114 if (main_frame_key_iter == subframe_to_mainframe_map_.end()) { 127 if (main_frame_key_iter == subframe_to_mainframe_map_.end()) {
115 return data_use_recorders_.end(); 128 return data_use_recorders_.end();
116 } 129 }
117 auto frame_iter = 130 auto frame_iter =
118 main_render_frame_data_use_map_.find(main_frame_key_iter->second); 131 main_render_frame_data_use_map_.find(main_frame_key_iter->second);
119 if (frame_iter == main_render_frame_data_use_map_.end()) { 132 if (frame_iter == main_render_frame_data_use_map_.end()) {
120 return data_use_recorders_.end(); 133 return data_use_recorders_.end();
121 } 134 }
122 135
123 const content::ResourceRequestInfo* request_info =
124 content::ResourceRequestInfo::ForRequest(request);
125 content::ResourceType resource_type =
126 request_info ? request_info->GetResourceType()
127 : content::RESOURCE_TYPE_LAST_TYPE;
128
129 if (resource_type == content::RESOURCE_TYPE_MAIN_FRAME) {
130 content::GlobalRequestID navigation_key =
131 request_info->GetGlobalRequestID();
132
133 DataUseRecorderEntry new_entry =
134 CreateNewDataUseRecorder(request, DataUse::TrafficType::USER_TRAFFIC);
135 new_entry->set_main_frame_request_id(navigation_key);
136 pending_navigation_data_use_map_.insert(
137 std::make_pair(navigation_key, new_entry));
138
139 return new_entry;
140 }
141
142 DCHECK(frame_iter != main_render_frame_data_use_map_.end());
143 auto entry = frame_iter->second; 136 auto entry = frame_iter->second;
144 request->SetUserData( 137 request->SetUserData(
145 DataUseRecorderEntryAsUserData::kUserDataKey, 138 DataUseRecorderEntryAsUserData::kUserDataKey,
146 base::MakeUnique<DataUseRecorderEntryAsUserData>(entry)); 139 base::MakeUnique<DataUseRecorderEntryAsUserData>(entry));
147 entry->AddPendingURLRequest(request); 140 entry->AddPendingURLRequest(request);
148 return entry; 141 return entry;
149 } 142 }
150 143
151 // Create a new DataUseRecorder for all other requests. 144 // Create a new DataUseRecorder for all other requests.
152 DataUseRecorderEntry entry = CreateNewDataUseRecorder( 145 DataUseRecorderEntry entry = CreateNewDataUseRecorder(
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 180 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
188 181
189 // TODO(rajendrant): GetDataUseRecorder is sufficient and 182 // TODO(rajendrant): GetDataUseRecorder is sufficient and
190 // GetOrCreateDataUseRecorderEntry is not needed. The entry gets created in 183 // GetOrCreateDataUseRecorderEntry is not needed. The entry gets created in
191 // DataUseAscriber::OnBeforeUrlRequest(). 184 // DataUseAscriber::OnBeforeUrlRequest().
192 DataUseRecorderEntry entry = GetOrCreateDataUseRecorderEntry(request); 185 DataUseRecorderEntry entry = GetOrCreateDataUseRecorderEntry(request);
193 186
194 if (entry == data_use_recorders_.end()) 187 if (entry == data_use_recorders_.end())
195 return; 188 return;
196 189
197 RenderFrameHostID frame_key = entry->main_frame_id(); 190 bool will_datause_complete = false;
198 auto frame_iter = main_render_frame_data_use_map_.find(frame_key);
199 bool is_in_render_frame_map =
200 frame_iter != main_render_frame_data_use_map_.end() &&
201 frame_iter->second->HasPendingURLRequest(request);
202
203 const content::ResourceRequestInfo* request_info = 191 const content::ResourceRequestInfo* request_info =
204 content::ResourceRequestInfo::ForRequest(request); 192 content::ResourceRequestInfo::ForRequest(request);
205 bool is_in_pending_navigation_map = 193
206 request_info && 194 if (request_info &&
207 request_info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME && 195 request_info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME) {
208 pending_navigation_data_use_map_.find(entry->main_frame_request_id()) != 196 will_datause_complete =
209 pending_navigation_data_use_map_.end(); 197 pending_navigation_data_use_map_.find(entry->main_frame_request_id()) ==
198 pending_navigation_data_use_map_.end();
199 } else {
200 // Non-mainframe, Services, and other requests.
201 auto frame_iter =
202 main_render_frame_data_use_map_.find(entry->main_frame_id());
RyanSturm 2017/05/22 17:22:05 If the request is destroyed after the next page lo
rajendrant 2017/05/24 07:14:09 Yes. That happens in mainframe delete or next page
RyanSturm 2017/05/24 16:08:44 I was thinking more along the lines of: 1) reques
203 will_datause_complete =
204 frame_iter == main_render_frame_data_use_map_.end() ||
205 !frame_iter->second->HasPendingURLRequest(request);
206 }
210 207
211 DataUseAscriber::OnUrlRequestDestroyed(request); 208 DataUseAscriber::OnUrlRequestDestroyed(request);
212 request->RemoveUserData(DataUseRecorderEntryAsUserData::kUserDataKey); 209 request->RemoveUserData(DataUseRecorderEntryAsUserData::kUserDataKey);
213 210
214 if (entry->IsDataUseComplete() && !is_in_render_frame_map && 211 if (entry->IsDataUseComplete() && will_datause_complete) {
215 !is_in_pending_navigation_map) {
216 OnDataUseCompleted(entry); 212 OnDataUseCompleted(entry);
217 data_use_recorders_.erase(entry); 213 data_use_recorders_.erase(entry);
218 } 214 }
219 } 215 }
220 216
221 void ChromeDataUseAscriber::RenderFrameCreated(int render_process_id, 217 void ChromeDataUseAscriber::RenderFrameCreated(int render_process_id,
222 int render_frame_id, 218 int render_frame_id,
223 int main_render_process_id, 219 int main_render_process_id,
224 int main_render_frame_id) { 220 int main_render_frame_id) {
225 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 221 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
226 222
227 if (content::IsBrowserSideNavigationEnabled())
228 return;
229
230 if (main_render_process_id != -1 && main_render_frame_id != -1) { 223 if (main_render_process_id != -1 && main_render_frame_id != -1) {
231 // Create an entry in |subframe_to_mainframe_map_| for this frame mapped to 224 // Create an entry in |subframe_to_mainframe_map_| for this frame mapped to
232 // it's parent frame. 225 // it's parent frame.
233 subframe_to_mainframe_map_.insert(std::make_pair( 226 subframe_to_mainframe_map_.insert(std::make_pair(
234 RenderFrameHostID(render_process_id, render_frame_id), 227 RenderFrameHostID(render_process_id, render_frame_id),
235 RenderFrameHostID(main_render_process_id, main_render_frame_id))); 228 RenderFrameHostID(main_render_process_id, main_render_frame_id)));
236 } else { 229 } else {
237 subframe_to_mainframe_map_.insert( 230 subframe_to_mainframe_map_.insert(
238 std::make_pair(RenderFrameHostID(render_process_id, render_frame_id), 231 std::make_pair(RenderFrameHostID(render_process_id, render_frame_id),
239 RenderFrameHostID(render_process_id, render_frame_id))); 232 RenderFrameHostID(render_process_id, render_frame_id)));
240 auto frame_iter = main_render_frame_data_use_map_.find( 233 auto frame_iter = main_render_frame_data_use_map_.find(
241 RenderFrameHostID(render_process_id, render_frame_id)); 234 RenderFrameHostID(render_process_id, render_frame_id));
242 DCHECK(frame_iter == main_render_frame_data_use_map_.end()); 235 DCHECK(frame_iter == main_render_frame_data_use_map_.end());
243 DataUseRecorderEntry entry = 236 DataUseRecorderEntry entry =
244 CreateNewDataUseRecorder(nullptr, DataUse::TrafficType::UNKNOWN); 237 CreateNewDataUseRecorder(nullptr, DataUse::TrafficType::UNKNOWN);
245 entry->set_main_frame_id( 238 entry->set_main_frame_id(
246 RenderFrameHostID(render_process_id, render_frame_id)); 239 RenderFrameHostID(render_process_id, render_frame_id));
247 main_render_frame_data_use_map_.insert(std::make_pair( 240 main_render_frame_data_use_map_.insert(std::make_pair(
248 RenderFrameHostID(render_process_id, render_frame_id), entry)); 241 RenderFrameHostID(render_process_id, render_frame_id), entry));
249 } 242 }
250 } 243 }
251 244
252 void ChromeDataUseAscriber::RenderFrameDeleted(int render_process_id, 245 void ChromeDataUseAscriber::RenderFrameDeleted(int render_process_id,
253 int render_frame_id, 246 int render_frame_id,
254 int main_render_process_id, 247 int main_render_process_id,
255 int main_render_frame_id) { 248 int main_render_frame_id) {
256 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 249 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
257 250
258 if (content::IsBrowserSideNavigationEnabled())
259 return;
260
261 RenderFrameHostID key(render_process_id, render_frame_id); 251 RenderFrameHostID key(render_process_id, render_frame_id);
262 252
263 if (main_render_process_id == -1 && main_render_frame_id == -1) { 253 if (main_render_process_id == -1 && main_render_frame_id == -1) {
264 auto frame_iter = main_render_frame_data_use_map_.find(key); 254 auto frame_iter = main_render_frame_data_use_map_.find(key);
265 DataUseRecorderEntry entry = frame_iter->second; 255 DataUseRecorderEntry entry = frame_iter->second;
266 if (entry->IsDataUseComplete()) { 256 if (entry->IsDataUseComplete()) {
267 OnDataUseCompleted(entry); 257 OnDataUseCompleted(entry);
268 data_use_recorders_.erase(entry); 258 data_use_recorders_.erase(entry);
269 } 259 }
270 main_render_frame_data_use_map_.erase(frame_iter); 260 main_render_frame_data_use_map_.erase(frame_iter);
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 int new_render_process_id, 429 int new_render_process_id,
440 int new_render_frame_id) { 430 int new_render_frame_id) {
441 if (visible_main_render_frames_.find( 431 if (visible_main_render_frames_.find(
442 RenderFrameHostID(old_render_process_id, old_render_frame_id)) != 432 RenderFrameHostID(old_render_process_id, old_render_frame_id)) !=
443 visible_main_render_frames_.end()) { 433 visible_main_render_frames_.end()) {
444 WasShownOrHidden(new_render_process_id, new_render_frame_id, true); 434 WasShownOrHidden(new_render_process_id, new_render_frame_id, true);
445 } 435 }
446 } 436 }
447 437
448 } // namespace data_use_measurement 438 } // namespace data_use_measurement
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/data_use_measurement/chrome_data_use_ascriber_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698