Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(568)

Side by Side Diff: chrome/browser/net/pref_proxy_config_service.cc

Issue 8102019: redesign and reimplement proxy config service and tracker, revise proxy ui on cros (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/net/pref_proxy_config_service.h" 5 #include "chrome/browser/net/pref_proxy_config_service.h"
6 6
7 #include "base/values.h" 7 #include "base/values.h"
8 #include "chrome/browser/prefs/pref_service.h" 8 #include "chrome/browser/prefs/pref_service.h"
9 #include "chrome/browser/prefs/pref_set_observer.h" 9 #include "chrome/browser/prefs/pref_set_observer.h"
10 #include "chrome/browser/prefs/proxy_config_dictionary.h" 10 #include "chrome/browser/prefs/proxy_config_dictionary.h"
11 #include "chrome/common/chrome_notification_types.h" 11 #include "chrome/common/chrome_notification_types.h"
12 #include "chrome/common/pref_names.h" 12 #include "chrome/common/pref_names.h"
13 #include "content/browser/browser_thread.h" 13 #include "content/browser/browser_thread.h"
14 #include "content/common/notification_details.h" 14 #include "content/common/notification_details.h"
15 #include "content/common/notification_source.h" 15 #include "content/common/notification_source.h"
16 16
17 PrefProxyConfigTracker::PrefProxyConfigTracker(PrefService* pref_service) 17 PrefProxyConfigTracker::PrefProxyConfigTracker(PrefService* pref_service)
18 : pref_service_(pref_service) { 18 : pref_service_(pref_service) {
19 config_state_ = ReadPrefConfig(&pref_config_); 19 ui_config_state_ = ReadPrefConfig(&ui_pref_config_, &ui_config_source_);
20 io_config_state_ = ui_config_state_;
21 io_pref_config_ = ui_pref_config_;
22 io_config_source_ = ui_config_source_;
20 proxy_prefs_observer_.reset( 23 proxy_prefs_observer_.reset(
21 PrefSetObserver::CreateProxyPrefSetObserver(pref_service_, this)); 24 PrefSetObserver::CreateProxyPrefSetObserver(pref_service_, this));
22 } 25 }
23 26
24 PrefProxyConfigTracker::~PrefProxyConfigTracker() { 27 PrefProxyConfigTracker::~PrefProxyConfigTracker() {
25 DCHECK(pref_service_ == NULL); 28 DCHECK(pref_service_ == NULL);
26 } 29 }
27 30
28 PrefProxyConfigTracker::ConfigState 31 PrefProxyConfigTracker::ConfigState
29 PrefProxyConfigTracker::GetProxyConfig(net::ProxyConfig* config) { 32 PrefProxyConfigTracker::IOGetProxyConfig(net::ProxyConfig* config,
33 ConfigSource* config_source) {
30 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 34 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
31 if (config_state_ != CONFIG_UNSET) 35 if (io_config_state_ != CONFIG_UNSET) {
32 *config = pref_config_; 36 *config = io_pref_config_;
33 return config_state_; 37 *config_source = io_config_source_;
38 }
39 return io_config_state_;
40 }
41
42 PrefProxyConfigTracker::ConfigState
43 PrefProxyConfigTracker::UIGetProxyConfig(net::ProxyConfig* config,
44 ConfigSource* config_source) {
45 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
46 if (ui_config_state_ != CONFIG_UNSET) {
47 *config = ui_pref_config_;
48 *config_source = ui_config_source_;
49 }
50 return ui_config_state_;
34 } 51 }
35 52
36 void PrefProxyConfigTracker::DetachFromPrefService() { 53 void PrefProxyConfigTracker::DetachFromPrefService() {
37 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 54 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
38 // Stop notifications. 55 // Stop notifications.
39 proxy_prefs_observer_.reset(); 56 proxy_prefs_observer_.reset();
40 pref_service_ = NULL; 57 pref_service_ = NULL;
41 } 58 }
42 59
43 void PrefProxyConfigTracker::AddObserver( 60 void PrefProxyConfigTracker::AddObserver(
44 PrefProxyConfigTracker::Observer* observer) { 61 PrefProxyConfigTracker::Observer* observer) {
45 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 62 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
46 observers_.AddObserver(observer); 63 observers_.AddObserver(observer);
47 } 64 }
48 65
49 void PrefProxyConfigTracker::RemoveObserver( 66 void PrefProxyConfigTracker::RemoveObserver(
50 PrefProxyConfigTracker::Observer* observer) { 67 PrefProxyConfigTracker::Observer* observer) {
51 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 68 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
52 observers_.RemoveObserver(observer); 69 observers_.RemoveObserver(observer);
53 } 70 }
54 71
55 void PrefProxyConfigTracker::Observe(int type, 72 void PrefProxyConfigTracker::Observe(int type,
56 const NotificationSource& source, 73 const NotificationSource& source,
57 const NotificationDetails& details) { 74 const NotificationDetails& details) {
58 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 75 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
59 if (type == chrome::NOTIFICATION_PREF_CHANGED && 76 if (type == chrome::NOTIFICATION_PREF_CHANGED &&
60 Source<PrefService>(source).ptr() == pref_service_) { 77 Source<PrefService>(source).ptr() == pref_service_) {
61 net::ProxyConfig new_config; 78 net::ProxyConfig new_config;
62 ConfigState config_state = ReadPrefConfig(&new_config); 79 ConfigSource config_source;
63 BrowserThread::PostTask( 80 ConfigState config_state = ReadPrefConfig(&new_config, &config_source);
64 BrowserThread::IO, FROM_HERE, 81 if (ui_config_state_ != config_state ||
65 NewRunnableMethod(this, 82 (ui_config_state_ != CONFIG_UNSET &&
66 &PrefProxyConfigTracker::InstallProxyConfig, 83 (ui_config_source_ != config_source ||
67 new_config, config_state)); 84 !ui_pref_config_.Equals(new_config)))) {
85 ui_config_state_ = config_state;
86 if (ui_config_state_ != CONFIG_UNSET) {
87 ui_pref_config_ = new_config;
88 ui_config_source_ = config_source;
89 }
90 BrowserThread::PostTask(
91 BrowserThread::IO, FROM_HERE,
92 NewRunnableMethod(this,
93 &PrefProxyConfigTracker::InstallProxyConfig,
94 new_config, config_state, config_source));
95 }
68 } else { 96 } else {
69 NOTREACHED() << "Unexpected notification of type " << type; 97 NOTREACHED() << "Unexpected notification of type " << type;
70 } 98 }
71 } 99 }
72 100
73 void PrefProxyConfigTracker::InstallProxyConfig( 101 void PrefProxyConfigTracker::InstallProxyConfig(
74 const net::ProxyConfig& config, 102 const net::ProxyConfig& config,
75 PrefProxyConfigTracker::ConfigState config_state) { 103 PrefProxyConfigTracker::ConfigState config_state,
76 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 104 PrefProxyConfigTracker::ConfigSource config_source) {
77 if (config_state_ != config_state || 105 io_config_state_ = config_state;
78 (config_state_ != CONFIG_UNSET && !pref_config_.Equals(config))) { 106 if (io_config_state_ != CONFIG_UNSET) {
79 config_state_ = config_state; 107 io_pref_config_ = config;
80 if (config_state_ != CONFIG_UNSET) 108 io_config_source_ = config_source;
81 pref_config_ = config;
82 FOR_EACH_OBSERVER(Observer, observers_, OnPrefProxyConfigChanged());
83 } 109 }
110 FOR_EACH_OBSERVER(Observer, observers_, OnPrefProxyConfigChanged());
84 } 111 }
85 112
86 PrefProxyConfigTracker::ConfigState 113 PrefProxyConfigTracker::ConfigState
87 PrefProxyConfigTracker::ReadPrefConfig(net::ProxyConfig* config) { 114 PrefProxyConfigTracker::ReadPrefConfig(net::ProxyConfig* config,
115 ConfigSource* config_source) {
88 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 116 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
89 117
90 // Clear the configuration. 118 // Clear the configuration and source.
91 *config = net::ProxyConfig(); 119 *config = net::ProxyConfig();
120 *config_source = CONFIG_SOURCE_UNSET;
92 121
93 const PrefService::Preference* pref = 122 const PrefService::Preference* pref =
94 pref_service_->FindPreference(prefs::kProxy); 123 pref_service_->FindPreference(prefs::kProxy);
95 DCHECK(pref); 124 DCHECK(pref);
96 125
97 const DictionaryValue* dict = pref_service_->GetDictionary(prefs::kProxy); 126 const DictionaryValue* dict = pref_service_->GetDictionary(prefs::kProxy);
98 DCHECK(dict); 127 DCHECK(dict);
99 ProxyConfigDictionary proxy_dict(dict); 128 ProxyConfigDictionary proxy_dict(dict);
100 129
101 if (PrefConfigToNetConfig(proxy_dict, config)) { 130 if (PrefConfigToNetConfig(proxy_dict, config)) {
102 return (!pref->IsUserModifiable() || pref->HasUserSetting()) ? 131 if (!pref->IsUserModifiable() || pref->HasUserSetting()) {
103 CONFIG_PRESENT : CONFIG_FALLBACK; 132 if (pref->IsManaged())
133 *config_source = CONFIG_SOURCE_POLICY;
134 else if (pref->IsExtensionControlled())
135 *config_source = CONFIG_SOURCE_EXTENSION;
136 return CONFIG_PRESENT;
137 } else {
138 *config_source = CONFIG_SOURCE_FALLBACK;
139 return CONFIG_FALLBACK;
140 }
104 } 141 }
105 142
106 return CONFIG_UNSET; 143 return CONFIG_UNSET;
107 } 144 }
108 145
109 bool PrefProxyConfigTracker::PrefConfigToNetConfig( 146 bool PrefProxyConfigTracker::PrefConfigToNetConfig(
110 const ProxyConfigDictionary& proxy_dict, 147 const ProxyConfigDictionary& proxy_dict,
111 net::ProxyConfig* config) { 148 net::ProxyConfig* config) {
112 ProxyPrefs::ProxyMode mode; 149 ProxyPrefs::ProxyMode mode;
113 if (!proxy_dict.GetMode(&mode)) { 150 if (!proxy_dict.GetMode(&mode)) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 return true; 197 return true;
161 } 198 }
162 case ProxyPrefs::kModeCount: { 199 case ProxyPrefs::kModeCount: {
163 // Fall through to NOTREACHED(). 200 // Fall through to NOTREACHED().
164 } 201 }
165 } 202 }
166 NOTREACHED() << "Unknown proxy mode, falling back to system settings."; 203 NOTREACHED() << "Unknown proxy mode, falling back to system settings.";
167 return false; 204 return false;
168 } 205 }
169 206
207 net::ProxyConfigService::ConfigAvailability
208 ProxyConfigDecider::GetEffectiveProxyConfig(
209 PrefProxyConfigTracker::ConfigState pref_state,
210 const net::ProxyConfig& pref_config,
211 PrefProxyConfigTracker::ConfigSource pref_source,
212 net::ProxyConfigService::ConfigAvailability system_availability,
213 const net::ProxyConfig& system_config,
214 bool ignore_fallback_config,
215 net::ProxyConfig* config,
216 PrefProxyConfigTracker::ConfigSource* config_source) {
217 *config_source = pref_source;
218
219 if (pref_state == PrefProxyConfigTracker::CONFIG_PRESENT) {
220 *config = pref_config;
221 return net::ProxyConfigService::CONFIG_VALID;
222 }
223
224 // There's no system proxy config, fall back to prefs or default.
225 if (system_availability == net::ProxyConfigService::CONFIG_UNSET) {
226 if (pref_state == PrefProxyConfigTracker::CONFIG_FALLBACK &&
227 !ignore_fallback_config) {
228 *config = pref_config;
229 } else {
230 *config = net::ProxyConfig::CreateDirect();
231 }
232 return net::ProxyConfigService::CONFIG_VALID;
233 }
234
235 *config = system_config;
236 *config_source = PrefProxyConfigTracker::CONFIG_SOURCE_SYSTEM;
237 return system_availability;
238 }
239
170 PrefProxyConfigService::PrefProxyConfigService( 240 PrefProxyConfigService::PrefProxyConfigService(
171 PrefProxyConfigTracker* tracker, 241 PrefProxyConfigTracker* tracker,
172 net::ProxyConfigService* base_service) 242 net::ProxyConfigService* base_service)
173 : base_service_(base_service), 243 : base_service_(base_service),
174 pref_config_tracker_(tracker), 244 pref_config_tracker_(tracker),
175 registered_observers_(false) { 245 registered_observers_(false) {
176 } 246 }
177 247
178 PrefProxyConfigService::~PrefProxyConfigService() { 248 PrefProxyConfigService::~PrefProxyConfigService() {
179 if (registered_observers_) { 249 if (registered_observers_) {
180 base_service_->RemoveObserver(this); 250 base_service_->RemoveObserver(this);
181 pref_config_tracker_->RemoveObserver(this); 251 pref_config_tracker_->RemoveObserver(this);
182 } 252 }
183 } 253 }
184 254
185 void PrefProxyConfigService::AddObserver( 255 void PrefProxyConfigService::AddObserver(
186 net::ProxyConfigService::Observer* observer) { 256 net::ProxyConfigService::Observer* observer) {
187 RegisterObservers(); 257 RegisterObservers();
188 observers_.AddObserver(observer); 258 observers_.AddObserver(observer);
189 } 259 }
190 260
191 void PrefProxyConfigService::RemoveObserver( 261 void PrefProxyConfigService::RemoveObserver(
192 net::ProxyConfigService::Observer* observer) { 262 net::ProxyConfigService::Observer* observer) {
193 observers_.RemoveObserver(observer); 263 observers_.RemoveObserver(observer);
194 } 264 }
195 265
196 net::ProxyConfigService::ConfigAvailability 266 net::ProxyConfigService::ConfigAvailability
197 PrefProxyConfigService::GetLatestProxyConfig(net::ProxyConfig* config) { 267 PrefProxyConfigService::GetLatestProxyConfig(net::ProxyConfig* config) {
198 RegisterObservers(); 268 RegisterObservers();
269
270 // Get prefs proxy config.
199 net::ProxyConfig pref_config; 271 net::ProxyConfig pref_config;
200 PrefProxyConfigTracker::ConfigState state = 272 PrefProxyConfigTracker::ConfigSource pref_source;
201 pref_config_tracker_->GetProxyConfig(&pref_config); 273 PrefProxyConfigTracker::ConfigState pref_state =
202 if (state == PrefProxyConfigTracker::CONFIG_PRESENT) { 274 pref_config_tracker_->IOGetProxyConfig(&pref_config, &pref_source);
203 *config = pref_config;
204 return CONFIG_VALID;
205 }
206 275
207 // Ask the base service. 276 // Ask the base service.
208 ConfigAvailability available = base_service_->GetLatestProxyConfig(config); 277 net::ProxyConfig system_config;
278 ConfigAvailability system_availability =
279 base_service_->GetLatestProxyConfig(&system_config);
209 280
210 // Base service doesn't have a configuration, fall back to prefs or default. 281 PrefProxyConfigTracker::ConfigSource config_source;
211 if (available == CONFIG_UNSET) { 282 return GetEffectiveProxyConfig(pref_state, pref_config, pref_source,
212 if (state == PrefProxyConfigTracker::CONFIG_FALLBACK) 283 system_availability, system_config, false,
213 *config = pref_config; 284 config, &config_source);
214 else
215 *config = net::ProxyConfig::CreateDirect();
216 return CONFIG_VALID;
217 }
218
219 return available;
220 } 285 }
221 286
222 void PrefProxyConfigService::OnLazyPoll() { 287 void PrefProxyConfigService::OnLazyPoll() {
223 base_service_->OnLazyPoll(); 288 base_service_->OnLazyPoll();
224 } 289 }
225 290
226 void PrefProxyConfigService::OnProxyConfigChanged( 291 void PrefProxyConfigService::OnProxyConfigChanged(
227 const net::ProxyConfig& config, 292 const net::ProxyConfig& config,
228 ConfigAvailability availability) { 293 ConfigAvailability availability) {
229 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 294 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
230 295
231 // Check whether there is a proxy configuration defined by preferences. In 296 // Check whether there is a proxy configuration defined by preferences. In
232 // this case that proxy configuration takes precedence and the change event 297 // this case that proxy configuration takes precedence and the change event
233 // from the delegate proxy service can be disregarded. 298 // from the delegate proxy service can be disregarded.
234 net::ProxyConfig actual_config; 299 net::ProxyConfig actual_config;
235 if (pref_config_tracker_->GetProxyConfig(&actual_config) != 300 PrefProxyConfigTracker::ConfigSource config_source;
301 if (pref_config_tracker_->IOGetProxyConfig(&actual_config, &config_source) !=
236 PrefProxyConfigTracker::CONFIG_PRESENT) { 302 PrefProxyConfigTracker::CONFIG_PRESENT) {
237 availability = GetLatestProxyConfig(&actual_config); 303 availability = GetLatestProxyConfig(&actual_config);
238 FOR_EACH_OBSERVER(net::ProxyConfigService::Observer, observers_, 304 FOR_EACH_OBSERVER(net::ProxyConfigService::Observer, observers_,
239 OnProxyConfigChanged(actual_config, availability)); 305 OnProxyConfigChanged(actual_config, availability));
240 } 306 }
241 } 307 }
242 308
243 void PrefProxyConfigService::OnPrefProxyConfigChanged() { 309 void PrefProxyConfigService::OnPrefProxyConfigChanged() {
244 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 310 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
245 311
(...skipping 22 matching lines...) Expand all
268 } 334 }
269 } 335 }
270 336
271 // static 337 // static
272 void PrefProxyConfigService::RegisterPrefs(PrefService* pref_service) { 338 void PrefProxyConfigService::RegisterPrefs(PrefService* pref_service) {
273 DictionaryValue* default_settings = ProxyConfigDictionary::CreateSystem(); 339 DictionaryValue* default_settings = ProxyConfigDictionary::CreateSystem();
274 pref_service->RegisterDictionaryPref(prefs::kProxy, 340 pref_service->RegisterDictionaryPref(prefs::kProxy,
275 default_settings, 341 default_settings,
276 PrefService::UNSYNCABLE_PREF); 342 PrefService::UNSYNCABLE_PREF);
277 } 343 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698