| 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 "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
| 8 #include "components/data_use_measurement/content/content_url_request_classifier
.h" | 8 #include "components/data_use_measurement/content/content_url_request_classifier
.h" |
| 9 #include "components/data_use_measurement/core/data_use_recorder.h" | 9 #include "components/data_use_measurement/core/data_use_recorder.h" |
| 10 #include "components/data_use_measurement/core/data_use_user_data.h" | 10 #include "components/data_use_measurement/core/data_use_user_data.h" |
| 11 #include "components/data_use_measurement/core/url_request_classifier.h" | 11 #include "components/data_use_measurement/core/url_request_classifier.h" |
| 12 #include "content/public/browser/browser_thread.h" | 12 #include "content/public/browser/browser_thread.h" |
| 13 #include "content/public/browser/navigation_handle.h" | 13 #include "content/public/browser/navigation_handle.h" |
| 14 #include "content/public/browser/render_frame_host.h" | 14 #include "content/public/browser/render_frame_host.h" |
| 15 #include "content/public/browser/resource_request_info.h" | 15 #include "content/public/browser/resource_request_info.h" |
| 16 #include "content/public/common/browser_side_navigation_policy.h" | 16 #include "content/public/common/browser_side_navigation_policy.h" |
| 17 #include "net/url_request/url_request.h" | 17 #include "net/url_request/url_request.h" |
| 18 | 18 |
| 19 namespace { |
| 20 const base::TimeDelta kDiscardPendingNavigationsThreshold = |
| 21 base::TimeDelta::FromSeconds(5); |
| 22 const base::TimeDelta kDiscardPendingNavigationsInterval = |
| 23 base::TimeDelta::FromSeconds(10); |
| 24 } |
| 25 |
| 19 namespace data_use_measurement { | 26 namespace data_use_measurement { |
| 20 | |
| 21 // static | 27 // static |
| 22 const void* ChromeDataUseAscriber::DataUseRecorderEntryAsUserData:: | 28 const void* ChromeDataUseAscriber::DataUseRecorderEntryAsUserData:: |
| 23 kUserDataKey = static_cast<void*>( | 29 kUserDataKey = static_cast<void*>( |
| 24 &ChromeDataUseAscriber::DataUseRecorderEntryAsUserData::kUserDataKey); | 30 &ChromeDataUseAscriber::DataUseRecorderEntryAsUserData::kUserDataKey); |
| 25 | 31 |
| 26 ChromeDataUseAscriber::DataUseRecorderEntryAsUserData:: | 32 ChromeDataUseAscriber::DataUseRecorderEntryAsUserData:: |
| 27 DataUseRecorderEntryAsUserData(DataUseRecorderEntry entry) | 33 DataUseRecorderEntryAsUserData(DataUseRecorderEntry entry) |
| 28 : entry_(entry) {} | 34 : entry_(entry) {} |
| 29 | 35 |
| 30 ChromeDataUseAscriber::DataUseRecorderEntryAsUserData:: | 36 ChromeDataUseAscriber::DataUseRecorderEntryAsUserData:: |
| 31 ~DataUseRecorderEntryAsUserData() {} | 37 ~DataUseRecorderEntryAsUserData() {} |
| 32 | 38 |
| 33 ChromeDataUseAscriber::ChromeDataUseAscriber() { | 39 ChromeDataUseAscriber::ChromeDataUseAscriber() { |
| 34 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 40 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 35 } | 41 } |
| 36 | 42 |
| 37 ChromeDataUseAscriber::~ChromeDataUseAscriber() { | 43 ChromeDataUseAscriber::~ChromeDataUseAscriber() { |
| 38 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 44 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 39 DCHECK_EQ(0u, data_use_recorders_.size()); | 45 DCHECK_EQ(0u, render_frame_data_use_map_.size()); |
| 46 DCHECK_EQ(pending_navigation_data_use_map_.size(), |
| 47 data_use_recorders_.size()); |
| 40 } | 48 } |
| 41 | 49 |
| 42 DataUseRecorder* ChromeDataUseAscriber::GetDataUseRecorder( | 50 DataUseRecorder* ChromeDataUseAscriber::GetDataUseRecorder( |
| 43 net::URLRequest* request) { | 51 net::URLRequest* request) { |
| 44 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 52 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 45 return nullptr; | 53 return nullptr; |
| 46 } | 54 } |
| 47 | 55 |
| 48 void ChromeDataUseAscriber::OnBeforeUrlRequest(net::URLRequest* request) { | 56 void ChromeDataUseAscriber::OnBeforeUrlRequest(net::URLRequest* request) { |
| 49 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 57 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 request->GetUserData(DataUseRecorderEntryAsUserData::kUserDataKey)); | 97 request->GetUserData(DataUseRecorderEntryAsUserData::kUserDataKey)); |
| 90 if (user_data) | 98 if (user_data) |
| 91 return; | 99 return; |
| 92 | 100 |
| 93 DataUseRecorderEntry entry = data_use_recorders_.insert( | 101 DataUseRecorderEntry entry = data_use_recorders_.insert( |
| 94 data_use_recorders_.end(), base::MakeUnique<DataUseRecorder>()); | 102 data_use_recorders_.end(), base::MakeUnique<DataUseRecorder>()); |
| 95 request->SetUserData(DataUseRecorderEntryAsUserData::kUserDataKey, | 103 request->SetUserData(DataUseRecorderEntryAsUserData::kUserDataKey, |
| 96 new DataUseRecorderEntryAsUserData(entry)); | 104 new DataUseRecorderEntryAsUserData(entry)); |
| 97 pending_navigation_data_use_map_.insert( | 105 pending_navigation_data_use_map_.insert( |
| 98 std::make_pair(request_info->GetGlobalRequestID(), entry)); | 106 std::make_pair(request_info->GetGlobalRequestID(), entry)); |
| 107 |
| 108 DeleteOldPendingNavigationEntries(base::Time::Now()); |
| 99 } | 109 } |
| 100 | 110 |
| 101 void ChromeDataUseAscriber::OnUrlRequestDestroyed(net::URLRequest* request) { | 111 void ChromeDataUseAscriber::OnUrlRequestDestroyed(net::URLRequest* request) { |
| 102 const content::ResourceRequestInfo* request_info = | 112 const content::ResourceRequestInfo* request_info = |
| 103 content::ResourceRequestInfo::ForRequest(request); | 113 content::ResourceRequestInfo::ForRequest(request); |
| 104 content::ResourceType resource_type = request_info | 114 content::ResourceType resource_type = request_info |
| 105 ? request_info->GetResourceType() | 115 ? request_info->GetResourceType() |
| 106 : content::RESOURCE_TYPE_LAST_TYPE; | 116 : content::RESOURCE_TYPE_LAST_TYPE; |
| 107 if (resource_type == content::RESOURCE_TYPE_MAIN_FRAME) { | 117 if (resource_type == content::RESOURCE_TYPE_MAIN_FRAME) { |
| 108 // If request was not successful, then ReadyToCommitNavigation will not be | 118 // If request was not successful, then ReadyToCommitNavigation will not be |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 pending_navigation_data_use_map_.erase(navigation_iter); | 193 pending_navigation_data_use_map_.erase(navigation_iter); |
| 184 data_use_recorders_.erase(entry); | 194 data_use_recorders_.erase(entry); |
| 185 } | 195 } |
| 186 } | 196 } |
| 187 | 197 |
| 188 std::unique_ptr<URLRequestClassifier> | 198 std::unique_ptr<URLRequestClassifier> |
| 189 ChromeDataUseAscriber::CreateURLRequestClassifier() const { | 199 ChromeDataUseAscriber::CreateURLRequestClassifier() const { |
| 190 return base::MakeUnique<ContentURLRequestClassifier>(); | 200 return base::MakeUnique<ContentURLRequestClassifier>(); |
| 191 } | 201 } |
| 192 | 202 |
| 203 void ChromeDataUseAscriber::DeleteOldPendingNavigationEntries(base::Time now) { |
| 204 if (last_pending_navigations_discard_time_ > |
| 205 now + kDiscardPendingNavigationsInterval) { |
| 206 return; |
| 207 } |
| 208 last_pending_navigations_discard_time_ = now; |
| 209 |
| 210 for (auto iter = pending_navigation_data_use_map_.begin(); |
| 211 iter != pending_navigation_data_use_map_.end();) { |
| 212 DataUseRecorderEntry entry = iter->second; |
| 213 DataUseRecorder* recorder = (*entry).get(); |
| 214 const DataUse& data_use = (*entry)->data_use(); |
| 215 if (recorder->IsDataUseComplete() && |
| 216 data_use.start_time() <= now - kDiscardPendingNavigationsThreshold) { |
| 217 data_use_recorders_.erase(entry); |
| 218 iter = pending_navigation_data_use_map_.erase(iter); |
| 219 } else { |
| 220 iter++; |
| 221 } |
| 222 } |
| 223 } |
| 224 |
| 193 } // namespace data_use_measurement | 225 } // namespace data_use_measurement |
| OLD | NEW |