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

Side by Side Diff: net/proxy/proxy_config_service_linux.cc

Issue 669813003: Update from chromium https://crrev.com/301725/ (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 years, 1 month 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
OLDNEW
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 #include <fcntl.h> 8 #include <fcntl.h>
9 #if defined(USE_GCONF) 9 #if defined(USE_GCONF)
10 #include <gconf/gconf-client.h> 10 #include <gconf/gconf-client.h>
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 199
200 #if defined(USE_GCONF) 200 #if defined(USE_GCONF)
201 // This setting getter uses gconf, as used in GNOME 2 and some GNOME 3 desktops. 201 // This setting getter uses gconf, as used in GNOME 2 and some GNOME 3 desktops.
202 class SettingGetterImplGConf : public ProxyConfigServiceLinux::SettingGetter { 202 class SettingGetterImplGConf : public ProxyConfigServiceLinux::SettingGetter {
203 public: 203 public:
204 SettingGetterImplGConf() 204 SettingGetterImplGConf()
205 : client_(NULL), system_proxy_id_(0), system_http_proxy_id_(0), 205 : client_(NULL), system_proxy_id_(0), system_http_proxy_id_(0),
206 notify_delegate_(NULL) { 206 notify_delegate_(NULL) {
207 } 207 }
208 208
209 virtual ~SettingGetterImplGConf() { 209 ~SettingGetterImplGConf() override {
210 // client_ should have been released before now, from 210 // client_ should have been released before now, from
211 // Delegate::OnDestroy(), while running on the UI thread. However 211 // Delegate::OnDestroy(), while running on the UI thread. However
212 // on exiting the process, it may happen that Delegate::OnDestroy() 212 // on exiting the process, it may happen that Delegate::OnDestroy()
213 // task is left pending on the glib loop after the loop was quit, 213 // task is left pending on the glib loop after the loop was quit,
214 // and pending tasks may then be deleted without being run. 214 // and pending tasks may then be deleted without being run.
215 if (client_) { 215 if (client_) {
216 // gconf client was not cleaned up. 216 // gconf client was not cleaned up.
217 if (task_runner_->BelongsToCurrentThread()) { 217 if (task_runner_->BelongsToCurrentThread()) {
218 // We are on the UI thread so we can clean it safely. This is 218 // We are on the UI thread so we can clean it safely. This is
219 // the case at least for ui_tests running under Valgrind in 219 // the case at least for ui_tests running under Valgrind in
220 // bug 16076. 220 // bug 16076.
221 VLOG(1) << "~SettingGetterImplGConf: releasing gconf client"; 221 VLOG(1) << "~SettingGetterImplGConf: releasing gconf client";
222 ShutDown(); 222 ShutDown();
223 } else { 223 } else {
224 // This is very bad! We are deleting the setting getter but we're not on 224 // This is very bad! We are deleting the setting getter but we're not on
225 // the UI thread. This is not supposed to happen: the setting getter is 225 // the UI thread. This is not supposed to happen: the setting getter is
226 // owned by the proxy config service's delegate, which is supposed to be 226 // owned by the proxy config service's delegate, which is supposed to be
227 // destroyed on the UI thread only. We will get change notifications to 227 // destroyed on the UI thread only. We will get change notifications to
228 // a deleted object if we continue here, so fail now. 228 // a deleted object if we continue here, so fail now.
229 LOG(FATAL) << "~SettingGetterImplGConf: deleting on wrong thread!"; 229 LOG(FATAL) << "~SettingGetterImplGConf: deleting on wrong thread!";
230 } 230 }
231 } 231 }
232 DCHECK(!client_); 232 DCHECK(!client_);
233 } 233 }
234 234
235 virtual bool Init( 235 bool Init(const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner,
236 const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner, 236 const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner)
237 const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner)
238 override { 237 override {
239 DCHECK(glib_task_runner->BelongsToCurrentThread()); 238 DCHECK(glib_task_runner->BelongsToCurrentThread());
240 DCHECK(!client_); 239 DCHECK(!client_);
241 DCHECK(!task_runner_.get()); 240 DCHECK(!task_runner_.get());
242 task_runner_ = glib_task_runner; 241 task_runner_ = glib_task_runner;
243 client_ = gconf_client_get_default(); 242 client_ = gconf_client_get_default();
244 if (!client_) { 243 if (!client_) {
245 // It's not clear whether/when this can return NULL. 244 // It's not clear whether/when this can return NULL.
246 LOG(ERROR) << "Unable to create a gconf client"; 245 LOG(ERROR) << "Unable to create a gconf client";
247 task_runner_ = NULL; 246 task_runner_ = NULL;
(...skipping 18 matching lines...) Expand all
266 if (added_system_proxy) 265 if (added_system_proxy)
267 gconf_client_remove_dir(client_, "/system/proxy", NULL); 266 gconf_client_remove_dir(client_, "/system/proxy", NULL);
268 g_object_unref(client_); 267 g_object_unref(client_);
269 client_ = NULL; 268 client_ = NULL;
270 task_runner_ = NULL; 269 task_runner_ = NULL;
271 return false; 270 return false;
272 } 271 }
273 return true; 272 return true;
274 } 273 }
275 274
276 virtual void ShutDown() override { 275 void ShutDown() override {
277 if (client_) { 276 if (client_) {
278 DCHECK(task_runner_->BelongsToCurrentThread()); 277 DCHECK(task_runner_->BelongsToCurrentThread());
279 // We must explicitly disable gconf notifications here, because the gconf 278 // We must explicitly disable gconf notifications here, because the gconf
280 // client will be shared between all setting getters, and they do not all 279 // client will be shared between all setting getters, and they do not all
281 // have the same lifetimes. (For instance, incognito sessions get their 280 // have the same lifetimes. (For instance, incognito sessions get their
282 // own, which is destroyed when the session ends.) 281 // own, which is destroyed when the session ends.)
283 gconf_client_notify_remove(client_, system_http_proxy_id_); 282 gconf_client_notify_remove(client_, system_http_proxy_id_);
284 gconf_client_notify_remove(client_, system_proxy_id_); 283 gconf_client_notify_remove(client_, system_proxy_id_);
285 gconf_client_remove_dir(client_, "/system/http_proxy", NULL); 284 gconf_client_remove_dir(client_, "/system/http_proxy", NULL);
286 gconf_client_remove_dir(client_, "/system/proxy", NULL); 285 gconf_client_remove_dir(client_, "/system/proxy", NULL);
287 g_object_unref(client_); 286 g_object_unref(client_);
288 client_ = NULL; 287 client_ = NULL;
289 task_runner_ = NULL; 288 task_runner_ = NULL;
290 } 289 }
291 } 290 }
292 291
293 virtual bool SetUpNotifications( 292 bool SetUpNotifications(
294 ProxyConfigServiceLinux::Delegate* delegate) override { 293 ProxyConfigServiceLinux::Delegate* delegate) override {
295 DCHECK(client_); 294 DCHECK(client_);
296 DCHECK(task_runner_->BelongsToCurrentThread()); 295 DCHECK(task_runner_->BelongsToCurrentThread());
297 GError* error = NULL; 296 GError* error = NULL;
298 notify_delegate_ = delegate; 297 notify_delegate_ = delegate;
299 // We have to keep track of the IDs returned by gconf_client_notify_add() so 298 // We have to keep track of the IDs returned by gconf_client_notify_add() so
300 // that we can remove them in ShutDown(). (Otherwise, notifications will be 299 // that we can remove them in ShutDown(). (Otherwise, notifications will be
301 // delivered to this object after it is deleted, which is bad, m'kay?) 300 // delivered to this object after it is deleted, which is bad, m'kay?)
302 system_proxy_id_ = gconf_client_notify_add( 301 system_proxy_id_ = gconf_client_notify_add(
303 client_, "/system/proxy", 302 client_, "/system/proxy",
304 OnGConfChangeNotification, this, 303 OnGConfChangeNotification, this,
305 NULL, &error); 304 NULL, &error);
306 if (error == NULL) { 305 if (error == NULL) {
307 system_http_proxy_id_ = gconf_client_notify_add( 306 system_http_proxy_id_ = gconf_client_notify_add(
308 client_, "/system/http_proxy", 307 client_, "/system/http_proxy",
309 OnGConfChangeNotification, this, 308 OnGConfChangeNotification, this,
310 NULL, &error); 309 NULL, &error);
311 } 310 }
312 if (error != NULL) { 311 if (error != NULL) {
313 LOG(ERROR) << "Error requesting gconf notifications: " << error->message; 312 LOG(ERROR) << "Error requesting gconf notifications: " << error->message;
314 g_error_free(error); 313 g_error_free(error);
315 ShutDown(); 314 ShutDown();
316 return false; 315 return false;
317 } 316 }
318 // Simulate a change to avoid possibly losing updates before this point. 317 // Simulate a change to avoid possibly losing updates before this point.
319 OnChangeNotification(); 318 OnChangeNotification();
320 return true; 319 return true;
321 } 320 }
322 321
323 virtual const scoped_refptr<base::SingleThreadTaskRunner>& 322 const scoped_refptr<base::SingleThreadTaskRunner>& GetNotificationTaskRunner()
324 GetNotificationTaskRunner() override { 323 override {
325 return task_runner_; 324 return task_runner_;
326 } 325 }
327 326
328 virtual ProxyConfigSource GetConfigSource() override { 327 ProxyConfigSource GetConfigSource() override {
329 return PROXY_CONFIG_SOURCE_GCONF; 328 return PROXY_CONFIG_SOURCE_GCONF;
330 } 329 }
331 330
332 virtual bool GetString(StringSetting key, std::string* result) override { 331 bool GetString(StringSetting key, std::string* result) override {
333 switch (key) { 332 switch (key) {
334 case PROXY_MODE: 333 case PROXY_MODE:
335 return GetStringByPath("/system/proxy/mode", result); 334 return GetStringByPath("/system/proxy/mode", result);
336 case PROXY_AUTOCONF_URL: 335 case PROXY_AUTOCONF_URL:
337 return GetStringByPath("/system/proxy/autoconfig_url", result); 336 return GetStringByPath("/system/proxy/autoconfig_url", result);
338 case PROXY_HTTP_HOST: 337 case PROXY_HTTP_HOST:
339 return GetStringByPath("/system/http_proxy/host", result); 338 return GetStringByPath("/system/http_proxy/host", result);
340 case PROXY_HTTPS_HOST: 339 case PROXY_HTTPS_HOST:
341 return GetStringByPath("/system/proxy/secure_host", result); 340 return GetStringByPath("/system/proxy/secure_host", result);
342 case PROXY_FTP_HOST: 341 case PROXY_FTP_HOST:
343 return GetStringByPath("/system/proxy/ftp_host", result); 342 return GetStringByPath("/system/proxy/ftp_host", result);
344 case PROXY_SOCKS_HOST: 343 case PROXY_SOCKS_HOST:
345 return GetStringByPath("/system/proxy/socks_host", result); 344 return GetStringByPath("/system/proxy/socks_host", result);
346 } 345 }
347 return false; // Placate compiler. 346 return false; // Placate compiler.
348 } 347 }
349 virtual bool GetBool(BoolSetting key, bool* result) override { 348 bool GetBool(BoolSetting key, bool* result) override {
350 switch (key) { 349 switch (key) {
351 case PROXY_USE_HTTP_PROXY: 350 case PROXY_USE_HTTP_PROXY:
352 return GetBoolByPath("/system/http_proxy/use_http_proxy", result); 351 return GetBoolByPath("/system/http_proxy/use_http_proxy", result);
353 case PROXY_USE_SAME_PROXY: 352 case PROXY_USE_SAME_PROXY:
354 return GetBoolByPath("/system/http_proxy/use_same_proxy", result); 353 return GetBoolByPath("/system/http_proxy/use_same_proxy", result);
355 case PROXY_USE_AUTHENTICATION: 354 case PROXY_USE_AUTHENTICATION:
356 return GetBoolByPath("/system/http_proxy/use_authentication", result); 355 return GetBoolByPath("/system/http_proxy/use_authentication", result);
357 } 356 }
358 return false; // Placate compiler. 357 return false; // Placate compiler.
359 } 358 }
360 virtual bool GetInt(IntSetting key, int* result) override { 359 bool GetInt(IntSetting key, int* result) override {
361 switch (key) { 360 switch (key) {
362 case PROXY_HTTP_PORT: 361 case PROXY_HTTP_PORT:
363 return GetIntByPath("/system/http_proxy/port", result); 362 return GetIntByPath("/system/http_proxy/port", result);
364 case PROXY_HTTPS_PORT: 363 case PROXY_HTTPS_PORT:
365 return GetIntByPath("/system/proxy/secure_port", result); 364 return GetIntByPath("/system/proxy/secure_port", result);
366 case PROXY_FTP_PORT: 365 case PROXY_FTP_PORT:
367 return GetIntByPath("/system/proxy/ftp_port", result); 366 return GetIntByPath("/system/proxy/ftp_port", result);
368 case PROXY_SOCKS_PORT: 367 case PROXY_SOCKS_PORT:
369 return GetIntByPath("/system/proxy/socks_port", result); 368 return GetIntByPath("/system/proxy/socks_port", result);
370 } 369 }
371 return false; // Placate compiler. 370 return false; // Placate compiler.
372 } 371 }
373 virtual bool GetStringList(StringListSetting key, 372 bool GetStringList(StringListSetting key,
374 std::vector<std::string>* result) override { 373 std::vector<std::string>* result) override {
375 switch (key) { 374 switch (key) {
376 case PROXY_IGNORE_HOSTS: 375 case PROXY_IGNORE_HOSTS:
377 return GetStringListByPath("/system/http_proxy/ignore_hosts", result); 376 return GetStringListByPath("/system/http_proxy/ignore_hosts", result);
378 } 377 }
379 return false; // Placate compiler. 378 return false; // Placate compiler.
380 } 379 }
381 380
382 virtual bool BypassListIsReversed() override { 381 bool BypassListIsReversed() override {
383 // This is a KDE-specific setting. 382 // This is a KDE-specific setting.
384 return false; 383 return false;
385 } 384 }
386 385
387 virtual bool MatchHostsUsingSuffixMatching() override { 386 bool MatchHostsUsingSuffixMatching() override { return false; }
388 return false;
389 }
390 387
391 private: 388 private:
392 bool GetStringByPath(const char* key, std::string* result) { 389 bool GetStringByPath(const char* key, std::string* result) {
393 DCHECK(client_); 390 DCHECK(client_);
394 DCHECK(task_runner_->BelongsToCurrentThread()); 391 DCHECK(task_runner_->BelongsToCurrentThread());
395 GError* error = NULL; 392 GError* error = NULL;
396 gchar* value = gconf_client_get_string(client_, key, &error); 393 gchar* value = gconf_client_get_string(client_, key, &error);
397 if (HandleGError(error, key)) 394 if (HandleGError(error, key))
398 return false; 395 return false;
399 if (!value) 396 if (!value)
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
522 public: 519 public:
523 SettingGetterImplGSettings() : 520 SettingGetterImplGSettings() :
524 client_(NULL), 521 client_(NULL),
525 http_client_(NULL), 522 http_client_(NULL),
526 https_client_(NULL), 523 https_client_(NULL),
527 ftp_client_(NULL), 524 ftp_client_(NULL),
528 socks_client_(NULL), 525 socks_client_(NULL),
529 notify_delegate_(NULL) { 526 notify_delegate_(NULL) {
530 } 527 }
531 528
532 virtual ~SettingGetterImplGSettings() { 529 ~SettingGetterImplGSettings() override {
533 // client_ should have been released before now, from 530 // client_ should have been released before now, from
534 // Delegate::OnDestroy(), while running on the UI thread. However 531 // Delegate::OnDestroy(), while running on the UI thread. However
535 // on exiting the process, it may happen that 532 // on exiting the process, it may happen that
536 // Delegate::OnDestroy() task is left pending on the glib loop 533 // Delegate::OnDestroy() task is left pending on the glib loop
537 // after the loop was quit, and pending tasks may then be deleted 534 // after the loop was quit, and pending tasks may then be deleted
538 // without being run. 535 // without being run.
539 if (client_) { 536 if (client_) {
540 // gconf client was not cleaned up. 537 // gconf client was not cleaned up.
541 if (task_runner_->BelongsToCurrentThread()) { 538 if (task_runner_->BelongsToCurrentThread()) {
542 // We are on the UI thread so we can clean it safely. This is 539 // We are on the UI thread so we can clean it safely. This is
(...skipping 15 matching lines...) Expand all
558 if (strcmp(schema_name, static_cast<const char*>(*schemas)) == 0) 555 if (strcmp(schema_name, static_cast<const char*>(*schemas)) == 0)
559 return true; 556 return true;
560 schemas++; 557 schemas++;
561 } 558 }
562 return false; 559 return false;
563 } 560 }
564 561
565 // LoadAndCheckVersion() must be called *before* Init()! 562 // LoadAndCheckVersion() must be called *before* Init()!
566 bool LoadAndCheckVersion(base::Environment* env); 563 bool LoadAndCheckVersion(base::Environment* env);
567 564
568 virtual bool Init( 565 bool Init(const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner,
569 const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner, 566 const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner)
570 const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner)
571 override { 567 override {
572 DCHECK(glib_task_runner->BelongsToCurrentThread()); 568 DCHECK(glib_task_runner->BelongsToCurrentThread());
573 DCHECK(!client_); 569 DCHECK(!client_);
574 DCHECK(!task_runner_.get()); 570 DCHECK(!task_runner_.get());
575 571
576 if (!SchemaExists(kProxyGConfSchema) || 572 if (!SchemaExists(kProxyGConfSchema) ||
577 !(client_ = libgio_loader_.g_settings_new(kProxyGConfSchema))) { 573 !(client_ = libgio_loader_.g_settings_new(kProxyGConfSchema))) {
578 // It's not clear whether/when this can return NULL. 574 // It's not clear whether/when this can return NULL.
579 LOG(ERROR) << "Unable to create a gsettings client"; 575 LOG(ERROR) << "Unable to create a gsettings client";
580 return false; 576 return false;
581 } 577 }
582 task_runner_ = glib_task_runner; 578 task_runner_ = glib_task_runner;
583 // We assume these all work if the above call worked. 579 // We assume these all work if the above call worked.
584 http_client_ = libgio_loader_.g_settings_get_child(client_, "http"); 580 http_client_ = libgio_loader_.g_settings_get_child(client_, "http");
585 https_client_ = libgio_loader_.g_settings_get_child(client_, "https"); 581 https_client_ = libgio_loader_.g_settings_get_child(client_, "https");
586 ftp_client_ = libgio_loader_.g_settings_get_child(client_, "ftp"); 582 ftp_client_ = libgio_loader_.g_settings_get_child(client_, "ftp");
587 socks_client_ = libgio_loader_.g_settings_get_child(client_, "socks"); 583 socks_client_ = libgio_loader_.g_settings_get_child(client_, "socks");
588 DCHECK(http_client_ && https_client_ && ftp_client_ && socks_client_); 584 DCHECK(http_client_ && https_client_ && ftp_client_ && socks_client_);
589 return true; 585 return true;
590 } 586 }
591 587
592 virtual void ShutDown() override { 588 void ShutDown() override {
593 if (client_) { 589 if (client_) {
594 DCHECK(task_runner_->BelongsToCurrentThread()); 590 DCHECK(task_runner_->BelongsToCurrentThread());
595 // This also disables gsettings notifications. 591 // This also disables gsettings notifications.
596 g_object_unref(socks_client_); 592 g_object_unref(socks_client_);
597 g_object_unref(ftp_client_); 593 g_object_unref(ftp_client_);
598 g_object_unref(https_client_); 594 g_object_unref(https_client_);
599 g_object_unref(http_client_); 595 g_object_unref(http_client_);
600 g_object_unref(client_); 596 g_object_unref(client_);
601 // We only need to null client_ because it's the only one that we check. 597 // We only need to null client_ because it's the only one that we check.
602 client_ = NULL; 598 client_ = NULL;
603 task_runner_ = NULL; 599 task_runner_ = NULL;
604 } 600 }
605 } 601 }
606 602
607 virtual bool SetUpNotifications( 603 bool SetUpNotifications(
608 ProxyConfigServiceLinux::Delegate* delegate) override { 604 ProxyConfigServiceLinux::Delegate* delegate) override {
609 DCHECK(client_); 605 DCHECK(client_);
610 DCHECK(task_runner_->BelongsToCurrentThread()); 606 DCHECK(task_runner_->BelongsToCurrentThread());
611 notify_delegate_ = delegate; 607 notify_delegate_ = delegate;
612 // We could watch for the change-event signal instead of changed, but 608 // We could watch for the change-event signal instead of changed, but
613 // since we have to watch more than one object, we'd still have to 609 // since we have to watch more than one object, we'd still have to
614 // debounce change notifications. This is conceptually simpler. 610 // debounce change notifications. This is conceptually simpler.
615 g_signal_connect(G_OBJECT(client_), "changed", 611 g_signal_connect(G_OBJECT(client_), "changed",
616 G_CALLBACK(OnGSettingsChangeNotification), this); 612 G_CALLBACK(OnGSettingsChangeNotification), this);
617 g_signal_connect(G_OBJECT(http_client_), "changed", 613 g_signal_connect(G_OBJECT(http_client_), "changed",
618 G_CALLBACK(OnGSettingsChangeNotification), this); 614 G_CALLBACK(OnGSettingsChangeNotification), this);
619 g_signal_connect(G_OBJECT(https_client_), "changed", 615 g_signal_connect(G_OBJECT(https_client_), "changed",
620 G_CALLBACK(OnGSettingsChangeNotification), this); 616 G_CALLBACK(OnGSettingsChangeNotification), this);
621 g_signal_connect(G_OBJECT(ftp_client_), "changed", 617 g_signal_connect(G_OBJECT(ftp_client_), "changed",
622 G_CALLBACK(OnGSettingsChangeNotification), this); 618 G_CALLBACK(OnGSettingsChangeNotification), this);
623 g_signal_connect(G_OBJECT(socks_client_), "changed", 619 g_signal_connect(G_OBJECT(socks_client_), "changed",
624 G_CALLBACK(OnGSettingsChangeNotification), this); 620 G_CALLBACK(OnGSettingsChangeNotification), this);
625 // Simulate a change to avoid possibly losing updates before this point. 621 // Simulate a change to avoid possibly losing updates before this point.
626 OnChangeNotification(); 622 OnChangeNotification();
627 return true; 623 return true;
628 } 624 }
629 625
630 virtual const scoped_refptr<base::SingleThreadTaskRunner>& 626 const scoped_refptr<base::SingleThreadTaskRunner>& GetNotificationTaskRunner()
631 GetNotificationTaskRunner() override { 627 override {
632 return task_runner_; 628 return task_runner_;
633 } 629 }
634 630
635 virtual ProxyConfigSource GetConfigSource() override { 631 ProxyConfigSource GetConfigSource() override {
636 return PROXY_CONFIG_SOURCE_GSETTINGS; 632 return PROXY_CONFIG_SOURCE_GSETTINGS;
637 } 633 }
638 634
639 virtual bool GetString(StringSetting key, std::string* result) override { 635 bool GetString(StringSetting key, std::string* result) override {
640 DCHECK(client_); 636 DCHECK(client_);
641 switch (key) { 637 switch (key) {
642 case PROXY_MODE: 638 case PROXY_MODE:
643 return GetStringByPath(client_, "mode", result); 639 return GetStringByPath(client_, "mode", result);
644 case PROXY_AUTOCONF_URL: 640 case PROXY_AUTOCONF_URL:
645 return GetStringByPath(client_, "autoconfig-url", result); 641 return GetStringByPath(client_, "autoconfig-url", result);
646 case PROXY_HTTP_HOST: 642 case PROXY_HTTP_HOST:
647 return GetStringByPath(http_client_, "host", result); 643 return GetStringByPath(http_client_, "host", result);
648 case PROXY_HTTPS_HOST: 644 case PROXY_HTTPS_HOST:
649 return GetStringByPath(https_client_, "host", result); 645 return GetStringByPath(https_client_, "host", result);
650 case PROXY_FTP_HOST: 646 case PROXY_FTP_HOST:
651 return GetStringByPath(ftp_client_, "host", result); 647 return GetStringByPath(ftp_client_, "host", result);
652 case PROXY_SOCKS_HOST: 648 case PROXY_SOCKS_HOST:
653 return GetStringByPath(socks_client_, "host", result); 649 return GetStringByPath(socks_client_, "host", result);
654 } 650 }
655 return false; // Placate compiler. 651 return false; // Placate compiler.
656 } 652 }
657 virtual bool GetBool(BoolSetting key, bool* result) override { 653 bool GetBool(BoolSetting key, bool* result) override {
658 DCHECK(client_); 654 DCHECK(client_);
659 switch (key) { 655 switch (key) {
660 case PROXY_USE_HTTP_PROXY: 656 case PROXY_USE_HTTP_PROXY:
661 // Although there is an "enabled" boolean in http_client_, it is not set 657 // Although there is an "enabled" boolean in http_client_, it is not set
662 // to true by the proxy config utility. We ignore it and return false. 658 // to true by the proxy config utility. We ignore it and return false.
663 return false; 659 return false;
664 case PROXY_USE_SAME_PROXY: 660 case PROXY_USE_SAME_PROXY:
665 // Similarly, although there is a "use-same-proxy" boolean in client_, 661 // Similarly, although there is a "use-same-proxy" boolean in client_,
666 // it is never set to false by the proxy config utility. We ignore it. 662 // it is never set to false by the proxy config utility. We ignore it.
667 return false; 663 return false;
668 case PROXY_USE_AUTHENTICATION: 664 case PROXY_USE_AUTHENTICATION:
669 // There is also no way to set this in the proxy config utility, but it 665 // There is also no way to set this in the proxy config utility, but it
670 // doesn't hurt us to get the actual setting (unlike the two above). 666 // doesn't hurt us to get the actual setting (unlike the two above).
671 return GetBoolByPath(http_client_, "use-authentication", result); 667 return GetBoolByPath(http_client_, "use-authentication", result);
672 } 668 }
673 return false; // Placate compiler. 669 return false; // Placate compiler.
674 } 670 }
675 virtual bool GetInt(IntSetting key, int* result) override { 671 bool GetInt(IntSetting key, int* result) override {
676 DCHECK(client_); 672 DCHECK(client_);
677 switch (key) { 673 switch (key) {
678 case PROXY_HTTP_PORT: 674 case PROXY_HTTP_PORT:
679 return GetIntByPath(http_client_, "port", result); 675 return GetIntByPath(http_client_, "port", result);
680 case PROXY_HTTPS_PORT: 676 case PROXY_HTTPS_PORT:
681 return GetIntByPath(https_client_, "port", result); 677 return GetIntByPath(https_client_, "port", result);
682 case PROXY_FTP_PORT: 678 case PROXY_FTP_PORT:
683 return GetIntByPath(ftp_client_, "port", result); 679 return GetIntByPath(ftp_client_, "port", result);
684 case PROXY_SOCKS_PORT: 680 case PROXY_SOCKS_PORT:
685 return GetIntByPath(socks_client_, "port", result); 681 return GetIntByPath(socks_client_, "port", result);
686 } 682 }
687 return false; // Placate compiler. 683 return false; // Placate compiler.
688 } 684 }
689 virtual bool GetStringList(StringListSetting key, 685 bool GetStringList(StringListSetting key,
690 std::vector<std::string>* result) override { 686 std::vector<std::string>* result) override {
691 DCHECK(client_); 687 DCHECK(client_);
692 switch (key) { 688 switch (key) {
693 case PROXY_IGNORE_HOSTS: 689 case PROXY_IGNORE_HOSTS:
694 return GetStringListByPath(client_, "ignore-hosts", result); 690 return GetStringListByPath(client_, "ignore-hosts", result);
695 } 691 }
696 return false; // Placate compiler. 692 return false; // Placate compiler.
697 } 693 }
698 694
699 virtual bool BypassListIsReversed() override { 695 bool BypassListIsReversed() override {
700 // This is a KDE-specific setting. 696 // This is a KDE-specific setting.
701 return false; 697 return false;
702 } 698 }
703 699
704 virtual bool MatchHostsUsingSuffixMatching() override { 700 bool MatchHostsUsingSuffixMatching() override { return false; }
705 return false;
706 }
707 701
708 private: 702 private:
709 bool GetStringByPath(GSettings* client, const char* key, 703 bool GetStringByPath(GSettings* client, const char* key,
710 std::string* result) { 704 std::string* result) {
711 DCHECK(task_runner_->BelongsToCurrentThread()); 705 DCHECK(task_runner_->BelongsToCurrentThread());
712 gchar* value = libgio_loader_.g_settings_get_string(client, key); 706 gchar* value = libgio_loader_.g_settings_get_string(client, key);
713 if (!value) 707 if (!value)
714 return false; 708 return false;
715 *result = value; 709 *result = value;
716 g_free(value); 710 g_free(value);
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
909 } 903 }
910 if (use_kde4) { 904 if (use_kde4) {
911 kde_config_dir_ = KDEHomeToConfigPath(kde4_path); 905 kde_config_dir_ = KDEHomeToConfigPath(kde4_path);
912 } else { 906 } else {
913 kde_config_dir_ = KDEHomeToConfigPath(kde3_path); 907 kde_config_dir_ = KDEHomeToConfigPath(kde3_path);
914 } 908 }
915 } 909 }
916 } 910 }
917 } 911 }
918 912
919 virtual ~SettingGetterImplKDE() { 913 ~SettingGetterImplKDE() override {
920 // inotify_fd_ should have been closed before now, from 914 // inotify_fd_ should have been closed before now, from
921 // Delegate::OnDestroy(), while running on the file thread. However 915 // Delegate::OnDestroy(), while running on the file thread. However
922 // on exiting the process, it may happen that Delegate::OnDestroy() 916 // on exiting the process, it may happen that Delegate::OnDestroy()
923 // task is left pending on the file loop after the loop was quit, 917 // task is left pending on the file loop after the loop was quit,
924 // and pending tasks may then be deleted without being run. 918 // and pending tasks may then be deleted without being run.
925 // Here in the KDE version, we can safely close the file descriptor 919 // Here in the KDE version, we can safely close the file descriptor
926 // anyway. (Not that it really matters; the process is exiting.) 920 // anyway. (Not that it really matters; the process is exiting.)
927 if (inotify_fd_ >= 0) 921 if (inotify_fd_ >= 0)
928 ShutDown(); 922 ShutDown();
929 DCHECK(inotify_fd_ < 0); 923 DCHECK(inotify_fd_ < 0);
930 } 924 }
931 925
932 virtual bool Init( 926 bool Init(const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner,
933 const scoped_refptr<base::SingleThreadTaskRunner>& glib_task_runner, 927 const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner)
934 const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner)
935 override { 928 override {
936 // This has to be called on the UI thread (http://crbug.com/69057). 929 // This has to be called on the UI thread (http://crbug.com/69057).
937 base::ThreadRestrictions::ScopedAllowIO allow_io; 930 base::ThreadRestrictions::ScopedAllowIO allow_io;
938 DCHECK(inotify_fd_ < 0); 931 DCHECK(inotify_fd_ < 0);
939 inotify_fd_ = inotify_init(); 932 inotify_fd_ = inotify_init();
940 if (inotify_fd_ < 0) { 933 if (inotify_fd_ < 0) {
941 PLOG(ERROR) << "inotify_init failed"; 934 PLOG(ERROR) << "inotify_init failed";
942 return false; 935 return false;
943 } 936 }
944 int flags = fcntl(inotify_fd_, F_GETFL); 937 int flags = fcntl(inotify_fd_, F_GETFL);
945 if (fcntl(inotify_fd_, F_SETFL, flags | O_NONBLOCK) < 0) { 938 if (fcntl(inotify_fd_, F_SETFL, flags | O_NONBLOCK) < 0) {
946 PLOG(ERROR) << "fcntl failed"; 939 PLOG(ERROR) << "fcntl failed";
947 close(inotify_fd_); 940 close(inotify_fd_);
948 inotify_fd_ = -1; 941 inotify_fd_ = -1;
949 return false; 942 return false;
950 } 943 }
951 file_task_runner_ = file_task_runner; 944 file_task_runner_ = file_task_runner;
952 // The initial read is done on the current thread, not 945 // The initial read is done on the current thread, not
953 // |file_task_runner_|, since we will need to have it for 946 // |file_task_runner_|, since we will need to have it for
954 // SetUpAndFetchInitialConfig(). 947 // SetUpAndFetchInitialConfig().
955 UpdateCachedSettings(); 948 UpdateCachedSettings();
956 return true; 949 return true;
957 } 950 }
958 951
959 virtual void ShutDown() override { 952 void ShutDown() override {
960 if (inotify_fd_ >= 0) { 953 if (inotify_fd_ >= 0) {
961 ResetCachedSettings(); 954 ResetCachedSettings();
962 inotify_watcher_.StopWatchingFileDescriptor(); 955 inotify_watcher_.StopWatchingFileDescriptor();
963 close(inotify_fd_); 956 close(inotify_fd_);
964 inotify_fd_ = -1; 957 inotify_fd_ = -1;
965 } 958 }
966 } 959 }
967 960
968 virtual bool SetUpNotifications( 961 bool SetUpNotifications(
969 ProxyConfigServiceLinux::Delegate* delegate) override { 962 ProxyConfigServiceLinux::Delegate* delegate) override {
970 DCHECK(inotify_fd_ >= 0); 963 DCHECK(inotify_fd_ >= 0);
971 DCHECK(file_task_runner_->BelongsToCurrentThread()); 964 DCHECK(file_task_runner_->BelongsToCurrentThread());
972 // We can't just watch the kioslaverc file directly, since KDE will write 965 // We can't just watch the kioslaverc file directly, since KDE will write
973 // a new copy of it and then rename it whenever settings are changed and 966 // a new copy of it and then rename it whenever settings are changed and
974 // inotify watches inodes (so we'll be watching the old deleted file after 967 // inotify watches inodes (so we'll be watching the old deleted file after
975 // the first change, and it will never change again). So, we watch the 968 // the first change, and it will never change again). So, we watch the
976 // directory instead. We then act only on changes to the kioslaverc entry. 969 // directory instead. We then act only on changes to the kioslaverc entry.
977 if (inotify_add_watch(inotify_fd_, kde_config_dir_.value().c_str(), 970 if (inotify_add_watch(inotify_fd_, kde_config_dir_.value().c_str(),
978 IN_MODIFY | IN_MOVED_TO) < 0) { 971 IN_MODIFY | IN_MOVED_TO) < 0) {
979 return false; 972 return false;
980 } 973 }
981 notify_delegate_ = delegate; 974 notify_delegate_ = delegate;
982 if (!base::MessageLoopForIO::current()->WatchFileDescriptor( 975 if (!base::MessageLoopForIO::current()->WatchFileDescriptor(
983 inotify_fd_, true, base::MessageLoopForIO::WATCH_READ, 976 inotify_fd_, true, base::MessageLoopForIO::WATCH_READ,
984 &inotify_watcher_, this)) { 977 &inotify_watcher_, this)) {
985 return false; 978 return false;
986 } 979 }
987 // Simulate a change to avoid possibly losing updates before this point. 980 // Simulate a change to avoid possibly losing updates before this point.
988 OnChangeNotification(); 981 OnChangeNotification();
989 return true; 982 return true;
990 } 983 }
991 984
992 virtual const scoped_refptr<base::SingleThreadTaskRunner>& 985 const scoped_refptr<base::SingleThreadTaskRunner>& GetNotificationTaskRunner()
993 GetNotificationTaskRunner() override { 986 override {
994 return file_task_runner_; 987 return file_task_runner_;
995 } 988 }
996 989
997 // Implement base::MessagePumpLibevent::Watcher. 990 // Implement base::MessagePumpLibevent::Watcher.
998 virtual void OnFileCanReadWithoutBlocking(int fd) override { 991 void OnFileCanReadWithoutBlocking(int fd) override {
999 DCHECK_EQ(fd, inotify_fd_); 992 DCHECK_EQ(fd, inotify_fd_);
1000 DCHECK(file_task_runner_->BelongsToCurrentThread()); 993 DCHECK(file_task_runner_->BelongsToCurrentThread());
1001 OnChangeNotification(); 994 OnChangeNotification();
1002 } 995 }
1003 virtual void OnFileCanWriteWithoutBlocking(int fd) override { 996 void OnFileCanWriteWithoutBlocking(int fd) override { NOTREACHED(); }
1004 NOTREACHED();
1005 }
1006 997
1007 virtual ProxyConfigSource GetConfigSource() override { 998 ProxyConfigSource GetConfigSource() override {
1008 return PROXY_CONFIG_SOURCE_KDE; 999 return PROXY_CONFIG_SOURCE_KDE;
1009 } 1000 }
1010 1001
1011 virtual bool GetString(StringSetting key, std::string* result) override { 1002 bool GetString(StringSetting key, std::string* result) override {
1012 string_map_type::iterator it = string_table_.find(key); 1003 string_map_type::iterator it = string_table_.find(key);
1013 if (it == string_table_.end()) 1004 if (it == string_table_.end())
1014 return false; 1005 return false;
1015 *result = it->second; 1006 *result = it->second;
1016 return true; 1007 return true;
1017 } 1008 }
1018 virtual bool GetBool(BoolSetting key, bool* result) override { 1009 bool GetBool(BoolSetting key, bool* result) override {
1019 // We don't ever have any booleans. 1010 // We don't ever have any booleans.
1020 return false; 1011 return false;
1021 } 1012 }
1022 virtual bool GetInt(IntSetting key, int* result) override { 1013 bool GetInt(IntSetting key, int* result) override {
1023 // We don't ever have any integers. (See AddProxy() below about ports.) 1014 // We don't ever have any integers. (See AddProxy() below about ports.)
1024 return false; 1015 return false;
1025 } 1016 }
1026 virtual bool GetStringList(StringListSetting key, 1017 bool GetStringList(StringListSetting key,
1027 std::vector<std::string>* result) override { 1018 std::vector<std::string>* result) override {
1028 strings_map_type::iterator it = strings_table_.find(key); 1019 strings_map_type::iterator it = strings_table_.find(key);
1029 if (it == strings_table_.end()) 1020 if (it == strings_table_.end())
1030 return false; 1021 return false;
1031 *result = it->second; 1022 *result = it->second;
1032 return true; 1023 return true;
1033 } 1024 }
1034 1025
1035 virtual bool BypassListIsReversed() override { 1026 bool BypassListIsReversed() override { return reversed_bypass_list_; }
1036 return reversed_bypass_list_;
1037 }
1038 1027
1039 virtual bool MatchHostsUsingSuffixMatching() override { 1028 bool MatchHostsUsingSuffixMatching() override { return true; }
1040 return true;
1041 }
1042 1029
1043 private: 1030 private:
1044 void ResetCachedSettings() { 1031 void ResetCachedSettings() {
1045 string_table_.clear(); 1032 string_table_.clear();
1046 strings_table_.clear(); 1033 strings_table_.clear();
1047 indirect_manual_ = false; 1034 indirect_manual_ = false;
1048 auto_no_pac_ = false; 1035 auto_no_pac_ = false;
1049 reversed_bypass_list_ = false; 1036 reversed_bypass_list_ = false;
1050 } 1037 }
1051 1038
(...skipping 721 matching lines...) Expand 10 before | Expand all | Expand 10 after
1773 void ProxyConfigServiceLinux::RemoveObserver(Observer* observer) { 1760 void ProxyConfigServiceLinux::RemoveObserver(Observer* observer) {
1774 delegate_->RemoveObserver(observer); 1761 delegate_->RemoveObserver(observer);
1775 } 1762 }
1776 1763
1777 ProxyConfigService::ConfigAvailability 1764 ProxyConfigService::ConfigAvailability
1778 ProxyConfigServiceLinux::GetLatestProxyConfig(ProxyConfig* config) { 1765 ProxyConfigServiceLinux::GetLatestProxyConfig(ProxyConfig* config) {
1779 return delegate_->GetLatestProxyConfig(config); 1766 return delegate_->GetLatestProxyConfig(config);
1780 } 1767 }
1781 1768
1782 } // namespace net 1769 } // namespace net
OLDNEW
« no previous file with comments | « net/proxy/proxy_config_service_linux.h ('k') | net/proxy/proxy_config_service_linux_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698