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

Unified Diff: net/proxy/proxy_config_service_linux.cc

Issue 6990008: LBYL on GSettings (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698