OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #ifndef NET_PROXY_PROXY_CONFIG_SERVICE_LINUX_H_ | 5 #ifndef NET_PROXY_PROXY_CONFIG_SERVICE_LINUX_H_ |
6 #define NET_PROXY_PROXY_CONFIG_SERVICE_LINUX_H_ | 6 #define NET_PROXY_PROXY_CONFIG_SERVICE_LINUX_H_ |
7 | 7 |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 // Setting change notification callbacks can occur at any time and are | 151 // Setting change notification callbacks can occur at any time and are |
152 // run on either the UI thread (gconf/gsettings) or the file thread | 152 // run on either the UI thread (gconf/gsettings) or the file thread |
153 // (KDE). The new settings are fetched on that thread, and the resulting | 153 // (KDE). The new settings are fetched on that thread, and the resulting |
154 // proxy config is posted to the IO thread through | 154 // proxy config is posted to the IO thread through |
155 // Delegate::SetNewProxyConfig(). We then notify observers on the IO | 155 // Delegate::SetNewProxyConfig(). We then notify observers on the IO |
156 // thread of the configuration change. | 156 // thread of the configuration change. |
157 // | 157 // |
158 // ProxyConfigServiceLinux is deleted from the IO thread. | 158 // ProxyConfigServiceLinux is deleted from the IO thread. |
159 // | 159 // |
160 // The substance of the ProxyConfigServiceLinux implementation is | 160 // The substance of the ProxyConfigServiceLinux implementation is |
161 // wrapped in the Delegate ref counted class. On deleting the | 161 // wrapped in the Delegate ref counted class. Destruction of the Delegate |
162 // ProxyConfigServiceLinux, Delegate::OnDestroy() is posted to either | 162 // is commenced by StartTearDown() which calls Delegate::OnDestroy() on |
163 // the UI thread (gconf/gsettings) or the file thread (KDE) where change | 163 // the UI thread (gconf/gsettings) or posts it to the file thread (KDE) where |
164 // notifications will be safely stopped before releasing Delegate. | 164 // change notifications will be safely stopped before releasing Delegate. |
165 | 165 |
166 class Delegate : public base::RefCountedThreadSafe<Delegate> { | 166 class Delegate : public base::RefCountedThreadSafe<Delegate> { |
167 public: | 167 public: |
168 // Constructor receives env var getter implementation to use, and | 168 // Constructor receives env var getter implementation to use, and |
169 // takes ownership of it. This is the normal constructor. | 169 // takes ownership of it. This is the normal constructor. |
170 explicit Delegate(base::Environment* env_var_getter); | 170 explicit Delegate(base::Environment* env_var_getter); |
171 // Constructor receives setting and env var getter implementations | 171 // Constructor receives setting and env var getter implementations |
172 // to use, and takes ownership of them. Used for testing. | 172 // to use, and takes ownership of them. Used for testing. |
173 Delegate(base::Environment* env_var_getter, SettingGetter* setting_getter); | 173 Delegate(base::Environment* env_var_getter, SettingGetter* setting_getter); |
174 | 174 |
175 // Synchronously obtains the proxy configuration. If gconf, | 175 // Asynchronously obtains the proxy configuration. If gconf, |
176 // gsettings, or kioslaverc are used, also enables notifications for | 176 // gsettings, or kioslaverc are used, also enables notifications for |
177 // setting changes. gconf/gsettings must only be accessed from the | 177 // setting changes. This method must be called from the IO thread. The |
178 // thread running the default glib main loop, and so this method | 178 // message loop for the IO thread is specified so that notifications |
179 // must be called from the UI thread. The message loop for the IO | 179 // can post tasks to it (and for assertions). The message loop for the |
180 // thread is specified so that notifications can post tasks to it | 180 // file thread is used to read any files needed to determine proxy |
181 // (and for assertions). The message loop for the file thread is | 181 // settings. |
182 // used to read any files needed to determine proxy settings. | |
183 void SetUpAndFetchInitialConfig( | 182 void SetUpAndFetchInitialConfig( |
184 base::SingleThreadTaskRunner* glib_thread_task_runner, | 183 base::SingleThreadTaskRunner* glib_thread_task_runner, |
185 base::SingleThreadTaskRunner* io_thread_task_runner, | 184 base::SingleThreadTaskRunner* io_thread_task_runner, |
186 MessageLoopForIO* file_loop); | 185 MessageLoopForIO* file_loop); |
187 | 186 |
188 // Handler for setting change notifications: fetches a new proxy | 187 // Handler for setting change notifications: fetches a new proxy |
189 // configuration from settings, and if this config is different | 188 // configuration from settings, and if this config is different |
190 // than what we had before, posts a task to have it stored in | 189 // than what we had before, posts a task to have it stored in |
191 // cached_config_. | 190 // cached_config_. |
192 // Left public for simplicity. | 191 // Left public for simplicity. |
193 void OnCheckProxyConfigSettings(); | 192 void OnCheckProxyConfigSettings(); |
194 | 193 |
195 // Called from IO thread. | 194 // Called from IO thread. |
196 void AddObserver(Observer* observer); | 195 void AddObserver(Observer* observer); |
197 void RemoveObserver(Observer* observer); | 196 void RemoveObserver(Observer* observer); |
198 ProxyConfigService::ConfigAvailability GetLatestProxyConfig( | 197 ProxyConfigService::ConfigAvailability GetLatestProxyConfig( |
199 ProxyConfig* config); | 198 ProxyConfig* config); |
200 | 199 |
201 // Posts a call to OnDestroy() to the UI or FILE thread, depending on the | 200 // Posts a call to OnDestroy() to the UI or FILE thread, depending on the |
202 // setting getter in use. Called from ProxyConfigServiceLinux's destructor. | 201 // setting getter in use. Called from ProxyConfigServiceLinux's |
| 202 // StartTearDown. |
203 void PostDestroyTask(); | 203 void PostDestroyTask(); |
204 // Safely stops change notifications. Posted to either the UI or FILE | 204 // Safely stops change notifications. Posted to either the UI or FILE |
205 // thread, depending on the setting getter in use. | 205 // thread, depending on the setting getter in use. |
206 void OnDestroy(); | 206 void OnDestroy(); |
207 | 207 |
208 private: | 208 private: |
209 friend class base::RefCountedThreadSafe<Delegate>; | 209 friend class base::RefCountedThreadSafe<Delegate>; |
210 | 210 |
211 ~Delegate(); | 211 ~Delegate(); |
212 | 212 |
| 213 // Synchronously obtains the proxy configuration. If gconf, |
| 214 // gsettings, or kioslaverc are used, also enables notifications for |
| 215 // setting changes. gconf/gsettings must only be accessed from the |
| 216 // thread running the default glib main loop, and so this method |
| 217 // must be called from the UI thread. The message loop for the IO |
| 218 // thread is specified so that notifications can post tasks to it |
| 219 // (and for assertions). The message loop for the file thread is |
| 220 // used to read any files needed to determine proxy settings. |
| 221 void SetUpAndFetchInitialConfigOnUIThread( |
| 222 MessageLoopForIO* file_loop); |
| 223 |
213 // Obtains an environment variable's value. Parses a proxy server | 224 // Obtains an environment variable's value. Parses a proxy server |
214 // specification from it and puts it in result. Returns true if the | 225 // specification from it and puts it in result. Returns true if the |
215 // requested variable is defined and the value valid. | 226 // requested variable is defined and the value valid. |
216 bool GetProxyFromEnvVarForScheme(const char* variable, | 227 bool GetProxyFromEnvVarForScheme(const char* variable, |
217 ProxyServer::Scheme scheme, | 228 ProxyServer::Scheme scheme, |
218 ProxyServer* result_server); | 229 ProxyServer* result_server); |
219 // As above but with scheme set to HTTP, for convenience. | 230 // As above but with scheme set to HTTP, for convenience. |
220 bool GetProxyFromEnvVar(const char* variable, ProxyServer* result_server); | 231 bool GetProxyFromEnvVar(const char* variable, ProxyServer* result_server); |
221 // Fills proxy config from environment variables. Returns true if | 232 // Fills proxy config from environment variables. Returns true if |
222 // variables were found and the configuration is valid. | 233 // variables were found and the configuration is valid. |
(...skipping 11 matching lines...) Expand all Loading... |
234 // This method is posted from the UI thread to the IO thread to | 245 // This method is posted from the UI thread to the IO thread to |
235 // carry the new config information. | 246 // carry the new config information. |
236 void SetNewProxyConfig(const ProxyConfig& new_config); | 247 void SetNewProxyConfig(const ProxyConfig& new_config); |
237 | 248 |
238 // This method is run on the getter's notification thread. | 249 // This method is run on the getter's notification thread. |
239 void SetUpNotifications(); | 250 void SetUpNotifications(); |
240 | 251 |
241 scoped_ptr<base::Environment> env_var_getter_; | 252 scoped_ptr<base::Environment> env_var_getter_; |
242 scoped_ptr<SettingGetter> setting_getter_; | 253 scoped_ptr<SettingGetter> setting_getter_; |
243 | 254 |
| 255 // Has initialization completed and it's safe to read cached_config_. |
| 256 bool finished_initialization_; |
| 257 |
244 // Cached proxy configuration, to be returned by | 258 // Cached proxy configuration, to be returned by |
245 // GetLatestProxyConfig. Initially populated from the UI thread, but | 259 // GetLatestProxyConfig. Only accessed from the IO thread. |
246 // afterwards only accessed from the IO thread. | |
247 ProxyConfig cached_config_; | 260 ProxyConfig cached_config_; |
248 | 261 |
249 // A copy kept on the UI thread of the last seen proxy config, so as | 262 // A copy kept on the UI thread of the last seen proxy config, so as |
250 // to avoid posting a call to SetNewProxyConfig when we get a | 263 // to avoid posting a call to SetNewProxyConfig when we get a |
251 // notification but the config has not actually changed. | 264 // notification but the config has not actually changed. |
252 ProxyConfig reference_config_; | 265 ProxyConfig reference_config_; |
253 | 266 |
254 // The task runner for the glib thread, aka main browser thread. This thread | 267 // The task runner for the glib thread, aka main browser thread. This thread |
255 // is where we run the glib main loop (see base/message_pump_glib.h). It is | 268 // is where we run the glib main loop (see base/message_pump_glib.h). It is |
256 // the glib default loop in the sense that it runs the glib default context: | 269 // the glib default loop in the sense that it runs the glib default context: |
257 // as in the context where sources are added by g_timeout_add and | 270 // as in the context where sources are added by g_timeout_add and |
258 // g_idle_add, and returned by g_main_context_default. gconf uses glib | 271 // g_idle_add, and returned by g_main_context_default. gconf uses glib |
259 // timeouts and idles and possibly other callbacks that will all be | 272 // timeouts and idles and possibly other callbacks that will all be |
260 // dispatched on this thread. Since gconf is not thread safe, any use of | 273 // dispatched on this thread. Since gconf is not thread safe, any use of |
261 // gconf must be done on the thread running this loop. | 274 // gconf must be done on the thread running this loop. |
262 scoped_refptr<base::SingleThreadTaskRunner> glib_thread_task_runner_; | 275 scoped_refptr<base::SingleThreadTaskRunner> glib_thread_task_runner_; |
263 // Task runner for the IO thread. GetLatestProxyConfig() is called from | 276 // Task runner for the IO thread. GetLatestProxyConfig() is called from |
264 // the thread running this loop. | 277 // the thread running this loop. |
265 scoped_refptr<base::SingleThreadTaskRunner> io_thread_task_runner_; | 278 scoped_refptr<base::SingleThreadTaskRunner> io_thread_task_runner_; |
266 | 279 |
267 ObserverList<Observer> observers_; | 280 ObserverList<Observer> observers_; |
268 | 281 |
269 DISALLOW_COPY_AND_ASSIGN(Delegate); | 282 DISALLOW_COPY_AND_ASSIGN(Delegate); |
270 }; | 283 }; |
271 | 284 |
272 // Thin wrapper shell around Delegate. | 285 // Thin wrapper shell around Delegate. |
273 | 286 |
274 // Usual constructor | 287 // Usual constructor |
275 ProxyConfigServiceLinux(); | 288 ProxyConfigServiceLinux( |
| 289 base::SingleThreadTaskRunner* glib_thread_task_runner, |
| 290 base::SingleThreadTaskRunner* io_thread_task_runner, |
| 291 MessageLoopForIO* file_loop); |
276 // For testing: take alternate setting and env var getter implementations. | 292 // For testing: take alternate setting and env var getter implementations. |
277 explicit ProxyConfigServiceLinux(base::Environment* env_var_getter); | 293 explicit ProxyConfigServiceLinux(base::Environment* env_var_getter); |
278 ProxyConfigServiceLinux(base::Environment* env_var_getter, | 294 ProxyConfigServiceLinux(base::Environment* env_var_getter, |
279 SettingGetter* setting_getter); | 295 SettingGetter* setting_getter); |
280 | 296 |
281 virtual ~ProxyConfigServiceLinux(); | 297 virtual ~ProxyConfigServiceLinux(); |
282 | 298 |
| 299 // This is only public for testing. |
283 void SetupAndFetchInitialConfig( | 300 void SetupAndFetchInitialConfig( |
284 base::SingleThreadTaskRunner* glib_thread_task_runner, | 301 base::SingleThreadTaskRunner* glib_thread_task_runner, |
285 base::SingleThreadTaskRunner* io_thread_task_runner, | 302 base::SingleThreadTaskRunner* io_thread_task_runner, |
286 MessageLoopForIO* file_loop) { | 303 MessageLoopForIO* file_loop) { |
287 delegate_->SetUpAndFetchInitialConfig(glib_thread_task_runner, | 304 delegate_->SetUpAndFetchInitialConfig(glib_thread_task_runner, |
288 io_thread_task_runner, file_loop); | 305 io_thread_task_runner, file_loop); |
289 } | 306 } |
290 void OnCheckProxyConfigSettings() { | 307 void OnCheckProxyConfigSettings() { |
291 delegate_->OnCheckProxyConfigSettings(); | 308 delegate_->OnCheckProxyConfigSettings(); |
292 } | 309 } |
293 | 310 |
294 // ProxyConfigService methods: | 311 // ProxyConfigService methods: |
295 // Called from IO thread. | 312 // Called from IO thread. |
296 virtual void AddObserver(Observer* observer) OVERRIDE; | 313 virtual void AddObserver(Observer* observer) OVERRIDE; |
297 virtual void RemoveObserver(Observer* observer) OVERRIDE; | 314 virtual void RemoveObserver(Observer* observer) OVERRIDE; |
298 virtual ProxyConfigService::ConfigAvailability GetLatestProxyConfig( | 315 virtual ProxyConfigService::ConfigAvailability GetLatestProxyConfig( |
299 ProxyConfig* config) OVERRIDE; | 316 ProxyConfig* config) OVERRIDE; |
300 | 317 // Called from Glib thread. |
| 318 virtual void StartTearDown() OVERRIDE; |
301 private: | 319 private: |
302 scoped_refptr<Delegate> delegate_; | 320 scoped_refptr<Delegate> delegate_; |
303 | 321 |
304 DISALLOW_COPY_AND_ASSIGN(ProxyConfigServiceLinux); | 322 DISALLOW_COPY_AND_ASSIGN(ProxyConfigServiceLinux); |
305 }; | 323 }; |
306 | 324 |
307 } // namespace net | 325 } // namespace net |
308 | 326 |
309 #endif // NET_PROXY_PROXY_CONFIG_SERVICE_LINUX_H_ | 327 #endif // NET_PROXY_PROXY_CONFIG_SERVICE_LINUX_H_ |
OLD | NEW |