Chromium Code Reviews| Index: components/data_reduction_proxy/browser/data_reduction_proxy_delayed_pref_service.cc |
| diff --git a/components/data_reduction_proxy/browser/data_reduction_proxy_delayed_pref_service.cc b/components/data_reduction_proxy/browser/data_reduction_proxy_delayed_pref_service.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..7b38bca8e7d1a8b516225b444573bf7cfb14d3c8 |
| --- /dev/null |
| +++ b/components/data_reduction_proxy/browser/data_reduction_proxy_delayed_pref_service.cc |
| @@ -0,0 +1,139 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "components/data_reduction_proxy/browser/data_reduction_proxy_delayed_pref_service.h" |
| + |
| +#include "base/bind.h" |
| +#include "base/location.h" |
| +#include "base/prefs/pref_service.h" |
| +#include "base/prefs/scoped_user_pref_update.h" |
| +#include "base/sequenced_task_runner.h" |
| +#include "base/strings/string_number_conversions.h" |
| +#include "base/time/time.h" |
| +#include "base/values.h" |
| + |
| +namespace data_reduction_proxy { |
| + |
| +DataReductionProxyDelayedPrefService::DataReductionProxyDelayedPrefService( |
| + PrefService* prefs, |
| + scoped_refptr<base::SequencedTaskRunner> task_runner, |
| + base::TimeDelta delay) |
| + : pref_service_(prefs), |
| + task_runner_(task_runner), |
| + delay_(delay), |
| + delayed_task_posted_(false) { |
| + DCHECK(prefs); |
|
bengr
2014/08/14 17:39:42
Also, DCHECK that delay is non-negative
megjablon
2014/08/26 19:28:40
Done.
|
| + if (delay_ <= base::TimeDelta()) { |
|
bengr
2014/08/14 17:39:42
Don't you mean >=?. Also, afaict, these don't need
megjablon
2014/08/26 19:28:41
Done.
|
| + pref_map_ = new DataReductionProxyPrefMap(); |
| + list_pref_map_ = new DataReductionProxyListPrefMap(); |
| + } |
| +} |
| + |
| +DataReductionProxyDelayedPrefService::~DataReductionProxyDelayedPrefService() { |
| + WritePrefs(); |
| +} |
| + |
| +int64 DataReductionProxyDelayedPrefService::GetInt64(const char* pref_path) { |
| + if (!(delay_ <= base::TimeDelta())) { |
|
bengr
2014/08/14 17:39:41
if (delay_ == base::TimeDelta())
return pref_ser
megjablon
2014/08/26 19:28:41
Done.
|
| + return pref_service_->GetInt64(pref_path); |
| + } |
| + |
| + DataReductionProxyPrefMap::iterator iter = pref_map_->find(pref_path); |
| + if (iter == pref_map_->end()) { |
| + int64 pref_value = pref_service_->GetInt64(pref_path); |
| + pref_map_->insert(std::pair<const char*, int64>(pref_path, pref_value)); |
|
bengr
2014/08/14 17:39:42
You can do pref_map_[pref_path] = pref_value, I th
megjablon
2014/08/26 19:28:40
Done.
|
| + return pref_value; |
| + } |
| + return iter->second; |
| +} |
| + |
| +void DataReductionProxyDelayedPrefService::SetInt64(const char* pref_path, |
| + int64 pref_value) { |
| + if (!(delay_ <= base::TimeDelta())) { |
|
bengr
2014/08/14 17:39:41
if (delay_ == base::TimeDelta())
...
megjablon
2014/08/26 19:28:41
Done.
|
| + pref_service_->SetInt64(pref_path, pref_value); |
| + return; |
| + } |
| + |
| + if (!delayed_task_posted_) |
| + WritePrefsAndPost(); |
| + DataReductionProxyPrefMap::iterator iter = pref_map_->find(pref_path); |
|
bengr
2014/08/14 17:39:42
Can you factor out the initialization of the maps?
megjablon
2014/08/26 19:28:40
Done.
|
| + if (iter == pref_map_->end()) { |
| + int64 pref_value = pref_service_->GetInt64(pref_path); |
| + pref_map_->insert(std::pair<const char*, int64>(pref_path, pref_value)); |
|
bengr
2014/08/14 17:39:41
again, use []
megjablon
2014/08/26 19:28:40
Done.
|
| + } |
| + (*pref_map_)[pref_path] = pref_value; |
| +} |
| + |
| +base::ListValue* DataReductionProxyDelayedPrefService::GetList( |
| + const char* pref_path) { |
| + if (!(delay_ <= base::TimeDelta())) { |
| + return ListPrefUpdate(pref_service_, pref_path).Get(); |
| + } |
| + |
| + if (!delayed_task_posted_) |
| + WritePrefsAndPost(); |
| + DataReductionProxyListPrefMap::iterator iter = |
| + list_pref_map_->find(pref_path); |
| + if (iter == list_pref_map_->end()) { |
| + base::ListValue* pref_value = pref_service_->GetList(pref_path)->DeepCopy(); |
|
bengr
2014/08/14 17:39:41
This looks like a memory leak. Where do you deallo
megjablon
2014/08/26 19:28:40
Using a ScopedPtrHashMap
megjablon
2014/08/26 19:28:40
Done.
|
| + list_pref_map_->insert(std::pair<const char*, base::ListValue*> |
| + (pref_path, pref_value)); |
| + return pref_value; |
| + } |
| + return iter->second; |
| +} |
| + |
| +void DataReductionProxyDelayedPrefService::WritePrefs() { |
| + for(DataReductionProxyPrefMap::iterator iter = pref_map_->begin(); |
|
bengr
2014/08/14 17:39:41
for (
megjablon
2014/08/26 19:28:41
Done.
|
| + iter != pref_map_->end(); ++iter) { |
| + pref_service_->SetInt64(iter->first, iter->second); |
| + } |
| + |
| + for (DataReductionProxyListPrefMap::iterator iter = list_pref_map_->begin(); |
| + iter != list_pref_map_->end(); ++iter) { |
|
bengr
2014/08/14 17:39:41
indent one more
megjablon
2014/08/26 19:28:40
Done.
|
| + TransferList(*(iter->second), |
| + ListPrefUpdate(pref_service_, iter->first).Get()); |
| + } |
| +} |
| + |
| +void DataReductionProxyDelayedPrefService::WritePrefsAndPost() { |
| + // Only write after the first time posting the task |
| + if (!delayed_task_posted_) { |
| + delayed_task_posted_ = true; |
| + } else { |
| + WritePrefs(); |
| + } |
| + task_runner_->PostDelayedTask( |
| + FROM_HERE, |
| + base::Bind(&DataReductionProxyDelayedPrefService::WritePrefsAndPost, |
| + base::Unretained(this)), |
|
bengr
2014/08/14 17:39:41
What happens after this is destroyed? I think you
bengr
2014/08/14 23:09:49
Ignore that. I think you can just pass a WeakPtr i
megjablon
2014/08/26 19:28:40
Done.
|
| + delay_); |
| +} |
| + |
| +void DataReductionProxyDelayedPrefService::TransferList( |
| + const base::ListValue& from_list, |
| + base::ListValue* to_list) { |
| + to_list->Clear(); |
| + for (size_t i = 0; i < from_list.GetSize(); ++i) { |
| + int64 value = GetListPrefInt64Value(from_list, i); |
| + to_list->Set(i, new base::StringValue(base::Int64ToString(value))); |
|
bengr
2014/08/14 17:39:41
you can combine this line with the previous.
megjablon
2014/08/26 19:28:41
Done.
|
| + } |
| +} |
| + |
| +int64 DataReductionProxyDelayedPrefService::GetListPrefInt64Value( |
| + const base::ListValue& list, |
| + size_t index) { |
| + std::string string_value; |
| + if (!list.GetString(index, &string_value)) { |
| + NOTREACHED(); |
| + return 0; |
| + } |
| + |
| + int64 value = 0; |
| + bool rv = base::StringToInt64(string_value, &value); |
| + DCHECK(rv); |
| + return value; |
| +} |
| + |
| +} // namespace data_reduction_proxy |