summaryrefslogtreecommitdiffstats
path: root/chrome/browser/net
diff options
context:
space:
mode:
authorbengr@chromium.org <bengr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-19 22:04:32 +0000
committerbengr@chromium.org <bengr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-19 22:04:32 +0000
commiteac11e1d5fe94c2363e0ead4e3bcc46948b8366e (patch)
tree4c50e5e08b75b8a0b74ffe5e9194cb431a5149f7 /chrome/browser/net
parentb0d2751938c9c671a2155e510365c5c3f547608c (diff)
downloadchromium_src-eac11e1d5fe94c2363e0ead4e3bcc46948b8366e.zip
chromium_src-eac11e1d5fe94c2363e0ead4e3bcc46948b8366e.tar.gz
chromium_src-eac11e1d5fe94c2363e0ead4e3bcc46948b8366e.tar.bz2
Tracking received data amounts on a daily basis
Maintain a window of the last 60 days of the amount of HTTP data received. BUG=174531 Review URL: https://chromiumcodereview.appspot.com/12664006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@189127 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/net')
-rw-r--r--chrome/browser/net/chrome_network_delegate.cc88
1 files changed, 88 insertions, 0 deletions
diff --git a/chrome/browser/net/chrome_network_delegate.cc b/chrome/browser/net/chrome_network_delegate.cc
index 1630a52..5dee970 100644
--- a/chrome/browser/net/chrome_network_delegate.cc
+++ b/chrome/browser/net/chrome_network_delegate.cc
@@ -4,6 +4,8 @@
#include "chrome/browser/net/chrome_network_delegate.h"
+#include <stdlib.h>
+
#include <vector>
#include "base/base_paths.h"
@@ -28,6 +30,7 @@
#include "chrome/browser/net/connect_interceptor.h"
#include "chrome/browser/net/load_time_stats.h"
#include "chrome/browser/performance_monitor/performance_monitor.h"
+#include "chrome/browser/prefs/scoped_user_pref_update.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/task_manager/task_manager.h"
#include "chrome/common/pref_names.h"
@@ -209,6 +212,25 @@ void ForwardRequestStatus(
}
}
+#if defined(OS_ANDROID)
+// Increments an int64, stored as a string, in a ListPref at the specified
+// index. The value must already exist and be a string representation of a
+// number.
+void AddInt64ToListPref(size_t index, int64 length,
+ ListPrefUpdate& list_update) {
+ int64 value = 0;
+ std::string old_string_value;
+ bool rv = list_update->GetString(index, &old_string_value);
+ DCHECK(rv);
+ if (rv) {
+ rv = base::StringToInt64(old_string_value, &value);
+ DCHECK(rv);
+ }
+ value += length;
+ list_update->Set(index, Value::CreateStringValue(base::Int64ToString(value)));
+}
+#endif // defined(OS_ANDROID)
+
void UpdateContentLengthPrefs(int received_content_length,
int original_content_length) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
@@ -229,6 +251,72 @@ void UpdateContentLengthPrefs(int received_content_length,
total_original += original_content_length;
prefs->SetInt64(prefs::kHttpReceivedContentLength, total_received);
prefs->SetInt64(prefs::kHttpOriginalContentLength, total_original);
+
+#if defined(OS_ANDROID)
+ base::Time now = base::Time::Now().LocalMidnight();
+ const size_t kNumDaysInHistory = 60;
+
+ // Each day, we calculate the total number of bytes received and the total
+ // size of all corresponding resources before any data-reducing recompression
+ // is applied. These values are used to compute the data savings realized
+ // by applying our compression techniques. Totals for the last
+ // |kNumDaysInHistory| days are maintained.
+ ListPrefUpdate original_update(prefs, prefs::kDailyHttpOriginalContentLength);
+ ListPrefUpdate received_update(prefs, prefs::kDailyHttpReceivedContentLength);
+
+ // Determine how many days it has been since the last update.
+ int64 then_internal = prefs->GetInt64(
+ prefs::kDailyHttpContentLengthLastUpdateDate);
+ base::Time then = base::Time::FromInternalValue(then_internal);
+ int days_since_last_update = (now - then).InDays();
+
+ if (days_since_last_update) {
+ // Record the last update time.
+ prefs->SetInt64(prefs::kDailyHttpContentLengthLastUpdateDate,
+ now.ToInternalValue());
+
+ if (days_since_last_update == -1) {
+ // The system may go backwards in time by up to a day for legitimate
+ // reasons, such as with changes to the time zone. In such cases the
+ // history is likely still valid. Shift backwards one day and retain all
+ // values.
+ original_update->Remove(kNumDaysInHistory - 1, NULL);
+ received_update->Remove(kNumDaysInHistory - 1, NULL);
+ original_update->Insert(0, new StringValue(base::Int64ToString(0)));
+ received_update->Insert(0, new StringValue(base::Int64ToString(0)));
+ days_since_last_update = 0;
+
+ } else if (days_since_last_update < -1) {
+ // Erase all entries if the system went backwards in time by more than
+ // a day.
+ original_update->Clear();
+ days_since_last_update = kNumDaysInHistory;
+ }
+
+ // Add entries for days since last update.
+ for (int i = 0;
+ i < days_since_last_update && i < static_cast<int>(kNumDaysInHistory);
+ ++i) {
+ original_update->AppendString(base::Int64ToString(0));
+ received_update->AppendString(base::Int64ToString(0));
+ }
+
+ // Maintain the invariant that there should never be more than
+ // |kNumDaysInHistory| days in the histories.
+ while (original_update->GetSize() > kNumDaysInHistory)
+ original_update->Remove(0, NULL);
+ while (received_update->GetSize() > kNumDaysInHistory)
+ received_update->Remove(0, NULL);
+ }
+ DCHECK_EQ(kNumDaysInHistory, original_update->GetSize());
+ DCHECK_EQ(kNumDaysInHistory, received_update->GetSize());
+
+ // Update the counts for the current day.
+ AddInt64ToListPref(kNumDaysInHistory - 1,
+ original_content_length, original_update);
+ AddInt64ToListPref(kNumDaysInHistory - 1,
+ received_content_length, received_update);
+#endif
}
void StoreAccumulatedContentLength(int received_content_length,