1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef COMPONENTS_DATA_REDUCTION_PROXY_BROWSER_DATA_REDUCTION_PROXY_CONFIG_SERVICE_H_
6#define COMPONENTS_DATA_REDUCTION_PROXY_BROWSER_DATA_REDUCTION_PROXY_CONFIG_SERVICE_H_
7
8#include <vector>
9
10#include "base/basictypes.h"
11#include "base/callback.h"
12#include "base/gtest_prod_util.h"
13#include "base/memory/ref_counted.h"
14#include "base/memory/scoped_ptr.h"
15#include "base/observer_list.h"
16#include "base/task_runner.h"
17#include "components/data_reduction_proxy/browser/data_reduction_proxy_configurator.h"
18#include "net/proxy/proxy_config.h"
19#include "net/proxy/proxy_config_service.h"
20
21class PrefService;
22
23namespace net {
24class ProxyConfig;
25}
26
27namespace data_reduction_proxy {
28
29// A net::ProxyConfigService implementation that applies data reduction proxy
30// settings as overrides to the proxy configuration determined by a
31// baseline delegate ProxyConfigService.
32class DataReductionProxyConfigService
33    : public net::ProxyConfigService,
34      public net::ProxyConfigService::Observer {
35 public:
36  // Takes ownership of the passed |base_service|.
37  DataReductionProxyConfigService(
38      scoped_ptr<net::ProxyConfigService> base_service);
39  virtual ~DataReductionProxyConfigService();
40
41  // ProxyConfigService implementation:
42  virtual void AddObserver(
43      net::ProxyConfigService::Observer* observer) OVERRIDE;
44  virtual void RemoveObserver(
45      net::ProxyConfigService::Observer* observer) OVERRIDE;
46  virtual ConfigAvailability GetLatestProxyConfig(
47      net::ProxyConfig* config) OVERRIDE;
48  virtual void OnLazyPoll() OVERRIDE;
49
50  // Method on IO thread that receives the data reduction proxy settings pushed
51  // from DataReductionProxyConfiguratorImpl.
52  void UpdateProxyConfig(bool enabled,
53                         const net::ProxyConfig& config);
54
55 private:
56  friend class DataReductionProxyConfigServiceTest;
57
58  // ProxyConfigService::Observer implementation:
59  virtual void OnProxyConfigChanged(const net::ProxyConfig& config,
60                                    ConfigAvailability availability) OVERRIDE;
61
62  // Makes sure that the observer registration with the base service is set up.
63  void RegisterObserver();
64
65  scoped_ptr<net::ProxyConfigService> base_service_;
66  ObserverList<net::ProxyConfigService::Observer, true> observers_;
67
68  // Configuration as defined by the data reduction proxy.
69  net::ProxyConfig config_;
70
71  // Flag that indicates that a PrefProxyConfigTracker needs to inform us
72  // about a proxy configuration before we may return any configuration.
73  bool config_read_pending_;
74
75  // Indicates whether the base service registration is done.
76  bool registered_observer_;
77
78  // The data reduction proxy is enabled.
79  bool enabled_;
80
81  // Use of the data reduction proxy is restricted to HTTP proxying only.
82  bool restricted_;
83
84  DISALLOW_COPY_AND_ASSIGN(DataReductionProxyConfigService);
85};
86
87// A data_reduction_proxy::DataReductionProxyConfigurator implementation that
88// tracks changes to the data reduction proxy configuration and notifies an
89// associated DataReductionProxyConfigService. Configuration changes include
90// adding URL and host patterns to bypass and enabling and disabling use of the
91// proxy.
92class DataReductionProxyConfigTracker : public DataReductionProxyConfigurator {
93 public:
94  DataReductionProxyConfigTracker(
95      base::Callback<void(bool, const net::ProxyConfig&)> update_proxy_config,
96      base::TaskRunner* task_runner);
97  virtual ~DataReductionProxyConfigTracker();
98
99  virtual void Enable(bool primary_restricted,
100                      bool fallback_restricted,
101                      const std::string& primary_origin,
102                      const std::string& fallback_origin,
103                      const std::string& ssl_origin) OVERRIDE;
104  virtual void Disable() OVERRIDE;
105  virtual void AddHostPatternToBypass(const std::string& pattern) OVERRIDE;
106  virtual void AddURLPatternToBypass(const std::string& pattern) OVERRIDE;
107
108 private:
109  FRIEND_TEST_ALL_PREFIXES(DataReductionProxyConfigServiceTest,
110                           TrackerEnable);
111  FRIEND_TEST_ALL_PREFIXES(DataReductionProxyConfigServiceTest,
112                           TrackerRestricted);
113  FRIEND_TEST_ALL_PREFIXES(DataReductionProxyConfigServiceTest,
114                           TrackerBypassList);
115
116  void UpdateProxyConfigOnIOThread(bool enabled,
117                                   const net::ProxyConfig& config);
118
119  base::Callback<void(bool, const net::ProxyConfig&)> update_proxy_config_;
120  std::vector<std::string> bypass_rules_;
121  scoped_refptr<base::TaskRunner> task_runner_;
122
123  DISALLOW_COPY_AND_ASSIGN(DataReductionProxyConfigTracker);
124};
125
126}  //  namespace data_reduction_proxy
127
128#endif  // COMPONENTS_DATA_REDUCTION_PROXY_BROWSER_DATA_REDUCTION_PROXY_CONFIG_SERVICE_H_
129