Provide identification string and proxy server preferences

This works with libSoup stable, if WebKit uses libSoup.
This commit is contained in:
Christian Dywan 2008-12-08 23:18:14 +01:00
parent e1075f1aae
commit 219c6bdf4c
4 changed files with 228 additions and 17 deletions

View file

@ -1274,7 +1274,9 @@ cookie_jar_changed_cb (SoupCookieJar* jar,
} }
} }
} }
#endif
#if HAVE_LIBSOUP
/* The following code hooks up to any created cookie jar in order to /* The following code hooks up to any created cookie jar in order to
load and save cookies. This is *not* a generally advisable technique load and save cookies. This is *not* a generally advisable technique
but merely a preliminary workaround until WebKit exposes its but merely a preliminary workaround until WebKit exposes its
@ -1283,15 +1285,18 @@ static GObjectConstructed old_jar_constructed_cb;
static void static void
cookie_jar_constructed_cb (GObject* object) cookie_jar_constructed_cb (GObject* object)
{ {
#if HAVE_LIBSOUP_2_25_2
gchar* config_path; gchar* config_path;
gchar* config_file; gchar* config_file;
SoupCookieJar* jar; SoupCookieJar* jar;
#endif
if (old_jar_constructed_cb) if (old_jar_constructed_cb)
old_jar_constructed_cb (object); old_jar_constructed_cb (object);
g_type_set_qdata (SOUP_TYPE_COOKIE_JAR, g_type_set_qdata (SOUP_TYPE_COOKIE_JAR,
g_quark_from_static_string ("midori-has-jar"), (void*)1); g_quark_from_static_string ("midori-has-jar"), (void*)1);
#if HAVE_LIBSOUP_2_25_2
config_path = g_build_filename (g_get_user_config_dir (), config_path = g_build_filename (g_get_user_config_dir (),
PACKAGE_NAME, NULL); PACKAGE_NAME, NULL);
g_mkdir_with_parents (config_path, 0700); g_mkdir_with_parents (config_path, 0700);
@ -1301,6 +1306,7 @@ cookie_jar_constructed_cb (GObject* object)
g_signal_connect_data (jar, "changed", g_signal_connect_data (jar, "changed",
G_CALLBACK (cookie_jar_changed_cb), config_file, G_CALLBACK (cookie_jar_changed_cb), config_file,
(GClosureNotify)g_free, 0); (GClosureNotify)g_free, 0);
#endif
} }
#endif #endif
@ -1433,12 +1439,22 @@ static void
soup_session_constructed_cb (GObject* object) soup_session_constructed_cb (GObject* object)
{ {
MidoriApp* app; MidoriApp* app;
MidoriWebSettings* settings;
SoupSession* session; SoupSession* session;
SoupURI* proxy_uri;
if (old_session_constructed_cb) if (old_session_constructed_cb)
old_session_constructed_cb (object); old_session_constructed_cb (object);
app = g_type_get_qdata (SOUP_TYPE_SESSION, app = g_type_get_qdata (SOUP_TYPE_SESSION,
g_quark_from_static_string ("midori-app")); g_quark_from_static_string ("midori-app"));
settings = katze_object_get_object (app, "settings");
proxy_uri = soup_uri_new (katze_object_get_string (settings, "http-proxy"));
g_object_set (object,
"user-agent", katze_object_get_string (settings, "ident-string"),
"proxy-uri", proxy_uri,
NULL);
if (proxy_uri)
soup_uri_free (proxy_uri);
session = SOUP_SESSION (object); session = SOUP_SESSION (object);
g_signal_connect (session, "authenticate", g_signal_connect (session, "authenticate",
@ -1566,7 +1582,7 @@ main (int argc,
return 1; return 1;
} }
#if HAVE_LIBSOUP_2_25_2 #if HAVE_LIBSOUP
/* This is a nasty trick that allows us to manipulate cookies /* This is a nasty trick that allows us to manipulate cookies
even without having a pointer to the jar. */ even without having a pointer to the jar. */
soup_cookie_jar_get_type (); soup_cookie_jar_get_type ();
@ -1578,8 +1594,6 @@ main (int argc,
old_jar_constructed_cb = G_OBJECT_CLASS (jar_class)->constructed; old_jar_constructed_cb = G_OBJECT_CLASS (jar_class)->constructed;
G_OBJECT_CLASS (jar_class)->constructed = cookie_jar_constructed_cb; G_OBJECT_CLASS (jar_class)->constructed = cookie_jar_constructed_cb;
} }
#endif
#if HAVE_LIBSOUP
/* This is a nasty trick that allows us to manipulate preferences /* This is a nasty trick that allows us to manipulate preferences
even without having a pointer to the session. */ even without having a pointer to the session. */
soup_session_get_type (); soup_session_get_type ();

