[epiphany] Add custom user-agent support



commit e896b194fbff39b480c571483c7d549865f38960
Author: Vincent Untz <vuntz gnome org>
Date:   Fri Dec 18 20:32:51 2009 +0100

    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 <xan gnome org>

 data/epiphany.schemas.in |   11 ++++++
 embed/ephy-embed-prefs.c |   88 +++++++++++++++++++++++++++++++++++++++++++++-
 embed/ephy-embed-prefs.h |    1 +
 3 files changed, 99 insertions(+), 1 deletions(-)
---
diff --git a/data/epiphany.schemas.in b/data/epiphany.schemas.in
index 5faccc4..bdfa8c2 100644
--- a/data/epiphany.schemas.in
+++ b/data/epiphany.schemas.in
@@ -94,6 +94,17 @@
         <short>Enable smooth scrolling</short>
         </locale>
       </schema>
+      <schema>
+        <key>/schemas/apps/epiphany/general/user_agent</key>
+        <applyto>/apps/epiphany/general/user_agent</applyto>
+        <owner>epiphany</owner>
+        <type>string</type>
+        <default></default>
+        <locale name="C">
+        <short>User agent</short>
+        <long>String that will be used as user agent, to identify the browser to the web servers.</long>
+        </locale>
+     </schema>
      <schema>
         <key>/schemas/apps/epiphany/web/minimum_font_size</key>
         <applyto>/apps/epiphany/web/minimum_font_size</applyto>
diff --git a/embed/ephy-embed-prefs.c b/embed/ephy-embed-prefs.c
index cb64b30..a7cf60e 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 ada4ac8..4865aa0 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"



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]