Index: components/data_reduction_proxy/browser/data_reduction_proxy_usage_stats.cc |
diff --git a/components/data_reduction_proxy/browser/data_reduction_proxy_usage_stats.cc b/components/data_reduction_proxy/browser/data_reduction_proxy_usage_stats.cc |
index d500301b25c7243dbc140fc831bdd17a5d24a6fb..bddfef4d88aa37c442020a1eff86616964a5b811 100644 |
--- a/components/data_reduction_proxy/browser/data_reduction_proxy_usage_stats.cc |
+++ b/components/data_reduction_proxy/browser/data_reduction_proxy_usage_stats.cc |
@@ -4,6 +4,9 @@ |
#include "components/data_reduction_proxy/browser/data_reduction_proxy_usage_stats.h" |
+#include "base/bind.h" |
+#include "base/callback.h" |
+#include "base/message_loop/message_loop_proxy.h" |
#include "base/metrics/histogram.h" |
#include "net/base/net_errors.h" |
#include "net/proxy/proxy_retry_info.h" |
@@ -23,15 +26,14 @@ namespace data_reduction_proxy { |
DataReductionProxyUsageStats::DataReductionProxyUsageStats( |
DataReductionProxyParams* params, |
- MessageLoopProxy* ui_thread_proxy, |
- MessageLoopProxy* io_thread_proxy) |
+ MessageLoopProxy* ui_thread_proxy) |
: data_reduction_proxy_params_(params), |
last_bypass_type_(ProxyService::BYPASS_EVENT_TYPE_MAX), |
triggering_request_(true), |
ui_thread_proxy_(ui_thread_proxy), |
- io_thread_proxy_(io_thread_proxy), |
eligible_num_requests_through_proxy_(0), |
- actual_num_requests_through_proxy_(0) { |
+ actual_num_requests_through_proxy_(0), |
+ unavailable_(false) { |
NetworkChangeNotifier::AddNetworkChangeObserver(this); |
}; |
@@ -41,47 +43,27 @@ DataReductionProxyUsageStats::~DataReductionProxyUsageStats() { |
void DataReductionProxyUsageStats::OnUrlRequestCompleted( |
const net::URLRequest* request, bool started) { |
- DCHECK(io_thread_proxy_->BelongsToCurrentThread()); |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
if (request->status().status() == net::URLRequestStatus::SUCCESS) { |
if (data_reduction_proxy_params_->IsDataReductionProxyEligible(request)) { |
bool was_received_via_proxy = |
data_reduction_proxy_params_->WasDataReductionProxyUsed( |
request, NULL); |
- ui_thread_proxy_->PostTask(FROM_HERE, base::Bind( |
- &DataReductionProxyUsageStats::IncRequestCountsOnUiThread, |
- base::Unretained(this), was_received_via_proxy)); |
+ IncrementRequestCounts(was_received_via_proxy); |
} |
} |
} |
-/** |
- * Determines if the data reduction proxy is currently unreachable. We keep |
- * track of count of requests which go through data reduction proxy as well as |
- * count of requests which are eligible to go through the proxy. If and only if |
- * no requests go through proxy and some requests were eligible, we conclude |
- * that the proxy is unreachable. |
- * |
- * Returns true if the data reduction proxy is unreachable. |
- */ |
-bool DataReductionProxyUsageStats::isDataReductionProxyUnreachable() { |
- DCHECK(ui_thread_proxy_->BelongsToCurrentThread()); |
- |
- return eligible_num_requests_through_proxy_ > 0 && |
- actual_num_requests_through_proxy_ == 0; |
-} |
- |
void DataReductionProxyUsageStats::OnNetworkChanged( |
NetworkChangeNotifier::ConnectionType type) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- ui_thread_proxy_->PostTask(FROM_HERE, base::Bind( |
- &DataReductionProxyUsageStats::ClearRequestCountsOnUiThread, |
- base::Unretained(this))); |
+ ClearRequestCounts(); |
} |
-void DataReductionProxyUsageStats::IncRequestCountsOnUiThread( |
+void DataReductionProxyUsageStats::IncrementRequestCounts( |
bool was_received_via_proxy) { |
- DCHECK(ui_thread_proxy_->BelongsToCurrentThread()); |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
if (was_received_via_proxy) { |
actual_num_requests_through_proxy_++; |
} |
@@ -91,14 +73,36 @@ void DataReductionProxyUsageStats::IncRequestCountsOnUiThread( |
// gets blocked, we reset the counts occasionally. |
if (eligible_num_requests_through_proxy_ > 50 |
&& actual_num_requests_through_proxy_ > 0) { |
- ClearRequestCountsOnUiThread(); |
+ ClearRequestCounts(); |
+ } else { |
+ MaybeNotifyUnavailability(); |
} |
} |
-void DataReductionProxyUsageStats::ClearRequestCountsOnUiThread() { |
- DCHECK(ui_thread_proxy_->BelongsToCurrentThread()); |
+void DataReductionProxyUsageStats::ClearRequestCounts() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
eligible_num_requests_through_proxy_ = 0; |
actual_num_requests_through_proxy_ = 0; |
+ MaybeNotifyUnavailability(); |
+} |
+ |
+void DataReductionProxyUsageStats::MaybeNotifyUnavailability() { |
+ bool prev_unavailable = unavailable_; |
+ unavailable_ = (eligible_num_requests_through_proxy_ > 0 && |
+ actual_num_requests_through_proxy_ == 0); |
+ if (prev_unavailable != unavailable_) { |
+ ui_thread_proxy_->PostTask(FROM_HERE, base::Bind( |
+ &DataReductionProxyUsageStats::NotifyUnavailabilityOnUIThread, |
+ base::Unretained(this), |
+ unavailable_)); |
+ } |
+} |
+ |
+void DataReductionProxyUsageStats::NotifyUnavailabilityOnUIThread( |
+ bool unavailable) { |
+ DCHECK(ui_thread_proxy_->BelongsToCurrentThread()); |
+ if (!unavailable_callback_.is_null()) |
+ unavailable_callback_.Run(unavailable); |
} |
void DataReductionProxyUsageStats::SetBypassType( |