View file

@ -220,6 +220,16 @@ proxy_download_manager_icon_cb (GtkWidget* entry,
return FALSE; return FALSE;
} }
static void
midori_preferences_notify_identify_as_cb (MidoriWebSettings* settings,
GParamSpec* pspec,
GtkWidget* entry)
{
MidoriIdentity identify_as = katze_object_get_enum (settings, "identify-as");
gtk_widget_set_sensitive (entry, identify_as == MIDORI_IDENT_CUSTOM);
}
#ifdef HAVE_OSX #ifdef HAVE_OSX
static void static void
midori_preferences_help_clicked_cb (GtkWidget* button, midori_preferences_help_clicked_cb (GtkWidget* button,
@ -480,35 +490,52 @@ midori_preferences_set_settings (MidoriPreferences* preferences,
WIDGET_ADD (button, 1, 2, 5, 6); WIDGET_ADD (button, 1, 2, 5, 6);
/* Page "Network" */ /* Page "Network" */
#if 0 #if HAVE_LIBSOUP
/* If a cookie jar was created, WebKit is using Soup */
if (g_type_get_qdata (SOUP_TYPE_COOKIE_JAR,
g_quark_from_static_string ("midori-has-jar")))
{
PAGE_NEW (GTK_STOCK_NETWORK, _("Network")); PAGE_NEW (GTK_STOCK_NETWORK, _("Network"));
FRAME_NEW (_("Network")); FRAME_NEW (_("Network"));
TABLE_NEW (2, 2); TABLE_NEW (4, 2);
label = katze_property_label (settings, "http-proxy"); label = katze_property_label (settings, "http-proxy");
INDENTED_ADD (label, 0, 1, 0, 1); INDENTED_ADD (label, 0, 1, 0, 1);
button = katze_property_proxy (settings, "http-proxy", NULL); button = katze_property_proxy (settings, "http-proxy", NULL);
FILLED_ADD (button, 1, 2, 0, 1); FILLED_ADD (button, 1, 2, 0, 1);
label = katze_property_label (settings, "cache-size"); label = katze_property_label (settings, "identify-as");
INDENTED_ADD (label, 0, 1, 1, 2); INDENTED_ADD (label, 0, 1, 1, 2);
button = katze_property_proxy (settings, "identify-as", NULL);
FILLED_ADD (button, 1, 2, 1, 2);
label = katze_property_label (settings, "ident-string");
INDENTED_ADD (label, 0, 1, 2, 3);
entry = katze_property_proxy (settings, "ident-string", NULL);
g_signal_connect (settings, "notify::identify-as",
G_CALLBACK (midori_preferences_notify_identify_as_cb), entry);
midori_preferences_notify_identify_as_cb (settings, NULL, entry);
FILLED_ADD (entry, 1, 2, 2, 3);
label = katze_property_label (settings, "cache-size");
INDENTED_ADD (label, 0, 1, 3, 4);
hbox = gtk_hbox_new (FALSE, 4); hbox = gtk_hbox_new (FALSE, 4);
entry = katze_property_proxy (settings, "cache-size", NULL); entry = katze_property_proxy (settings, "cache-size", NULL);
gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new (_("MB")), gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new (_("MB")),
FALSE, FALSE, 0); FALSE, FALSE, 0);
FILLED_ADD (hbox, 1, 2, 1, 2); FILLED_ADD (hbox, 1, 2, 3, 4);
}
#endif #endif
/* Page "Privacy" */ /* Page "Privacy" */
PAGE_NEW (GTK_STOCK_INDEX, _("Privacy")); PAGE_NEW (GTK_STOCK_INDEX, _("Privacy"));
#if HAVE_LIBSOUP_2_25_2 #if HAVE_LIBSOUP_2_25_2
/* If a cookie jar was created, WebKit is using Soup */
if (g_type_get_qdata (SOUP_TYPE_COOKIE_JAR,
g_quark_from_static_string ("midori-has-jar")))
{
FRAME_NEW (_("Web Cookies")); FRAME_NEW (_("Web Cookies"));
TABLE_NEW (3, 2); TABLE_NEW (3, 2);
label = katze_property_label (settings, "accept-cookies"); label = katze_property_label (settings, "accept-cookies");
INDENTED_ADD (label, 0, 1, 0, 1); INDENTED_ADD (label, 0, 1, 0, 1);
button = katze_property_proxy (settings, "accept-cookies", NULL); button = katze_property_proxy (settings, "accept-cookies", NULL);
/* If a cookie jar was created, WebKit is using Soup */
gtk_widget_set_sensitive (button, g_type_get_qdata (SOUP_TYPE_COOKIE_JAR,
g_quark_from_static_string ("midori-has-jar")) != NULL);
FILLED_ADD (button, 1, 2, 0, 1); FILLED_ADD (button, 1, 2, 0, 1);
button = katze_property_proxy (settings, "original-cookies-only", "blurb"); button = katze_property_proxy (settings, "original-cookies-only", "blurb");
SPANNED_ADD (button, 0, 2, 1, 2); SPANNED_ADD (button, 0, 2, 1, 2);
@ -516,13 +543,11 @@ midori_preferences_set_settings (MidoriPreferences* preferences,
INDENTED_ADD (label, 0, 1, 2, 3); INDENTED_ADD (label, 0, 1, 2, 3);
hbox = gtk_hbox_new (FALSE, 4); hbox = gtk_hbox_new (FALSE, 4);
entry = katze_property_proxy (settings, "maximum-cookie-age", NULL); entry = katze_property_proxy (settings, "maximum-cookie-age", NULL);
/* If a cookie jar was created, WebKit is using Soup */
gtk_widget_set_sensitive (entry, g_type_get_qdata (SOUP_TYPE_COOKIE_JAR,
g_quark_from_static_string ("midori-has-jar")) != NULL);
gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new (_("days")), gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new (_("days")),
FALSE, FALSE, 0); FALSE, FALSE, 0);
FILLED_ADD (hbox, 1, 2, 2, 3); FILLED_ADD (hbox, 1, 2, 2, 3);
}
#endif #endif
FRAME_NEW (_("History")); FRAME_NEW (_("History"));
TABLE_NEW (3, 2); TABLE_NEW (3, 2);

