Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "components/data_usage/core/data_use_aggregator.h" | 5 #include "components/data_usage/core/data_use_aggregator.h" |
| 6 | 6 |
| 7 #include <sstream> | |
|
tbansal1
2015/10/26 22:24:30
why is sstream required?
sclittle
2015/10/26 23:56:01
<sstream> and <string> are just included right now
| |
| 8 #include <string> | |
| 9 | |
| 7 #include "base/bind.h" | 10 #include "base/bind.h" |
| 8 #include "base/memory/scoped_ptr.h" | |
| 9 #include "base/message_loop/message_loop.h" | 11 #include "base/message_loop/message_loop.h" |
| 10 #include "base/single_thread_task_runner.h" | 12 #include "base/single_thread_task_runner.h" |
| 11 #include "base/stl_util.h" | 13 #include "base/stl_util.h" |
| 12 #include "components/data_usage/core/data_use.h" | 14 #include "components/data_usage/core/data_use.h" |
| 13 #include "net/base/network_change_notifier.h" | 15 #include "net/base/network_change_notifier.h" |
| 14 #include "net/url_request/url_request.h" | 16 #include "net/url_request/url_request.h" |
| 15 | 17 |
| 16 namespace data_usage { | 18 namespace data_usage { |
| 17 | 19 |
| 20 namespace { | |
| 21 | |
| 22 // Observer for debug logging. | |
| 23 // TODO in this CL: Remove this before landing. | |
|
bengr
2015/10/27 00:01:47
Please do remove it.
sclittle
2015/10/28 22:30:45
Done.
| |
| 24 class LoggingObserver : public DataUseAggregator::Observer { | |
| 25 public: | |
| 26 LoggingObserver(DataUseAggregator* aggregator) : aggregator_(aggregator) { | |
| 27 DCHECK(aggregator_); | |
| 28 aggregator_->AddObserver(this); | |
| 29 } | |
| 30 | |
| 31 ~LoggingObserver() override { aggregator_->RemoveObserver(this); } | |
| 32 | |
| 33 void OnDataUse( | |
| 34 const std::vector<const DataUse*>& data_use_sequence) override { | |
| 35 std::ostringstream os; | |
| 36 for (const DataUse* data_use : data_use_sequence) { | |
| 37 os << "\n[" | |
| 38 << "url=" << data_use->url << " rt=" << data_use->request_time | |
| 39 << " fp=" << data_use->first_party_for_cookies | |
| 40 << " tab_id=" << data_use->tab_id | |
| 41 << " ctype=" << data_use->connection_type | |
| 42 << " tx=" << data_use->tx_bytes << " rx=" << data_use->rx_bytes << "]"; | |
| 43 } | |
| 44 LOG(WARNING) << "OnDataUse:" << os.str(); | |
| 45 } | |
| 46 | |
| 47 private: | |
| 48 DataUseAggregator* aggregator_; | |
| 49 }; | |
| 50 | |
| 51 } // namespace | |
| 52 | |
| 18 DataUseAggregator::DataUseAggregator() | 53 DataUseAggregator::DataUseAggregator() |
| 19 : off_the_record_tx_bytes_since_last_flush_(0), | 54 : off_the_record_tx_bytes_since_last_flush_(0), |
| 20 off_the_record_rx_bytes_since_last_flush_(0), | 55 off_the_record_rx_bytes_since_last_flush_(0), |
| 21 is_flush_pending_(false), | 56 is_flush_pending_(false), |
| 22 weak_ptr_factory_(this) {} | 57 weak_ptr_factory_(this) {} |
| 23 | 58 |
| 24 DataUseAggregator::~DataUseAggregator() {} | 59 DataUseAggregator::~DataUseAggregator() {} |
| 25 | 60 |
| 26 void DataUseAggregator::AddObserver(Observer* observer) { | 61 void DataUseAggregator::AddObserver(Observer* observer) { |
| 27 DCHECK(thread_checker_.CalledOnValidThread()); | 62 DCHECK(thread_checker_.CalledOnValidThread()); |
| 28 observer_list_.AddObserver(observer); | 63 observer_list_.AddObserver(observer); |
| 29 } | 64 } |
| 30 | 65 |
| 31 void DataUseAggregator::RemoveObserver(Observer* observer) { | 66 void DataUseAggregator::RemoveObserver(Observer* observer) { |
| 32 DCHECK(thread_checker_.CalledOnValidThread()); | 67 DCHECK(thread_checker_.CalledOnValidThread()); |
| 33 observer_list_.RemoveObserver(observer); | 68 observer_list_.RemoveObserver(observer); |
| 34 } | 69 } |
| 35 | 70 |
| 36 void DataUseAggregator::ReportDataUse(const net::URLRequest& request, | 71 void DataUseAggregator::ReportDataUse(int64_t tx_bytes, |
| 37 int32_t tab_id, | 72 int64_t rx_bytes, |
| 38 int64_t tx_bytes, | 73 const GURL& url, |
| 39 int64_t rx_bytes) { | 74 const base::Time& request_time, |
| 75 const GURL& first_party_for_cookies, | |
| 76 int32_t tab_id) { | |
| 40 DCHECK(thread_checker_.CalledOnValidThread()); | 77 DCHECK(thread_checker_.CalledOnValidThread()); |
| 41 | 78 |
| 42 scoped_ptr<DataUse> data_use(new DataUse( | 79 scoped_ptr<DataUse> data_use(new DataUse( |
| 43 request.url(), request.request_time(), request.first_party_for_cookies(), | 80 url, request_time, first_party_for_cookies, tab_id, |
| 44 tab_id, net::NetworkChangeNotifier::GetConnectionType(), tx_bytes, | 81 net::NetworkChangeNotifier::GetConnectionType(), tx_bytes, rx_bytes)); |
| 45 rx_bytes)); | |
| 46 | 82 |
| 47 // As an optimization, attempt to combine the newly reported data use with the | 83 // As an optimization, attempt to combine the newly reported data use with the |
| 48 // most recent buffered data use, if the annotations on the data use are the | 84 // most recent buffered data use, if the annotations on the data use are the |
| 49 // same. | 85 // same. |
| 50 if (!buffered_data_use_.empty() && | 86 if (!buffered_data_use_.empty() && |
| 51 buffered_data_use_.back()->CanCombineWith(*data_use)) { | 87 buffered_data_use_.back()->CanCombineWith(*data_use)) { |
| 52 buffered_data_use_.back()->tx_bytes += tx_bytes; | 88 buffered_data_use_.back()->tx_bytes += data_use->tx_bytes; |
| 53 buffered_data_use_.back()->rx_bytes += rx_bytes; | 89 buffered_data_use_.back()->rx_bytes += data_use->rx_bytes; |
| 54 } else { | 90 } else { |
| 55 buffered_data_use_.push_back(data_use.Pass()); | 91 buffered_data_use_.push_back(data_use.Pass()); |
| 56 } | 92 } |
| 57 | 93 |
| 58 if (!is_flush_pending_) { | 94 if (!is_flush_pending_) { |
| 59 // Post a flush operation to happen in the future, so that the | 95 // Post a flush operation to happen in the future, so that the |
| 60 // DataUseAggregator has a chance to batch together some data use before | 96 // DataUseAggregator has a chance to batch together some data use before |
| 61 // notifying observers. | 97 // notifying observers. |
| 62 base::MessageLoop::current()->task_runner()->PostTask( | 98 base::MessageLoop::current()->task_runner()->PostTask( |
| 63 FROM_HERE, | 99 FROM_HERE, |
| 64 base::Bind(&DataUseAggregator::FlushBufferedDataUse, GetWeakPtr())); | 100 base::Bind(&DataUseAggregator::FlushBufferedDataUse, GetWeakPtr())); |
| 65 is_flush_pending_ = true; | 101 is_flush_pending_ = true; |
| 66 } | 102 } |
| 67 } | 103 } |
| 68 | 104 |
| 69 void DataUseAggregator::ReportOffTheRecordDataUse(int64_t tx_bytes, | 105 void DataUseAggregator::ReportOffTheRecordDataUse(int64_t tx_bytes, |
| 70 int64_t rx_bytes) { | 106 int64_t rx_bytes) { |
| 71 DCHECK(thread_checker_.CalledOnValidThread()); | 107 DCHECK(thread_checker_.CalledOnValidThread()); |
| 72 off_the_record_tx_bytes_since_last_flush_ += tx_bytes; | 108 off_the_record_tx_bytes_since_last_flush_ += tx_bytes; |
| 73 off_the_record_rx_bytes_since_last_flush_ += rx_bytes; | 109 off_the_record_rx_bytes_since_last_flush_ += rx_bytes; |
| 74 } | 110 } |
| 75 | 111 |
| 76 base::WeakPtr<DataUseAggregator> DataUseAggregator::GetWeakPtr() { | 112 base::WeakPtr<DataUseAggregator> DataUseAggregator::GetWeakPtr() { |
| 77 return weak_ptr_factory_.GetWeakPtr(); | 113 return weak_ptr_factory_.GetWeakPtr(); |
| 78 } | 114 } |
| 79 | 115 |
| 80 void DataUseAggregator::FlushBufferedDataUse() { | 116 void DataUseAggregator::FlushBufferedDataUse() { |
| 81 DCHECK(thread_checker_.CalledOnValidThread()); | 117 DCHECK(thread_checker_.CalledOnValidThread()); |
| 82 | 118 |
| 119 // TODO in this CL: Remove this debug logging observer. | |
|
bengr
2015/10/27 00:01:47
And this too.
sclittle
2015/10/28 22:30:45
Done.
| |
| 120 LoggingObserver logging_observer(this); | |
| 121 | |
| 83 // TODO(sclittle): Amortize data use on supported platforms before notifying | 122 // TODO(sclittle): Amortize data use on supported platforms before notifying |
| 84 // observers. | 123 // observers. |
| 85 | 124 |
| 86 // Pass Observers a sequence of const DataUse pointers instead of using the | 125 // Pass Observers a sequence of const DataUse pointers instead of using the |
| 87 // buffer directly in order to prevent Observers from modifying the DataUse | 126 // buffer directly in order to prevent Observers from modifying the DataUse |
| 88 // objects. | 127 // objects. |
| 89 std::vector<const DataUse*> const_sequence(buffered_data_use_.begin(), | 128 std::vector<const DataUse*> const_sequence(buffered_data_use_.begin(), |
| 90 buffered_data_use_.end()); | 129 buffered_data_use_.end()); |
| 91 DCHECK(!ContainsValue(const_sequence, nullptr)); | 130 DCHECK(!ContainsValue(const_sequence, nullptr)); |
| 92 FOR_EACH_OBSERVER(Observer, observer_list_, OnDataUse(const_sequence)); | 131 FOR_EACH_OBSERVER(Observer, observer_list_, OnDataUse(const_sequence)); |
| 93 | 132 |
| 94 buffered_data_use_.clear(); | 133 buffered_data_use_.clear(); |
| 95 off_the_record_tx_bytes_since_last_flush_ = 0; | 134 off_the_record_tx_bytes_since_last_flush_ = 0; |
| 96 off_the_record_rx_bytes_since_last_flush_ = 0; | 135 off_the_record_rx_bytes_since_last_flush_ = 0; |
| 97 is_flush_pending_ = false; | 136 is_flush_pending_ = false; |
| 98 } | 137 } |
| 99 | 138 |
| 100 } // namespace data_usage | 139 } // namespace data_usage |
| OLD | NEW |