| 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 #include "net/proxy/proxy_config_service_linux.h" | 5 #include "net/proxy/proxy_config_service_linux.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 #if defined(USE_GCONF) | 8 #if defined(USE_GCONF) |
| 9 #include <gconf/gconf-client.h> | 9 #include <gconf/gconf-client.h> |
| 10 #endif // defined(USE_GCONF) | 10 #endif // defined(USE_GCONF) |
| 11 #include <limits.h> | 11 #include <limits.h> |
| 12 #include <stdio.h> | 12 #include <stdio.h> |
| 13 #include <stdlib.h> | 13 #include <stdlib.h> |
| 14 #include <sys/inotify.h> | 14 #include <sys/inotify.h> |
| 15 #include <unistd.h> | 15 #include <unistd.h> |
| 16 | 16 |
| 17 #include <map> | 17 #include <map> |
| 18 #include <utility> |
| 18 | 19 |
| 19 #include "base/bind.h" | 20 #include "base/bind.h" |
| 20 #include "base/compiler_specific.h" | 21 #include "base/compiler_specific.h" |
| 21 #include "base/debug/leak_annotations.h" | 22 #include "base/debug/leak_annotations.h" |
| 22 #include "base/files/file_path.h" | 23 #include "base/files/file_path.h" |
| 23 #include "base/files/file_util.h" | 24 #include "base/files/file_util.h" |
| 24 #include "base/files/scoped_file.h" | 25 #include "base/files/scoped_file.h" |
| 25 #include "base/logging.h" | 26 #include "base/logging.h" |
| 26 #include "base/macros.h" | 27 #include "base/macros.h" |
| 27 #include "base/message_loop/message_loop.h" | 28 #include "base/message_loop/message_loop.h" |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 host.resize(host.length() - 1); | 88 host.resize(host.length() - 1); |
| 88 return host; | 89 return host; |
| 89 } | 90 } |
| 90 | 91 |
| 91 } // namespace | 92 } // namespace |
| 92 | 93 |
| 93 ProxyConfigServiceLinux::Delegate::~Delegate() { | 94 ProxyConfigServiceLinux::Delegate::~Delegate() { |
| 94 } | 95 } |
| 95 | 96 |
| 96 bool ProxyConfigServiceLinux::Delegate::GetProxyFromEnvVarForScheme( | 97 bool ProxyConfigServiceLinux::Delegate::GetProxyFromEnvVarForScheme( |
| 97 const char* variable, ProxyServer::Scheme scheme, | 98 base::StringPiece variable, |
| 99 ProxyServer::Scheme scheme, |
| 98 ProxyServer* result_server) { | 100 ProxyServer* result_server) { |
| 99 std::string env_value; | 101 std::string env_value; |
| 100 if (env_var_getter_->GetVar(variable, &env_value)) { | 102 if (!env_var_getter_->GetVar(variable, &env_value)) |
| 101 if (!env_value.empty()) { | 103 return false; |
| 102 env_value = FixupProxyHostScheme(scheme, env_value); | 104 |
| 103 ProxyServer proxy_server = | 105 if (env_value.empty()) |
| 104 ProxyServer::FromURI(env_value, ProxyServer::SCHEME_HTTP); | 106 return false; |
| 105 if (proxy_server.is_valid() && !proxy_server.is_direct()) { | 107 |
| 106 *result_server = proxy_server; | 108 env_value = FixupProxyHostScheme(scheme, env_value); |
| 107 return true; | 109 ProxyServer proxy_server = |
| 108 } else { | 110 ProxyServer::FromURI(env_value, ProxyServer::SCHEME_HTTP); |
| 109 LOG(ERROR) << "Failed to parse environment variable " << variable; | 111 if (proxy_server.is_valid() && !proxy_server.is_direct()) { |
| 110 } | 112 *result_server = proxy_server; |
| 111 } | 113 return true; |
| 112 } | 114 } |
| 115 LOG(ERROR) << "Failed to parse environment variable " << variable; |
| 113 return false; | 116 return false; |
| 114 } | 117 } |
| 115 | 118 |
| 116 bool ProxyConfigServiceLinux::Delegate::GetProxyFromEnvVar( | 119 bool ProxyConfigServiceLinux::Delegate::GetProxyFromEnvVar( |
| 117 const char* variable, ProxyServer* result_server) { | 120 base::StringPiece variable, |
| 121 ProxyServer* result_server) { |
| 118 return GetProxyFromEnvVarForScheme(variable, ProxyServer::SCHEME_HTTP, | 122 return GetProxyFromEnvVarForScheme(variable, ProxyServer::SCHEME_HTTP, |
| 119 result_server); | 123 result_server); |
| 120 } | 124 } |
| 121 | 125 |
| 122 bool ProxyConfigServiceLinux::Delegate::GetConfigFromEnv(ProxyConfig* config) { | 126 bool ProxyConfigServiceLinux::Delegate::GetConfigFromEnv(ProxyConfig* config) { |
| 123 // Check for automatic configuration first, in | 127 // Check for automatic configuration first, in |
| 124 // "auto_proxy". Possibly only the "environment_proxy" firefox | 128 // "auto_proxy". Possibly only the "environment_proxy" firefox |
| 125 // extension has ever used this, but it still sounds like a good | 129 // extension has ever used this, but it still sounds like a good |
| 126 // idea. | 130 // idea. |
| 127 std::string auto_proxy; | 131 std::string auto_proxy; |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 | 199 |
| 196 namespace { | 200 namespace { |
| 197 | 201 |
| 198 const int kDebounceTimeoutMilliseconds = 250; | 202 const int kDebounceTimeoutMilliseconds = 250; |
| 199 | 203 |
| 200 #if defined(USE_GCONF) | 204 #if defined(USE_GCONF) |
| 201 // This setting getter uses gconf, as used in GNOME 2 and some GNOME 3 desktops. | 205 // This setting getter uses gconf, as used in GNOME 2 and some GNOME 3 desktops. |
| 202 class SettingGetterImplGConf : public ProxyConfigServiceLinux::SettingGetter { | 206 class SettingGetterImplGConf : public ProxyConfigServiceLinux::SettingGetter { |
| 203 public: | 207 public: |
| 204 SettingGetterImplGConf() | 208 SettingGetterImplGConf() |
| 205 : client_(NULL), | 209 : client_(nullptr), |
| 206 system_proxy_id_(0), | 210 system_proxy_id_(0), |
| 207 system_http_proxy_id_(0), | 211 system_http_proxy_id_(0), |
| 208 notify_delegate_(NULL), | 212 notify_delegate_(nullptr), |
| 209 debounce_timer_(new base::OneShotTimer()) {} | 213 debounce_timer_(new base::OneShotTimer()) {} |
| 210 | 214 |
| 211 ~SettingGetterImplGConf() override { | 215 ~SettingGetterImplGConf() override { |
| 212 // client_ should have been released before now, from | 216 // client_ should have been released before now, from |
| 213 // Delegate::OnDestroy(), while running on the UI thread. However | 217 // Delegate::OnDestroy(), while running on the UI thread. However |
| 214 // on exiting the process, it may happen that Delegate::OnDestroy() | 218 // on exiting the process, it may happen that Delegate::OnDestroy() |
| 215 // task is left pending on the glib loop after the loop was quit, | 219 // task is left pending on the glib loop after the loop was quit, |
| 216 // and pending tasks may then be deleted without being run. | 220 // and pending tasks may then be deleted without being run. |
| 217 if (client_) { | 221 if (client_) { |
| 218 // gconf client was not cleaned up. | 222 // gconf client was not cleaned up. |
| (...skipping 20 matching lines...) Expand all Loading... |
| 239 override { | 243 override { |
| 240 DCHECK(glib_task_runner->BelongsToCurrentThread()); | 244 DCHECK(glib_task_runner->BelongsToCurrentThread()); |
| 241 DCHECK(!client_); | 245 DCHECK(!client_); |
| 242 DCHECK(!task_runner_.get()); | 246 DCHECK(!task_runner_.get()); |
| 243 task_runner_ = glib_task_runner; | 247 task_runner_ = glib_task_runner; |
| 244 | 248 |
| 245 client_ = gconf_client_get_default(); | 249 client_ = gconf_client_get_default(); |
| 246 if (!client_) { | 250 if (!client_) { |
| 247 // It's not clear whether/when this can return NULL. | 251 // It's not clear whether/when this can return NULL. |
| 248 LOG(ERROR) << "Unable to create a gconf client"; | 252 LOG(ERROR) << "Unable to create a gconf client"; |
| 249 task_runner_ = NULL; | 253 task_runner_ = nullptr; |
| 250 return false; | 254 return false; |
| 251 } | 255 } |
| 252 GError* error = NULL; | 256 GError* error = nullptr; |
| 253 bool added_system_proxy = false; | 257 bool added_system_proxy = false; |
| 254 // We need to add the directories for which we'll be asking | 258 // We need to add the directories for which we'll be asking |
| 255 // for notifications, and we might as well ask to preload them. | 259 // for notifications, and we might as well ask to preload them. |
| 256 // These need to be removed again in ShutDown(); we are careful | 260 // These need to be removed again in ShutDown(); we are careful |
| 257 // here to only leave client_ non-NULL if both have been added. | 261 // here to only leave client_ non-NULL if both have been added. |
| 258 gconf_client_add_dir(client_, "/system/proxy", | 262 gconf_client_add_dir(client_, "/system/proxy", |
| 259 GCONF_CLIENT_PRELOAD_ONELEVEL, &error); | 263 GCONF_CLIENT_PRELOAD_ONELEVEL, &error); |
| 260 if (error == NULL) { | 264 if (!error) { |
| 261 added_system_proxy = true; | 265 added_system_proxy = true; |
| 262 gconf_client_add_dir(client_, "/system/http_proxy", | 266 gconf_client_add_dir(client_, "/system/http_proxy", |
| 263 GCONF_CLIENT_PRELOAD_ONELEVEL, &error); | 267 GCONF_CLIENT_PRELOAD_ONELEVEL, &error); |
| 264 } | 268 } |
| 265 if (error != NULL) { | 269 if (!error) |
| 266 LOG(ERROR) << "Error requesting gconf directory: " << error->message; | 270 return true; |
| 267 g_error_free(error); | 271 |
| 268 if (added_system_proxy) | 272 LOG(ERROR) << "Error requesting gconf directory: " << error->message; |
| 269 gconf_client_remove_dir(client_, "/system/proxy", NULL); | 273 g_error_free(error); |
| 270 g_object_unref(client_); | 274 if (added_system_proxy) |
| 271 client_ = NULL; | 275 gconf_client_remove_dir(client_, "/system/proxy", nullptr); |
| 272 task_runner_ = NULL; | 276 g_object_unref(client_); |
| 273 return false; | 277 client_ = nullptr; |
| 274 } | 278 task_runner_ = nullptr; |
| 275 return true; | 279 return false; |
| 276 } | 280 } |
| 277 | 281 |
| 278 void ShutDown() override { | 282 void ShutDown() override { |
| 279 if (client_) { | 283 if (client_) { |
| 280 DCHECK(task_runner_->BelongsToCurrentThread()); | 284 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 281 // We must explicitly disable gconf notifications here, because the gconf | 285 // We must explicitly disable gconf notifications here, because the gconf |
| 282 // client will be shared between all setting getters, and they do not all | 286 // client will be shared between all setting getters, and they do not all |
| 283 // have the same lifetimes. (For instance, incognito sessions get their | 287 // have the same lifetimes. (For instance, incognito sessions get their |
| 284 // own, which is destroyed when the session ends.) | 288 // own, which is destroyed when the session ends.) |
| 285 gconf_client_notify_remove(client_, system_http_proxy_id_); | 289 gconf_client_notify_remove(client_, system_http_proxy_id_); |
| 286 gconf_client_notify_remove(client_, system_proxy_id_); | 290 gconf_client_notify_remove(client_, system_proxy_id_); |
| 287 gconf_client_remove_dir(client_, "/system/http_proxy", NULL); | 291 gconf_client_remove_dir(client_, "/system/http_proxy", nullptr); |
| 288 gconf_client_remove_dir(client_, "/system/proxy", NULL); | 292 gconf_client_remove_dir(client_, "/system/proxy", nullptr); |
| 289 g_object_unref(client_); | 293 g_object_unref(client_); |
| 290 client_ = NULL; | 294 client_ = nullptr; |
| 291 task_runner_ = NULL; | 295 task_runner_ = nullptr; |
| 292 } | 296 } |
| 293 debounce_timer_.reset(); | 297 debounce_timer_.reset(); |
| 294 } | 298 } |
| 295 | 299 |
| 296 bool SetUpNotifications( | 300 bool SetUpNotifications( |
| 297 ProxyConfigServiceLinux::Delegate* delegate) override { | 301 ProxyConfigServiceLinux::Delegate* delegate) override { |
| 298 DCHECK(client_); | 302 DCHECK(client_); |
| 299 DCHECK(task_runner_->BelongsToCurrentThread()); | 303 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 300 GError* error = NULL; | 304 GError* error = nullptr; |
| 301 notify_delegate_ = delegate; | 305 notify_delegate_ = delegate; |
| 302 // We have to keep track of the IDs returned by gconf_client_notify_add() so | 306 // We have to keep track of the IDs returned by gconf_client_notify_add() so |
| 303 // that we can remove them in ShutDown(). (Otherwise, notifications will be | 307 // that we can remove them in ShutDown(). (Otherwise, notifications will be |
| 304 // delivered to this object after it is deleted, which is bad, m'kay?) | 308 // delivered to this object after it is deleted, which is bad, m'kay?) |
| 305 system_proxy_id_ = gconf_client_notify_add( | 309 system_proxy_id_ = gconf_client_notify_add(client_, "/system/proxy", |
| 306 client_, "/system/proxy", | 310 OnGConfChangeNotification, this, |
| 307 OnGConfChangeNotification, this, | 311 nullptr, &error); |
| 308 NULL, &error); | 312 if (!error) { |
| 309 if (error == NULL) { | |
| 310 system_http_proxy_id_ = gconf_client_notify_add( | 313 system_http_proxy_id_ = gconf_client_notify_add( |
| 311 client_, "/system/http_proxy", | 314 client_, "/system/http_proxy", OnGConfChangeNotification, this, |
| 312 OnGConfChangeNotification, this, | 315 nullptr, &error); |
| 313 NULL, &error); | |
| 314 } | 316 } |
| 315 if (error != NULL) { | 317 if (!error) { |
| 316 LOG(ERROR) << "Error requesting gconf notifications: " << error->message; | 318 // Simulate a change to avoid possibly losing updates before this point. |
| 317 g_error_free(error); | 319 OnChangeNotification(); |
| 318 ShutDown(); | 320 return true; |
| 319 return false; | |
| 320 } | 321 } |
| 321 // Simulate a change to avoid possibly losing updates before this point. | 322 |
| 322 OnChangeNotification(); | 323 LOG(ERROR) << "Error requesting gconf notifications: " << error->message; |
| 323 return true; | 324 g_error_free(error); |
| 325 ShutDown(); |
| 326 return false; |
| 324 } | 327 } |
| 325 | 328 |
| 326 const scoped_refptr<base::SingleThreadTaskRunner>& GetNotificationTaskRunner() | 329 const scoped_refptr<base::SingleThreadTaskRunner>& GetNotificationTaskRunner() |
| 327 override { | 330 override { |
| 328 return task_runner_; | 331 return task_runner_; |
| 329 } | 332 } |
| 330 | 333 |
| 331 ProxyConfigSource GetConfigSource() override { | 334 ProxyConfigSource GetConfigSource() override { |
| 332 return PROXY_CONFIG_SOURCE_GCONF; | 335 return PROXY_CONFIG_SOURCE_GCONF; |
| 333 } | 336 } |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 } | 386 } |
| 384 | 387 |
| 385 bool BypassListIsReversed() override { | 388 bool BypassListIsReversed() override { |
| 386 // This is a KDE-specific setting. | 389 // This is a KDE-specific setting. |
| 387 return false; | 390 return false; |
| 388 } | 391 } |
| 389 | 392 |
| 390 bool MatchHostsUsingSuffixMatching() override { return false; } | 393 bool MatchHostsUsingSuffixMatching() override { return false; } |
| 391 | 394 |
| 392 private: | 395 private: |
| 393 bool GetStringByPath(const char* key, std::string* result) { | 396 bool GetStringByPath(base::StringPiece key, std::string* result) { |
| 394 DCHECK(client_); | 397 DCHECK(client_); |
| 395 DCHECK(task_runner_->BelongsToCurrentThread()); | 398 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 396 GError* error = NULL; | 399 GError* error = nullptr; |
| 397 gchar* value = gconf_client_get_string(client_, key, &error); | 400 gchar* value = gconf_client_get_string(client_, key.data(), &error); |
| 398 if (HandleGError(error, key)) | 401 if (HandleGError(error, key.data())) |
| 399 return false; | 402 return false; |
| 400 if (!value) | 403 if (!value) |
| 401 return false; | 404 return false; |
| 402 *result = value; | 405 *result = value; |
| 403 g_free(value); | 406 g_free(value); |
| 404 return true; | 407 return true; |
| 405 } | 408 } |
| 406 bool GetBoolByPath(const char* key, bool* result) { | 409 bool GetBoolByPath(base::StringPiece key, bool* result) { |
| 407 DCHECK(client_); | 410 DCHECK(client_); |
| 408 DCHECK(task_runner_->BelongsToCurrentThread()); | 411 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 409 GError* error = NULL; | 412 GError* error = nullptr; |
| 410 // We want to distinguish unset values from values defaulting to | 413 // We want to distinguish unset values from values defaulting to |
| 411 // false. For that we need to use the type-generic | 414 // false. For that we need to use the type-generic |
| 412 // gconf_client_get() rather than gconf_client_get_bool(). | 415 // gconf_client_get() rather than gconf_client_get_bool(). |
| 413 GConfValue* gconf_value = gconf_client_get(client_, key, &error); | 416 GConfValue* gconf_value = gconf_client_get(client_, key.data(), &error); |
| 414 if (HandleGError(error, key)) | 417 if (HandleGError(error, key.data())) |
| 415 return false; | 418 return false; |
| 416 if (!gconf_value) { | 419 if (!gconf_value) { |
| 417 // Unset. | 420 // Unset. |
| 418 return false; | 421 return false; |
| 419 } | 422 } |
| 420 if (gconf_value->type != GCONF_VALUE_BOOL) { | 423 if (gconf_value->type != GCONF_VALUE_BOOL) { |
| 421 gconf_value_free(gconf_value); | 424 gconf_value_free(gconf_value); |
| 422 return false; | 425 return false; |
| 423 } | 426 } |
| 424 gboolean bool_value = gconf_value_get_bool(gconf_value); | 427 gboolean bool_value = gconf_value_get_bool(gconf_value); |
| 425 *result = static_cast<bool>(bool_value); | 428 *result = static_cast<bool>(bool_value); |
| 426 gconf_value_free(gconf_value); | 429 gconf_value_free(gconf_value); |
| 427 return true; | 430 return true; |
| 428 } | 431 } |
| 429 bool GetIntByPath(const char* key, int* result) { | 432 bool GetIntByPath(base::StringPiece key, int* result) { |
| 430 DCHECK(client_); | 433 DCHECK(client_); |
| 431 DCHECK(task_runner_->BelongsToCurrentThread()); | 434 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 432 GError* error = NULL; | 435 GError* error = nullptr; |
| 433 int value = gconf_client_get_int(client_, key, &error); | 436 int value = gconf_client_get_int(client_, key.data(), &error); |
| 434 if (HandleGError(error, key)) | 437 if (HandleGError(error, key.data())) |
| 435 return false; | 438 return false; |
| 436 // We don't bother to distinguish an unset value because callers | 439 // We don't bother to distinguish an unset value because callers |
| 437 // don't care. 0 is returned if unset. | 440 // don't care. 0 is returned if unset. |
| 438 *result = value; | 441 *result = value; |
| 439 return true; | 442 return true; |
| 440 } | 443 } |
| 441 bool GetStringListByPath(const char* key, std::vector<std::string>* result) { | 444 bool GetStringListByPath(base::StringPiece key, |
| 445 std::vector<std::string>* result) { |
| 442 DCHECK(client_); | 446 DCHECK(client_); |
| 443 DCHECK(task_runner_->BelongsToCurrentThread()); | 447 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 444 GError* error = NULL; | 448 GError* error = nullptr; |
| 445 GSList* list = gconf_client_get_list(client_, key, | 449 GSList* list = |
| 446 GCONF_VALUE_STRING, &error); | 450 gconf_client_get_list(client_, key.data(), GCONF_VALUE_STRING, &error); |
| 447 if (HandleGError(error, key)) | 451 if (HandleGError(error, key.data())) |
| 448 return false; | 452 return false; |
| 449 if (!list) | 453 if (!list) |
| 450 return false; | 454 return false; |
| 451 for (GSList *it = list; it; it = it->next) { | 455 for (GSList *it = list; it; it = it->next) { |
| 452 result->push_back(static_cast<char*>(it->data)); | 456 result->push_back(static_cast<char*>(it->data)); |
| 453 g_free(it->data); | 457 g_free(it->data); |
| 454 } | 458 } |
| 455 g_slist_free(list); | 459 g_slist_free(list); |
| 456 return true; | 460 return true; |
| 457 } | 461 } |
| 458 | 462 |
| 459 // Logs and frees a glib error. Returns false if there was no error | 463 // Logs and frees a glib error. Returns false if there was no error |
| 460 // (error is NULL). | 464 // (error is NULL). |
| 461 bool HandleGError(GError* error, const char* key) { | 465 bool HandleGError(GError* error, base::StringPiece key) { |
| 462 if (error != NULL) { | 466 if (!error) |
| 463 LOG(ERROR) << "Error getting gconf value for " << key | 467 return false; |
| 464 << ": " << error->message; | 468 |
| 465 g_error_free(error); | 469 LOG(ERROR) << "Error getting gconf value for " << key << ": " |
| 466 return true; | 470 << error->message; |
| 467 } | 471 g_error_free(error); |
| 468 return false; | 472 return true; |
| 469 } | 473 } |
| 470 | 474 |
| 471 // This is the callback from the debounce timer. | 475 // This is the callback from the debounce timer. |
| 472 void OnDebouncedNotification() { | 476 void OnDebouncedNotification() { |
| 473 DCHECK(task_runner_->BelongsToCurrentThread()); | 477 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 474 CHECK(notify_delegate_); | 478 CHECK(notify_delegate_); |
| 475 // Forward to a method on the proxy config service delegate object. | 479 // Forward to a method on the proxy config service delegate object. |
| 476 notify_delegate_->OnCheckProxyConfigSettings(); | 480 notify_delegate_->OnCheckProxyConfigSettings(); |
| 477 } | 481 } |
| 478 | 482 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 515 #endif // defined(USE_GCONF) | 519 #endif // defined(USE_GCONF) |
| 516 | 520 |
| 517 #if defined(USE_GIO) | 521 #if defined(USE_GIO) |
| 518 const char kProxyGConfSchema[] = "org.gnome.system.proxy"; | 522 const char kProxyGConfSchema[] = "org.gnome.system.proxy"; |
| 519 | 523 |
| 520 // This setting getter uses gsettings, as used in most GNOME 3 desktops. | 524 // This setting getter uses gsettings, as used in most GNOME 3 desktops. |
| 521 class SettingGetterImplGSettings | 525 class SettingGetterImplGSettings |
| 522 : public ProxyConfigServiceLinux::SettingGetter { | 526 : public ProxyConfigServiceLinux::SettingGetter { |
| 523 public: | 527 public: |
| 524 SettingGetterImplGSettings() | 528 SettingGetterImplGSettings() |
| 525 : client_(NULL), | 529 : client_(nullptr), |
| 526 http_client_(NULL), | 530 http_client_(nullptr), |
| 527 https_client_(NULL), | 531 https_client_(nullptr), |
| 528 ftp_client_(NULL), | 532 ftp_client_(nullptr), |
| 529 socks_client_(NULL), | 533 socks_client_(nullptr), |
| 530 notify_delegate_(NULL), | 534 notify_delegate_(nullptr), |
| 531 debounce_timer_(new base::OneShotTimer()) {} | 535 debounce_timer_(new base::OneShotTimer()) {} |
| 532 | 536 |
| 533 ~SettingGetterImplGSettings() override { | 537 ~SettingGetterImplGSettings() override { |
| 534 // client_ should have been released before now, from | 538 // client_ should have been released before now, from |
| 535 // Delegate::OnDestroy(), while running on the UI thread. However | 539 // Delegate::OnDestroy(), while running on the UI thread. However |
| 536 // on exiting the process, it may happen that | 540 // on exiting the process, it may happen that |
| 537 // Delegate::OnDestroy() task is left pending on the glib loop | 541 // Delegate::OnDestroy() task is left pending on the glib loop |
| 538 // after the loop was quit, and pending tasks may then be deleted | 542 // after the loop was quit, and pending tasks may then be deleted |
| 539 // without being run. | 543 // without being run. |
| 540 if (client_) { | 544 if (client_) { |
| 541 // gconf client was not cleaned up. | 545 // gconf client was not cleaned up. |
| 542 if (task_runner_->BelongsToCurrentThread()) { | 546 if (task_runner_->BelongsToCurrentThread()) { |
| 543 // We are on the UI thread so we can clean it safely. This is | 547 // We are on the UI thread so we can clean it safely. This is |
| 544 // the case at least for ui_tests running under Valgrind in | 548 // the case at least for ui_tests running under Valgrind in |
| 545 // bug 16076. | 549 // bug 16076. |
| 546 VLOG(1) << "~SettingGetterImplGSettings: releasing gsettings client"; | 550 VLOG(1) << "~SettingGetterImplGSettings: releasing gsettings client"; |
| 547 ShutDown(); | 551 ShutDown(); |
| 548 } else { | 552 } else { |
| 549 LOG(WARNING) << "~SettingGetterImplGSettings: leaking gsettings client"; | 553 LOG(WARNING) << "~SettingGetterImplGSettings: leaking gsettings client"; |
| 550 client_ = NULL; | 554 client_ = nullptr; |
| 551 } | 555 } |
| 552 } | 556 } |
| 553 DCHECK(!client_); | 557 DCHECK(!client_); |
| 554 } | 558 } |
| 555 | 559 |
| 556 bool SchemaExists(const char* schema_name) { | 560 bool SchemaExists(base::StringPiece schema_name) { |
| 557 const gchar* const* schemas = libgio_loader_.g_settings_list_schemas(); | 561 const gchar* const* schemas = libgio_loader_.g_settings_list_schemas(); |
| 558 while (*schemas) { | 562 while (*schemas) { |
| 559 if (strcmp(schema_name, static_cast<const char*>(*schemas)) == 0) | 563 if (!strcmp(schema_name.data(), static_cast<const char*>(*schemas))) |
| 560 return true; | 564 return true; |
| 561 schemas++; | 565 schemas++; |
| 562 } | 566 } |
| 563 return false; | 567 return false; |
| 564 } | 568 } |
| 565 | 569 |
| 566 // LoadAndCheckVersion() must be called *before* Init()! | 570 // LoadAndCheckVersion() must be called *before* Init()! |
| 567 bool LoadAndCheckVersion(base::Environment* env); | 571 bool LoadAndCheckVersion(base::Environment* env); |
| 568 | 572 |
| 569 bool Init(const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner, | 573 bool Init(const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner, |
| (...skipping 22 matching lines...) Expand all Loading... |
| 592 void ShutDown() override { | 596 void ShutDown() override { |
| 593 if (client_) { | 597 if (client_) { |
| 594 DCHECK(task_runner_->BelongsToCurrentThread()); | 598 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 595 // This also disables gsettings notifications. | 599 // This also disables gsettings notifications. |
| 596 g_object_unref(socks_client_); | 600 g_object_unref(socks_client_); |
| 597 g_object_unref(ftp_client_); | 601 g_object_unref(ftp_client_); |
| 598 g_object_unref(https_client_); | 602 g_object_unref(https_client_); |
| 599 g_object_unref(http_client_); | 603 g_object_unref(http_client_); |
| 600 g_object_unref(client_); | 604 g_object_unref(client_); |
| 601 // We only need to null client_ because it's the only one that we check. | 605 // We only need to null client_ because it's the only one that we check. |
| 602 client_ = NULL; | 606 client_ = nullptr; |
| 603 task_runner_ = NULL; | 607 task_runner_ = nullptr; |
| 604 } | 608 } |
| 605 debounce_timer_.reset(); | 609 debounce_timer_.reset(); |
| 606 } | 610 } |
| 607 | 611 |
| 608 bool SetUpNotifications( | 612 bool SetUpNotifications( |
| 609 ProxyConfigServiceLinux::Delegate* delegate) override { | 613 ProxyConfigServiceLinux::Delegate* delegate) override { |
| 610 DCHECK(client_); | 614 DCHECK(client_); |
| 611 DCHECK(task_runner_->BelongsToCurrentThread()); | 615 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 612 notify_delegate_ = delegate; | 616 notify_delegate_ = delegate; |
| 613 // We could watch for the change-event signal instead of changed, but | 617 // We could watch for the change-event signal instead of changed, but |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 698 } | 702 } |
| 699 | 703 |
| 700 bool BypassListIsReversed() override { | 704 bool BypassListIsReversed() override { |
| 701 // This is a KDE-specific setting. | 705 // This is a KDE-specific setting. |
| 702 return false; | 706 return false; |
| 703 } | 707 } |
| 704 | 708 |
| 705 bool MatchHostsUsingSuffixMatching() override { return false; } | 709 bool MatchHostsUsingSuffixMatching() override { return false; } |
| 706 | 710 |
| 707 private: | 711 private: |
| 708 bool GetStringByPath(GSettings* client, const char* key, | 712 bool GetStringByPath(GSettings* client, |
| 713 base::StringPiece key, |
| 709 std::string* result) { | 714 std::string* result) { |
| 710 DCHECK(task_runner_->BelongsToCurrentThread()); | 715 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 711 gchar* value = libgio_loader_.g_settings_get_string(client, key); | 716 gchar* value = libgio_loader_.g_settings_get_string(client, key.data()); |
| 712 if (!value) | 717 if (!value) |
| 713 return false; | 718 return false; |
| 714 *result = value; | 719 *result = value; |
| 715 g_free(value); | 720 g_free(value); |
| 716 return true; | 721 return true; |
| 717 } | 722 } |
| 718 bool GetBoolByPath(GSettings* client, const char* key, bool* result) { | 723 bool GetBoolByPath(GSettings* client, base::StringPiece key, bool* result) { |
| 719 DCHECK(task_runner_->BelongsToCurrentThread()); | 724 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 720 *result = static_cast<bool>( | 725 *result = static_cast<bool>( |
| 721 libgio_loader_.g_settings_get_boolean(client, key)); | 726 libgio_loader_.g_settings_get_boolean(client, key.data())); |
| 722 return true; | 727 return true; |
| 723 } | 728 } |
| 724 bool GetIntByPath(GSettings* client, const char* key, int* result) { | 729 bool GetIntByPath(GSettings* client, base::StringPiece key, int* result) { |
| 725 DCHECK(task_runner_->BelongsToCurrentThread()); | 730 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 726 *result = libgio_loader_.g_settings_get_int(client, key); | 731 *result = libgio_loader_.g_settings_get_int(client, key.data()); |
| 727 return true; | 732 return true; |
| 728 } | 733 } |
| 729 bool GetStringListByPath(GSettings* client, const char* key, | 734 bool GetStringListByPath(GSettings* client, |
| 735 base::StringPiece key, |
| 730 std::vector<std::string>* result) { | 736 std::vector<std::string>* result) { |
| 731 DCHECK(task_runner_->BelongsToCurrentThread()); | 737 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 732 gchar** list = libgio_loader_.g_settings_get_strv(client, key); | 738 gchar** list = libgio_loader_.g_settings_get_strv(client, key.data()); |
| 733 if (!list) | 739 if (!list) |
| 734 return false; | 740 return false; |
| 735 for (size_t i = 0; list[i]; ++i) { | 741 for (size_t i = 0; list[i]; ++i) { |
| 736 result->push_back(static_cast<char*>(list[i])); | 742 result->push_back(static_cast<char*>(list[i])); |
| 737 g_free(list[i]); | 743 g_free(list[i]); |
| 738 } | 744 } |
| 739 g_free(list); | 745 g_free(list); |
| 740 return true; | 746 return true; |
| 741 } | 747 } |
| 742 | 748 |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 814 } | 820 } |
| 815 | 821 |
| 816 // g_type_init will be deprecated in 2.36. 2.35 is the development | 822 // g_type_init will be deprecated in 2.36. 2.35 is the development |
| 817 // version for 2.36, hence do not call g_type_init starting 2.35. | 823 // version for 2.36, hence do not call g_type_init starting 2.35. |
| 818 // http://developer.gnome.org/gobject/unstable/gobject-Type-Information.html
#g-type-init | 824 // http://developer.gnome.org/gobject/unstable/gobject-Type-Information.html
#g-type-init |
| 819 if (libgio_loader_.glib_check_version(2, 35, 0)) { | 825 if (libgio_loader_.glib_check_version(2, 35, 0)) { |
| 820 libgio_loader_.g_type_init(); | 826 libgio_loader_.g_type_init(); |
| 821 } | 827 } |
| 822 } | 828 } |
| 823 | 829 |
| 824 GSettings* client = NULL; | 830 GSettings* client = nullptr; |
| 825 if (SchemaExists(kProxyGConfSchema)) { | 831 if (SchemaExists(kProxyGConfSchema)) { |
| 826 ANNOTATE_SCOPED_MEMORY_LEAK; // http://crbug.com/380782 | 832 ANNOTATE_SCOPED_MEMORY_LEAK; // http://crbug.com/380782 |
| 827 client = libgio_loader_.g_settings_new(kProxyGConfSchema); | 833 client = libgio_loader_.g_settings_new(kProxyGConfSchema); |
| 828 } | 834 } |
| 829 if (!client) { | 835 if (!client) { |
| 830 VLOG(1) << "Cannot create gsettings client. Will fall back to gconf."; | 836 VLOG(1) << "Cannot create gsettings client. Will fall back to gconf."; |
| 831 return false; | 837 return false; |
| 832 } | 838 } |
| 833 g_object_unref(client); | 839 g_object_unref(client); |
| 834 | 840 |
| 835 // Yes, we're on the UI thread. Yes, we're accessing the file system. | 841 // Yes, we're on the UI thread. Yes, we're accessing the file system. |
| 836 // Sadly, we don't have much choice. We need the proxy settings and we | 842 // Sadly, we don't have much choice. We need the proxy settings and we |
| (...skipping 13 matching lines...) Expand all Loading... |
| 850 #endif // defined(USE_GIO) | 856 #endif // defined(USE_GIO) |
| 851 | 857 |
| 852 // This is the KDE version that reads kioslaverc and simulates gconf. | 858 // This is the KDE version that reads kioslaverc and simulates gconf. |
| 853 // Doing this allows the main Delegate code, as well as the unit tests | 859 // Doing this allows the main Delegate code, as well as the unit tests |
| 854 // for it, to stay the same - and the settings map fairly well besides. | 860 // for it, to stay the same - and the settings map fairly well besides. |
| 855 class SettingGetterImplKDE : public ProxyConfigServiceLinux::SettingGetter, | 861 class SettingGetterImplKDE : public ProxyConfigServiceLinux::SettingGetter, |
| 856 public base::MessagePumpLibevent::Watcher { | 862 public base::MessagePumpLibevent::Watcher { |
| 857 public: | 863 public: |
| 858 explicit SettingGetterImplKDE(base::Environment* env_var_getter) | 864 explicit SettingGetterImplKDE(base::Environment* env_var_getter) |
| 859 : inotify_fd_(-1), | 865 : inotify_fd_(-1), |
| 860 notify_delegate_(NULL), | 866 notify_delegate_(nullptr), |
| 861 debounce_timer_(new base::OneShotTimer()), | 867 debounce_timer_(new base::OneShotTimer()), |
| 862 indirect_manual_(false), | 868 indirect_manual_(false), |
| 863 auto_no_pac_(false), | 869 auto_no_pac_(false), |
| 864 reversed_bypass_list_(false), | 870 reversed_bypass_list_(false), |
| 865 env_var_getter_(env_var_getter), | 871 env_var_getter_(env_var_getter), |
| 866 file_task_runner_(NULL) { | 872 file_task_runner_(nullptr) { |
| 867 // This has to be called on the UI thread (http://crbug.com/69057). | 873 // This has to be called on the UI thread (http://crbug.com/69057). |
| 868 base::ThreadRestrictions::ScopedAllowIO allow_io; | 874 base::ThreadRestrictions::ScopedAllowIO allow_io; |
| 869 | 875 |
| 870 // Derive the location of the kde config dir from the environment. | 876 // Derive the location of the kde config dir from the environment. |
| 871 std::string home; | 877 std::string home; |
| 872 if (env_var_getter->GetVar("KDEHOME", &home) && !home.empty()) { | 878 if (env_var_getter->GetVar("KDEHOME", &home) && !home.empty()) { |
| 873 // $KDEHOME is set. Use it unconditionally. | 879 // $KDEHOME is set. Use it unconditionally. |
| 874 kde_config_dir_ = KDEHomeToConfigPath(base::FilePath(home)); | 880 kde_config_dir_ = KDEHomeToConfigPath(base::FilePath(home)); |
| 875 } else { | 881 } else { |
| 876 // $KDEHOME is unset. Try to figure out what to use. This seems to be | 882 // $KDEHOME is unset. Try to figure out what to use. This seems to be |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 926 ~SettingGetterImplKDE() override { | 932 ~SettingGetterImplKDE() override { |
| 927 // inotify_fd_ should have been closed before now, from | 933 // inotify_fd_ should have been closed before now, from |
| 928 // Delegate::OnDestroy(), while running on the file thread. However | 934 // Delegate::OnDestroy(), while running on the file thread. However |
| 929 // on exiting the process, it may happen that Delegate::OnDestroy() | 935 // on exiting the process, it may happen that Delegate::OnDestroy() |
| 930 // task is left pending on the file loop after the loop was quit, | 936 // task is left pending on the file loop after the loop was quit, |
| 931 // and pending tasks may then be deleted without being run. | 937 // and pending tasks may then be deleted without being run. |
| 932 // Here in the KDE version, we can safely close the file descriptor | 938 // Here in the KDE version, we can safely close the file descriptor |
| 933 // anyway. (Not that it really matters; the process is exiting.) | 939 // anyway. (Not that it really matters; the process is exiting.) |
| 934 if (inotify_fd_ >= 0) | 940 if (inotify_fd_ >= 0) |
| 935 ShutDown(); | 941 ShutDown(); |
| 936 DCHECK(inotify_fd_ < 0); | 942 DCHECK_LT(inotify_fd_, 0); |
| 937 } | 943 } |
| 938 | 944 |
| 939 bool Init(const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner, | 945 bool Init(const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner, |
| 940 const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner) | 946 const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner) |
| 941 override { | 947 override { |
| 942 // This has to be called on the UI thread (http://crbug.com/69057). | 948 // This has to be called on the UI thread (http://crbug.com/69057). |
| 943 base::ThreadRestrictions::ScopedAllowIO allow_io; | 949 base::ThreadRestrictions::ScopedAllowIO allow_io; |
| 944 DCHECK(inotify_fd_ < 0); | 950 DCHECK_LT(inotify_fd_, 0); |
| 945 inotify_fd_ = inotify_init(); | 951 inotify_fd_ = inotify_init(); |
| 946 if (inotify_fd_ < 0) { | 952 if (inotify_fd_ < 0) { |
| 947 PLOG(ERROR) << "inotify_init failed"; | 953 PLOG(ERROR) << "inotify_init failed"; |
| 948 return false; | 954 return false; |
| 949 } | 955 } |
| 950 if (!base::SetNonBlocking(inotify_fd_)) { | 956 if (!base::SetNonBlocking(inotify_fd_)) { |
| 951 PLOG(ERROR) << "base::SetNonBlocking failed"; | 957 PLOG(ERROR) << "base::SetNonBlocking failed"; |
| 952 close(inotify_fd_); | 958 close(inotify_fd_); |
| 953 inotify_fd_ = -1; | 959 inotify_fd_ = -1; |
| 954 return false; | 960 return false; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 966 ResetCachedSettings(); | 972 ResetCachedSettings(); |
| 967 inotify_watcher_.StopWatchingFileDescriptor(); | 973 inotify_watcher_.StopWatchingFileDescriptor(); |
| 968 close(inotify_fd_); | 974 close(inotify_fd_); |
| 969 inotify_fd_ = -1; | 975 inotify_fd_ = -1; |
| 970 } | 976 } |
| 971 debounce_timer_.reset(); | 977 debounce_timer_.reset(); |
| 972 } | 978 } |
| 973 | 979 |
| 974 bool SetUpNotifications( | 980 bool SetUpNotifications( |
| 975 ProxyConfigServiceLinux::Delegate* delegate) override { | 981 ProxyConfigServiceLinux::Delegate* delegate) override { |
| 976 DCHECK(inotify_fd_ >= 0); | 982 DCHECK_GE(inotify_fd_, 0); |
| 977 DCHECK(file_task_runner_->BelongsToCurrentThread()); | 983 DCHECK(file_task_runner_->BelongsToCurrentThread()); |
| 978 // We can't just watch the kioslaverc file directly, since KDE will write | 984 // We can't just watch the kioslaverc file directly, since KDE will write |
| 979 // a new copy of it and then rename it whenever settings are changed and | 985 // a new copy of it and then rename it whenever settings are changed and |
| 980 // inotify watches inodes (so we'll be watching the old deleted file after | 986 // inotify watches inodes (so we'll be watching the old deleted file after |
| 981 // the first change, and it will never change again). So, we watch the | 987 // the first change, and it will never change again). So, we watch the |
| 982 // directory instead. We then act only on changes to the kioslaverc entry. | 988 // directory instead. We then act only on changes to the kioslaverc entry. |
| 983 if (inotify_add_watch(inotify_fd_, kde_config_dir_.value().c_str(), | 989 if (inotify_add_watch(inotify_fd_, kde_config_dir_.value().c_str(), |
| 984 IN_MODIFY | IN_MOVED_TO) < 0) { | 990 IN_MODIFY | IN_MOVED_TO) < 0) { |
| 985 return false; | 991 return false; |
| 986 } | 992 } |
| (...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1521 // bypass of local names in GNOME. In KDE, "<local>" is supported | 1527 // bypass of local names in GNOME. In KDE, "<local>" is supported |
| 1522 // as a hostname rule. | 1528 // as a hostname rule. |
| 1523 | 1529 |
| 1524 // KDE allows one to reverse the bypass rules. | 1530 // KDE allows one to reverse the bypass rules. |
| 1525 config->proxy_rules().reverse_bypass = | 1531 config->proxy_rules().reverse_bypass = |
| 1526 setting_getter_->BypassListIsReversed(); | 1532 setting_getter_->BypassListIsReversed(); |
| 1527 | 1533 |
| 1528 return true; | 1534 return true; |
| 1529 } | 1535 } |
| 1530 | 1536 |
| 1531 ProxyConfigServiceLinux::Delegate::Delegate(base::Environment* env_var_getter) | 1537 ProxyConfigServiceLinux::Delegate::Delegate( |
| 1532 : env_var_getter_(env_var_getter) { | 1538 std::unique_ptr<base::Environment> env_var_getter) |
| 1539 : env_var_getter_(std::move(env_var_getter)) { |
| 1533 // Figure out which SettingGetterImpl to use, if any. | 1540 // Figure out which SettingGetterImpl to use, if any. |
| 1534 switch (base::nix::GetDesktopEnvironment(env_var_getter)) { | 1541 switch (base::nix::GetDesktopEnvironment(env_var_getter_.get())) { |
| 1535 case base::nix::DESKTOP_ENVIRONMENT_GNOME: | 1542 case base::nix::DESKTOP_ENVIRONMENT_GNOME: |
| 1536 case base::nix::DESKTOP_ENVIRONMENT_UNITY: | 1543 case base::nix::DESKTOP_ENVIRONMENT_UNITY: |
| 1537 #if defined(USE_GIO) | 1544 #if defined(USE_GIO) |
| 1538 { | 1545 { |
| 1539 std::unique_ptr<SettingGetterImplGSettings> gs_getter( | 1546 std::unique_ptr<SettingGetterImplGSettings> gs_getter( |
| 1540 new SettingGetterImplGSettings()); | 1547 new SettingGetterImplGSettings()); |
| 1541 // We have to load symbols and check the GNOME version in use to decide | 1548 // We have to load symbols and check the GNOME version in use to decide |
| 1542 // if we should use the gsettings getter. See LoadAndCheckVersion(). | 1549 // if we should use the gsettings getter. See LoadAndCheckVersion(). |
| 1543 if (gs_getter->LoadAndCheckVersion(env_var_getter)) | 1550 if (gs_getter->LoadAndCheckVersion(env_var_getter_.get())) |
| 1544 setting_getter_.reset(gs_getter.release()); | 1551 setting_getter_.reset(gs_getter.release()); |
| 1545 } | 1552 } |
| 1546 #endif | 1553 #endif |
| 1547 #if defined(USE_GCONF) | 1554 #if defined(USE_GCONF) |
| 1548 // Fall back on gconf if gsettings is unavailable or incorrect. | 1555 // Fall back on gconf if gsettings is unavailable or incorrect. |
| 1549 if (!setting_getter_.get()) | 1556 if (!setting_getter_) |
| 1550 setting_getter_.reset(new SettingGetterImplGConf()); | 1557 setting_getter_.reset(new SettingGetterImplGConf()); |
| 1551 #endif | 1558 #endif |
| 1552 break; | 1559 break; |
| 1553 case base::nix::DESKTOP_ENVIRONMENT_KDE3: | 1560 case base::nix::DESKTOP_ENVIRONMENT_KDE3: |
| 1554 case base::nix::DESKTOP_ENVIRONMENT_KDE4: | 1561 case base::nix::DESKTOP_ENVIRONMENT_KDE4: |
| 1555 case base::nix::DESKTOP_ENVIRONMENT_KDE5: | 1562 case base::nix::DESKTOP_ENVIRONMENT_KDE5: |
| 1556 setting_getter_.reset(new SettingGetterImplKDE(env_var_getter)); | 1563 setting_getter_.reset(new SettingGetterImplKDE(env_var_getter_.get())); |
| 1557 break; | 1564 break; |
| 1558 case base::nix::DESKTOP_ENVIRONMENT_XFCE: | 1565 case base::nix::DESKTOP_ENVIRONMENT_XFCE: |
| 1559 case base::nix::DESKTOP_ENVIRONMENT_OTHER: | 1566 case base::nix::DESKTOP_ENVIRONMENT_OTHER: |
| 1560 break; | 1567 break; |
| 1561 } | 1568 } |
| 1562 } | 1569 } |
| 1563 | 1570 |
| 1564 ProxyConfigServiceLinux::Delegate::Delegate( | 1571 ProxyConfigServiceLinux::Delegate::Delegate( |
| 1565 base::Environment* env_var_getter, SettingGetter* setting_getter) | 1572 std::unique_ptr<base::Environment> env_var_getter, |
| 1566 : env_var_getter_(env_var_getter), setting_getter_(setting_getter) { | 1573 SettingGetter* setting_getter) |
| 1567 } | 1574 : env_var_getter_(std::move(env_var_getter)), |
| 1575 setting_getter_(setting_getter) {} |
| 1568 | 1576 |
| 1569 void ProxyConfigServiceLinux::Delegate::SetUpAndFetchInitialConfig( | 1577 void ProxyConfigServiceLinux::Delegate::SetUpAndFetchInitialConfig( |
| 1570 const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner, | 1578 const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner, |
| 1571 const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner, | 1579 const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner, |
| 1572 const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner) { | 1580 const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner) { |
| 1573 // We should be running on the default glib main loop thread right | 1581 // We should be running on the default glib main loop thread right |
| 1574 // now. gconf can only be accessed from this thread. | 1582 // now. gconf can only be accessed from this thread. |
| 1575 DCHECK(glib_task_runner->BelongsToCurrentThread()); | 1583 DCHECK(glib_task_runner->BelongsToCurrentThread()); |
| 1576 glib_task_runner_ = glib_task_runner; | 1584 glib_task_runner_ = glib_task_runner; |
| 1577 io_task_runner_ = io_task_runner; | 1585 io_task_runner_ = io_task_runner; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1588 // before this ProxyConfigServiceLinux is passed on to | 1596 // before this ProxyConfigServiceLinux is passed on to |
| 1589 // the ProxyService. | 1597 // the ProxyService. |
| 1590 | 1598 |
| 1591 // Note: It would be nice to prioritize environment variables | 1599 // Note: It would be nice to prioritize environment variables |
| 1592 // and only fall back to gconf if env vars were unset. But | 1600 // and only fall back to gconf if env vars were unset. But |
| 1593 // gnome-terminal "helpfully" sets http_proxy and no_proxy, and it | 1601 // gnome-terminal "helpfully" sets http_proxy and no_proxy, and it |
| 1594 // does so even if the proxy mode is set to auto, which would | 1602 // does so even if the proxy mode is set to auto, which would |
| 1595 // mislead us. | 1603 // mislead us. |
| 1596 | 1604 |
| 1597 bool got_config = false; | 1605 bool got_config = false; |
| 1598 if (setting_getter_.get() && | 1606 if (setting_getter_ && |
| 1599 setting_getter_->Init(glib_task_runner, file_task_runner) && | 1607 setting_getter_->Init(glib_task_runner, file_task_runner) && |
| 1600 GetConfigFromSettings(&cached_config_)) { | 1608 GetConfigFromSettings(&cached_config_)) { |
| 1601 cached_config_.set_id(1); // Mark it as valid. | 1609 cached_config_.set_id(1); // Mark it as valid. |
| 1602 cached_config_.set_source(setting_getter_->GetConfigSource()); | 1610 cached_config_.set_source(setting_getter_->GetConfigSource()); |
| 1603 VLOG(1) << "Obtained proxy settings from " | 1611 VLOG(1) << "Obtained proxy settings from " |
| 1604 << ProxyConfigSourceToString(cached_config_.source()); | 1612 << ProxyConfigSourceToString(cached_config_.source()); |
| 1605 | 1613 |
| 1606 // If gconf proxy mode is "none", meaning direct, then we take | 1614 // If gconf proxy mode is "none", meaning direct, then we take |
| 1607 // that to be a valid config and will not check environment | 1615 // that to be a valid config and will not check environment |
| 1608 // variables. The alternative would have been to look for a proxy | 1616 // variables. The alternative would have been to look for a proxy |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1720 const ProxyConfig& new_config) { | 1728 const ProxyConfig& new_config) { |
| 1721 DCHECK(io_task_runner_->BelongsToCurrentThread()); | 1729 DCHECK(io_task_runner_->BelongsToCurrentThread()); |
| 1722 VLOG(1) << "Proxy configuration changed"; | 1730 VLOG(1) << "Proxy configuration changed"; |
| 1723 cached_config_ = new_config; | 1731 cached_config_ = new_config; |
| 1724 FOR_EACH_OBSERVER( | 1732 FOR_EACH_OBSERVER( |
| 1725 Observer, observers_, | 1733 Observer, observers_, |
| 1726 OnProxyConfigChanged(new_config, ProxyConfigService::CONFIG_VALID)); | 1734 OnProxyConfigChanged(new_config, ProxyConfigService::CONFIG_VALID)); |
| 1727 } | 1735 } |
| 1728 | 1736 |
| 1729 void ProxyConfigServiceLinux::Delegate::PostDestroyTask() { | 1737 void ProxyConfigServiceLinux::Delegate::PostDestroyTask() { |
| 1730 if (!setting_getter_.get()) | 1738 if (!setting_getter_) |
| 1731 return; | 1739 return; |
| 1740 |
| 1732 scoped_refptr<base::SingleThreadTaskRunner> shutdown_loop = | 1741 scoped_refptr<base::SingleThreadTaskRunner> shutdown_loop = |
| 1733 setting_getter_->GetNotificationTaskRunner(); | 1742 setting_getter_->GetNotificationTaskRunner(); |
| 1734 if (!shutdown_loop.get() || shutdown_loop->BelongsToCurrentThread()) { | 1743 if (!shutdown_loop.get() || shutdown_loop->BelongsToCurrentThread()) { |
| 1735 // Already on the right thread, call directly. | 1744 // Already on the right thread, call directly. |
| 1736 // This is the case for the unittests. | 1745 // This is the case for the unittests. |
| 1737 OnDestroy(); | 1746 OnDestroy(); |
| 1738 } else { | 1747 } else { |
| 1739 // Post to shutdown thread. Note that on browser shutdown, we may quit | 1748 // Post to shutdown thread. Note that on browser shutdown, we may quit |
| 1740 // this MessageLoop and exit the program before ever running this. | 1749 // this MessageLoop and exit the program before ever running this. |
| 1741 shutdown_loop->PostTask(FROM_HERE, base::Bind( | 1750 shutdown_loop->PostTask(FROM_HERE, base::Bind( |
| 1742 &ProxyConfigServiceLinux::Delegate::OnDestroy, this)); | 1751 &ProxyConfigServiceLinux::Delegate::OnDestroy, this)); |
| 1743 } | 1752 } |
| 1744 } | 1753 } |
| 1745 void ProxyConfigServiceLinux::Delegate::OnDestroy() { | 1754 void ProxyConfigServiceLinux::Delegate::OnDestroy() { |
| 1746 scoped_refptr<base::SingleThreadTaskRunner> shutdown_loop = | 1755 scoped_refptr<base::SingleThreadTaskRunner> shutdown_loop = |
| 1747 setting_getter_->GetNotificationTaskRunner(); | 1756 setting_getter_->GetNotificationTaskRunner(); |
| 1748 DCHECK(!shutdown_loop.get() || shutdown_loop->BelongsToCurrentThread()); | 1757 DCHECK(!shutdown_loop.get() || shutdown_loop->BelongsToCurrentThread()); |
| 1749 setting_getter_->ShutDown(); | 1758 setting_getter_->ShutDown(); |
| 1750 } | 1759 } |
| 1751 | 1760 |
| 1752 ProxyConfigServiceLinux::ProxyConfigServiceLinux() | 1761 ProxyConfigServiceLinux::ProxyConfigServiceLinux() |
| 1753 : delegate_(new Delegate(base::Environment::Create())) { | 1762 : delegate_(new Delegate(base::Environment::Create())) { |
| 1754 } | 1763 } |
| 1755 | 1764 |
| 1756 ProxyConfigServiceLinux::~ProxyConfigServiceLinux() { | 1765 ProxyConfigServiceLinux::~ProxyConfigServiceLinux() { |
| 1757 delegate_->PostDestroyTask(); | 1766 delegate_->PostDestroyTask(); |
| 1758 } | 1767 } |
| 1759 | 1768 |
| 1760 ProxyConfigServiceLinux::ProxyConfigServiceLinux( | 1769 ProxyConfigServiceLinux::ProxyConfigServiceLinux( |
| 1761 base::Environment* env_var_getter) | 1770 std::unique_ptr<base::Environment> env_var_getter) |
| 1762 : delegate_(new Delegate(env_var_getter)) { | 1771 : delegate_(new Delegate(std::move(env_var_getter))) {} |
| 1763 } | |
| 1764 | 1772 |
| 1765 ProxyConfigServiceLinux::ProxyConfigServiceLinux( | 1773 ProxyConfigServiceLinux::ProxyConfigServiceLinux( |
| 1766 base::Environment* env_var_getter, SettingGetter* setting_getter) | 1774 std::unique_ptr<base::Environment> env_var_getter, |
| 1767 : delegate_(new Delegate(env_var_getter, setting_getter)) { | 1775 SettingGetter* setting_getter) |
| 1768 } | 1776 : delegate_(new Delegate(std::move(env_var_getter), setting_getter)) {} |
| 1769 | 1777 |
| 1770 void ProxyConfigServiceLinux::AddObserver(Observer* observer) { | 1778 void ProxyConfigServiceLinux::AddObserver(Observer* observer) { |
| 1771 delegate_->AddObserver(observer); | 1779 delegate_->AddObserver(observer); |
| 1772 } | 1780 } |
| 1773 | 1781 |
| 1774 void ProxyConfigServiceLinux::RemoveObserver(Observer* observer) { | 1782 void ProxyConfigServiceLinux::RemoveObserver(Observer* observer) { |
| 1775 delegate_->RemoveObserver(observer); | 1783 delegate_->RemoveObserver(observer); |
| 1776 } | 1784 } |
| 1777 | 1785 |
| 1778 ProxyConfigService::ConfigAvailability | 1786 ProxyConfigService::ConfigAvailability |
| 1779 ProxyConfigServiceLinux::GetLatestProxyConfig(ProxyConfig* config) { | 1787 ProxyConfigServiceLinux::GetLatestProxyConfig(ProxyConfig* config) { |
| 1780 return delegate_->GetLatestProxyConfig(config); | 1788 return delegate_->GetLatestProxyConfig(config); |
| 1781 } | 1789 } |
| 1782 | 1790 |
| 1783 } // namespace net | 1791 } // namespace net |
| OLD | NEW |