11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/data_reduction_proxy/browser/data_reduction_proxy_statistics_prefs.h" 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/bind.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/location.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/logging.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/prefs/pref_service.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/prefs/scoped_user_pref_update.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/sequenced_task_runner.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/strings/string_number_conversions.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/time/time.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/values.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace data_reduction_proxy { 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciDataReductionProxyStatisticsPrefs::DataReductionProxyStatisticsPrefs( 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefService* prefs, 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<base::SequencedTaskRunner> task_runner, 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::TimeDelta& delay) 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : pref_service_(prefs), 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci task_runner_(task_runner), 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci weak_factory_(this), 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci delay_(delay), 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci delayed_task_posted_(false) { 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(prefs); 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_GE(delay.InMilliseconds(), 0); 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Init(); 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciDataReductionProxyStatisticsPrefs::~DataReductionProxyStatisticsPrefs() {} 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DataReductionProxyStatisticsPrefs::Init() { 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (delay_ == base::TimeDelta()) 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Init all int64 prefs. 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InitInt64Pref(data_reduction_proxy::prefs:: 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kDailyHttpContentLengthLastUpdateDate); 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InitInt64Pref(data_reduction_proxy::prefs::kHttpReceivedContentLength); 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InitInt64Pref(data_reduction_proxy::prefs::kHttpOriginalContentLength); 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Init all list prefs. 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InitListPref(data_reduction_proxy::prefs:: 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kDailyContentLengthHttpsWithDataReductionProxyEnabled); 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InitListPref(data_reduction_proxy::prefs:: 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kDailyContentLengthLongBypassWithDataReductionProxyEnabled); 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InitListPref(data_reduction_proxy::prefs:: 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kDailyContentLengthShortBypassWithDataReductionProxyEnabled); 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InitListPref(data_reduction_proxy::prefs:: 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kDailyContentLengthUnknownWithDataReductionProxyEnabled); 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InitListPref(data_reduction_proxy::prefs:: 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kDailyContentLengthViaDataReductionProxy); 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InitListPref(data_reduction_proxy::prefs:: 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kDailyContentLengthWithDataReductionProxyEnabled); 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InitListPref(data_reduction_proxy::prefs::kDailyHttpOriginalContentLength); 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InitListPref(data_reduction_proxy::prefs::kDailyHttpReceivedContentLength); 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InitListPref(data_reduction_proxy::prefs:: 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kDailyOriginalContentLengthViaDataReductionProxy); 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InitListPref(data_reduction_proxy::prefs:: 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kDailyOriginalContentLengthWithDataReductionProxyEnabled); 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DataReductionProxyStatisticsPrefs::InitInt64Pref(const char* pref) { 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64 pref_value = pref_service_->GetInt64(pref); 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pref_map_[pref] = pref_value; 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DataReductionProxyStatisticsPrefs::InitListPref(const char* pref) { 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<base::ListValue> pref_value = scoped_ptr<base::ListValue>( 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pref_service_->GetList(pref)->DeepCopy()); 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci list_pref_map_.add(pref, pref_value.Pass()); 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint64 DataReductionProxyStatisticsPrefs::GetInt64(const char* pref_path) { 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (delay_ == base::TimeDelta()) 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return pref_service_->GetInt64(pref_path); 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DataReductionProxyPrefMap::iterator iter = pref_map_.find(pref_path); 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return iter->second; 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DataReductionProxyStatisticsPrefs::SetInt64(const char* pref_path, 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64 pref_value) { 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (delay_ == base::TimeDelta()) { 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pref_service_->SetInt64(pref_path, pref_value); 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DelayedWritePrefs(); 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pref_map_[pref_path] = pref_value; 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibase::ListValue* DataReductionProxyStatisticsPrefs::GetList( 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char* pref_path) { 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (delay_ == base::TimeDelta()) 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return ListPrefUpdate(pref_service_, pref_path).Get(); 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DelayedWritePrefs(); 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return list_pref_map_.get(pref_path); 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DataReductionProxyStatisticsPrefs::WritePrefs() { 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (delay_ == base::TimeDelta()) 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (DataReductionProxyPrefMap::iterator iter = pref_map_.begin(); 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci iter != pref_map_.end(); ++iter) { 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pref_service_->SetInt64(iter->first, iter->second); 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (DataReductionProxyListPrefMap::iterator iter = list_pref_map_.begin(); 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci iter != list_pref_map_.end(); ++iter) { 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TransferList(*(iter->second), 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ListPrefUpdate(pref_service_, iter->first).Get()); 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci delayed_task_posted_ = false; 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DataReductionProxyStatisticsPrefs::DelayedWritePrefs() { 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Only write after the first time posting the task. 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (delayed_task_posted_) 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci task_runner_->PostDelayedTask( 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FROM_HERE, 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&DataReductionProxyStatisticsPrefs::WritePrefs, 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci weak_factory_.GetWeakPtr()), 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci delay_); 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci delayed_task_posted_ = true; 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DataReductionProxyStatisticsPrefs::TransferList( 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::ListValue& from_list, 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::ListValue* to_list) { 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci to_list->Clear(); 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (size_t i = 0; i < from_list.GetSize(); ++i) { 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci to_list->Set(i, new base::StringValue(base::Int64ToString( 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetListPrefInt64Value(from_list, i)))); 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint64 DataReductionProxyStatisticsPrefs::GetListPrefInt64Value( 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::ListValue& list, 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t index) { 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string string_value; 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!list.GetString(index, &string_value)) { 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NOTREACHED(); 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64 value = 0; 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool rv = base::StringToInt64(string_value, &value); 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(rv); 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return value; 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace data_reduction_proxy 163