Index: net/proxy/proxy_config_service_linux.cc |
diff --git a/net/proxy/proxy_config_service_linux.cc b/net/proxy/proxy_config_service_linux.cc |
index c575584107ff5997d8dafb379f4ebbabb5361e20..3e60dc4062abf8d55b7e7fb08abb1c894c15d0c9 100644 |
--- a/net/proxy/proxy_config_service_linux.cc |
+++ b/net/proxy/proxy_config_service_linux.cc |
@@ -522,6 +522,16 @@ class SettingGetterImplGSettings |
#endif |
} |
+ bool SchemaExists(const char* schema_name) { |
+ const gchar* const* schemas = g_settings_list_schemas(); |
+ while (*schemas) { |
+ if (strcmp(schema_name, reinterpret_cast<const char*>(schemas)) == 0) |
+ return true; |
+ schemas++; |
+ } |
+ return false; |
+ } |
+ |
// LoadAndCheckVersion() must be called *before* Init()! |
bool LoadAndCheckVersion(base::Environment* env); |
@@ -530,8 +540,9 @@ class SettingGetterImplGSettings |
DCHECK(MessageLoop::current() == glib_default_loop); |
DCHECK(!client_); |
DCHECK(!loop_); |
- client_ = g_settings_new("org.gnome.system.proxy"); |
- if (!client_) { |
+ |
+ if (!SchemaExists("org.gnome.system.proxy") || |
+ !(client_ = g_settings_new("org.gnome.system.proxy"))) { |
// It's not clear whether/when this can return NULL. |
LOG(ERROR) << "Unable to create a gsettings client"; |
return false; |
@@ -677,6 +688,7 @@ class SettingGetterImplGSettings |
gchar* (*g_settings_get_string)(GSettings* settings, const gchar* key); |
gint (*g_settings_get_int)(GSettings* settings, const gchar* key); |
gchar** (*g_settings_get_strv)(GSettings* settings, const gchar* key); |
+ const gchar* const* (*g_settings_list_schemas)(); |
// The library handle. |
void* gio_handle_; |
@@ -805,7 +817,9 @@ bool SettingGetterImplGSettings::LoadAndCheckVersion( |
!LoadSymbol("g_settings_get_int", |
reinterpret_cast<void**>(&g_settings_get_int)) || |
!LoadSymbol("g_settings_get_strv", |
- reinterpret_cast<void**>(&g_settings_get_strv))) { |
+ reinterpret_cast<void**>(&g_settings_get_strv)) || |
+ !LoadSymbol("g_settings_list_schemas", |
+ reinterpret_cast<void**>(&g_settings_list_schemas))) { |
VLOG(1) << "Cannot load gsettings API. Will fall back to gconf."; |
dlclose(gio_handle_); |
gio_handle_ = NULL; |
@@ -813,8 +827,9 @@ bool SettingGetterImplGSettings::LoadAndCheckVersion( |
} |
#endif |
- GSettings* client = g_settings_new("org.gnome.system.proxy"); |
- if (!client) { |
+ GSettings* client; |
+ if (!SchemaExists("org.gnome.system.proxy") || |
+ !(client = g_settings_new("org.gnome.system.proxy"))) { |
VLOG(1) << "Cannot create gsettings client. Will fall back to gconf."; |
return false; |
} |