Chromium Code Reviews| 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 |