From e896b194fbff39b480c571483c7d549865f38960 Mon Sep 17 00:00:00 2001 From: Vincent Untz Date: Fri, 18 Dec 2009 20:32:51 +0100 Subject: Add custom user-agent support We default to the WebKitGTK+ user agent with Epiphany and the version appended to it. This can be overriden/modified in two ways: - The gconf key /apps/epiphany/general/user_agent has the maximum priority, and if it's set it will be always used. - If the gconf key is not set, vendors can still customize the UA by placing a branding.conf file in the share data directory. One example would be: [User Agent] Vendor=SUSE VendorSub=11.2 VendorComment=2.29.94-1 And the result would be: Mozilla/5.0 (X11; U; Linux i686; fr-fr) AppleWebKit/531.2+ (KHTML, like Gecko) Safari/531.2+ SUSE/11.2 (2.29.94-1) Epiphany/2.29.94 Bug #580903 Signed-off-by: Xan Lopez --- data/epiphany.schemas.in | 11 ++++++ embed/ephy-embed-prefs.c | 88 +++++++++++++++++++++++++++++++++++++++++++++++- embed/ephy-embed-prefs.h | 1 + 3 files changed, 99 insertions(+), 1 deletion(-) diff --git a/data/epiphany.schemas.in b/data/epiphany.schemas.in index 5faccc472..bdfa8c267 100644 --- a/data/epiphany.schemas.in +++ b/data/epiphany.schemas.in @@ -94,6 +94,17 @@ Enable smooth scrolling + + /schemas/apps/epiphany/general/user_agent + /apps/epiphany/general/user_agent + epiphany + string + + + User agent + String that will be used as user agent, to identify the browser to the web servers. + + /schemas/apps/epiphany/web/minimum_font_size /apps/epiphany/web/minimum_font_size diff --git a/embed/ephy-embed-prefs.c b/embed/ephy-embed-prefs.c index cb64b3012..a7cf60eaa 100644 --- a/embed/ephy-embed-prefs.c +++ b/embed/ephy-embed-prefs.c @@ -134,6 +134,89 @@ webkit_pref_callback_user_stylesheet (GConfClient *client, g_free (uri); } +static char * +webkit_pref_get_internal_user_agent (void) +{ + char *user_agent; + char *webkit_user_agent; + char *vendor_user_agent; + GKeyFile *branding_keyfile; + + vendor_user_agent = NULL; + branding_keyfile = g_key_file_new (); + + if (g_key_file_load_from_file (branding_keyfile, SHARE_DIR"/branding.conf", + G_KEY_FILE_NONE, NULL)) { + char *vendor; + char *vendor_sub; + char *vendor_comment; + + vendor = g_key_file_get_string (branding_keyfile, + "User Agent", "Vendor", NULL); + vendor_sub = g_key_file_get_string (branding_keyfile, + "User Agent", "VendorSub", NULL); + vendor_comment = g_key_file_get_string (branding_keyfile, + "User Agent", "VendorComment", NULL); + + if (vendor) { + vendor_user_agent = g_strconcat (vendor, + vendor_sub ? "/" : "", + vendor_sub ? vendor_sub : "", + vendor_comment ? " (" : "", + vendor_comment ? vendor_comment : "", + vendor_comment ? ")" : "", + NULL); + } + + g_free (vendor); + g_free (vendor_sub); + g_free (vendor_comment); + } + + g_key_file_free (branding_keyfile); + + g_object_get (settings, "user-agent", &webkit_user_agent, NULL); + + user_agent = g_strconcat (webkit_user_agent, " ", + vendor_user_agent ? vendor_user_agent : "", + vendor_user_agent ? " " : "", + "Epiphany/"VERSION, + NULL); + + g_free (vendor_user_agent); + g_free (webkit_user_agent); + + return user_agent; +} + +static void +webkit_pref_callback_user_agent (GConfClient *client, + guint cnxn_id, + GConfEntry *entry, + gpointer data) +{ + GConfValue *gcvalue; + const char *value = NULL; + static char *internal_user_agent = NULL; + char *webkit_pref = data; + + gcvalue = gconf_entry_get_value (entry); + + /* happens on initial notify if the key doesn't exist */ + if (gcvalue != NULL && + gcvalue->type == GCONF_VALUE_STRING) { + value = gconf_value_get_string (gcvalue); + } + + if (value == NULL || value[0] == '\0') { + if (internal_user_agent == NULL) + internal_user_agent = webkit_pref_get_internal_user_agent (); + + g_object_set (settings, webkit_pref, internal_user_agent, NULL); + } else + g_object_set (settings, webkit_pref, value, NULL); +} + static void webkit_pref_callback_font_size (GConfClient *client, guint cnxn_id, @@ -286,7 +369,10 @@ static const PrefData webkit_pref_entries[] = webkit_pref_callback_boolean }, { CONF_RENDERING_LANGUAGE, "accept-language", - webkit_pref_callback_accept_languages } + webkit_pref_callback_accept_languages }, + { CONF_USER_AGENT, + "user-agent", + webkit_pref_callback_user_agent } }; static void diff --git a/embed/ephy-embed-prefs.h b/embed/ephy-embed-prefs.h index ada4ac860..4865aa0ed 100644 --- a/embed/ephy-embed-prefs.h +++ b/embed/ephy-embed-prefs.h @@ -41,6 +41,7 @@ #define CONF_DISPLAY_SMOOTHSCROLL "/apps/epiphany/web/smooth_scroll" #define CONF_WEB_INSPECTOR_ENABLED "/apps/epiphany/web/inspector_enabled" #define CONF_CARET_BROWSING_ENABLED "/apps/epiphany/web/browse_with_caret" +#define CONF_USER_AGENT "/apps/epiphany/general/user_agent" /* These are defined gnome wide now */ #define CONF_NETWORK_PROXY_MODE "/system/proxy/mode" -- cgit v1.2.3