View file

@ -16,6 +16,10 @@
#include <glib/gi18n.h> #include <glib/gi18n.h>
#include <string.h> #include <string.h>
#if HAVE_CONFIG_H
#include <config.h>
#endif
struct _MidoriWebSettings struct _MidoriWebSettings
{ {
WebKitWebSettings parent_instance; WebKitWebSettings parent_instance;
@ -64,9 +68,16 @@ struct _MidoriWebSettings
gboolean remember_last_downloaded_files; gboolean remember_last_downloaded_files;
gchar* http_proxy; gchar* http_proxy;
MidoriIdentity identify_as;
gchar* ident_string;
gint cache_size; gint cache_size;
}; };
struct _MidoriWebSettingsClass
{
WebKitWebSettingsClass parent_class;
};
G_DEFINE_TYPE (MidoriWebSettings, midori_web_settings, WEBKIT_TYPE_WEB_SETTINGS) G_DEFINE_TYPE (MidoriWebSettings, midori_web_settings, WEBKIT_TYPE_WEB_SETTINGS)
enum enum
@ -118,6 +129,8 @@ enum
PROP_REMEMBER_LAST_DOWNLOADED_FILES, PROP_REMEMBER_LAST_DOWNLOADED_FILES,
PROP_HTTP_PROXY, PROP_HTTP_PROXY,
PROP_IDENTIFY_AS,
PROP_IDENT_STRING,
PROP_CACHE_SIZE PROP_CACHE_SIZE
}; };
@ -150,7 +163,7 @@ midori_preferred_encoding_get_type (void)
{ MIDORI_ENCODING_RUSSIAN, "MIDORI_ENCODING_RUSSIAN", N_("Russian (KOI8-R)") }, { MIDORI_ENCODING_RUSSIAN, "MIDORI_ENCODING_RUSSIAN", N_("Russian (KOI8-R)") },
{ MIDORI_ENCODING_UNICODE, "MIDORI_ENCODING_UNICODE", N_("Unicode (UTF-8)") }, { MIDORI_ENCODING_UNICODE, "MIDORI_ENCODING_UNICODE", N_("Unicode (UTF-8)") },
{ MIDORI_ENCODING_WESTERN, "MIDORI_ENCODING_WESTERN", N_("Western (ISO-8859-1)") }, { MIDORI_ENCODING_WESTERN, "MIDORI_ENCODING_WESTERN", N_("Western (ISO-8859-1)") },
{ MIDORI_ENCODING_WESTERN, "MIDORI_ENCODING_CUSTOM", N_("Custom...") }, { MIDORI_ENCODING_CUSTOM, "MIDORI_ENCODING_CUSTOM", N_("Custom...") },
{ 0, NULL, NULL } { 0, NULL, NULL }
}; };
type = g_enum_register_static ("MidoriPreferredEncoding", values); type = g_enum_register_static ("MidoriPreferredEncoding", values);
@ -211,6 +224,25 @@ midori_accept_cookies_get_type (void)
return type; return type;
} }
GType
midori_identity_get_type (void)
{
static GType type = 0;
if (!type)
{
static const GEnumValue values[] = {
{ MIDORI_IDENT_MIDORI, "MIDORI_IDENT_MIDORI", N_("Midori") },
{ MIDORI_IDENT_SAFARI, "MIDORI_IDENT_SAFARI", N_("Safari") },
{ MIDORI_IDENT_FIREFOX, "MIDORI_IDENT_FIREFOX", N_("Firefox") },
{ MIDORI_IDENT_EXPLORER, "MIDORI_IDENT_EXPLORER", N_("Internet Explorer") },
{ MIDORI_IDENT_CUSTOM, "MIDORI_IDENT_CUSTOM", N_("Custom...") },
{ 0, NULL, NULL }
};
type = g_enum_register_static ("MidoriIdentity", values);
}
return type;
}
static void static void
midori_web_settings_finalize (GObject* object); midori_web_settings_finalize (GObject* object);
@ -538,7 +570,11 @@ midori_web_settings_class_init (MidoriWebSettingsClass* class)
_("What type of cookies to accept"), _("What type of cookies to accept"),
MIDORI_TYPE_ACCEPT_COOKIES, MIDORI_TYPE_ACCEPT_COOKIES,
MIDORI_ACCEPT_COOKIES_ALL, MIDORI_ACCEPT_COOKIES_ALL,
#if HAVE_LIBSOUP
G_PARAM_READWRITE)); G_PARAM_READWRITE));
#else
G_PARAM_READABLE));
#endif
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_ORIGINAL_COOKIES_ONLY, PROP_ORIGINAL_COOKIES_ONLY,
@ -605,7 +641,52 @@ midori_web_settings_class_init (MidoriWebSettingsClass* class)
_("HTTP Proxy"), _("HTTP Proxy"),
_("The proxy used for HTTP connections"), _("The proxy used for HTTP connections"),
NULL, NULL,
#if HAVE_LIBSOUP
G_PARAM_READWRITE));
#else
G_PARAM_READABLE)); G_PARAM_READABLE));
#endif
/**
* MidoriWebSettings:identify-as:
*
* What to identify as to web pages.
*
* Since: 0.1.2
*/
g_object_class_install_property (gobject_class,
PROP_IDENTIFY_AS,
g_param_spec_enum (
"identify-as",
_("Identify as"),
_("What to identify as to web pages"),
MIDORI_TYPE_IDENTITY,
MIDORI_IDENT_MIDORI,
#if HAVE_LIBSOUP
G_PARAM_READWRITE));
#else
G_PARAM_READABLE));
#endif
/**
* MidoriWebSettings:ident-string:
*
* The browser identification string.
*
* Since: 0.1.2
*/
g_object_class_install_property (gobject_class,
PROP_IDENT_STRING,
g_param_spec_string (
"ident-string",
_("Identification string"),
_("The application identification string"),
NULL,
#if HAVE_LIBSOUP
G_PARAM_READWRITE));
#else
G_PARAM_READABLE));
#endif
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_CACHE_SIZE, PROP_CACHE_SIZE,
@ -659,6 +740,69 @@ midori_web_settings_finalize (GObject* object)
G_OBJECT_CLASS (midori_web_settings_parent_class)->finalize (object); G_OBJECT_CLASS (midori_web_settings_parent_class)->finalize (object);
} }
static gchar*
generate_ident_string (MidoriIdentity identify_as)
{
const gchar* platform =
#ifdef GDK_WINDOWING_X11
"X11";
#elif defined(GDK_WINDOWING_WIN32)
"Windows";
#elif defined(GDK_WINDOWING_QUARTZ)
"Macintosh";
#elif defined(GDK_WINDOWING_DIRECTFB)
"DirectFB";
#else
"Unknown";
#endif
const gchar* os =
#if defined (HAVE_OSX)
/* #if defined (HAVE_X86) */
"Intel Mac OS X";
/* #else
"PPC Mac OS X";
#endif */
#elif defined (G_OS_UNIX)
/* struct utsname name;
if (uname (&name) != -1)
String::format ("%s %s", name.sysname, name.machine);
else
"Unknown";*/
"Linux";
#elif defined (G_OS_WIN32)
// FIXME: Windows NT version
"Windows";
#else
"Unknown";
#endif
const gchar* appname = "Midori/" PACKAGE_VERSION;
const gchar* lang = pango_language_to_string ( gtk_get_default_language ());
switch (identify_as)
{
case MIDORI_IDENT_MIDORI:
return g_strdup_printf ("%s (%s; %s; U; %s) WebKit/532+",
appname, platform, os, lang);
case MIDORI_IDENT_SAFARI:
return g_strdup_printf ("Mozilla/5.0 (%s; U; %s; %s) "
"AppleWebKit/532+ (KHTML, like Gecko) Safari/419.3 %s",
platform, os, lang, appname);
case MIDORI_IDENT_FIREFOX:
return g_strdup_printf ("Mozilla/5.0 (%s; U; %s; %s; rv:1.8.1) "
"Gecko/20061010 Firefox/2.0 %s",
platform, os, lang, appname);
case MIDORI_IDENT_EXPLORER:
return g_strdup_printf ("Mozilla/4.0 (compatible; "
"MSIE 6.0; Windows NT 5.1; %s) %s",
lang, appname);
default:
return g_strdup_printf ("%s", appname);
}
}
static void static void
midori_web_settings_set_property (GObject* object, midori_web_settings_set_property (GObject* object,
guint prop_id, guint prop_id,
@ -807,6 +951,18 @@ midori_web_settings_set_property (GObject* object,
case PROP_HTTP_PROXY: case PROP_HTTP_PROXY:
katze_assign (web_settings->http_proxy, g_value_dup_string (value)); katze_assign (web_settings->http_proxy, g_value_dup_string (value));
break; break;
case PROP_IDENTIFY_AS:
web_settings->identify_as = g_value_get_enum (value);
if (web_settings->identify_as != MIDORI_IDENT_CUSTOM)
{
gchar* string = generate_ident_string (web_settings->identify_as);
g_object_set (object, "ident-string", string, NULL);
g_free (string);
}
break;
case PROP_IDENT_STRING:
katze_assign (web_settings->ident_string, g_value_dup_string (value));
break;
case PROP_CACHE_SIZE: case PROP_CACHE_SIZE:
web_settings->cache_size = g_value_get_int (value); web_settings->cache_size = g_value_get_int (value);
break; break;
@ -947,6 +1103,12 @@ midori_web_settings_get_property (GObject* object,
case PROP_HTTP_PROXY: case PROP_HTTP_PROXY:
g_value_set_string (value, web_settings->http_proxy); g_value_set_string (value, web_settings->http_proxy);
break; break;
case PROP_IDENTIFY_AS:
g_value_set_enum (value, web_settings->identify_as);
break;
case PROP_IDENT_STRING:
g_value_set_string (value, web_settings->ident_string);
break;
case PROP_CACHE_SIZE: case PROP_CACHE_SIZE:
g_value_set_int (value, web_settings->cache_size); g_value_set_int (value, web_settings->cache_size);
break; break;

View file

@ -104,10 +104,20 @@ midori_accept_cookies_get_type (void) G_GNUC_CONST;
#define MIDORI_TYPE_ACCEPT_COOKIES \ #define MIDORI_TYPE_ACCEPT_COOKIES \
(midori_accept_cookies_get_type ()) (midori_accept_cookies_get_type ())
struct _MidoriWebSettingsClass typedef enum
{ {
WebKitWebSettingsClass parent_class; MIDORI_IDENT_MIDORI,
}; MIDORI_IDENT_SAFARI,
MIDORI_IDENT_FIREFOX,
MIDORI_IDENT_EXPLORER,
MIDORI_IDENT_CUSTOM
} MidoriIdentity;
GType
midori_identity_get_type (void) G_GNUC_CONST;
#define MIDORI_TYPE_IDENTITY \
(midori_identity_get_type ())
GType GType
midori_web_settings_get_type (void); midori_web_settings_get_type (void);