OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |