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

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

Issue 2913063002: PlzNavigate support in data use ascriber (Closed)
Patch Set: ps Created 3 years, 6 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 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 ChromeDataUseRecorder* ChromeDataUseAscriber::GetOrCreateDataUseRecorder( 51 ChromeDataUseRecorder* ChromeDataUseAscriber::GetOrCreateDataUseRecorder(
52 net::URLRequest* request) { 52 net::URLRequest* request) {
53 DataUseRecorderEntry entry = GetOrCreateDataUseRecorderEntry(request); 53 DataUseRecorderEntry entry = GetOrCreateDataUseRecorderEntry(request);
54 return entry == data_use_recorders_.end() ? nullptr : &(*entry); 54 return entry == data_use_recorders_.end() ? nullptr : &(*entry);
55 } 55 }
56 56
57 ChromeDataUseRecorder* ChromeDataUseAscriber::GetDataUseRecorder( 57 ChromeDataUseRecorder* ChromeDataUseAscriber::GetDataUseRecorder(
58 const net::URLRequest& request) { 58 const net::URLRequest& request) {
59 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 59 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
60 60
61 // TODO(ryansturm): Handle PlzNavigate (http://crbug/664233).
62 if (content::IsBrowserSideNavigationEnabled())
63 return nullptr;
64
65 // If a DataUseRecorder has already been set as user data, then return that. 61 // If a DataUseRecorder has already been set as user data, then return that.
66 auto* user_data = static_cast<DataUseRecorderEntryAsUserData*>( 62 auto* user_data = static_cast<DataUseRecorderEntryAsUserData*>(
67 request.GetUserData(DataUseRecorderEntryAsUserData::kUserDataKey)); 63 request.GetUserData(DataUseRecorderEntryAsUserData::kUserDataKey));
68 return user_data ? &(*user_data->recorder_entry()) : nullptr; 64 return user_data ? &(*user_data->recorder_entry()) : nullptr;
69 } 65 }
70 66
71 ChromeDataUseAscriber::DataUseRecorderEntry 67 ChromeDataUseAscriber::DataUseRecorderEntry
72 ChromeDataUseAscriber::GetOrCreateDataUseRecorderEntry( 68 ChromeDataUseAscriber::GetOrCreateDataUseRecorderEntry(
73 net::URLRequest* request) { 69 net::URLRequest* request) {
74 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 70 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
75 71
76 // TODO(ryansturm): Handle PlzNavigate (http://crbug/664233).
77 if (content::IsBrowserSideNavigationEnabled())
78 return data_use_recorders_.end();
79
80 // If a DataUseRecorder has already been set as user data, then return that. 72 // If a DataUseRecorder has already been set as user data, then return that.
81 auto* user_data = static_cast<DataUseRecorderEntryAsUserData*>( 73 auto* user_data = static_cast<DataUseRecorderEntryAsUserData*>(
82 request->GetUserData(DataUseRecorderEntryAsUserData::kUserDataKey)); 74 request->GetUserData(DataUseRecorderEntryAsUserData::kUserDataKey));
83 if (user_data) 75 if (user_data)
84 return user_data->recorder_entry(); 76 return user_data->recorder_entry();
85 77
86 // If request is associated with a ChromeService, create a new 78 // If request is associated with a ChromeService, create a new
87 // DataUseRecorder for it. There is no reason to aggregate URLRequests 79 // DataUseRecorder for it. There is no reason to aggregate URLRequests
88 // from ChromeServices into the same DataUseRecorder instance. 80 // from ChromeServices into the same DataUseRecorder instance.
89 DataUseUserData* service = static_cast<DataUseUserData*>( 81 DataUseUserData* service = static_cast<DataUseUserData*>(
90 request->GetUserData(DataUseUserData::kUserDataKey)); 82 request->GetUserData(DataUseUserData::kUserDataKey));
91 if (service) { 83 if (service) {
92 DataUseRecorderEntry entry = 84 DataUseRecorderEntry entry =
93 CreateNewDataUseRecorder(request, DataUse::TrafficType::SERVICES); 85 CreateNewDataUseRecorder(request, DataUse::TrafficType::SERVICES);
94 entry->data_use().set_description( 86 entry->data_use().set_description(
95 DataUseUserData::GetServiceNameAsString(service->service_name())); 87 DataUseUserData::GetServiceNameAsString(service->service_name()));
96 return entry; 88 return entry;
97 } 89 }
98 90
91 if (!request->url().SchemeIsHTTPOrHTTPS())
92 return data_use_recorders_.end();
93
94 const content::ResourceRequestInfo* request_info =
95 content::ResourceRequestInfo::ForRequest(request);
96 if (!request_info ||
97 request_info->GetGlobalRequestID() == content::GlobalRequestID()) {
98 // Create a new DataUseRecorder for all other requests.
RyanSturm 2017/05/31 16:26:01 nit: s/other/non-content initiated/
tbansal1 2017/05/31 16:32:54 Done.
99 DataUseRecorderEntry entry =
100 CreateNewDataUseRecorder(request, DataUse::TrafficType::UNKNOWN);
101 DataUse& data_use = entry->data_use();
102 data_use.set_url(request->url());
103 return entry;
104 }
105
106 if (request_info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME) {
107 DataUseRecorderEntry new_entry =
108 CreateNewDataUseRecorder(request, DataUse::TrafficType::USER_TRAFFIC);
109 new_entry->set_main_frame_request_id(request_info->GetGlobalRequestID());
110 pending_navigation_data_use_map_.insert(
111 std::make_pair(request_info->GetGlobalRequestID(), new_entry));
112 return new_entry;
113 }
114
99 int render_process_id = -1; 115 int render_process_id = -1;
100 int render_frame_id = -1; 116 int render_frame_id = -1;
101 bool has_valid_frame = content::ResourceRequestInfo::GetRenderFrameForRequest( 117 bool has_valid_frame = content::ResourceRequestInfo::GetRenderFrameForRequest(
102 request, &render_process_id, &render_frame_id); 118 request, &render_process_id, &render_frame_id);
103 if (has_valid_frame && 119 if (has_valid_frame &&
104 render_frame_id != SpecialRoutingIDs::MSG_ROUTING_NONE) { 120 render_frame_id != SpecialRoutingIDs::MSG_ROUTING_NONE) {
105 DCHECK(render_process_id >= 0 || render_frame_id >= 0); 121 DCHECK(content::IsBrowserSideNavigationEnabled() ||
122 render_process_id >= 0 || render_frame_id >= 0);
106 123
107 // Browser tests may not set up DataUseWebContentsObservers in which case 124 // Browser tests may not set up DataUseWebContentsObservers in which case
108 // this class never sees navigation and frame events so DataUseRecorders 125 // this class never sees navigation and frame events so DataUseRecorders
109 // will never be destroyed. To avoid this, we ignore requests whose 126 // will never be destroyed. To avoid this, we ignore requests whose
110 // render frames don't have a record. However, this can also be caused by 127 // render frames don't have a record. However, this can also be caused by
111 // URLRequests racing the frame create events. 128 // URLRequests racing the frame create events.
112 // TODO(kundaji): Add UMA. 129 // TODO(kundaji): Add UMA.
113 RenderFrameHostID frame_key(render_process_id, render_frame_id); 130 RenderFrameHostID frame_key(render_process_id, render_frame_id);
114 auto main_frame_key_iter = subframe_to_mainframe_map_.find(frame_key); 131 const auto main_frame_key_iter = subframe_to_mainframe_map_.find(frame_key);
115 if (main_frame_key_iter == subframe_to_mainframe_map_.end()) { 132 if (main_frame_key_iter == subframe_to_mainframe_map_.end()) {
116 return data_use_recorders_.end(); 133 return data_use_recorders_.end();
117 } 134 }
118 auto frame_iter = 135 const auto frame_iter =
119 main_render_frame_data_use_map_.find(main_frame_key_iter->second); 136 main_render_frame_data_use_map_.find(main_frame_key_iter->second);
120 if (frame_iter == main_render_frame_data_use_map_.end()) { 137 if (frame_iter == main_render_frame_data_use_map_.end()) {
121 return data_use_recorders_.end(); 138 return data_use_recorders_.end();
122 } 139 }
123 140
124 const content::ResourceRequestInfo* request_info = 141 const auto entry = frame_iter->second;
125 content::ResourceRequestInfo::ForRequest(request);
126 content::ResourceType resource_type =
127 request_info ? request_info->GetResourceType()
128 : content::RESOURCE_TYPE_LAST_TYPE;
129
130 if (resource_type == content::RESOURCE_TYPE_MAIN_FRAME) {
131 content::GlobalRequestID navigation_key =
132 request_info->GetGlobalRequestID();
133
134 DataUseRecorderEntry new_entry =
135 CreateNewDataUseRecorder(request, DataUse::TrafficType::USER_TRAFFIC);
136 new_entry->set_main_frame_request_id(navigation_key);
137 pending_navigation_data_use_map_.insert(
138 std::make_pair(navigation_key, new_entry));
139
140 return new_entry;
141 }
142
143 DCHECK(frame_iter != main_render_frame_data_use_map_.end());
144 auto entry = frame_iter->second;
145 request->SetUserData( 142 request->SetUserData(
146 DataUseRecorderEntryAsUserData::kUserDataKey, 143 DataUseRecorderEntryAsUserData::kUserDataKey,
147 base::MakeUnique<DataUseRecorderEntryAsUserData>(entry)); 144 base::MakeUnique<DataUseRecorderEntryAsUserData>(entry));
148 entry->AddPendingURLRequest(request); 145 entry->AddPendingURLRequest(request);
149 return entry; 146 return entry;
150 } 147 }
151 148
152 // Create a new DataUseRecorder for all other requests. 149 // Create a new DataUseRecorder for all other requests.
153 DataUseRecorderEntry entry = CreateNewDataUseRecorder( 150 DataUseRecorderEntry entry = CreateNewDataUseRecorder(
154 request, 151 request,
(...skipping 28 matching lines...) Expand all
183 if (!request.status().is_success()) 180 if (!request.status().is_success())
184 pending_navigation_data_use_map_.erase(recorder->main_frame_request_id()); 181 pending_navigation_data_use_map_.erase(recorder->main_frame_request_id());
185 } 182 }
186 183
187 void ChromeDataUseAscriber::OnUrlRequestDestroyed(net::URLRequest* request) { 184 void ChromeDataUseAscriber::OnUrlRequestDestroyed(net::URLRequest* request) {
188 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 185 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
189 186
190 // TODO(rajendrant): GetDataUseRecorder is sufficient and 187 // TODO(rajendrant): GetDataUseRecorder is sufficient and
191 // GetOrCreateDataUseRecorderEntry is not needed. The entry gets created in 188 // GetOrCreateDataUseRecorderEntry is not needed. The entry gets created in
192 // DataUseAscriber::OnBeforeUrlRequest(). 189 // DataUseAscriber::OnBeforeUrlRequest().
193 DataUseRecorderEntry entry = GetOrCreateDataUseRecorderEntry(request); 190 const DataUseRecorderEntry entry = GetOrCreateDataUseRecorderEntry(request);
194 191
195 if (entry == data_use_recorders_.end()) 192 if (entry == data_use_recorders_.end())
196 return; 193 return;
197 194
198 for (auto& observer : observers_) 195 for (auto& observer : observers_)
199 observer.OnPageResourceLoad(*request, &entry->data_use()); 196 observer.OnPageResourceLoad(*request, &entry->data_use());
200 197
201 RenderFrameHostID frame_key = entry->main_frame_id(); 198 bool will_datause_complete = false;
202 auto frame_iter = main_render_frame_data_use_map_.find(frame_key);
203 bool is_in_render_frame_map =
204 frame_iter != main_render_frame_data_use_map_.end() &&
205 frame_iter->second->HasPendingURLRequest(request);
206
207 const content::ResourceRequestInfo* request_info = 199 const content::ResourceRequestInfo* request_info =
208 content::ResourceRequestInfo::ForRequest(request); 200 content::ResourceRequestInfo::ForRequest(request);
209 bool is_in_pending_navigation_map = 201
210 request_info && 202 if (request_info &&
211 request_info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME && 203 request_info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME) {
212 pending_navigation_data_use_map_.find(entry->main_frame_request_id()) != 204 will_datause_complete =
213 pending_navigation_data_use_map_.end(); 205 pending_navigation_data_use_map_.find(entry->main_frame_request_id()) ==
206 pending_navigation_data_use_map_.end();
207 } else {
208 // Non-mainframe, Services, and other requests.
209 const auto frame_iter =
210 main_render_frame_data_use_map_.find(entry->main_frame_id());
211 will_datause_complete =
212 frame_iter == main_render_frame_data_use_map_.end() ||
213 !frame_iter->second->HasPendingURLRequest(request);
214 }
214 215
215 DataUseAscriber::OnUrlRequestDestroyed(request); 216 DataUseAscriber::OnUrlRequestDestroyed(request);
216 request->RemoveUserData(DataUseRecorderEntryAsUserData::kUserDataKey); 217 request->RemoveUserData(DataUseRecorderEntryAsUserData::kUserDataKey);
217 218
218 if (entry->IsDataUseComplete() && !is_in_render_frame_map && 219 if (entry->IsDataUseComplete() && will_datause_complete) {
219 !is_in_pending_navigation_map) {
220 NotifyDataUseCompleted(entry); 220 NotifyDataUseCompleted(entry);
221 DeleteFromMainRenderFrameDataUseMap(entry);
221 data_use_recorders_.erase(entry); 222 data_use_recorders_.erase(entry);
222 } 223 }
223 } 224 }
224 225
225 void ChromeDataUseAscriber::RenderFrameCreated(int render_process_id, 226 void ChromeDataUseAscriber::RenderFrameCreated(int render_process_id,
226 int render_frame_id, 227 int render_frame_id,
227 int main_render_process_id, 228 int main_render_process_id,
228 int main_render_frame_id) { 229 int main_render_frame_id) {
229 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 230 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
230 231
231 if (content::IsBrowserSideNavigationEnabled())
232 return;
233
234 if (main_render_process_id != -1 && main_render_frame_id != -1) { 232 if (main_render_process_id != -1 && main_render_frame_id != -1) {
235 // Create an entry in |subframe_to_mainframe_map_| for this frame mapped to 233 // Create an entry in |subframe_to_mainframe_map_| for this frame mapped to
236 // it's parent frame. 234 // it's parent frame.
237 subframe_to_mainframe_map_.insert(std::make_pair( 235 subframe_to_mainframe_map_.insert(std::make_pair(
238 RenderFrameHostID(render_process_id, render_frame_id), 236 RenderFrameHostID(render_process_id, render_frame_id),
239 RenderFrameHostID(main_render_process_id, main_render_frame_id))); 237 RenderFrameHostID(main_render_process_id, main_render_frame_id)));
240 } else { 238 } else {
241 subframe_to_mainframe_map_.insert( 239 subframe_to_mainframe_map_.insert(
242 std::make_pair(RenderFrameHostID(render_process_id, render_frame_id), 240 std::make_pair(RenderFrameHostID(render_process_id, render_frame_id),
243 RenderFrameHostID(render_process_id, render_frame_id))); 241 RenderFrameHostID(render_process_id, render_frame_id)));
244 auto frame_iter = main_render_frame_data_use_map_.find( 242 auto frame_iter = main_render_frame_data_use_map_.find(
245 RenderFrameHostID(render_process_id, render_frame_id)); 243 RenderFrameHostID(render_process_id, render_frame_id));
246 DCHECK(frame_iter == main_render_frame_data_use_map_.end()); 244 DCHECK(frame_iter == main_render_frame_data_use_map_.end());
247 DataUseRecorderEntry entry = 245 DataUseRecorderEntry entry =
248 CreateNewDataUseRecorder(nullptr, DataUse::TrafficType::UNKNOWN); 246 CreateNewDataUseRecorder(nullptr, DataUse::TrafficType::UNKNOWN);
249 entry->set_main_frame_id( 247 entry->set_main_frame_id(
250 RenderFrameHostID(render_process_id, render_frame_id)); 248 RenderFrameHostID(render_process_id, render_frame_id));
251 main_render_frame_data_use_map_.insert(std::make_pair( 249 main_render_frame_data_use_map_.insert(std::make_pair(
252 RenderFrameHostID(render_process_id, render_frame_id), entry)); 250 RenderFrameHostID(render_process_id, render_frame_id), entry));
253 } 251 }
254 } 252 }
255 253
256 void ChromeDataUseAscriber::RenderFrameDeleted(int render_process_id, 254 void ChromeDataUseAscriber::RenderFrameDeleted(int render_process_id,
257 int render_frame_id, 255 int render_frame_id,
258 int main_render_process_id, 256 int main_render_process_id,
259 int main_render_frame_id) { 257 int main_render_frame_id) {
260 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 258 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
261 259
262 if (content::IsBrowserSideNavigationEnabled())
263 return;
264
265 RenderFrameHostID key(render_process_id, render_frame_id); 260 RenderFrameHostID key(render_process_id, render_frame_id);
266 261
267 if (main_render_process_id == -1 && main_render_frame_id == -1) { 262 if (main_render_process_id == -1 && main_render_frame_id == -1) {
268 auto frame_iter = main_render_frame_data_use_map_.find(key); 263 auto frame_iter = main_render_frame_data_use_map_.find(key);
269 DataUseRecorderEntry entry = frame_iter->second; 264
270 if (entry->IsDataUseComplete()) { 265 if (main_render_frame_data_use_map_.end() != frame_iter) {
271 NotifyDataUseCompleted(entry); 266 DataUseRecorderEntry entry = frame_iter->second;
272 data_use_recorders_.erase(entry); 267 if (entry->IsDataUseComplete()) {
268 NotifyDataUseCompleted(entry);
269 data_use_recorders_.erase(entry);
270 }
271 main_render_frame_data_use_map_.erase(frame_iter);
273 } 272 }
274 main_render_frame_data_use_map_.erase(frame_iter);
275 } 273 }
276 subframe_to_mainframe_map_.erase(key); 274 subframe_to_mainframe_map_.erase(key);
277 visible_main_render_frames_.erase(key); 275 visible_main_render_frames_.erase(key);
278 pending_navigation_global_request_id_.erase(key); 276 pending_navigation_global_request_id_.erase(key);
279 } 277 }
280 278
281 void ChromeDataUseAscriber::DidStartMainFrameNavigation( 279 void ChromeDataUseAscriber::DidStartMainFrameNavigation(
282 GURL gurl, 280 GURL gurl,
283 int render_process_id, 281 int render_process_id,
284 int render_frame_id, 282 int render_frame_id,
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 auto navigation_iter = 319 auto navigation_iter =
322 pending_navigation_data_use_map_.find(global_request_id->second); 320 pending_navigation_data_use_map_.find(global_request_id->second);
323 pending_navigation_global_request_id_.erase(global_request_id); 321 pending_navigation_global_request_id_.erase(global_request_id);
324 322
325 // We might not find a navigation entry since the pending navigation may not 323 // We might not find a navigation entry since the pending navigation may not
326 // have caused any HTTP or HTTPS URLRequests to be made. 324 // have caused any HTTP or HTTPS URLRequests to be made.
327 if (navigation_iter == pending_navigation_data_use_map_.end()) { 325 if (navigation_iter == pending_navigation_data_use_map_.end()) {
328 // No pending navigation entry to worry about. However, the old frame entry 326 // No pending navigation entry to worry about. However, the old frame entry
329 // must be removed from frame map, and possibly marked complete and deleted. 327 // must be removed from frame map, and possibly marked complete and deleted.
330 if (frame_it != main_render_frame_data_use_map_.end()) { 328 if (frame_it != main_render_frame_data_use_map_.end()) {
331 DataUseRecorderEntry old_frame_entry = frame_it->second; 329 const DataUseRecorderEntry old_frame_entry = frame_it->second;
332 DataUse::TrafficType old_traffic_type = 330 DataUse::TrafficType old_traffic_type =
333 old_frame_entry->data_use().traffic_type(); 331 old_frame_entry->data_use().traffic_type();
334 old_frame_entry->set_page_transition(page_transition); 332 old_frame_entry->set_page_transition(page_transition);
335 main_render_frame_data_use_map_.erase(frame_it); 333 main_render_frame_data_use_map_.erase(frame_it);
336 NotifyPageLoadCommit(old_frame_entry); 334 NotifyPageLoadCommit(old_frame_entry);
337 if (old_frame_entry->IsDataUseComplete()) { 335 if (old_frame_entry->IsDataUseComplete()) {
338 NotifyDataUseCompleted(old_frame_entry); 336 NotifyDataUseCompleted(old_frame_entry);
337 DeleteFromMainRenderFrameDataUseMap(old_frame_entry);
339 data_use_recorders_.erase(old_frame_entry); 338 data_use_recorders_.erase(old_frame_entry);
340 } 339 }
341 340
342 // Add a new recorder to the render frame map to replace the deleted one. 341 // Add a new recorder to the render frame map to replace the deleted one.
343 DataUseRecorderEntry entry = data_use_recorders_.emplace( 342 DataUseRecorderEntry entry = data_use_recorders_.emplace(
344 data_use_recorders_.end(), old_traffic_type); 343 data_use_recorders_.end(), old_traffic_type);
345 entry->set_main_frame_id(mainframe); 344 entry->set_main_frame_id(mainframe);
346 main_render_frame_data_use_map_.insert(std::make_pair(mainframe, entry)); 345 main_render_frame_data_use_map_.insert(std::make_pair(mainframe, entry));
347 } 346 }
348 return; 347 return;
349 } 348 }
350 349
351 DataUseRecorderEntry entry = navigation_iter->second; 350 const DataUseRecorderEntry entry = navigation_iter->second;
352 pending_navigation_data_use_map_.erase(navigation_iter); 351 pending_navigation_data_use_map_.erase(navigation_iter);
353 entry->set_main_frame_id(mainframe); 352 entry->set_main_frame_id(mainframe);
354 353
355 // If the frame has already been deleted then mark this navigation as having 354 // If the frame has already been deleted then mark this navigation as having
356 // completed its data use. 355 // completed its data use.
357 if (frame_it == main_render_frame_data_use_map_.end()) { 356 if (frame_it == main_render_frame_data_use_map_.end()) {
358 entry->set_page_transition(page_transition); 357 entry->set_page_transition(page_transition);
359 NotifyPageLoadCommit(entry); 358 NotifyPageLoadCommit(entry);
360 if (entry->IsDataUseComplete()) { 359 if (entry->IsDataUseComplete()) {
361 NotifyDataUseCompleted(entry); 360 NotifyDataUseCompleted(entry);
361 DeleteFromMainRenderFrameDataUseMap(entry);
362 data_use_recorders_.erase(entry); 362 data_use_recorders_.erase(entry);
363 } 363 }
364 return; 364 return;
365 } 365 }
366 DataUseRecorderEntry old_frame_entry = frame_it->second; 366 DataUseRecorderEntry old_frame_entry = frame_it->second;
367 old_frame_entry->set_page_transition(page_transition); 367 old_frame_entry->set_page_transition(page_transition);
368 NotifyPageLoadCommit(old_frame_entry); 368 NotifyPageLoadCommit(old_frame_entry);
369 369
370 if (is_same_page_navigation) { 370 if (is_same_page_navigation) {
371 old_frame_entry->MergeFrom(&(*entry)); 371 old_frame_entry->MergeFrom(&(*entry));
372 372
373 for (auto* request : entry->pending_url_requests()) { 373 for (auto* request : entry->pending_url_requests()) {
374 request->RemoveUserData(DataUseRecorderEntryAsUserData::kUserDataKey); 374 request->RemoveUserData(DataUseRecorderEntryAsUserData::kUserDataKey);
375 request->SetUserData( 375 request->SetUserData(
376 DataUseRecorderEntryAsUserData::kUserDataKey, 376 DataUseRecorderEntryAsUserData::kUserDataKey,
377 base::MakeUnique<DataUseRecorderEntryAsUserData>(old_frame_entry)); 377 base::MakeUnique<DataUseRecorderEntryAsUserData>(old_frame_entry));
378 old_frame_entry->AddPendingURLRequest(request); 378 old_frame_entry->AddPendingURLRequest(request);
379 } 379 }
380 380
381 entry->RemoveAllPendingURLRequests(); 381 entry->RemoveAllPendingURLRequests();
382 382
383 data_use_recorders_.erase(entry); 383 data_use_recorders_.erase(entry);
384 } else { 384 } else {
385 // Navigation is not same page, so remove old entry from
386 // |main_render_frame_data_use_map_|, possibly marking it complete.
387 main_render_frame_data_use_map_.erase(frame_it);
388 if (old_frame_entry->IsDataUseComplete()) { 385 if (old_frame_entry->IsDataUseComplete()) {
389 NotifyDataUseCompleted(old_frame_entry); 386 NotifyDataUseCompleted(old_frame_entry);
390 data_use_recorders_.erase(old_frame_entry); 387 data_use_recorders_.erase(old_frame_entry);
391 388
392 if (visible_main_render_frames_.find(mainframe) != 389 if (visible_main_render_frames_.find(mainframe) !=
393 visible_main_render_frames_.end()) { 390 visible_main_render_frames_.end()) {
394 entry->set_is_visible(true); 391 entry->set_is_visible(true);
395 } 392 }
396 } 393 }
397 394
398 DataUse& data_use = entry->data_use(); 395 DataUse& data_use = entry->data_use();
399 396
400 DCHECK(!data_use.url().is_valid() || data_use.url() == gurl) 397 DCHECK(!data_use.url().is_valid() || data_use.url() == gurl)
401 << "is valid: " << data_use.url().is_valid() 398 << "is valid: " << data_use.url().is_valid()
402 << "; data_use.url(): " << data_use.url().spec() 399 << "; data_use.url(): " << data_use.url().spec()
403 << "; gurl: " << gurl.spec(); 400 << "; gurl: " << gurl.spec();
404 if (!data_use.url().is_valid()) { 401 if (!data_use.url().is_valid()) {
405 data_use.set_url(gurl); 402 data_use.set_url(gurl);
406 } 403 }
407 404
405 main_render_frame_data_use_map_.erase(frame_it);
408 main_render_frame_data_use_map_.insert(std::make_pair(mainframe, entry)); 406 main_render_frame_data_use_map_.insert(std::make_pair(mainframe, entry));
409 } 407 }
410 } 408 }
411 409
412 void ChromeDataUseAscriber::NotifyPageLoadCommit(DataUseRecorderEntry entry) { 410 void ChromeDataUseAscriber::NotifyPageLoadCommit(DataUseRecorderEntry entry) {
413 for (auto& observer : observers_) 411 for (auto& observer : observers_)
414 observer.OnPageLoadCommit(&entry->data_use()); 412 observer.OnPageLoadCommit(&entry->data_use());
415 } 413 }
416 414
415 void ChromeDataUseAscriber::DeleteFromMainRenderFrameDataUseMap(
RyanSturm 2017/05/31 16:26:01 Can't you just call map.delete[entry.main_frame_id
tbansal1 2017/05/31 16:32:54 No, this is called when the iterator is from |pend
tbansal1 2017/05/31 16:33:50 Ooh, I see. let me try that.
416 DataUseRecorderEntry entry) {
417 for (base::hash_map<RenderFrameHostID, DataUseRecorderEntry>::iterator it =
418 main_render_frame_data_use_map_.begin();
419 it != main_render_frame_data_use_map_.end(); ++it) {
420 if ((it->second) == entry) {
421 main_render_frame_data_use_map_.erase(it);
422 break;
423 }
424 }
425 }
426
417 void ChromeDataUseAscriber::NotifyDataUseCompleted(DataUseRecorderEntry entry) { 427 void ChromeDataUseAscriber::NotifyDataUseCompleted(DataUseRecorderEntry entry) {
418 for (auto& observer : observers_) 428 for (auto& observer : observers_)
419 observer.OnPageLoadComplete(&entry->data_use()); 429 observer.OnPageLoadComplete(&entry->data_use());
420 } 430 }
421 431
422 std::unique_ptr<URLRequestClassifier> 432 std::unique_ptr<URLRequestClassifier>
423 ChromeDataUseAscriber::CreateURLRequestClassifier() const { 433 ChromeDataUseAscriber::CreateURLRequestClassifier() const {
424 return base::MakeUnique<ContentURLRequestClassifier>(); 434 return base::MakeUnique<ContentURLRequestClassifier>();
425 } 435 }
426 436
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 pending_navigation_global_request_id_.find(old_frame); 480 pending_navigation_global_request_id_.find(old_frame);
471 if (pending_navigation_iter != pending_navigation_global_request_id_.end()) { 481 if (pending_navigation_iter != pending_navigation_global_request_id_.end()) {
472 pending_navigation_global_request_id_.insert(std::make_pair( 482 pending_navigation_global_request_id_.insert(std::make_pair(
473 RenderFrameHostID(new_render_process_id, new_render_frame_id), 483 RenderFrameHostID(new_render_process_id, new_render_frame_id),
474 pending_navigation_iter->second)); 484 pending_navigation_iter->second));
475 pending_navigation_global_request_id_.erase(pending_navigation_iter); 485 pending_navigation_global_request_id_.erase(pending_navigation_iter);
476 } 486 }
477 } 487 }
478 488
479 } // namespace data_use_measurement 489 } // namespace data_use_measurement
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698