blob: b03c1e2f8c9e180ae1a836fde184213822f00a99 [file] [log] [blame]
// Copyright 2017 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.
#ifndef COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_NETWORK_PROPERTIES_MANAGER_H_
#define COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_NETWORK_PROPERTIES_MANAGER_H_
#include <map>
#include <memory>
#include <string>
#include "base/macros.h"
#include "base/sequence_checker.h"
#include "base/sequenced_task_runner.h"
#include "components/data_reduction_proxy/proto/network_properties.pb.h"
#include "components/prefs/pref_service.h"
namespace base {
class Clock;
class Value;
}
namespace data_reduction_proxy {
// Stores the properties of a single network. Created on the UI thread, but
// lives on the IO thread. Guaranteed to be destroyed on IO thread if the IO
// thread is still available at the time of destruction. If the IO thread is
// unavailable, then the destruction will happen on the UI thread.
class NetworkPropertiesManager {
public:
NetworkPropertiesManager(
base::Clock* clock,
PrefService* pref_service,
scoped_refptr<base::SequencedTaskRunner> ui_task_runner);
virtual ~NetworkPropertiesManager();
// Called when the user clears the browsing history.
void DeleteHistory();
void ShutdownOnUIThread();
void OnChangeInNetworkID(const std::string& network_id);
// Returns true if usage of secure proxies are allowed on the current network.
// Returns the status of core secure proxies if |is_core_proxy| is true.
bool IsSecureProxyAllowed(bool is_core_proxy) const;
// Returns true if usage of insecure proxies are allowed on the current
// network. Returns the status of core non-secure proxies if |is_core_proxy|
// is true.
bool IsInsecureProxyAllowed(bool is_core_proxy) const;
// Returns true if usage of secure proxies has been disallowed by the carrier
// on the current network.
bool IsSecureProxyDisallowedByCarrier() const;
// Sets the status of whether the usage of secure proxies is disallowed by the
// carrier on the current network.
void SetIsSecureProxyDisallowedByCarrier(bool disallowed_by_carrier);
// Returns true if the current network has a captive portal.
bool IsCaptivePortal() const;
// Sets the status of whether the current network has a captive portal or not.
// If the current network has captive portal, usage of secure proxies is
// disallowed.
void SetIsCaptivePortal(bool is_captive_portal);
// Returns true if the warmup URL probe has failed
// on secure (or insecure), core (or non-core) data saver proxies on the
// current network.
bool HasWarmupURLProbeFailed(bool secure_proxy, bool is_core_proxy) const;
// Sets the status of whether the fetching of warmup URL failed on the current
// network. Sets the status for secure (or insecure), core (or non-core) data
// saver proxies.
void SetHasWarmupURLProbeFailed(bool secure_proxy,
bool is_core_proxy,
bool warmup_url_probe_failed);
// Returns true if the warmup URL probe can be fetched from the proxy with the
// specified properties.
bool ShouldFetchWarmupProbeURL(bool secure_proxy, bool is_core_proxy) const;
// Called when the warmup URL probe to a proxy with the specified properties
// has been initiated.
void OnWarmupFetchInitiated(bool secure_proxy, bool is_core_proxy);
// Returns the count of fetch attempts that have been made to the proxy with
// the specified properties.
size_t GetWarmupURLFetchAttemptCounts(bool secure_proxy,
bool is_core_proxy) const;
// Resets the metrics related to the fetching of the warmup probe URL.
void ResetWarmupURLFetchMetrics();
private:
// Map from network IDs to network properties.
typedef std::map<std::string, NetworkProperties> NetworkPropertiesContainer;
// PrefManager writes or updates the network properties prefs. Created on
// UI thread, and should be used on the UI thread. May be destroyed on UI
// or IO thread.
class PrefManager;
// Called when there is a change in the network property of the current
// network.
void OnChangeInNetworkPropertyOnIOThread();
static NetworkPropertiesContainer ConvertDictionaryValueToParsedPrefs(
const base::Value* value);
// Clock used for querying current time. Guaranteed to be non-null.
base::Clock* clock_;
// Task runner on which prefs should be accessed.
scoped_refptr<base::SequencedTaskRunner> ui_task_runner_;
// Network properties of different networks. Should be accessed on the IO
// thread.
NetworkPropertiesContainer network_properties_container_;
// ID of the current network.
std::string network_id_;
// State of the proxies on the current network.
NetworkProperties network_properties_;
std::unique_ptr<PrefManager> pref_manager_;
// Set to true if the fetch of the warmup URL was successful since the last
// connection change. The status is recorded separately for each combination
// of (is_secure_proxy) and (is_core_proxy).
bool has_warmup_url_succeded_secure_core_;
bool has_warmup_url_succeded_secure_non_core_;
bool has_warmup_url_succeded_insecure_core_;
bool has_warmup_url_succeded_insecure_non_core_;
// Count of warmup URL fetch attempts since the last connection change. The
// count is recorded separately for each combination of (is_secure_proxy) and
// (is_core_proxy).
size_t warmup_url_fetch_attempt_counts_secure_core_;
size_t warmup_url_fetch_attempt_counts_secure_non_core_;
size_t warmup_url_fetch_attempt_counts_insecure_core_;
size_t warmup_url_fetch_attempt_counts_insecure_non_core_;
// Should be dereferenced only on the UI thread.
base::WeakPtr<PrefManager> pref_manager_weak_ptr_;
SEQUENCE_CHECKER(sequence_checker_);
DISALLOW_COPY_AND_ASSIGN(NetworkPropertiesManager);
};
} // namespace data_reduction_proxy
#endif // COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_NETWORK_PROPERTIES_MANAGER_H_