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 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |