From c202a6b79eb3658c12ba2077cb175a2fe5ae30a1 Mon Sep 17 00:00:00 2001 From: Daiki Ueno Date: Thu, 2 Sep 2010 12:35:41 +0900 Subject: Fix crash on "Open Image in New Window" (FS#231). - create_web_view_js2_cb(): don't destroy web_view if uri is not a "javascript:" URI. - create_web_view_js_cb(): fix g_object_connect() call which must terminate with a NULL signal name. --- src/callbacks.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/callbacks.c b/src/callbacks.c index d2352b2..37f392a 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -703,11 +703,10 @@ create_web_view_js2_cb (WebKitWebView* web_view, GParamSpec param_spec) { if (strncmp(uri, "javascript:", strlen("javascript:")) == 0) { eval_js(uzbl.gui.web_view, (gchar*) uri + strlen("javascript:"), NULL, "javascript:"); + gtk_widget_destroy(GTK_WIDGET(web_view)); } else send_event(NEW_WINDOW, uri, NULL); - - gtk_widget_destroy(GTK_WIDGET(web_view)); } @@ -717,7 +716,7 @@ create_web_view_js_cb (WebKitWebView* web_view, gpointer user_data) { (void) user_data; g_object_connect (web_view, "signal::notify::uri", - G_CALLBACK(create_web_view_js2_cb), NULL); + G_CALLBACK(create_web_view_js2_cb), NULL, NULL); return TRUE; } -- cgit v1.2.3 From 9611080ef53ab8e45a4b02aaf100e473ddb5440d Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Sun, 5 Sep 2010 21:45:26 +0200 Subject: Enable webkit pagecache by default --- src/callbacks.c | 6 ++++++ src/callbacks.h | 3 +++ src/uzbl-core.c | 1 + src/uzbl-core.h | 1 + 4 files changed, 11 insertions(+) (limited to 'src') diff --git a/src/callbacks.c b/src/callbacks.c index d2352b2..17517e4 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -181,6 +181,12 @@ cmd_zoom_level() { webkit_web_view_set_zoom_level (uzbl.gui.web_view, uzbl.behave.zoom_level); } +void +cmd_disable_pagecache() { + g_object_set (G_OBJECT(view_settings()), "enable-page-cache", + !uzbl.behave.disable_pagecache, NULL); +} + void cmd_disable_plugins() { g_object_set (G_OBJECT(view_settings()), "enable-plugins", diff --git a/src/callbacks.h b/src/callbacks.h index fdd08e4..cf3780f 100644 --- a/src/callbacks.h +++ b/src/callbacks.h @@ -58,6 +58,9 @@ cmd_zoom_level(); void cmd_set_zoom_type(); +void +cmd_disable_pagecache(); + void cmd_disable_plugins(); diff --git a/src/uzbl-core.c b/src/uzbl-core.c index 7be98c3..2e87d1b 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -125,6 +125,7 @@ const struct var_name_to_ptr_t { { "fantasy_font_family", PTR_V_STR(uzbl.behave.fantasy_font_family, 1, cmd_fantasy_font_family)}, { "monospace_size", PTR_V_INT(uzbl.behave.monospace_size, 1, cmd_font_size)}, { "minimum_font_size", PTR_V_INT(uzbl.behave.minimum_font_size, 1, cmd_minimum_font_size)}, + { "disable_pagecache", PTR_V_INT(uzbl.behave.disable_pagecache, 1, cmd_disable_pagecache)}, { "disable_plugins", PTR_V_INT(uzbl.behave.disable_plugins, 1, cmd_disable_plugins)}, { "disable_scripts", PTR_V_INT(uzbl.behave.disable_scripts, 1, cmd_disable_scripts)}, { "autoload_images", PTR_V_INT(uzbl.behave.autoload_img, 1, cmd_autoload_img)}, diff --git a/src/uzbl-core.h b/src/uzbl-core.h index 5760423..0c5061a 100644 --- a/src/uzbl-core.h +++ b/src/uzbl-core.h @@ -144,6 +144,7 @@ typedef struct { guint minimum_font_size; gfloat zoom_level; gboolean zoom_type; + guint disable_pagecache; guint disable_plugins; guint disable_scripts; guint autoload_img; -- cgit v1.2.3 From 5510abf69022d8393e6c5fc3d1456cc47f96fa4a Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Mon, 27 Sep 2010 10:41:13 -0600 Subject: move cookie handling into a subclass of SoupCookieJar this cleans up the code and slightly improves efficiency. --- src/callbacks.c | 36 +------ src/callbacks.h | 5 +- src/cookie-jar.c | 289 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/cookie-jar.h | 33 +++++++ src/uzbl-core.c | 173 +-------------------------------- src/uzbl-core.h | 9 +- 6 files changed, 332 insertions(+), 213 deletions(-) create mode 100644 src/cookie-jar.c create mode 100644 src/cookie-jar.h (limited to 'src') diff --git a/src/callbacks.c b/src/callbacks.c index d2352b2..0fbf589 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -831,38 +831,6 @@ populate_popup_cb(WebKitWebView *v, GtkMenu *m, void *c) { } void -save_cookies_js(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie, gpointer user_data) { - (void) jar; - (void) user_data; - (void) old_cookie; - char *scheme; - GString *s; - - if(new_cookie != NULL) { - scheme = (new_cookie->secure == TRUE) ? "https" : "http"; - - s = g_string_new(""); - g_string_printf(s, "PUT '%s' '%s' '%s' '%s=%s'", scheme, new_cookie->domain, new_cookie->path, new_cookie->name, new_cookie->value); - run_handler(uzbl.behave.cookie_handler, s->str); - g_string_free(s, TRUE); - } -} - -void -save_cookies_http(SoupMessage *msg, gpointer user_data) { - (void) user_data; - GSList *ck; - char *cookie; - - for(ck = soup_cookies_from_response(msg); ck; ck = ck->next){ - cookie = soup_cookie_to_set_cookie_header(ck->data); - SoupURI *soup_uri = soup_message_get_uri(msg); - GString *s = g_string_new(""); - g_string_printf(s, "PUT '%s' '%s' '%s' '%s'", soup_uri->scheme, soup_uri->host, soup_uri->path, cookie); - run_handler(uzbl.behave.cookie_handler, s->str); - g_free (cookie); - g_string_free(s, TRUE); - } - - g_slist_free(ck); +cmd_set_cookie_handler() { + uzbl_cookie_jar_set_handler(uzbl.net.soup_cookie_jar, uzbl.behave.cookie_handler); } diff --git a/src/callbacks.h b/src/callbacks.h index fdd08e4..0b89f96 100644 --- a/src/callbacks.h +++ b/src/callbacks.h @@ -212,7 +212,4 @@ gboolean focus_cb(GtkWidget* window, GdkEventFocus* event, void *ud); void -save_cookies_js(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie, gpointer user_data); - -void -save_cookies_http(SoupMessage *msg, gpointer user_data); +cmd_set_cookie_handler(); diff --git a/src/cookie-jar.c b/src/cookie-jar.c new file mode 100644 index 0000000..875fdec --- /dev/null +++ b/src/cookie-jar.c @@ -0,0 +1,289 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "cookie-jar.h" +#include "uzbl-core.h" + +static void +uzbl_cookie_jar_session_feature_init(SoupSessionFeatureInterface *iface, gpointer user_data); + +G_DEFINE_TYPE_WITH_CODE (UzblCookieJar, soup_cookie_jar_socket, SOUP_TYPE_COOKIE_JAR, + G_IMPLEMENT_INTERFACE (SOUP_TYPE_SESSION_FEATURE, uzbl_cookie_jar_session_feature_init)) + +static void request_started (SoupSessionFeature *feature, SoupSession *session, SoupMessage *msg, SoupSocket *socket); +static void changed(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie); + +static void setup_handler(UzblCookieJar *jar); + +static void connect_cookie_socket(UzblCookieJar *jar); +static void disconnect_cookie_socket(UzblCookieJar *jar); + +static gchar *do_socket_request(UzblCookieJar *jar, gchar *request, int request_len); + +static bool has_socket_handler(UzblCookieJar *jar) { + return jar->socket_path != NULL; +} + +static void +soup_cookie_jar_socket_init(UzblCookieJar *jar) { + jar->socket_path = NULL; + jar->connection_fd = -1; +} + +static void +finalize(GObject *object) { + disconnect_cookie_socket(UZBL_COOKIE_JAR(object)); + G_OBJECT_CLASS(soup_cookie_jar_socket_parent_class)->finalize(object); +} + +static void +soup_cookie_jar_socket_class_init(UzblCookieJarClass *socket_class) { + G_OBJECT_CLASS(socket_class)->finalize = finalize; + SOUP_COOKIE_JAR_CLASS(socket_class)->changed = changed; +} + +/* override SoupCookieJar's request_started handler */ +static void +uzbl_cookie_jar_session_feature_init(SoupSessionFeatureInterface *iface, gpointer user_data) { + (void) user_data; + iface->request_started = request_started; +} + +UzblCookieJar *uzbl_cookie_jar_new() { + return g_object_new(UZBL_TYPE_COOKIE_JAR, NULL); +} + +void +uzbl_cookie_jar_set_handler(UzblCookieJar *jar, const gchar* handler) { + jar->handler = handler; + setup_handler(jar); +} + +char *get_cookies(UzblCookieJar *jar, SoupURI *uri) { + gchar *result; + GString *s = g_string_new ("GET"); + + if(has_socket_handler(jar)) { + g_string_append_c(s, 0); /* null-terminate the GET */ + g_string_append_len(s, uri->scheme, strlen(uri->scheme)+1); + g_string_append_len(s, uri->host, strlen(uri->host)+1 ); + g_string_append_len(s, uri->path, strlen(uri->path)+1 ); + + result = do_socket_request(jar, s->str, s->len); + /* try it again; older cookie daemons closed the connection after each request */ + if(result == NULL) + result = do_socket_request(jar, s->str, s->len); + } else { + g_string_append_printf(s, " '%s' '%s' '%s'", uri->scheme, uri->host, uri->path); + + run_handler(jar->handler, s->str); + result = g_strdup(uzbl.comm.sync_stdout); + } + g_string_free(s, TRUE); + return result; +} + +/* this is a duplicate of SoupCookieJar's request_started that uses our get_cookies instead */ +static void +request_started(SoupSessionFeature *feature, SoupSession *session, + SoupMessage *msg, SoupSocket *socket) { + (void) session; (void) socket; + + UzblCookieJar *jar = UZBL_COOKIE_JAR (feature); + SoupURI *uri = soup_message_get_uri(msg); + + gchar *cookies = get_cookies(jar, uri); + + if (cookies && *cookies != 0) { + const gchar *next_cookie_start = cookies; + + /* add the cookie data that we just obtained from the cookie handler + to the cookie jar so that javascript has access to them. + we set this flag so that we don't trigger the PUT handler. */ + jar->in_get_callback = true; + do { + SoupCookie *soup_cookie = soup_cookie_parse(next_cookie_start, uri); + if(soup_cookie) + soup_cookie_jar_add_cookie(SOUP_COOKIE_JAR(uzbl.net.soup_cookie_jar), soup_cookie); + next_cookie_start = strchr(next_cookie_start, ';'); + } while(next_cookie_start++ != NULL); + jar->in_get_callback = false; + + soup_message_headers_replace (msg->request_headers, "Cookie", cookies); + + g_free (cookies); + } else { + soup_message_headers_remove (msg->request_headers, "Cookie"); + } +} + +static void +changed(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie) { + (void) old_cookie; + + UzblCookieJar *uzbl_jar = UZBL_COOKIE_JAR(jar); + + /* when Uzbl begins an HTTP request, it GETs cookies from the handler + and then adds them to the cookie jar so that javascript can access + these cookies. this causes a 'changed' callback, which we don't want + to do anything, so we just return. + + (if SoupCookieJar let us override soup_cookie_jar_get_cookies we + wouldn't have to do this.) */ + if(uzbl_jar->in_get_callback) + return; + + /* the cookie daemon is only interested in new cookies and changed + ones, it can take care of deleting expired cookies on its own. */ + if(!new_cookie) + return; + + GString *s = g_string_new ("PUT"); + + gchar *scheme = (new_cookie->secure == TRUE) ? "https" : "http"; + if(has_socket_handler(uzbl_jar)) { + g_string_append_c(s, 0); /* null-terminate the PUT */ + g_string_append_len(s, scheme, strlen(scheme)+1); + g_string_append_len(s, new_cookie->domain, strlen(new_cookie->domain)+1 ); + g_string_append_len(s, new_cookie->path, strlen(new_cookie->path)+1 ); + g_string_append_printf(s, "%s=%s", new_cookie->name, new_cookie->value); + + gchar *result = do_socket_request(uzbl_jar, s->str, s->len+1); + /* try it again; older cookie daemons closed the connection after each request */ + if(!result) + result = do_socket_request(uzbl_jar, s->str, s->len+1); + } else { + g_string_append_printf(s, " '%s' '%s' '%s' '%s=%s'", scheme, new_cookie->domain, new_cookie->path, new_cookie->name, new_cookie->value); + + run_handler(uzbl_jar->handler, s->str); + } + + g_string_free(s, TRUE); +} + +static void +setup_handler(UzblCookieJar *jar) { + if(strncmp(jar->handler, "talk_to_socket", strlen("talk_to_socket")) == 0) { + /* extract the socket path from the handler. */ + jar->socket_path = jar->handler + strlen("talk_to_socket"); + while(isspace(*jar->socket_path)) + jar->socket_path++; + if(*jar->socket_path == 0) + return; /* there was no path specified. */ + disconnect_cookie_socket(jar); + connect_cookie_socket(jar); + } else { + jar->socket_path = NULL; + } +} + +static void +connect_cookie_socket(UzblCookieJar *jar) { + struct sockaddr_un sa; + int fd; + + g_strlcpy(sa.sun_path, jar->socket_path, sizeof(sa.sun_path)); + sa.sun_family = AF_UNIX; + + /* create socket file descriptor and connect it to path */ + fd = socket(AF_UNIX, SOCK_SEQPACKET, 0); + if(fd == -1) { + g_printerr("connect_cookie_socket: creating socket failed (%s)\n", strerror(errno)); + return; + } + + if(connect(fd, (struct sockaddr*)&sa, sizeof(sa))) { + g_printerr("connect_cookie_socket: connect failed (%s)\n", strerror(errno)); + close(fd); + return; + } + + /* successful connection! */ + jar->connection_fd = fd; +} + +static void +disconnect_cookie_socket(UzblCookieJar *jar) { + if(jar->connection_fd > 0) { + close(jar->connection_fd); + jar->connection_fd = -1; + } +} + +static gchar *do_socket_request(UzblCookieJar *jar, gchar *request, int request_length) { + int len; + ssize_t ret; + struct pollfd pfd; + gchar *result = NULL; + + if(jar->connection_fd < 0) + connect_cookie_socket(jar); /* connection was lost, reconnect */ + + /* write request */ + ret = write(jar->connection_fd, request, request_length); + if(ret == -1) { + g_printerr("talk_to_socket: write failed (%s)\n", strerror(errno)); + disconnect_cookie_socket(jar); + return NULL; + } + + /* wait for a response, with a 500ms timeout */ + pfd.fd = jar->connection_fd; + pfd.events = POLLIN; + while(1) { + ret = poll(&pfd, 1, 500); + if(ret == 1) break; + if(ret == 0) errno = ETIMEDOUT; + if(errno == EINTR) continue; + g_printerr("talk_to_socket: poll failed while waiting for input (%s)\n", + strerror(errno)); + disconnect_cookie_socket(jar); + return NULL; + } + + /* get length of response */ + if(ioctl(jar->connection_fd, FIONREAD, &len) == -1) { + g_printerr("talk_to_socket: cannot find daemon response length, " + "ioctl failed (%s)\n", strerror(errno)); + disconnect_cookie_socket(jar); + return NULL; + } + + /* there was an empty response. */ + if(len == 0) + return g_strdup(""); + + /* there is a response, read it */ + result = g_malloc(len + 1); + if(!result) { + g_printerr("talk_to_socket: failed to allocate %d bytes\n", len); + return NULL; + } + result[len] = 0; /* ensure result is null terminated */ + + gchar *p = result; + while(len > 0) { + ret = read(jar->connection_fd, p, len); + if(ret == -1) { + g_printerr("talk_to_socket: failed to read from socket (%s)\n", + strerror(errno)); + disconnect_cookie_socket(jar); + g_free(result); + return NULL; + } else { + len -= ret; + p += ret; + } + } + + return result; +} diff --git a/src/cookie-jar.h b/src/cookie-jar.h new file mode 100644 index 0000000..80af00e --- /dev/null +++ b/src/cookie-jar.h @@ -0,0 +1,33 @@ +#ifndef UZBL_COOKIE_JAR_H +#define UZBL_COOKIE_JAR_H + +#include + +#define UZBL_TYPE_COOKIE_JAR (soup_cookie_jar_socket_get_type ()) +#define UZBL_COOKIE_JAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), UZBL_TYPE_COOKIE_JAR, UzblCookieJar)) +#define UZBL_COOKIE_JAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), UZBL_TYPE_COOKIE_JAR, UzblCookieJarClass)) + +typedef struct { + SoupCookieJar parent; + + const gchar *handler; + + const gchar *socket_path; + int connection_fd; + + gboolean in_get_callback; +} UzblCookieJar; + +typedef struct { + SoupCookieJarClass parent_class; +} UzblCookieJarClass; + +UzblCookieJar *uzbl_cookie_jar_new(); + +void +uzbl_cookie_jar_set_handler(UzblCookieJar *jar, const gchar *handler); + +char +*get_cookies(UzblCookieJar *jar, SoupURI *uri); + +#endif diff --git a/src/uzbl-core.c b/src/uzbl-core.c index 7be98c3..12d20ae 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -98,7 +98,7 @@ const struct var_name_to_ptr_t { { "title_format_short", PTR_V_STR(uzbl.behave.title_format_short, 1, NULL)}, { "icon", PTR_V_STR(uzbl.gui.icon, 1, set_icon)}, { "forward_keys", PTR_V_INT(uzbl.behave.forward_keys, 1, NULL)}, - { "cookie_handler", PTR_V_STR(uzbl.behave.cookie_handler, 1, NULL)}, + { "cookie_handler", PTR_V_STR(uzbl.behave.cookie_handler, 1, cmd_set_cookie_handler)}, { "authentication_handler", PTR_V_STR(uzbl.behave.authentication_handler, 1, set_authentication_handler)}, { "scheme_handler", PTR_V_STR(uzbl.behave.scheme_handler, 1, NULL)}, { "fifo_dir", PTR_V_STR(uzbl.behave.fifo_dir, 1, cmd_fifo_dir)}, @@ -679,7 +679,6 @@ struct {const char *key; CommandInfo value;} cmdlist[] = { "sync_spawn", {spawn_sync, 0} }, // needed for cookie handler { "sh", {spawn_sh, 0} }, { "sync_sh", {spawn_sh_sync, 0} }, // needed for cookie handler - { "talk_to_socket", {talk_to_socket, 0} }, { "exit", {close_uzbl, 0} }, { "search", {search_forward_text, TRUE} }, { "search_reverse", {search_reverse_text, TRUE} }, @@ -1431,118 +1430,6 @@ spawn_sh_sync(WebKitWebView *web_view, GArray *argv, GString *result) { g_strfreev (cmd); } -void -talk_to_socket(WebKitWebView *web_view, GArray *argv, GString *result) { - (void)web_view; (void)result; - - int fd, len; - struct sockaddr_un sa; - char* sockpath; - ssize_t ret; - struct pollfd pfd; - struct iovec* iov; - guint i; - - if(uzbl.comm.sync_stdout) uzbl.comm.sync_stdout = strfree(uzbl.comm.sync_stdout); - - /* This function could be optimised by storing a hash table of socket paths - and associated connected file descriptors rather than closing and - re-opening for every call. Also we could launch a script if socket connect - fails. */ - - /* First element argv[0] is path to socket. Following elements are tokens to - write to the socket. We write them as a single packet with each token - separated by an ASCII nul (\0). */ - if(argv->len < 2) { - g_printerr("talk_to_socket called with only %d args (need at least two).\n", - (int)argv->len); - return; - } - - /* copy socket path, null terminate result */ - sockpath = g_array_index(argv, char*, 0); - g_strlcpy(sa.sun_path, sockpath, sizeof(sa.sun_path)); - sa.sun_family = AF_UNIX; - - /* create socket file descriptor and connect it to path */ - fd = socket(AF_UNIX, SOCK_SEQPACKET, 0); - if(fd == -1) { - g_printerr("talk_to_socket: creating socket failed (%s)\n", strerror(errno)); - return; - } - if(connect(fd, (struct sockaddr*)&sa, sizeof(sa))) { - g_printerr("talk_to_socket: connect failed (%s)\n", strerror(errno)); - close(fd); - return; - } - - /* build request vector */ - iov = g_malloc(sizeof(struct iovec) * (argv->len - 1)); - if(!iov) { - g_printerr("talk_to_socket: unable to allocated memory for token vector\n"); - close(fd); - return; - } - for(i = 1; i < argv->len; ++i) { - iov[i - 1].iov_base = g_array_index(argv, char*, i); - iov[i - 1].iov_len = strlen(iov[i - 1].iov_base) + 1; /* string plus \0 */ - } - - /* write request */ - ret = writev(fd, iov, argv->len - 1); - g_free(iov); - if(ret == -1) { - g_printerr("talk_to_socket: write failed (%s)\n", strerror(errno)); - close(fd); - return; - } - - /* wait for a response, with a 500ms timeout */ - pfd.fd = fd; - pfd.events = POLLIN; - while(1) { - ret = poll(&pfd, 1, 500); - if(ret == 1) break; - if(ret == 0) errno = ETIMEDOUT; - if(errno == EINTR) continue; - g_printerr("talk_to_socket: poll failed while waiting for input (%s)\n", - strerror(errno)); - close(fd); - return; - } - - /* get length of response */ - if(ioctl(fd, FIONREAD, &len) == -1) { - g_printerr("talk_to_socket: cannot find daemon response length, " - "ioctl failed (%s)\n", strerror(errno)); - close(fd); - return; - } - - /* if there is a response, read it */ - if(len) { - uzbl.comm.sync_stdout = g_malloc(len + 1); - if(!uzbl.comm.sync_stdout) { - g_printerr("talk_to_socket: failed to allocate %d bytes\n", len); - close(fd); - return; - } - uzbl.comm.sync_stdout[len] = 0; /* ensure result is null terminated */ - - ret = read(fd, uzbl.comm.sync_stdout, len); - if(ret == -1) { - g_printerr("talk_to_socket: failed to read from socket (%s)\n", - strerror(errno)); - close(fd); - return; - } - } - - /* clean up */ - close(fd); - return; -} - void parse_command(const char *cmd, const char *param, GString *result) { CommandInfo *c; @@ -2125,8 +2012,7 @@ inject_handler_args(const gchar *actname, const gchar *origargs, const gchar *ne if ((g_strcmp0(actname, "spawn") == 0) || (g_strcmp0(actname, "sh") == 0) || (g_strcmp0(actname, "sync_spawn") == 0) || - (g_strcmp0(actname, "sync_sh") == 0) || - (g_strcmp0(actname, "talk_to_socket") == 0)) { + (g_strcmp0(actname, "sync_sh") == 0)) { guint i; GString *a = g_string_new(""); gchar **spawnparts = split_quoted(origargs, FALSE); @@ -2313,7 +2199,6 @@ settings_init () { if(s->connect_socket_names) init_connect_socket(); - g_signal_connect_after(n->soup_session, "request-started", G_CALLBACK(handle_cookies), NULL); g_signal_connect(n->soup_session, "authenticate", G_CALLBACK(handle_authentication), NULL); } @@ -2373,57 +2258,6 @@ void handle_authentication (SoupSession *session, SoupMessage *msg, SoupAuth *au } } -void handle_cookies (SoupSession *session, SoupMessage *msg, gpointer user_data) { - (void) session; - (void) user_data; - - soup_message_add_header_handler(msg, "got-headers", "Set-Cookie", G_CALLBACK(save_cookies_http), NULL); - GString *s = g_string_new (""); - SoupURI * soup_uri = soup_message_get_uri(msg); - g_string_printf(s, "GET '%s' '%s' '%s'", soup_uri->scheme, soup_uri->host, soup_uri->path); - - if(uzbl.behave.cookie_handler) - run_handler(uzbl.behave.cookie_handler, s->str); - - if(uzbl.behave.cookie_handler && - uzbl.comm.sync_stdout && strcmp (uzbl.comm.sync_stdout, "") != 0) { - char *p = strchr(uzbl.comm.sync_stdout, '\n' ); - if ( p != NULL ) *p = '\0'; - soup_message_headers_replace (msg->request_headers, "Cookie", (const char *) uzbl.comm.sync_stdout); - - int len = strlen(uzbl.comm.sync_stdout); - - if(len > 0) { - SoupCookie *soup_cookie; - char *cookies = (char *) g_malloc(len+1); - strncpy(cookies, uzbl.comm.sync_stdout, len+1); - - /* Disconnect to avoid recursion */ - g_object_disconnect(G_OBJECT(uzbl.net.soup_cookie_jar), "any_signal", G_CALLBACK(save_cookies_js), NULL, NULL); - - p = cookies - 1; - while(p != NULL) { - p = p + 1; - soup_cookie = soup_cookie_parse((const char *) p, soup_uri); - if (soup_cookie) { - if(soup_cookie->domain == NULL) - soup_cookie->domain = soup_uri->host; - soup_cookie_jar_add_cookie(uzbl.net.soup_cookie_jar, soup_cookie); - } - p = strchr(p, ';'); - } - - g_object_connect(G_OBJECT(uzbl.net.soup_cookie_jar), "signal::changed", G_CALLBACK(save_cookies_js), NULL, NULL); - g_free(cookies); - } - } - - if (uzbl.comm.sync_stdout) - uzbl.comm.sync_stdout = strfree(uzbl.comm.sync_stdout); - - g_string_free(s, TRUE); -} - void dump_var_hash(gpointer k, gpointer v, gpointer ud) { (void) ud; @@ -2522,9 +2356,8 @@ initialize(int argc, char *argv[]) { uzbl.net.soup_session = webkit_get_default_session(); - uzbl.net.soup_cookie_jar = soup_cookie_jar_new(); + uzbl.net.soup_cookie_jar = uzbl_cookie_jar_new(); soup_session_add_feature(uzbl.net.soup_session, SOUP_SESSION_FEATURE(uzbl.net.soup_cookie_jar)); - g_object_connect(G_OBJECT(uzbl.net.soup_cookie_jar), "signal::changed", G_CALLBACK(save_cookies_js), NULL, NULL); for(i=0; sigs[i]; i++) { if(setup_signal(sigs[i], catch_signal) == SIG_ERR) diff --git a/src/uzbl-core.h b/src/uzbl-core.h index 5760423..b4b251d 100644 --- a/src/uzbl-core.h +++ b/src/uzbl-core.h @@ -40,6 +40,8 @@ #include #include +#include "cookie-jar.h" + #define LENGTH(x) (sizeof x / sizeof x[0]) /* gui elements */ @@ -104,8 +106,8 @@ typedef struct { /* networking */ typedef struct { - SoupSession *soup_session; - SoupCookieJar *soup_cookie_jar; + SoupSession *soup_session; + UzblCookieJar *soup_cookie_jar; SoupLogger *soup_logger; char *proxy_url; char *useragent; @@ -277,9 +279,6 @@ gboolean run_command(const gchar *command, const guint npre, const gchar **args, const gboolean sync, char **output_stdout); -void -talk_to_socket(WebKitWebView *web_view, GArray *argv, GString *result); - void spawn(WebKitWebView *web_view, GArray *argv, GString *result); -- cgit v1.2.3 From 7b8070d9997dc26d825467d3e78419d2ac51c985 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Sat, 2 Oct 2010 12:57:27 -0400 Subject: Set up the environment with the util dir The new scripts require that the utility directory be set through the environment. Add a function which sets it up. --- src/uzbl-core.c | 25 +++++++++++++++++++++++++ src/uzbl-core.h | 3 +++ 2 files changed, 28 insertions(+) (limited to 'src') diff --git a/src/uzbl-core.c b/src/uzbl-core.c index 7be98c3..129bb2a 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -1263,6 +1263,29 @@ sharg_append(GArray *a, const gchar *str) { g_array_append_val(a, s); } +gboolean +uzbl_setup_environ() { + gchar *util_dirs = expand("@scripts_util_dir", 0); + gchar *util_dir = NULL; + gboolean succeed = FALSE; + + if(!util_dirs) { + g_free(util_dirs); + return succeed; + } + + if(!(util_dir = find_existing_file(util_dirs))) { + g_free(util_dirs); + return succeed; + } + + succeed = g_setenv("UZBL_UTIL_DIR", util_dir, TRUE); + + g_free(util_dirs); + g_free(util_dir); + return succeed; +} + // make sure that the args string you pass can properly be interpreted (eg properly escaped against whitespace, quotes etc) gboolean run_command (const gchar *command, const guint npre, const gchar **args, @@ -1274,6 +1297,8 @@ run_command (const gchar *command, const guint npre, const gchar **args, gchar *pid = itos(getpid()); gchar *xwin = itos(uzbl.xwin); guint i; + gboolean environ_set = uzbl_setup_environ(); + sharg_append(a, command); for (i = 0; i < npre; i++) /* add n args before the default vars */ sharg_append(a, args[i]); diff --git a/src/uzbl-core.h b/src/uzbl-core.h index 5760423..15f7299 100644 --- a/src/uzbl-core.h +++ b/src/uzbl-core.h @@ -273,6 +273,9 @@ chain (WebKitWebView *page, GArray *argv, GString *result); void close_uzbl (WebKitWebView *page, GArray *argv, GString *result); +gboolean +uzbl_setup_environ(); + gboolean run_command(const gchar *command, const guint npre, const gchar **args, const gboolean sync, char **output_stdout); -- cgit v1.2.3 From 5ead964cad114989d49114f6a1490faa63b8ce6b Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Sat, 2 Oct 2010 13:35:17 -0400 Subject: Print an error message if the environ failed --- src/uzbl-core.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src') diff --git a/src/uzbl-core.c b/src/uzbl-core.c index 129bb2a..13328d0 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -1337,6 +1337,9 @@ run_command (const gchar *command, const guint npre, const gchar **args, printf("Stdout: %s\n", *output_stdout); } } + if (!environ_set) { + g_printerr("failed to set the environment for scripts"); + } if (err) { g_printerr("error on run_command: %s\n", err->message); g_error_free (err); -- cgit v1.2.3 From ee3e5ccc576041baeacf9ee3082d453e2fe74fb6 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Sat, 2 Oct 2010 16:19:18 -0400 Subject: Use the global configuration as a fallback First check if there isn't a global config. If there isn't *then* we can fail. If there is and the copy fails, at least run with the global configuration. --- src/uzbl-browser | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/uzbl-browser b/src/uzbl-browser index de4f7af..fabefc4 100755 --- a/src/uzbl-browser +++ b/src/uzbl-browser @@ -40,10 +40,16 @@ done # if no config exists yet in the recommended location, put the default (recommended) config there if [ ! -f $XDG_CONFIG_HOME/uzbl/config ] then + if [ ! -r $PREFIX/share/uzbl/examples/config/config ] + then + echo "Error: Global config not found; please check if your distribution ships them separately" + exit 3 + fi if ! cp $PREFIX/share/uzbl/examples/config/config $XDG_CONFIG_HOME/uzbl/config then echo "Could not copy default config to $XDG_CONFIG_HOME/uzbl/config" >&2 - exit 3 + # Run with the global configs as a last resort + config="--config $PREFIX/share/uzbl/examples/config/config" fi fi @@ -63,4 +69,4 @@ DAEMON_PID=${DAEMON_SOCKET}.pid uzbl-event-manager -va start #fi -exec uzbl-core "$@" --connect-socket $DAEMON_SOCKET +exec uzbl-core "$@" $config --connect-socket $DAEMON_SOCKET -- cgit v1.2.3 From 7b2b9dc3dda690f9992ed56a1392524ba92f6b17 Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Wed, 6 Oct 2010 08:38:58 -0600 Subject: fix a memory leak in the cookie jar --- src/cookie-jar.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src') diff --git a/src/cookie-jar.c b/src/cookie-jar.c index 875fdec..4bb1925 100644 --- a/src/cookie-jar.c +++ b/src/cookie-jar.c @@ -161,6 +161,8 @@ changed(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie) { /* try it again; older cookie daemons closed the connection after each request */ if(!result) result = do_socket_request(uzbl_jar, s->str, s->len+1); + + g_free(result); } else { g_string_append_printf(s, " '%s' '%s' '%s' '%s=%s'", scheme, new_cookie->domain, new_cookie->path, new_cookie->name, new_cookie->value); -- cgit v1.2.3 From 4a180e955fc0e9826a4808b05b04c649869cd21e Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Wed, 6 Oct 2010 08:39:22 -0600 Subject: fix memory leaks. --- src/callbacks.c | 4 ++-- src/events.c | 1 + src/uzbl-core.c | 27 +++++++++++++++------------ 3 files changed, 18 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/callbacks.c b/src/callbacks.c index 0fbf589..0a28ec6 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -589,9 +589,9 @@ motion_notify_cb(GtkWidget* window, GdkEventMotion* event, gpointer user_data) { (void) event; (void) user_data; - gchar *details; - details = g_strdup_printf("%.0lf %.0lf %u", event->x, event->y, event->state); + gchar *details = g_strdup_printf("%.0lf %.0lf %u", event->x, event->y, event->state); send_event(PTR_MOVE, details, NULL); + g_free(details); return FALSE; } diff --git a/src/events.c b/src/events.c index c209550..40a28e2 100644 --- a/src/events.c +++ b/src/events.c @@ -83,6 +83,7 @@ send_event_socket(GString *msg) { ret = g_io_channel_write_chars (gio, tmp->str, tmp->len, &len, &error); + g_string_free(tmp, TRUE); if (ret == G_IO_STATUS_ERROR) g_warning ("Error sending event to socket: %s", error->message); diff --git a/src/uzbl-core.c b/src/uzbl-core.c index 12d20ae..b06d369 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -2381,6 +2381,7 @@ initialize(int argc, char *argv[]) { void load_uri_imp(gchar *uri) { GString* newuri; + SoupURI* soup_uri; /* Strip leading whitespaces */ while (*uri) { @@ -2392,26 +2393,28 @@ load_uri_imp(gchar *uri) { eval_js(uzbl.gui.web_view, uri, NULL, "javascript:"); return; } + newuri = g_string_new (uri); - if (!soup_uri_new(uri)) { - GString* fullpath = g_string_new (""); + soup_uri = soup_uri_new(uri); + + if (!soup_uri) { + gchar* fullpath; if (g_path_is_absolute (newuri->str)) - g_string_assign (fullpath, newuri->str); + fullpath = newuri->str; else { - gchar* wd; - wd = g_get_current_dir (); - g_string_assign (fullpath, g_build_filename (wd, newuri->str, NULL)); - free(wd); + gchar* wd = g_get_current_dir (); + fullpath = g_build_filename (wd, newuri->str, NULL); + g_free(wd); } struct stat stat_result; - if (! g_stat(fullpath->str, &stat_result)) { - g_string_prepend (fullpath, "file://"); - g_string_assign (newuri, fullpath->str); - } + if (! g_stat(fullpath, &stat_result)) + g_string_printf (newuri, "file://%s", fullpath); else g_string_prepend (newuri, "http://"); - g_string_free (fullpath, TRUE); + } else { + soup_uri_free(soup_uri); } + /* if we do handle cookies, ask our handler for them */ webkit_web_view_load_uri (uzbl.gui.web_view, newuri->str); g_string_free (newuri, TRUE); -- cgit v1.2.3 From a327fab5b2581343f2414446be37e38c212355d1 Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Fri, 8 Oct 2010 07:18:09 -0600 Subject: give javascript cookie requests a "/" path (instead of the blank path they had for some reason, which was causing uzblcookied to ignore requests) --- src/cookie-jar.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/cookie-jar.c b/src/cookie-jar.c index 4bb1925..f88acee 100644 --- a/src/cookie-jar.c +++ b/src/cookie-jar.c @@ -69,14 +69,16 @@ uzbl_cookie_jar_set_handler(UzblCookieJar *jar, const gchar* handler) { } char *get_cookies(UzblCookieJar *jar, SoupURI *uri) { - gchar *result; + gchar *result, *path; GString *s = g_string_new ("GET"); + path = uri->path[0] ? uri->path : "/"; + if(has_socket_handler(jar)) { g_string_append_c(s, 0); /* null-terminate the GET */ g_string_append_len(s, uri->scheme, strlen(uri->scheme)+1); g_string_append_len(s, uri->host, strlen(uri->host)+1 ); - g_string_append_len(s, uri->path, strlen(uri->path)+1 ); + g_string_append_len(s, path, strlen(path)+1 ); result = do_socket_request(jar, s->str, s->len); /* try it again; older cookie daemons closed the connection after each request */ @@ -149,7 +151,8 @@ changed(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie) { GString *s = g_string_new ("PUT"); - gchar *scheme = (new_cookie->secure == TRUE) ? "https" : "http"; + gchar *scheme = new_cookie->secure ? "https" : "http"; + if(has_socket_handler(uzbl_jar)) { g_string_append_c(s, 0); /* null-terminate the PUT */ g_string_append_len(s, scheme, strlen(scheme)+1); @@ -228,7 +231,7 @@ static gchar *do_socket_request(UzblCookieJar *jar, gchar *request, int request_ gchar *result = NULL; if(jar->connection_fd < 0) - connect_cookie_socket(jar); /* connection was lost, reconnect */ + connect_cookie_socket(jar); /* connection was lost, reconnect */ /* write request */ ret = write(jar->connection_fd, request, request_length); @@ -248,7 +251,8 @@ static gchar *do_socket_request(UzblCookieJar *jar, gchar *request, int request_ if(errno == EINTR) continue; g_printerr("talk_to_socket: poll failed while waiting for input (%s)\n", strerror(errno)); - disconnect_cookie_socket(jar); + if(errno != ETIMEDOUT) + disconnect_cookie_socket(jar); return NULL; } -- cgit v1.2.3 From 1131d95f5925f78b4d4aac590b38cfb2ac35b7eb Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Fri, 8 Oct 2010 08:25:12 -0600 Subject: oops, memory leak fixes introduced a double free. fixed. --- src/events.c | 102 ++++++++++++++++++++++++----------------------------------- 1 file changed, 42 insertions(+), 60 deletions(-) (limited to 'src') diff --git a/src/events.c b/src/events.c index 40a28e2..ee2f96c 100644 --- a/src/events.c +++ b/src/events.c @@ -57,57 +57,53 @@ event_buffer_timeout(guint sec) { setitimer(ITIMER_REAL, &t, NULL); } - -void -send_event_socket(GString *msg) { +static void +send_event_sockets(GPtrArray *sockets, GString *msg) { GError *error = NULL; - GString *tmp; - GIOChannel *gio = NULL; GIOStatus ret; gsize len; - guint i=0, j=0; + guint i=0; + + while(i < sockets->len) { + GIOChannel *gio = g_ptr_array_index(sockets, i++); + + if(gio && gio->is_writeable && msg) { + ret = g_io_channel_write_chars (gio, + msg->str, msg->len, + &len, &error); + + if (ret == G_IO_STATUS_ERROR) + g_warning ("Error sending event to socket: %s", error->message); + else + g_io_channel_flush(gio, &error); + } + } +} + +static void +replay_buffered_events() { + guint i = 0; + event_buffer_timeout(0); + + /* replay buffered events */ + while(i < uzbl.state.event_buffer->len) { + GString *tmp = g_ptr_array_index(uzbl.state.event_buffer, i++); + send_event_sockets(uzbl.comm.connect_chan, tmp); + g_string_free(tmp, TRUE); + } + + g_ptr_array_free(uzbl.state.event_buffer, TRUE); + uzbl.state.event_buffer = NULL; +} + +void +send_event_socket(GString *msg) { /* write to all --connect-socket sockets */ if(uzbl.comm.connect_chan) { - while(i < uzbl.comm.connect_chan->len) { - gio = g_ptr_array_index(uzbl.comm.connect_chan, i++); - j=0; - - if(gio && gio->is_writeable) { - if(uzbl.state.event_buffer) { - event_buffer_timeout(0); - - /* replay buffered events */ - while(j < uzbl.state.event_buffer->len) { - tmp = g_ptr_array_index(uzbl.state.event_buffer, j++); - ret = g_io_channel_write_chars (gio, - tmp->str, tmp->len, - &len, &error); - g_string_free(tmp, TRUE); - - if (ret == G_IO_STATUS_ERROR) - g_warning ("Error sending event to socket: %s", error->message); - else - g_io_channel_flush(gio, &error); - } - } - - if(msg) { - ret = g_io_channel_write_chars (gio, - msg->str, msg->len, - &len, &error); - - if (ret == G_IO_STATUS_ERROR) - g_warning ("Error sending event to socket: %s", error->message); - else - g_io_channel_flush(gio, &error); - } - } - } - if(uzbl.state.event_buffer) { - g_ptr_array_free(uzbl.state.event_buffer, TRUE); - uzbl.state.event_buffer = NULL; - } + send_event_sockets(uzbl.comm.connect_chan, msg); + if(uzbl.state.event_buffer) + replay_buffered_events(); } /* buffer events until a socket is set and connected * or a timeout is encountered @@ -119,22 +115,8 @@ send_event_socket(GString *msg) { } /* write to all client sockets */ - i=0; if(msg && uzbl.comm.client_chan) { - while(i < uzbl.comm.client_chan->len) { - gio = g_ptr_array_index(uzbl.comm.client_chan, i++); - - if(gio && gio->is_writeable && msg) { - ret = g_io_channel_write_chars (gio, - msg->str, msg->len, - &len, &error); - - if (ret == G_IO_STATUS_ERROR) - g_warning ("Error sending event to socket: %s", error->message); - else - g_io_channel_flush(gio, &error); - } - } + send_event_sockets(uzbl.comm.client_chan, msg); } } -- cgit v1.2.3 From 61a96aaf812934ebeb49668739c1a7ac60b5d094 Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Mon, 27 Sep 2010 10:41:13 -0600 Subject: move cookie handling into a subclass of SoupCookieJar this cleans up the code and slightly improves efficiency. --- src/callbacks.c | 36 +------ src/callbacks.h | 5 +- src/cookie-jar.c | 289 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/cookie-jar.h | 33 +++++++ src/uzbl-core.c | 173 +-------------------------------- src/uzbl-core.h | 9 +- 6 files changed, 332 insertions(+), 213 deletions(-) create mode 100644 src/cookie-jar.c create mode 100644 src/cookie-jar.h (limited to 'src') diff --git a/src/callbacks.c b/src/callbacks.c index d2352b2..0fbf589 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -831,38 +831,6 @@ populate_popup_cb(WebKitWebView *v, GtkMenu *m, void *c) { } void -save_cookies_js(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie, gpointer user_data) { - (void) jar; - (void) user_data; - (void) old_cookie; - char *scheme; - GString *s; - - if(new_cookie != NULL) { - scheme = (new_cookie->secure == TRUE) ? "https" : "http"; - - s = g_string_new(""); - g_string_printf(s, "PUT '%s' '%s' '%s' '%s=%s'", scheme, new_cookie->domain, new_cookie->path, new_cookie->name, new_cookie->value); - run_handler(uzbl.behave.cookie_handler, s->str); - g_string_free(s, TRUE); - } -} - -void -save_cookies_http(SoupMessage *msg, gpointer user_data) { - (void) user_data; - GSList *ck; - char *cookie; - - for(ck = soup_cookies_from_response(msg); ck; ck = ck->next){ - cookie = soup_cookie_to_set_cookie_header(ck->data); - SoupURI *soup_uri = soup_message_get_uri(msg); - GString *s = g_string_new(""); - g_string_printf(s, "PUT '%s' '%s' '%s' '%s'", soup_uri->scheme, soup_uri->host, soup_uri->path, cookie); - run_handler(uzbl.behave.cookie_handler, s->str); - g_free (cookie); - g_string_free(s, TRUE); - } - - g_slist_free(ck); +cmd_set_cookie_handler() { + uzbl_cookie_jar_set_handler(uzbl.net.soup_cookie_jar, uzbl.behave.cookie_handler); } diff --git a/src/callbacks.h b/src/callbacks.h index fdd08e4..0b89f96 100644 --- a/src/callbacks.h +++ b/src/callbacks.h @@ -212,7 +212,4 @@ gboolean focus_cb(GtkWidget* window, GdkEventFocus* event, void *ud); void -save_cookies_js(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie, gpointer user_data); - -void -save_cookies_http(SoupMessage *msg, gpointer user_data); +cmd_set_cookie_handler(); diff --git a/src/cookie-jar.c b/src/cookie-jar.c new file mode 100644 index 0000000..875fdec --- /dev/null +++ b/src/cookie-jar.c @@ -0,0 +1,289 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "cookie-jar.h" +#include "uzbl-core.h" + +static void +uzbl_cookie_jar_session_feature_init(SoupSessionFeatureInterface *iface, gpointer user_data); + +G_DEFINE_TYPE_WITH_CODE (UzblCookieJar, soup_cookie_jar_socket, SOUP_TYPE_COOKIE_JAR, + G_IMPLEMENT_INTERFACE (SOUP_TYPE_SESSION_FEATURE, uzbl_cookie_jar_session_feature_init)) + +static void request_started (SoupSessionFeature *feature, SoupSession *session, SoupMessage *msg, SoupSocket *socket); +static void changed(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie); + +static void setup_handler(UzblCookieJar *jar); + +static void connect_cookie_socket(UzblCookieJar *jar); +static void disconnect_cookie_socket(UzblCookieJar *jar); + +static gchar *do_socket_request(UzblCookieJar *jar, gchar *request, int request_len); + +static bool has_socket_handler(UzblCookieJar *jar) { + return jar->socket_path != NULL; +} + +static void +soup_cookie_jar_socket_init(UzblCookieJar *jar) { + jar->socket_path = NULL; + jar->connection_fd = -1; +} + +static void +finalize(GObject *object) { + disconnect_cookie_socket(UZBL_COOKIE_JAR(object)); + G_OBJECT_CLASS(soup_cookie_jar_socket_parent_class)->finalize(object); +} + +static void +soup_cookie_jar_socket_class_init(UzblCookieJarClass *socket_class) { + G_OBJECT_CLASS(socket_class)->finalize = finalize; + SOUP_COOKIE_JAR_CLASS(socket_class)->changed = changed; +} + +/* override SoupCookieJar's request_started handler */ +static void +uzbl_cookie_jar_session_feature_init(SoupSessionFeatureInterface *iface, gpointer user_data) { + (void) user_data; + iface->request_started = request_started; +} + +UzblCookieJar *uzbl_cookie_jar_new() { + return g_object_new(UZBL_TYPE_COOKIE_JAR, NULL); +} + +void +uzbl_cookie_jar_set_handler(UzblCookieJar *jar, const gchar* handler) { + jar->handler = handler; + setup_handler(jar); +} + +char *get_cookies(UzblCookieJar *jar, SoupURI *uri) { + gchar *result; + GString *s = g_string_new ("GET"); + + if(has_socket_handler(jar)) { + g_string_append_c(s, 0); /* null-terminate the GET */ + g_string_append_len(s, uri->scheme, strlen(uri->scheme)+1); + g_string_append_len(s, uri->host, strlen(uri->host)+1 ); + g_string_append_len(s, uri->path, strlen(uri->path)+1 ); + + result = do_socket_request(jar, s->str, s->len); + /* try it again; older cookie daemons closed the connection after each request */ + if(result == NULL) + result = do_socket_request(jar, s->str, s->len); + } else { + g_string_append_printf(s, " '%s' '%s' '%s'", uri->scheme, uri->host, uri->path); + + run_handler(jar->handler, s->str); + result = g_strdup(uzbl.comm.sync_stdout); + } + g_string_free(s, TRUE); + return result; +} + +/* this is a duplicate of SoupCookieJar's request_started that uses our get_cookies instead */ +static void +request_started(SoupSessionFeature *feature, SoupSession *session, + SoupMessage *msg, SoupSocket *socket) { + (void) session; (void) socket; + + UzblCookieJar *jar = UZBL_COOKIE_JAR (feature); + SoupURI *uri = soup_message_get_uri(msg); + + gchar *cookies = get_cookies(jar, uri); + + if (cookies && *cookies != 0) { + const gchar *next_cookie_start = cookies; + + /* add the cookie data that we just obtained from the cookie handler + to the cookie jar so that javascript has access to them. + we set this flag so that we don't trigger the PUT handler. */ + jar->in_get_callback = true; + do { + SoupCookie *soup_cookie = soup_cookie_parse(next_cookie_start, uri); + if(soup_cookie) + soup_cookie_jar_add_cookie(SOUP_COOKIE_JAR(uzbl.net.soup_cookie_jar), soup_cookie); + next_cookie_start = strchr(next_cookie_start, ';'); + } while(next_cookie_start++ != NULL); + jar->in_get_callback = false; + + soup_message_headers_replace (msg->request_headers, "Cookie", cookies); + + g_free (cookies); + } else { + soup_message_headers_remove (msg->request_headers, "Cookie"); + } +} + +static void +changed(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie) { + (void) old_cookie; + + UzblCookieJar *uzbl_jar = UZBL_COOKIE_JAR(jar); + + /* when Uzbl begins an HTTP request, it GETs cookies from the handler + and then adds them to the cookie jar so that javascript can access + these cookies. this causes a 'changed' callback, which we don't want + to do anything, so we just return. + + (if SoupCookieJar let us override soup_cookie_jar_get_cookies we + wouldn't have to do this.) */ + if(uzbl_jar->in_get_callback) + return; + + /* the cookie daemon is only interested in new cookies and changed + ones, it can take care of deleting expired cookies on its own. */ + if(!new_cookie) + return; + + GString *s = g_string_new ("PUT"); + + gchar *scheme = (new_cookie->secure == TRUE) ? "https" : "http"; + if(has_socket_handler(uzbl_jar)) { + g_string_append_c(s, 0); /* null-terminate the PUT */ + g_string_append_len(s, scheme, strlen(scheme)+1); + g_string_append_len(s, new_cookie->domain, strlen(new_cookie->domain)+1 ); + g_string_append_len(s, new_cookie->path, strlen(new_cookie->path)+1 ); + g_string_append_printf(s, "%s=%s", new_cookie->name, new_cookie->value); + + gchar *result = do_socket_request(uzbl_jar, s->str, s->len+1); + /* try it again; older cookie daemons closed the connection after each request */ + if(!result) + result = do_socket_request(uzbl_jar, s->str, s->len+1); + } else { + g_string_append_printf(s, " '%s' '%s' '%s' '%s=%s'", scheme, new_cookie->domain, new_cookie->path, new_cookie->name, new_cookie->value); + + run_handler(uzbl_jar->handler, s->str); + } + + g_string_free(s, TRUE); +} + +static void +setup_handler(UzblCookieJar *jar) { + if(strncmp(jar->handler, "talk_to_socket", strlen("talk_to_socket")) == 0) { + /* extract the socket path from the handler. */ + jar->socket_path = jar->handler + strlen("talk_to_socket"); + while(isspace(*jar->socket_path)) + jar->socket_path++; + if(*jar->socket_path == 0) + return; /* there was no path specified. */ + disconnect_cookie_socket(jar); + connect_cookie_socket(jar); + } else { + jar->socket_path = NULL; + } +} + +static void +connect_cookie_socket(UzblCookieJar *jar) { + struct sockaddr_un sa; + int fd; + + g_strlcpy(sa.sun_path, jar->socket_path, sizeof(sa.sun_path)); + sa.sun_family = AF_UNIX; + + /* create socket file descriptor and connect it to path */ + fd = socket(AF_UNIX, SOCK_SEQPACKET, 0); + if(fd == -1) { + g_printerr("connect_cookie_socket: creating socket failed (%s)\n", strerror(errno)); + return; + } + + if(connect(fd, (struct sockaddr*)&sa, sizeof(sa))) { + g_printerr("connect_cookie_socket: connect failed (%s)\n", strerror(errno)); + close(fd); + return; + } + + /* successful connection! */ + jar->connection_fd = fd; +} + +static void +disconnect_cookie_socket(UzblCookieJar *jar) { + if(jar->connection_fd > 0) { + close(jar->connection_fd); + jar->connection_fd = -1; + } +} + +static gchar *do_socket_request(UzblCookieJar *jar, gchar *request, int request_length) { + int len; + ssize_t ret; + struct pollfd pfd; + gchar *result = NULL; + + if(jar->connection_fd < 0) + connect_cookie_socket(jar); /* connection was lost, reconnect */ + + /* write request */ + ret = write(jar->connection_fd, request, request_length); + if(ret == -1) { + g_printerr("talk_to_socket: write failed (%s)\n", strerror(errno)); + disconnect_cookie_socket(jar); + return NULL; + } + + /* wait for a response, with a 500ms timeout */ + pfd.fd = jar->connection_fd; + pfd.events = POLLIN; + while(1) { + ret = poll(&pfd, 1, 500); + if(ret == 1) break; + if(ret == 0) errno = ETIMEDOUT; + if(errno == EINTR) continue; + g_printerr("talk_to_socket: poll failed while waiting for input (%s)\n", + strerror(errno)); + disconnect_cookie_socket(jar); + return NULL; + } + + /* get length of response */ + if(ioctl(jar->connection_fd, FIONREAD, &len) == -1) { + g_printerr("talk_to_socket: cannot find daemon response length, " + "ioctl failed (%s)\n", strerror(errno)); + disconnect_cookie_socket(jar); + return NULL; + } + + /* there was an empty response. */ + if(len == 0) + return g_strdup(""); + + /* there is a response, read it */ + result = g_malloc(len + 1); + if(!result) { + g_printerr("talk_to_socket: failed to allocate %d bytes\n", len); + return NULL; + } + result[len] = 0; /* ensure result is null terminated */ + + gchar *p = result; + while(len > 0) { + ret = read(jar->connection_fd, p, len); + if(ret == -1) { + g_printerr("talk_to_socket: failed to read from socket (%s)\n", + strerror(errno)); + disconnect_cookie_socket(jar); + g_free(result); + return NULL; + } else { + len -= ret; + p += ret; + } + } + + return result; +} diff --git a/src/cookie-jar.h b/src/cookie-jar.h new file mode 100644 index 0000000..80af00e --- /dev/null +++ b/src/cookie-jar.h @@ -0,0 +1,33 @@ +#ifndef UZBL_COOKIE_JAR_H +#define UZBL_COOKIE_JAR_H + +#include + +#define UZBL_TYPE_COOKIE_JAR (soup_cookie_jar_socket_get_type ()) +#define UZBL_COOKIE_JAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), UZBL_TYPE_COOKIE_JAR, UzblCookieJar)) +#define UZBL_COOKIE_JAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), UZBL_TYPE_COOKIE_JAR, UzblCookieJarClass)) + +typedef struct { + SoupCookieJar parent; + + const gchar *handler; + + const gchar *socket_path; + int connection_fd; + + gboolean in_get_callback; +} UzblCookieJar; + +typedef struct { + SoupCookieJarClass parent_class; +} UzblCookieJarClass; + +UzblCookieJar *uzbl_cookie_jar_new(); + +void +uzbl_cookie_jar_set_handler(UzblCookieJar *jar, const gchar *handler); + +char +*get_cookies(UzblCookieJar *jar, SoupURI *uri); + +#endif diff --git a/src/uzbl-core.c b/src/uzbl-core.c index 7be98c3..12d20ae 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -98,7 +98,7 @@ const struct var_name_to_ptr_t { { "title_format_short", PTR_V_STR(uzbl.behave.title_format_short, 1, NULL)}, { "icon", PTR_V_STR(uzbl.gui.icon, 1, set_icon)}, { "forward_keys", PTR_V_INT(uzbl.behave.forward_keys, 1, NULL)}, - { "cookie_handler", PTR_V_STR(uzbl.behave.cookie_handler, 1, NULL)}, + { "cookie_handler", PTR_V_STR(uzbl.behave.cookie_handler, 1, cmd_set_cookie_handler)}, { "authentication_handler", PTR_V_STR(uzbl.behave.authentication_handler, 1, set_authentication_handler)}, { "scheme_handler", PTR_V_STR(uzbl.behave.scheme_handler, 1, NULL)}, { "fifo_dir", PTR_V_STR(uzbl.behave.fifo_dir, 1, cmd_fifo_dir)}, @@ -679,7 +679,6 @@ struct {const char *key; CommandInfo value;} cmdlist[] = { "sync_spawn", {spawn_sync, 0} }, // needed for cookie handler { "sh", {spawn_sh, 0} }, { "sync_sh", {spawn_sh_sync, 0} }, // needed for cookie handler - { "talk_to_socket", {talk_to_socket, 0} }, { "exit", {close_uzbl, 0} }, { "search", {search_forward_text, TRUE} }, { "search_reverse", {search_reverse_text, TRUE} }, @@ -1431,118 +1430,6 @@ spawn_sh_sync(WebKitWebView *web_view, GArray *argv, GString *result) { g_strfreev (cmd); } -void -talk_to_socket(WebKitWebView *web_view, GArray *argv, GString *result) { - (void)web_view; (void)result; - - int fd, len; - struct sockaddr_un sa; - char* sockpath; - ssize_t ret; - struct pollfd pfd; - struct iovec* iov; - guint i; - - if(uzbl.comm.sync_stdout) uzbl.comm.sync_stdout = strfree(uzbl.comm.sync_stdout); - - /* This function could be optimised by storing a hash table of socket paths - and associated connected file descriptors rather than closing and - re-opening for every call. Also we could launch a script if socket connect - fails. */ - - /* First element argv[0] is path to socket. Following elements are tokens to - write to the socket. We write them as a single packet with each token - separated by an ASCII nul (\0). */ - if(argv->len < 2) { - g_printerr("talk_to_socket called with only %d args (need at least two).\n", - (int)argv->len); - return; - } - - /* copy socket path, null terminate result */ - sockpath = g_array_index(argv, char*, 0); - g_strlcpy(sa.sun_path, sockpath, sizeof(sa.sun_path)); - sa.sun_family = AF_UNIX; - - /* create socket file descriptor and connect it to path */ - fd = socket(AF_UNIX, SOCK_SEQPACKET, 0); - if(fd == -1) { - g_printerr("talk_to_socket: creating socket failed (%s)\n", strerror(errno)); - return; - } - if(connect(fd, (struct sockaddr*)&sa, sizeof(sa))) { - g_printerr("talk_to_socket: connect failed (%s)\n", strerror(errno)); - close(fd); - return; - } - - /* build request vector */ - iov = g_malloc(sizeof(struct iovec) * (argv->len - 1)); - if(!iov) { - g_printerr("talk_to_socket: unable to allocated memory for token vector\n"); - close(fd); - return; - } - for(i = 1; i < argv->len; ++i) { - iov[i - 1].iov_base = g_array_index(argv, char*, i); - iov[i - 1].iov_len = strlen(iov[i - 1].iov_base) + 1; /* string plus \0 */ - } - - /* write request */ - ret = writev(fd, iov, argv->len - 1); - g_free(iov); - if(ret == -1) { - g_printerr("talk_to_socket: write failed (%s)\n", strerror(errno)); - close(fd); - return; - } - - /* wait for a response, with a 500ms timeout */ - pfd.fd = fd; - pfd.events = POLLIN; - while(1) { - ret = poll(&pfd, 1, 500); - if(ret == 1) break; - if(ret == 0) errno = ETIMEDOUT; - if(errno == EINTR) continue; - g_printerr("talk_to_socket: poll failed while waiting for input (%s)\n", - strerror(errno)); - close(fd); - return; - } - - /* get length of response */ - if(ioctl(fd, FIONREAD, &len) == -1) { - g_printerr("talk_to_socket: cannot find daemon response length, " - "ioctl failed (%s)\n", strerror(errno)); - close(fd); - return; - } - - /* if there is a response, read it */ - if(len) { - uzbl.comm.sync_stdout = g_malloc(len + 1); - if(!uzbl.comm.sync_stdout) { - g_printerr("talk_to_socket: failed to allocate %d bytes\n", len); - close(fd); - return; - } - uzbl.comm.sync_stdout[len] = 0; /* ensure result is null terminated */ - - ret = read(fd, uzbl.comm.sync_stdout, len); - if(ret == -1) { - g_printerr("talk_to_socket: failed to read from socket (%s)\n", - strerror(errno)); - close(fd); - return; - } - } - - /* clean up */ - close(fd); - return; -} - void parse_command(const char *cmd, const char *param, GString *result) { CommandInfo *c; @@ -2125,8 +2012,7 @@ inject_handler_args(const gchar *actname, const gchar *origargs, const gchar *ne if ((g_strcmp0(actname, "spawn") == 0) || (g_strcmp0(actname, "sh") == 0) || (g_strcmp0(actname, "sync_spawn") == 0) || - (g_strcmp0(actname, "sync_sh") == 0) || - (g_strcmp0(actname, "talk_to_socket") == 0)) { + (g_strcmp0(actname, "sync_sh") == 0)) { guint i; GString *a = g_string_new(""); gchar **spawnparts = split_quoted(origargs, FALSE); @@ -2313,7 +2199,6 @@ settings_init () { if(s->connect_socket_names) init_connect_socket(); - g_signal_connect_after(n->soup_session, "request-started", G_CALLBACK(handle_cookies), NULL); g_signal_connect(n->soup_session, "authenticate", G_CALLBACK(handle_authentication), NULL); } @@ -2373,57 +2258,6 @@ void handle_authentication (SoupSession *session, SoupMessage *msg, SoupAuth *au } } -void handle_cookies (SoupSession *session, SoupMessage *msg, gpointer user_data) { - (void) session; - (void) user_data; - - soup_message_add_header_handler(msg, "got-headers", "Set-Cookie", G_CALLBACK(save_cookies_http), NULL); - GString *s = g_string_new (""); - SoupURI * soup_uri = soup_message_get_uri(msg); - g_string_printf(s, "GET '%s' '%s' '%s'", soup_uri->scheme, soup_uri->host, soup_uri->path); - - if(uzbl.behave.cookie_handler) - run_handler(uzbl.behave.cookie_handler, s->str); - - if(uzbl.behave.cookie_handler && - uzbl.comm.sync_stdout && strcmp (uzbl.comm.sync_stdout, "") != 0) { - char *p = strchr(uzbl.comm.sync_stdout, '\n' ); - if ( p != NULL ) *p = '\0'; - soup_message_headers_replace (msg->request_headers, "Cookie", (const char *) uzbl.comm.sync_stdout); - - int len = strlen(uzbl.comm.sync_stdout); - - if(len > 0) { - SoupCookie *soup_cookie; - char *cookies = (char *) g_malloc(len+1); - strncpy(cookies, uzbl.comm.sync_stdout, len+1); - - /* Disconnect to avoid recursion */ - g_object_disconnect(G_OBJECT(uzbl.net.soup_cookie_jar), "any_signal", G_CALLBACK(save_cookies_js), NULL, NULL); - - p = cookies - 1; - while(p != NULL) { - p = p + 1; - soup_cookie = soup_cookie_parse((const char *) p, soup_uri); - if (soup_cookie) { - if(soup_cookie->domain == NULL) - soup_cookie->domain = soup_uri->host; - soup_cookie_jar_add_cookie(uzbl.net.soup_cookie_jar, soup_cookie); - } - p = strchr(p, ';'); - } - - g_object_connect(G_OBJECT(uzbl.net.soup_cookie_jar), "signal::changed", G_CALLBACK(save_cookies_js), NULL, NULL); - g_free(cookies); - } - } - - if (uzbl.comm.sync_stdout) - uzbl.comm.sync_stdout = strfree(uzbl.comm.sync_stdout); - - g_string_free(s, TRUE); -} - void dump_var_hash(gpointer k, gpointer v, gpointer ud) { (void) ud; @@ -2522,9 +2356,8 @@ initialize(int argc, char *argv[]) { uzbl.net.soup_session = webkit_get_default_session(); - uzbl.net.soup_cookie_jar = soup_cookie_jar_new(); + uzbl.net.soup_cookie_jar = uzbl_cookie_jar_new(); soup_session_add_feature(uzbl.net.soup_session, SOUP_SESSION_FEATURE(uzbl.net.soup_cookie_jar)); - g_object_connect(G_OBJECT(uzbl.net.soup_cookie_jar), "signal::changed", G_CALLBACK(save_cookies_js), NULL, NULL); for(i=0; sigs[i]; i++) { if(setup_signal(sigs[i], catch_signal) == SIG_ERR) diff --git a/src/uzbl-core.h b/src/uzbl-core.h index 5760423..b4b251d 100644 --- a/src/uzbl-core.h +++ b/src/uzbl-core.h @@ -40,6 +40,8 @@ #include #include +#include "cookie-jar.h" + #define LENGTH(x) (sizeof x / sizeof x[0]) /* gui elements */ @@ -104,8 +106,8 @@ typedef struct { /* networking */ typedef struct { - SoupSession *soup_session; - SoupCookieJar *soup_cookie_jar; + SoupSession *soup_session; + UzblCookieJar *soup_cookie_jar; SoupLogger *soup_logger; char *proxy_url; char *useragent; @@ -277,9 +279,6 @@ gboolean run_command(const gchar *command, const guint npre, const gchar **args, const gboolean sync, char **output_stdout); -void -talk_to_socket(WebKitWebView *web_view, GArray *argv, GString *result); - void spawn(WebKitWebView *web_view, GArray *argv, GString *result); -- cgit v1.2.3 From 5ed250ef5aafaaa578db68deae228f0af9cbda14 Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Wed, 6 Oct 2010 08:38:58 -0600 Subject: fix a memory leak in the cookie jar --- src/cookie-jar.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src') diff --git a/src/cookie-jar.c b/src/cookie-jar.c index 875fdec..4bb1925 100644 --- a/src/cookie-jar.c +++ b/src/cookie-jar.c @@ -161,6 +161,8 @@ changed(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie) { /* try it again; older cookie daemons closed the connection after each request */ if(!result) result = do_socket_request(uzbl_jar, s->str, s->len+1); + + g_free(result); } else { g_string_append_printf(s, " '%s' '%s' '%s' '%s=%s'", scheme, new_cookie->domain, new_cookie->path, new_cookie->name, new_cookie->value); -- cgit v1.2.3 From 8bfa2fb492d801b4919ee51eb1077f4b3acc39b9 Mon Sep 17 00:00:00 2001 From: Michael Raskin <4e976623@mail.ru> Date: Sat, 16 Oct 2010 23:23:48 +0400 Subject: Add show_inspector command --- src/uzbl-core.c | 10 +++++++++- src/uzbl-core.h | 3 +++ 2 files changed, 12 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/uzbl-core.c b/src/uzbl-core.c index 70d6f50..25583ca 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -704,7 +704,8 @@ struct {const char *key; CommandInfo value;} cmdlist[] = { "menu_image_remove", {menu_remove_image, TRUE} }, { "menu_editable_remove", {menu_remove_edit, TRUE} }, { "hardcopy", {hardcopy, TRUE} }, - { "include", {include, TRUE} } + { "include", {include, TRUE} }, + { "show_inspector", {show_inspector, 0} } }; void @@ -998,6 +999,13 @@ include(WebKitWebView *page, GArray *argv, GString *result) { g_free(pe); } +void +show_inspector(WebKitWebView *page, GArray *argv, GString *result) { + (void) page; (void) argv; (void) result; + + webkit_web_inspector_show(uzbl.gui.inspector); +} + void act_dump_config() { dump_config(); diff --git a/src/uzbl-core.h b/src/uzbl-core.h index a9e8fe2..19a5887 100644 --- a/src/uzbl-core.h +++ b/src/uzbl-core.h @@ -473,6 +473,9 @@ hardcopy(WebKitWebView *page, GArray *argv, GString *result); void include(WebKitWebView *page, GArray *argv, GString *result); +void +show_inspector(WebKitWebView *page, GArray *argv, GString *result); + void builtins(); -- cgit v1.2.3 From 4f9d02dab352ad85877383d57e01ba3a6144c5b4 Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Thu, 21 Oct 2010 15:08:01 -0600 Subject: don't parse and set status background every time the status bar is redrawn --- src/callbacks.c | 13 +++++++++++++ src/callbacks.h | 3 +++ src/uzbl-core.c | 11 +---------- 3 files changed, 17 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/callbacks.c b/src/callbacks.c index d2352b2..8944262 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -45,6 +45,19 @@ set_authentication_handler() { return; } +void +set_status_background() { + GdkColor color; + gdk_color_parse (uzbl.behave.status_background, &color); + /* labels and hboxes do not draw their own background. applying this + * on the vbox/main_window is ok as the statusbar is the only affected + * widget. (if not, we could also use GtkEventBox) */ + if (uzbl.gui.main_window) + gtk_widget_modify_bg (uzbl.gui.main_window, GTK_STATE_NORMAL, &color); + else if (uzbl.gui.plug) + gtk_widget_modify_bg (GTK_WIDGET(uzbl.gui.plug), GTK_STATE_NORMAL, &color); +} + void set_icon() { if(file_exists(uzbl.gui.icon)) { diff --git a/src/callbacks.h b/src/callbacks.h index fdd08e4..9c6a096 100644 --- a/src/callbacks.h +++ b/src/callbacks.h @@ -15,6 +15,9 @@ set_proxy_url(); void set_authentication_handler(); +void +set_status_background(); + void set_icon(); diff --git a/src/uzbl-core.c b/src/uzbl-core.c index 7be98c3..2d83f39 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -93,7 +93,7 @@ const struct var_name_to_ptr_t { { "show_status", PTR_V_INT(uzbl.behave.show_status, 1, cmd_set_status)}, { "status_top", PTR_V_INT(uzbl.behave.status_top, 1, move_statusbar)}, { "status_format", PTR_V_STR(uzbl.behave.status_format, 1, NULL)}, - { "status_background", PTR_V_STR(uzbl.behave.status_background, 1, NULL)}, + { "status_background", PTR_V_STR(uzbl.behave.status_background, 1, set_status_background)}, { "title_format_long", PTR_V_STR(uzbl.behave.title_format_long, 1, NULL)}, { "title_format_short", PTR_V_STR(uzbl.behave.title_format_short, 1, NULL)}, { "icon", PTR_V_STR(uzbl.gui.icon, 1, set_icon)}, @@ -2006,15 +2006,6 @@ update_title (void) { gtk_label_set_markup(GTK_LABEL(uzbl.gui.mainbar_label), parsed); g_free(parsed); } - if (b->status_background) { - GdkColor color; - gdk_color_parse (b->status_background, &color); - //labels and hboxes do not draw their own background. applying this on the vbox/main_window is ok as the statusbar is the only affected widget. (if not, we could also use GtkEventBox) - if (uzbl.gui.main_window) - gtk_widget_modify_bg (uzbl.gui.main_window, GTK_STATE_NORMAL, &color); - else if (uzbl.gui.plug) - gtk_widget_modify_bg (GTK_WIDGET(uzbl.gui.plug), GTK_STATE_NORMAL, &color); - } } else { if (b->title_format_long) { parsed = expand(b->title_format_long, 0); -- cgit v1.2.3 From 68ce1a4d1b5f9503ef89a798eb4936a7dd9ad9f8 Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Thu, 21 Oct 2010 15:12:21 -0600 Subject: only set the window title if it's actually changed. fixes weird hangs in xmonad --- src/uzbl-core.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/uzbl-core.c b/src/uzbl-core.c index 2d83f39..54975b9 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -1993,11 +1993,12 @@ void update_title (void) { Behaviour *b = &uzbl.behave; gchar *parsed; + const gchar *current_title = gtk_window_get_title (GTK_WINDOW(uzbl.gui.main_window)); if (b->show_status) { - if (b->title_format_short) { + if (b->title_format_short && uzbl.gui.main_window) { parsed = expand(b->title_format_short, 0); - if (uzbl.gui.main_window) + if(current_title && strcmp(current_title, parsed)) gtk_window_set_title (GTK_WINDOW(uzbl.gui.main_window), parsed); g_free(parsed); } @@ -2007,9 +2008,9 @@ update_title (void) { g_free(parsed); } } else { - if (b->title_format_long) { + if (b->title_format_long && uzbl.gui.main_window) { parsed = expand(b->title_format_long, 0); - if (uzbl.gui.main_window) + if(current_title && strcmp(current_title, parsed)) gtk_window_set_title (GTK_WINDOW(uzbl.gui.main_window), parsed); g_free(parsed); } -- cgit v1.2.3 From d8e3aa56842811761fca33091c73e0be997675e3 Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Thu, 21 Oct 2010 15:17:12 -0600 Subject: don't update title and status if the main window doesn't exist. --- src/uzbl-core.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src') diff --git a/src/uzbl-core.c b/src/uzbl-core.c index 54975b9..c736794 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -1993,6 +1993,10 @@ void update_title (void) { Behaviour *b = &uzbl.behave; gchar *parsed; + + if(!GTK_IS_WINDOW(uzbl.gui.main_window)) + return; /* we're just starting up or just shutting down. */ + const gchar *current_title = gtk_window_get_title (GTK_WINDOW(uzbl.gui.main_window)); if (b->show_status) { -- cgit v1.2.3 From bd67a4f3d033e7198dce2f570b58a7fbdb95e43e Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Sun, 10 Oct 2010 22:50:35 -0400 Subject: Add SCROLL_VERT and SCROLL_HORIZ events --- src/callbacks.c | 38 ++++++++++++++++++++++++++++++++++++++ src/callbacks.h | 6 ++++++ src/events.c | 3 +++ src/events.h | 2 +- src/uzbl-core.c | 10 ++++++++++ 5 files changed, 58 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/callbacks.c b/src/callbacks.c index d2352b2..07c395c 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -764,6 +764,44 @@ download_cb (WebKitWebView *web_view, GObject *download, gpointer user_data) { return (FALSE); } +gboolean +scroll_vert_cb(GtkAdjustment *adjust, void *w) +{ + (void) w; + + gdouble value = gtk_adjustment_get_value(adjust); + gdouble min = gtk_adjustment_get_lower(adjust); + gdouble max = gtk_adjustment_get_upper(adjust); + gdouble page = gtk_adjustment_get_page_size(adjust); + gchar* details; + details = g_strdup_printf("%g %g %g %g", value, min, max, page); + + send_event(SCROLL_VERT, details, NULL); + + g_free(details); + + return (FALSE); +} + +gboolean +scroll_horiz_cb(GtkAdjustment *adjust, void *w) +{ + (void) w; + + gdouble value = gtk_adjustment_get_value(adjust); + gdouble min = gtk_adjustment_get_lower(adjust); + gdouble max = gtk_adjustment_get_upper(adjust); + gdouble page = gtk_adjustment_get_page_size(adjust); + gchar* details; + details = g_strdup_printf("%g %g %g %g", value, min, max, page); + + send_event(SCROLL_HORIZ, details, NULL); + + g_free(details); + + return (FALSE); +} + void run_menu_command(GtkWidget *menu, const char *line) { (void) menu; diff --git a/src/callbacks.h b/src/callbacks.h index fdd08e4..553e388 100644 --- a/src/callbacks.h +++ b/src/callbacks.h @@ -211,6 +211,12 @@ button_release_cb (GtkWidget* window, GdkEventButton* event); gboolean focus_cb(GtkWidget* window, GdkEventFocus* event, void *ud); +gboolean +scroll_vert_cb(GtkAdjustment *adjust, void *w); + +gboolean +scroll_horiz_cb(GtkAdjustment *adjust, void *w); + void save_cookies_js(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie, gpointer user_data); diff --git a/src/events.c b/src/events.c index c209550..e34bca9 100644 --- a/src/events.c +++ b/src/events.c @@ -46,6 +46,9 @@ const char *event_table[LAST_EVENT] = { "COMMAND_ERROR" , "BUILTINS" , "PTR_MOVE" + "PTR_MOVE" , + "SCROLL_VERT" , + "SCROLL_HORIZ" }; void diff --git a/src/events.h b/src/events.h index 1bd8804..bc7960d 100644 --- a/src/events.h +++ b/src/events.h @@ -15,7 +15,7 @@ enum event_type { LINK_UNHOVER, FORM_ACTIVE, ROOT_ACTIVE, FOCUS_LOST, FOCUS_GAINED, FILE_INCLUDED, PLUG_CREATED, COMMAND_ERROR, BUILTINS, - PTR_MOVE, + PTR_MOVE, SCROLL_VERT, SCROLL_HORIZ, /* must be last entry */ LAST_EVENT diff --git a/src/uzbl-core.c b/src/uzbl-core.c index 7be98c3..4ced7af 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -2629,6 +2629,16 @@ main (int argc, char* argv[]) { uzbl.gui.bar_h = gtk_range_get_adjustment((GtkRange*) uzbl.gui.scbar_h); gtk_widget_set_scroll_adjustments ((GtkWidget*) uzbl.gui.web_view, uzbl.gui.bar_h, uzbl.gui.bar_v); + g_object_connect((GObject*)uzbl.gui.bar_v, + "signal::value-changed", (GCallback)scroll_vert_cb, NULL, + "signal::changed", (GCallback)scroll_vert_cb, NULL, + NULL); + + g_object_connect((GObject*)uzbl.gui.bar_h, + "signal::value-changed", (GCallback)scroll_horiz_cb, NULL, + "signal::changed", (GCallback)scroll_vert_cb, NULL, + NULL); + if(!uzbl.state.instance_name) uzbl.state.instance_name = itos((int)uzbl.xwin); -- cgit v1.2.3 From 87b0c1fde07859f01424eea1abde930ad91b151e Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Sun, 10 Oct 2010 22:50:53 -0400 Subject: Use SCROLL_VERT event to handle scroll percentage --- examples/config/config | 3 +++ src/uzbl-core.c | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/examples/config/config b/examples/config/config index 622f859..5656664 100644 --- a/examples/config/config +++ b/examples/config/config @@ -79,6 +79,9 @@ set authentication_handler = sync_spawn @scripts_dir/auth.py # Example CONFIG_CHANGED event handler #@on_event CONFIG_CHANGED print Config changed: %1 = %2 +# Scroll percentage calculation +@on_event SCROLL_VERT set scroll_message = \@<(function(){var a='%1'.split(' ');var p='--';if(a[2]!=a[1]){p=(a[0]/(a[2]-a[3]));p=Math.round(10000*p)/100;};return p+'%';})()>\@ + # === Behaviour and appearance =============================================== set show_status = 1 diff --git a/src/uzbl-core.c b/src/uzbl-core.c index 4ced7af..fdfb811 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -2635,8 +2635,8 @@ main (int argc, char* argv[]) { NULL); g_object_connect((GObject*)uzbl.gui.bar_h, - "signal::value-changed", (GCallback)scroll_horiz_cb, NULL, - "signal::changed", (GCallback)scroll_vert_cb, NULL, + "signal::value-changed", (GCallback)scroll_horiz_cb, NULL, + "signal::changed", (GCallback)scroll_horiz_cb, NULL, NULL); if(!uzbl.state.instance_name) -- cgit v1.2.3 From 279ab2449b9dfb63937f64d144983042b82d1fc3 Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Sun, 24 Oct 2010 14:28:46 -0600 Subject: fix title update logic --- src/uzbl-core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/uzbl-core.c b/src/uzbl-core.c index c736794..f0b516e 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -2002,7 +2002,7 @@ update_title (void) { if (b->show_status) { if (b->title_format_short && uzbl.gui.main_window) { parsed = expand(b->title_format_short, 0); - if(current_title && strcmp(current_title, parsed)) + if(!current_title || strcmp(current_title, parsed)) gtk_window_set_title (GTK_WINDOW(uzbl.gui.main_window), parsed); g_free(parsed); } @@ -2014,7 +2014,7 @@ update_title (void) { } else { if (b->title_format_long && uzbl.gui.main_window) { parsed = expand(b->title_format_long, 0); - if(current_title && strcmp(current_title, parsed)) + if(!current_title || strcmp(current_title, parsed)) gtk_window_set_title (GTK_WINDOW(uzbl.gui.main_window), parsed); g_free(parsed); } -- cgit v1.2.3 From 2a54464d97349e5322b456c3b3f2f40330c806d8 Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Tue, 26 Oct 2010 18:27:11 -0600 Subject: use notify::load-status instead of deprecated load* signals --- src/callbacks.c | 66 ++++++++++++++++++++++++++++----------------------------- src/callbacks.h | 10 ++------- src/uzbl-core.c | 6 ++---- 3 files changed, 36 insertions(+), 46 deletions(-) (limited to 'src') diff --git a/src/callbacks.c b/src/callbacks.c index d2352b2..516c5d7 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -395,16 +395,42 @@ title_change_cb (WebKitWebView* web_view, GParamSpec param_spec) { } void -progress_change_cb (WebKitWebView* page, gint progress, gpointer data) { - (void) page; - (void) data; - gchar *prg_str; - - prg_str = itos(progress); +progress_change_cb (WebKitWebView* web_view, GParamSpec param_spec) { + (void) param_spec; + int progress = webkit_web_view_get_progress(web_view) * 100; + gchar *prg_str = itos(progress); send_event(LOAD_PROGRESS, prg_str, NULL); g_free(prg_str); } +void +load_status_change_cb (WebKitWebView* web_view, GParamSpec param_spec) { + (void) param_spec; + + WebKitWebFrame *frame = webkit_web_view_get_main_frame(web_view); + WebKitLoadStatus status = webkit_web_view_get_load_status(web_view); + switch(status) { + case WEBKIT_LOAD_PROVISIONAL: + send_event(LOAD_START, uzbl.state.uri, NULL); + break; + case WEBKIT_LOAD_COMMITTED: + g_free (uzbl.state.uri); + GString* newuri = g_string_new (webkit_web_frame_get_uri (frame)); + uzbl.state.uri = g_string_free (newuri, FALSE); + + send_event(LOAD_COMMIT, webkit_web_frame_get_uri (frame), NULL); + break; + case WEBKIT_LOAD_FINISHED: + send_event(LOAD_FINISH, webkit_web_frame_get_uri(frame), NULL); + break; + case WEBKIT_LOAD_FIRST_VISUALLY_NON_EMPTY_LAYOUT: + break; /* we don't do anything with this (yet) */ + case WEBKIT_LOAD_FAILED: + break; /* load_error_cb will handle this case */ + } + +} + void selection_changed_cb(WebKitWebView *webkitwebview, gpointer ud) { (void)ud; @@ -416,23 +442,6 @@ selection_changed_cb(WebKitWebView *webkitwebview, gpointer ud) { g_free(tmp); } -void -load_finish_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data) { - (void) page; - (void) data; - - send_event(LOAD_FINISH, webkit_web_frame_get_uri(frame), NULL); -} - -void -load_start_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data) { - (void) page; - (void) frame; - (void) data; - - send_event(LOAD_START, uzbl.state.uri, NULL); -} - void load_error_cb (WebKitWebView* page, WebKitWebFrame* frame, gchar *uri, gpointer web_err, gpointer ud) { (void) page; @@ -446,17 +455,6 @@ load_error_cb (WebKitWebView* page, WebKitWebFrame* frame, gchar *uri, gpointer g_free(details); } -void -load_commit_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data) { - (void) page; - (void) data; - g_free (uzbl.state.uri); - GString* newuri = g_string_new (webkit_web_frame_get_uri (frame)); - uzbl.state.uri = g_string_free (newuri, FALSE); - - send_event(LOAD_COMMIT, webkit_web_frame_get_uri (frame), NULL); -} - void destroy_cb (GtkWidget* widget, gpointer data) { (void) widget; diff --git a/src/callbacks.h b/src/callbacks.h index fdd08e4..41c1efa 100644 --- a/src/callbacks.h +++ b/src/callbacks.h @@ -143,16 +143,10 @@ void title_change_cb (WebKitWebView* web_view, GParamSpec param_spec); void -progress_change_cb (WebKitWebView* page, gint progress, gpointer data); +progress_change_cb (WebKitWebView* web_view, GParamSpec param_spec); void -load_commit_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data); - -void -load_start_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data); - -void -load_finish_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data); +load_status_change_cb (WebKitWebView* web_view, GParamSpec param_spec); void load_error_cb (WebKitWebView* page, WebKitWebFrame* frame, gchar *uri, gpointer web_err, gpointer ud); diff --git a/src/uzbl-core.c b/src/uzbl-core.c index 7be98c3..59cdf59 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -2039,10 +2039,8 @@ create_browser () { "signal::motion-notify-event", (GCallback)motion_notify_cb, NULL, "signal::title-changed", (GCallback)title_change_cb, NULL, "signal::selection-changed", (GCallback)selection_changed_cb, NULL, - "signal::load-progress-changed", (GCallback)progress_change_cb, NULL, - "signal::load-committed", (GCallback)load_commit_cb, NULL, - "signal::load-started", (GCallback)load_start_cb, NULL, - "signal::load-finished", (GCallback)load_finish_cb, NULL, + "signal::notify::progress", (GCallback)progress_change_cb, NULL, + "signal::notify::load-status", (GCallback)load_status_change_cb, NULL, "signal::load-error", (GCallback)load_error_cb, NULL, "signal::hovering-over-link", (GCallback)link_hover_cb, NULL, "signal::navigation-policy-decision-requested", (GCallback)navigation_decision_cb, NULL, -- cgit v1.2.3 From 457642eb3fea682f06b3aee5d5b61cf88e5b2991 Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Fri, 29 Oct 2010 12:16:20 -0600 Subject: split off some generic functions into util.c --- src/callbacks.c | 2 +- src/util.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/util.h | 15 ++++++++++ src/uzbl-core.c | 83 +--------------------------------------------------- src/uzbl-core.h | 18 ------------ 5 files changed, 108 insertions(+), 101 deletions(-) create mode 100644 src/util.c create mode 100644 src/util.h (limited to 'src') diff --git a/src/callbacks.c b/src/callbacks.c index 0fbf589..f07d63e 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -6,7 +6,7 @@ #include "uzbl-core.h" #include "callbacks.h" #include "events.h" - +#include "util.h" void set_proxy_url() { diff --git a/src/util.c b/src/util.c new file mode 100644 index 0000000..f6c2e0a --- /dev/null +++ b/src/util.c @@ -0,0 +1,91 @@ +#define _POSIX_SOURCE + +#include +#include +#include + +#include "util.h" + +XDG_Var XDG[] = +{ + { "XDG_CONFIG_HOME", "~/.config" }, + { "XDG_DATA_HOME", "~/.local/share" }, + { "XDG_CACHE_HOME", "~/.cache" }, + { "XDG_CONFIG_DIRS", "/etc/xdg" }, + { "XDG_DATA_DIRS", "/usr/local/share/:/usr/share/" }, +}; + +/*@null@*/ gchar* +get_xdg_var (XDG_Var xdg) { + const gchar* actual_value = getenv (xdg.environmental); + const gchar* home = getenv ("HOME"); + gchar* return_value; + + if (! actual_value || strcmp (actual_value, "") == 0) { + if (xdg.default_value) { + return_value = str_replace ("~", home, xdg.default_value); + } else { + return_value = NULL; + } + } else { + return_value = str_replace("~", home, actual_value); + } + + return return_value; +} + +/*@null@*/ gchar* +find_xdg_file (int xdg_type, const char* filename) { + /* xdg_type = 0 => config + xdg_type = 1 => data + xdg_type = 2 => cache*/ + + gchar* xdgv = get_xdg_var (XDG[xdg_type]); + gchar* temporary_file = g_strconcat (xdgv, filename, NULL); + g_free (xdgv); + + gchar* temporary_string; + char* saveptr; + char* buf; + + if (! file_exists (temporary_file) && xdg_type != 2) { + buf = get_xdg_var (XDG[3 + xdg_type]); + temporary_string = (char *) strtok_r (buf, ":", &saveptr); + g_free(buf); + + while ((temporary_string = (char * ) strtok_r (NULL, ":", &saveptr)) && ! file_exists (temporary_file)) { + g_free (temporary_file); + temporary_file = g_strconcat (temporary_string, filename, NULL); + } + } + + //g_free (temporary_string); - segfaults. + + if (file_exists (temporary_file)) { + return temporary_file; + } else { + g_free(temporary_file); + return NULL; + } +} + +gboolean +file_exists (const char * filename) { + return (access(filename, F_OK) == 0); +} + +char * +str_replace (const char* search, const char* replace, const char* string) { + gchar **buf; + char *ret; + + if(!string) + return NULL; + + buf = g_strsplit (string, search, -1); + ret = g_strjoinv (replace, buf); + g_strfreev(buf); + + return ret; +} + diff --git a/src/util.h b/src/util.h new file mode 100644 index 0000000..2a00b8a --- /dev/null +++ b/src/util.h @@ -0,0 +1,15 @@ +#include + +typedef struct { + gchar* environmental; + gchar* default_value; +} XDG_Var; + +gchar* get_xdg_var (XDG_Var xdg); + +gchar* find_xdg_file (int xdg_type, const char* filename); + +gboolean file_exists(const char* filename); + +char * +str_replace (const char* search, const char* replace, const char* string); diff --git a/src/uzbl-core.c b/src/uzbl-core.c index 12d20ae..9cb6f08 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -34,6 +34,7 @@ #include "events.h" #include "inspector.h" #include "config.h" +#include "util.h" UzblCore uzbl; @@ -62,15 +63,6 @@ GOptionEntry entries[] = { NULL, 0, 0, 0, NULL, NULL, NULL } }; -XDG_Var XDG[] = -{ - { "XDG_CONFIG_HOME", "~/.config" }, - { "XDG_DATA_HOME", "~/.local/share" }, - { "XDG_CACHE_HOME", "~/.cache" }, - { "XDG_CONFIG_DIRS", "/etc/xdg" }, - { "XDG_DATA_DIRS", "/usr/local/share/:/usr/share/" }, -}; - /* abbreviations to help keep the table's width humane */ #define PTR_V_STR(var, d, fun) { .ptr.s = &(var), .type = TYPE_STR, .dump = d, .writeable = 1, .func = fun } #define PTR_V_INT(var, d, fun) { .ptr.i = (int*)&(var), .type = TYPE_INT, .dump = d, .writeable = 1, .func = fun } @@ -372,21 +364,6 @@ strfree(gchar *str) { gchar* argv_idx(const GArray *a, const guint idx) { return g_array_index(a, gchar*, idx); } -char * -str_replace (const char* search, const char* replace, const char* string) { - gchar **buf; - char *ret; - - if(!string) - return NULL; - - buf = g_strsplit (string, search, -1); - ret = g_strjoinv (replace, buf); - g_strfreev(buf); - - return ret; -} - GArray* read_file_by_line (const gchar *path) { GIOChannel *chan = NULL; @@ -734,11 +711,6 @@ builtins() { /* -- CORE FUNCTIONS -- */ -bool -file_exists (const char * filename) { - return (access(filename, F_OK) == 0); -} - void set_var(WebKitWebView *page, GArray *argv, GString *result) { (void) page; (void) result; @@ -2108,59 +2080,6 @@ run_handler (const gchar *act, const gchar *args) { g_strfreev(parts); } -/*@null@*/ gchar* -get_xdg_var (XDG_Var xdg) { - const gchar* actual_value = getenv (xdg.environmental); - const gchar* home = getenv ("HOME"); - gchar* return_value; - - if (! actual_value || strcmp (actual_value, "") == 0) { - if (xdg.default_value) { - return_value = str_replace ("~", home, xdg.default_value); - } else { - return_value = NULL; - } - } else { - return_value = str_replace("~", home, actual_value); - } - - return return_value; -} - -/*@null@*/ gchar* -find_xdg_file (int xdg_type, const char* filename) { - /* xdg_type = 0 => config - xdg_type = 1 => data - xdg_type = 2 => cache*/ - - gchar* xdgv = get_xdg_var (XDG[xdg_type]); - gchar* temporary_file = g_strconcat (xdgv, filename, NULL); - g_free (xdgv); - - gchar* temporary_string; - char* saveptr; - char* buf; - - if (! file_exists (temporary_file) && xdg_type != 2) { - buf = get_xdg_var (XDG[3 + xdg_type]); - temporary_string = (char *) strtok_r (buf, ":", &saveptr); - g_free(buf); - - while ((temporary_string = (char * ) strtok_r (NULL, ":", &saveptr)) && ! file_exists (temporary_file)) { - g_free (temporary_file); - temporary_file = g_strconcat (temporary_string, filename, NULL); - } - } - - //g_free (temporary_string); - segfaults. - - if (file_exists (temporary_file)) { - return temporary_file; - } else { - g_free(temporary_file); - return NULL; - } -} void settings_init () { State *s = &uzbl.state; diff --git a/src/uzbl-core.h b/src/uzbl-core.h index b4b251d..08fdce2 100644 --- a/src/uzbl-core.h +++ b/src/uzbl-core.h @@ -206,12 +206,6 @@ extern UzblCore uzbl; typedef void sigfunc(int); -/* XDG Stuff */ -typedef struct { - gchar* environmental; - gchar* default_value; -} XDG_Var; - /* uzbl variables */ enum ptr_type {TYPE_INT, TYPE_STR, TYPE_FLOAT}; typedef struct { @@ -230,9 +224,6 @@ typedef struct { char * itos(int val); -char * -str_replace (const char* search, const char* replace, const char* string); - gchar* strfree(gchar *str); @@ -263,9 +254,6 @@ print(WebKitWebView *page, GArray *argv, GString *result); void commands_hash(void); -bool -file_exists (const char * filename); - void load_uri (WebKitWebView * web_view, GArray *argv, GString *result); @@ -348,12 +336,6 @@ create_plug (); void run_handler (const gchar *act, const gchar *args); -/*@null@*/ gchar* -get_xdg_var (XDG_Var xdg); - -/*@null@*/ gchar* -find_xdg_file (int xdg_type, const char* filename); - void settings_init (); -- cgit v1.2.3 From 9bea9618424093c6d2cc93954f4cbdd0be4b7637 Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Fri, 29 Oct 2010 21:49:38 -0600 Subject: add uzbl-cookie-manager --- Makefile | 18 ++-- examples/uzbl-cookie-manager.c | 211 +++++++++++++++++++++++++++++++++++++++++ src/util.c | 2 +- 3 files changed, 222 insertions(+), 9 deletions(-) create mode 100644 examples/uzbl-cookie-manager.c (limited to 'src') diff --git a/Makefile b/Makefile index 5287d5c..2a08b5c 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ SRC = $(wildcard src/*.c) HEAD = $(wildcard src/*.h) OBJ = $(foreach obj, $(SRC:.c=.o), $(notdir $(obj))) -all: uzbl-browser +all: uzbl-browser uzbl-cookie-manager VPATH:=src @@ -24,7 +24,11 @@ uzbl-core: ${OBJ} @echo -e "\n${CC} -o $@ ${OBJ} ${LDFLAGS}" @${CC} -o $@ ${OBJ} ${LDFLAGS} -uzbl-browser: uzbl-core +uzbl-cookie-manager: examples/uzbl-cookie-manager.o src/util.o + @echo -e "\n${CC} -o $@ uzbl-cookie-manager.o util.o ${LDFLAGS}" + @${CC} -o $@ uzbl-cookie-manager.o util.o ${LDFLAGS} + +uzbl-browser: uzbl-core uzbl-cookie-manager # packagers, set DESTDIR to your "package directory" and PREFIX to the prefix you want to have on the end-user system # end-users who build from source: don't care about DESTDIR, update PREFIX if you want to @@ -72,10 +76,8 @@ test-uzbl-browser-sandbox: uzbl-browser clean: rm -f uzbl-core - rm -f uzbl-core.o - rm -f events.o - rm -f callbacks.o - rm -f inspector.o + rm -f uzbl-cookie-manager + rm -f *.o find ./examples/ -name "*.pyc" -delete cd ./tests/; $(MAKE) clean rm -rf ./sandbox/ @@ -104,9 +106,9 @@ install-uzbl-core: all install-dirs rm $(INSTALLDIR)/share/uzbl/examples/config/config.bak install -m755 uzbl-core $(INSTALLDIR)/bin/uzbl-core -install-uzbl-browser: install-dirs +install-uzbl-browser: uzbl-cookie-manager install-dirs install -m755 src/uzbl-browser $(INSTALLDIR)/bin/uzbl-browser - install -m755 examples/data/scripts/uzbl-cookie-daemon $(INSTALLDIR)/bin/uzbl-cookie-daemon + install -m755 uzbl-cookie-manager $(INSTALLDIR)/bin/uzbl-cookie-manager install -m755 examples/data/scripts/uzbl-event-manager $(INSTALLDIR)/bin/uzbl-event-manager mv $(INSTALLDIR)/bin/uzbl-browser{,.bak} sed 's#^PREFIX=.*#PREFIX=$(RUN_PREFIX)#' < $(INSTALLDIR)/bin/uzbl-browser.bak > $(INSTALLDIR)/bin/uzbl-browser diff --git a/examples/uzbl-cookie-manager.c b/examples/uzbl-cookie-manager.c new file mode 100644 index 0000000..b873aeb --- /dev/null +++ b/examples/uzbl-cookie-manager.c @@ -0,0 +1,211 @@ +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "../src/util.h" + +extern const XDG_Var XDG[]; + +int verbose = 0; + +#define SOCK_BACKLOG 10 +#define MAX_COOKIE_LENGTH 4096 + +char cookie_buffer[MAX_COOKIE_LENGTH]; + +int setup_socket(const char *cookied_socket_path) { + int socket_fd = socket(AF_UNIX, SOCK_SEQPACKET, 0); + + if(socket_fd < 0) { + fprintf(stderr, "socket failed (%s)\n", strerror(errno)); + return -1; + } + + struct sockaddr_un sa; + sa.sun_family = AF_UNIX; + strcpy(sa.sun_path, cookied_socket_path); + + if(bind(socket_fd, (struct sockaddr*)&sa, sizeof(sa)) < 0) { + fprintf(stderr, "bind failed (%s)\n", strerror(errno)); + return -1; + } + + if(listen(socket_fd, SOCK_BACKLOG) < 0) { + fprintf(stderr, "listen failed (%s)\n", strerror(errno)); + return -1; + } + + return socket_fd; +} + +void handle_request(SoupCookieJar *j, const char *buff, int len, int fd) { + const char *command = buff; + + const char *scheme = command + strlen(command) + 1; + if((scheme - buff) > len) { + fprintf(stderr, "got malformed or partial request\n"); + return; + } + + const char *host = scheme + strlen(scheme) + 1; + if((host - buff) > len) { + fprintf(stderr, "got malformed or partial request\n"); + return; + } + + const char *path = host + strlen(host) + 1; + if((path - buff) > len) { + fprintf(stderr, "got malformed or partial request\n"); + return; + } + + /* glue the parts back together into a SoupURI */ + char *u = g_strconcat(scheme, "://", host, path, NULL); + if(verbose) printf("%s %s\n", command, u); + SoupURI *uri = soup_uri_new(u); + g_free(u); + + if(!strcmp(command, "GET")) { + char *result = soup_cookie_jar_get_cookies(j, uri, TRUE); + if(result) { + if(verbose) puts(result); + if(write(fd, result, strlen(result)+1) < 0) + fprintf(stderr, "write failed (%s)", strerror(errno)); + + g_free(result); + } else { + if(verbose) puts("-"); + if(write(fd, "", 1) < 0) + fprintf(stderr, "write failed (%s)", strerror(errno)); + } + } else if(!strcmp(command, "PUT")) { + const char *name_and_val = path + strlen(path) + 1; + if((name_and_val - buff) > len) { + fprintf(stderr, "got malformed or partial request\n"); + return; + } + + if(verbose) puts(name_and_val); + + char *eql = strchr(name_and_val, '='); + eql[0] = 0; + + const char *name = name_and_val; + const char *value = eql + 1; + + SoupCookie *cookie = soup_cookie_new(name, value, host, path, SOUP_COOKIE_MAX_AGE_ONE_YEAR); + + soup_cookie_jar_add_cookie(j, cookie); + + if(write(fd, "", 1) < 0) + fprintf(stderr, "write failed (%s)", strerror(errno)); + } + + soup_uri_free(uri); +} + +void usage(const char *progname) { + printf("%s [-s socket-path] [-f cookies.txt] [-w whitelist-file] [-v]\n", progname); +} + +int main(int argc, char *argv[]) { + int i; + + const char *cookies_txt_path = NULL; + const char *cookied_socket_path = NULL; + + for(i = 1; i < argc && argv[i][0] == '-'; i++) { + switch(argv[i][1]) { + case 's': + cookied_socket_path = argv[++i]; + break; + case 'f': + cookies_txt_path = argv[++i]; + break; + case 'v': + verbose = 1; + break; + default: + usage(argv[0]); + return 1; + } + } + + if(!cookies_txt_path) + cookies_txt_path = find_xdg_file(1, "/uzbl/cookies.txt"); + + if(!cookied_socket_path) + cookied_socket_path = g_strconcat(get_xdg_var(XDG[2]), "/uzbl/cookie_daemon_socket", NULL); + + g_type_init(); + + SoupCookieJar *j = soup_cookie_jar_text_new(cookies_txt_path, FALSE); + + int cookie_socket = setup_socket(cookied_socket_path); + if(cookie_socket < 0) { + return 1; + } + + GArray *connections = g_array_new (FALSE, FALSE, sizeof (int)); + + while(1) { + unsigned int i; + int r; + fd_set fs; + + int maxfd = cookie_socket; + FD_ZERO(&fs); + FD_SET(maxfd, &fs); + + for(i = 0; i < connections->len; i++) { + int fd = g_array_index(connections, int, i); + if(fd > maxfd) maxfd = fd; + FD_SET(fd, &fs); + } + + r = select(maxfd+1, &fs, NULL, NULL, NULL); + if(r < 0) { + fprintf(stderr, "select failed (%s)\n", strerror(errno)); + continue; + } + + if(FD_ISSET(cookie_socket, &fs)) { + /* handle new connection */ + int fd = accept(cookie_socket, NULL, NULL); + g_array_append_val(connections, fd); + if(verbose) puts("got connection."); + } + + for(i = 0; i < connections->len; i++) { + /* handle activity on a connection */ + int fd = g_array_index(connections, int, i); + if(FD_ISSET(fd, &fs)) { + r = read(fd, cookie_buffer, MAX_COOKIE_LENGTH); + if(r < 0) { + fprintf(stderr, "read failed (%s)\n", strerror(errno)); + continue; + } else if(r == 0) { + if(verbose) puts("client hung up."); + g_array_remove_index(connections, i); + i--; /* other elements in the array are moved down to fill the gap */ + continue; + } + cookie_buffer[r] = 0; + + handle_request(j, cookie_buffer, r, fd); + } + } + } + + return 0; +} diff --git a/src/util.c b/src/util.c index f6c2e0a..54d1d02 100644 --- a/src/util.c +++ b/src/util.c @@ -6,7 +6,7 @@ #include "util.h" -XDG_Var XDG[] = +const XDG_Var XDG[] = { { "XDG_CONFIG_HOME", "~/.config" }, { "XDG_DATA_HOME", "~/.local/share" }, -- cgit v1.2.3 From 877e5dace26fd6482f56f211082492eac48cc588 Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Sun, 31 Oct 2010 18:16:17 -0600 Subject: if no handler is set, fall back to the internal soup cookie jar --- src/callbacks.c | 5 +++++ src/cookie-jar.c | 43 +++++++++++++++++++++++++++---------------- 2 files changed, 32 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/callbacks.c b/src/callbacks.c index 0fbf589..9a37543 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -832,5 +832,10 @@ populate_popup_cb(WebKitWebView *v, GtkMenu *m, void *c) { void cmd_set_cookie_handler() { + if(uzbl.behave.cookie_handler[0] == 0) { + g_free(uzbl.behave.cookie_handler); + uzbl.behave.cookie_handler = NULL; + } + uzbl_cookie_jar_set_handler(uzbl.net.soup_cookie_jar, uzbl.behave.cookie_handler); } diff --git a/src/cookie-jar.c b/src/cookie-jar.c index 4bb1925..cd8e4b8 100644 --- a/src/cookie-jar.c +++ b/src/cookie-jar.c @@ -35,6 +35,7 @@ static bool has_socket_handler(UzblCookieJar *jar) { static void soup_cookie_jar_socket_init(UzblCookieJar *jar) { + jar->handler = NULL; jar->socket_path = NULL; jar->connection_fd = -1; } @@ -97,33 +98,43 @@ static void request_started(SoupSessionFeature *feature, SoupSession *session, SoupMessage *msg, SoupSocket *socket) { (void) session; (void) socket; + gchar *cookies; UzblCookieJar *jar = UZBL_COOKIE_JAR (feature); SoupURI *uri = soup_message_get_uri(msg); + gboolean add_to_internal_jar = false; - gchar *cookies = get_cookies(jar, uri); + if(jar->handler) { + cookies = get_cookies(jar, uri); + } else { + /* no handler is set, fall back to the internal soup cookie jar */ + cookies = soup_cookie_jar_get_cookies(SOUP_COOKIE_JAR(jar), soup_message_get_uri (msg), TRUE); + } - if (cookies && *cookies != 0) { + if (cookies && cookies[0] != 0) { const gchar *next_cookie_start = cookies; - /* add the cookie data that we just obtained from the cookie handler - to the cookie jar so that javascript has access to them. - we set this flag so that we don't trigger the PUT handler. */ - jar->in_get_callback = true; - do { - SoupCookie *soup_cookie = soup_cookie_parse(next_cookie_start, uri); - if(soup_cookie) - soup_cookie_jar_add_cookie(SOUP_COOKIE_JAR(uzbl.net.soup_cookie_jar), soup_cookie); - next_cookie_start = strchr(next_cookie_start, ';'); - } while(next_cookie_start++ != NULL); - jar->in_get_callback = false; + if (add_to_internal_jar) { + /* add the cookie data that we just obtained from the cookie handler + to the cookie jar so that javascript has access to them. + we set this flag so that we don't trigger the PUT handler. */ + jar->in_get_callback = true; + do { + SoupCookie *soup_cookie = soup_cookie_parse(next_cookie_start, uri); + if(soup_cookie) + soup_cookie_jar_add_cookie(SOUP_COOKIE_JAR(uzbl.net.soup_cookie_jar), soup_cookie); + next_cookie_start = strchr(next_cookie_start, ';'); + } while(next_cookie_start++ != NULL); + jar->in_get_callback = false; + } soup_message_headers_replace (msg->request_headers, "Cookie", cookies); - - g_free (cookies); } else { soup_message_headers_remove (msg->request_headers, "Cookie"); } + + if(cookies) + g_free (cookies); } static void @@ -174,7 +185,7 @@ changed(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie) { static void setup_handler(UzblCookieJar *jar) { - if(strncmp(jar->handler, "talk_to_socket", strlen("talk_to_socket")) == 0) { + if(jar->handler && strncmp(jar->handler, "talk_to_socket", strlen("talk_to_socket")) == 0) { /* extract the socket path from the handler. */ jar->socket_path = jar->handler + strlen("talk_to_socket"); while(isspace(*jar->socket_path)) -- cgit v1.2.3 From 2f6fe6720ca69b58224bd5f45c9b47be9b7f8fbe Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Tue, 2 Nov 2010 20:59:23 -0600 Subject: get rid of read_file_by_line config files no longer have to be read entirely into memory, and external javascript no longer does pointless reallocations --- src/uzbl-core.c | 91 +++++++++++++++++++-------------------------------------- src/uzbl-core.h | 3 -- 2 files changed, 30 insertions(+), 64 deletions(-) (limited to 'src') diff --git a/src/uzbl-core.c b/src/uzbl-core.c index 9cb6f08..8b2dba5 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -364,31 +364,24 @@ strfree(gchar *str) { gchar* argv_idx(const GArray *a, const guint idx) { return g_array_index(a, gchar*, idx); } -GArray* -read_file_by_line (const gchar *path) { - GIOChannel *chan = NULL; - gchar *readbuf = NULL; +void +for_each_line_in_file(gchar *path, void (*callback)(const gchar *l, void *c), void *user_data) { \ + gchar *line = NULL; gsize len; - GArray *lines = g_array_new(TRUE, FALSE, sizeof(gchar*)); - int i = 0; - chan = g_io_channel_new_file(path, "r", NULL); + GIOChannel *chan = g_io_channel_new_file(path, "r", NULL); + if (chan) { - while (g_io_channel_read_line(chan, &readbuf, &len, NULL, NULL) == G_IO_STATUS_NORMAL) { - const gchar* val = g_strdup (readbuf); - g_array_append_val (lines, val); - g_free (readbuf); - i ++; + while (g_io_channel_read_line(chan, &line, &len, NULL, NULL) == G_IO_STATUS_NORMAL) { + callback(line, user_data); + g_free(line); } - g_io_channel_unref (chan); } else { gchar *tmp = g_strdup_printf("File %s can not be read.", path); send_event(COMMAND_ERROR, tmp, NULL); g_free(tmp); } - - return lines; } /* search a PATH style string for an existing file+path combination */ @@ -941,29 +934,26 @@ hardcopy(WebKitWebView *page, GArray *argv, GString *result) { webkit_web_frame_print(webkit_web_view_get_main_frame(page)); } +/* just a wrapper so parse_cmd_line can be used with for_each_line_in_file */ +static void +parse_cmd_line_cb(const char *line, void *user_data) { + (void) user_data; + parse_cmd_line(line, NULL); +} + void include(WebKitWebView *page, GArray *argv, GString *result) { (void) page; (void) result; gchar *pe = NULL, - *path = NULL, - *line; - int i=0; + *path = NULL; if(!argv_idx(argv, 0)) return; pe = parseenv(argv_idx(argv, 0)); if((path = find_existing_file(pe))) { - GArray* lines = read_file_by_line(path); - - while ((line = g_array_index(lines, gchar*, i))) { - parse_cmd_line (line, NULL); - i++; - g_free (line); - } - g_array_free (lines, TRUE); - + for_each_line_in_file(path, parse_cmd_line_cb, NULL); send_event(FILE_INCLUDED, path, NULL); g_free(path); } @@ -1127,32 +1117,23 @@ run_external_js (WebKitWebView * web_view, GArray *argv, GString *result) { if (argv_idx(argv, 0) && ((path = find_existing_file(argv_idx(argv, 0)))) ) { - GArray* lines = read_file_by_line (path); - gchar* js = NULL; - int i = 0; - gchar* line; - - while ((line = g_array_index(lines, gchar*, i))) { - if (js == NULL) { - js = g_strdup (line); - } else { - gchar* newjs = g_strconcat (js, line, NULL); - js = newjs; - } - i ++; - g_free (line); + gchar *file_contents = NULL; + + GIOChannel *chan = g_io_channel_new_file(path, "r", NULL); + if (chan) { + gsize len; + g_io_channel_read_to_end(chan, &file_contents, &len, NULL); + g_io_channel_unref (chan); } if (uzbl.state.verbose) printf ("External JavaScript file %s loaded\n", argv_idx(argv, 0)); - gchar* newjs = str_replace("%s", argv_idx (argv, 1)?argv_idx (argv, 1):"", js); - g_free (js); - js = newjs; + gchar *js = str_replace("%s", argv_idx (argv, 1) ? argv_idx (argv, 1) : "", file_contents); + g_free (file_contents); eval_js (web_view, js, result, path); g_free (js); - g_array_free (lines, TRUE); g_free(path); } } @@ -1575,7 +1556,6 @@ parse_cmd_line(const char *ctl_line, GString *result) { g_free(ctlstrip); } - /*@null@*/ gchar* build_stream_name(int type, const gchar* dir) { State *s = &uzbl.state; @@ -2099,21 +2079,10 @@ settings_init () { s->config_file = find_xdg_file (0, "/uzbl/config"); } - if (s->config_file) { - GArray* lines = read_file_by_line (s->config_file); - int i = 0; - gchar* line; - - while ((line = g_array_index(lines, gchar*, i))) { - parse_cmd_line (line, NULL); - i ++; - g_free (line); - } - g_array_free (lines, TRUE); - } else { - if (uzbl.state.verbose) - printf ("No configuration file loaded.\n"); - } + if (s->config_file) + for_each_line_in_file(s->config_file, parse_cmd_line_cb, NULL); + else if (uzbl.state.verbose) + printf ("No configuration file loaded.\n"); if(s->connect_socket_names) init_connect_socket(); diff --git a/src/uzbl-core.h b/src/uzbl-core.h index 08fdce2..5466507 100644 --- a/src/uzbl-core.h +++ b/src/uzbl-core.h @@ -227,9 +227,6 @@ itos(int val); gchar* strfree(gchar *str); -GArray* -read_file_by_line (const gchar *path); - gchar* parseenv (gchar* string); -- cgit v1.2.3 From e0acf99635e715b088eee33f83e4524ed3c7f734 Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Tue, 2 Nov 2010 21:14:48 -0600 Subject: moved for_each_line_in_file into util.c --- src/util.c | 19 +++++++++++++++++++ src/util.h | 3 +++ src/uzbl-core.c | 37 +++++++++++++------------------------ 3 files changed, 35 insertions(+), 24 deletions(-) (limited to 'src') diff --git a/src/util.c b/src/util.c index 54d1d02..c9c728e 100644 --- a/src/util.c +++ b/src/util.c @@ -89,3 +89,22 @@ str_replace (const char* search, const char* replace, const char* string) { return ret; } +gboolean +for_each_line_in_file(const gchar *path, void (*callback)(const gchar *l, void *c), void *user_data) { + gchar *line = NULL; + gsize len; + + GIOChannel *chan = g_io_channel_new_file(path, "r", NULL); + + if (chan) { + while (g_io_channel_read_line(chan, &line, &len, NULL, NULL) == G_IO_STATUS_NORMAL) { + callback(line, user_data); + g_free(line); + } + g_io_channel_unref (chan); + + return TRUE; + } + + return FALSE; +} diff --git a/src/util.h b/src/util.h index 2a00b8a..f03f13e 100644 --- a/src/util.h +++ b/src/util.h @@ -13,3 +13,6 @@ gboolean file_exists(const char* filename); char * str_replace (const char* search, const char* replace, const char* string); + +gboolean +for_each_line_in_file(const gchar *path, void (*callback)(const gchar *l, void *c), void *user_data); diff --git a/src/uzbl-core.c b/src/uzbl-core.c index 8b2dba5..4125514 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -364,26 +364,6 @@ strfree(gchar *str) { gchar* argv_idx(const GArray *a, const guint idx) { return g_array_index(a, gchar*, idx); } -void -for_each_line_in_file(gchar *path, void (*callback)(const gchar *l, void *c), void *user_data) { \ - gchar *line = NULL; - gsize len; - - GIOChannel *chan = g_io_channel_new_file(path, "r", NULL); - - if (chan) { - while (g_io_channel_read_line(chan, &line, &len, NULL, NULL) == G_IO_STATUS_NORMAL) { - callback(line, user_data); - g_free(line); - } - g_io_channel_unref (chan); - } else { - gchar *tmp = g_strdup_printf("File %s can not be read.", path); - send_event(COMMAND_ERROR, tmp, NULL); - g_free(tmp); - } -} - /* search a PATH style string for an existing file+path combination */ gchar* find_existing_file(gchar* path_list) { @@ -953,7 +933,12 @@ include(WebKitWebView *page, GArray *argv, GString *result) { pe = parseenv(argv_idx(argv, 0)); if((path = find_existing_file(pe))) { - for_each_line_in_file(path, parse_cmd_line_cb, NULL); + if(!for_each_line_in_file(path, parse_cmd_line_cb, NULL)) { + gchar *tmp = g_strdup_printf("File %s can not be read.", path); + send_event(COMMAND_ERROR, tmp, NULL); + g_free(tmp); + } + send_event(FILE_INCLUDED, path, NULL); g_free(path); } @@ -2079,9 +2064,13 @@ settings_init () { s->config_file = find_xdg_file (0, "/uzbl/config"); } - if (s->config_file) - for_each_line_in_file(s->config_file, parse_cmd_line_cb, NULL); - else if (uzbl.state.verbose) + if (s->config_file) { + if(!for_each_line_in_file(s->config_file, parse_cmd_line_cb, NULL)) { + gchar *tmp = g_strdup_printf("File %s can not be read.", s->config_file); + send_event(COMMAND_ERROR, tmp, NULL); + g_free(tmp); + } + } else if (uzbl.state.verbose) printf ("No configuration file loaded.\n"); if(s->connect_socket_names) -- cgit v1.2.3 From 9bcdbf979f5812b26803dbbc26f3f661808a2ee9 Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Fri, 5 Nov 2010 16:36:14 -0600 Subject: use notify::title instead of title-changed --- src/uzbl-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/uzbl-core.c b/src/uzbl-core.c index 59cdf59..52ec95a 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -2037,7 +2037,7 @@ create_browser () { "signal::button-press-event", (GCallback)button_press_cb, NULL, "signal::button-release-event", (GCallback)button_release_cb, NULL, "signal::motion-notify-event", (GCallback)motion_notify_cb, NULL, - "signal::title-changed", (GCallback)title_change_cb, NULL, + "signal::notify::title", (GCallback)title_change_cb, NULL, "signal::selection-changed", (GCallback)selection_changed_cb, NULL, "signal::notify::progress", (GCallback)progress_change_cb, NULL, "signal::notify::load-status", (GCallback)load_status_change_cb, NULL, -- cgit v1.2.3 From 63b6c90cb3911a7424f5d30c63526a3b42ab3a5f Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Sat, 13 Nov 2010 10:44:07 -0700 Subject: replace uzbl-cookie-daemon with uzbl-cookie-manager in uzbl-browser, also cleanup some outdated comments in u-b --- Makefile | 3 +-- src/uzbl-browser | 29 +++++++++++++---------------- 2 files changed, 14 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/Makefile b/Makefile index ca1401c..81df414 100644 --- a/Makefile +++ b/Makefile @@ -66,10 +66,9 @@ test-uzbl-browser-sandbox: uzbl-browser make DESTDIR=./sandbox RUN_PREFIX=`pwd`/sandbox/usr/local install-uzbl-browser make DESTDIR=./sandbox RUN_PREFIX=`pwd`/sandbox/usr/local install-example-data cp -np ./misc/env.sh ./sandbox/env.sh - source ./sandbox/env.sh && uzbl-cookie-daemon restart -nv & + source ./sandbox/env.sh && uzbl-cookie-manager -v & source ./sandbox/env.sh && uzbl-event-manager restart -navv & source ./sandbox/env.sh && uzbl-browser --uri http://www.uzbl.org --verbose - source ./sandbox/env.sh && uzbl-cookie-daemon stop -v source ./sandbox/env.sh && uzbl-event-manager stop -ivv make DESTDIR=./sandbox uninstall rm -rf ./sandbox/usr diff --git a/src/uzbl-browser b/src/uzbl-browser index de4f7af..9f6847b 100755 --- a/src/uzbl-browser +++ b/src/uzbl-browser @@ -1,13 +1,11 @@ #!/bin/sh -# this script implements a more useful out-of-the-box "browsing experience". -# it does so by combining uzbl-core with a set of "recommended" tools and practices. -# see docs for more info -# If you want to customize the behavior of the cookie-daemon or similar helper tools, -# copy them to your $XDG_DATA_HOME/uzbl/scripts/, edit them and update $PATH - -# Also, we assume existence of fifo/socket == correctly functioning cookie_daemon/event_manager. -# Checking correct functioning of the daemons here would be too complex here, and it's not implemented in uzbl-core either. -# But this shouldn't cause much problems.. +# +# This script implements a more useful out-of-the-box "browsing experience". +# It does so by combining uzbl-core with a set of "recommended" tools and +# practices. See docs for more info. +# +# If you want to customize the behavior any of the helper tools, copy them +# to your $XDG_DATA_HOME/uzbl/scripts/ and edit them PREFIX=/usr/local if [ -z "$XDG_DATA_HOME" ] @@ -37,6 +35,7 @@ do fi fi done + # if no config exists yet in the recommended location, put the default (recommended) config there if [ ! -f $XDG_CONFIG_HOME/uzbl/config ] then @@ -47,17 +46,15 @@ then fi fi -# Uncomment this for a slight speedup at the expense of not having -# stale cookie daemon sockets cleaned up. -#if [ ! -S $XDG_CACHE_HOME/uzbl/cookie_daemon_socket ] -#then - # if you want to customize it, copy to your $XDG_DATA_HOME/uzbl/scripts/ and update $PATH - uzbl-cookie-daemon -v start -#fi +# uzbl-cookie-manager will exit if another instance is already running +uzbl-cookie-manager DAEMON_SOCKET=$XDG_CACHE_HOME/uzbl/event_daemon DAEMON_PID=${DAEMON_SOCKET}.pid +# uzbl-event-manager will exit if one is already running, but you could +# check if the pid file exists here to avoid having to spawn it for a +# slight speedup #if [ -f "$DAEMON_PID" ] #then uzbl-event-manager -va start -- cgit v1.2.3 From 9ced8fc3981ad0dc9dba24fe414df71292420dba Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Sun, 14 Nov 2010 06:03:59 -0700 Subject: fix the status bar in uzbl-tabbed --- src/uzbl-core.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/uzbl-core.c b/src/uzbl-core.c index 1bac5ed..fb7b641 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -1854,26 +1854,27 @@ void update_title (void) { Behaviour *b = &uzbl.behave; gchar *parsed; + const gchar *current_title; + /* this check is here because if we're starting up or shutting down it might not be a window */ + gboolean have_main_window = !uzbl.state.plug_mode && GTK_IS_WINDOW(uzbl.gui.main_window); - if(!GTK_IS_WINDOW(uzbl.gui.main_window)) - return; /* we're just starting up or just shutting down. */ - - const gchar *current_title = gtk_window_get_title (GTK_WINDOW(uzbl.gui.main_window)); + if(have_main_window) + current_title = gtk_window_get_title (GTK_WINDOW(uzbl.gui.main_window)); if (b->show_status) { - if (b->title_format_short && uzbl.gui.main_window) { + if (b->title_format_short && have_main_window) { parsed = expand(b->title_format_short, 0); if(!current_title || strcmp(current_title, parsed)) gtk_window_set_title (GTK_WINDOW(uzbl.gui.main_window), parsed); g_free(parsed); } - if (b->status_format) { + if (b->status_format && GTK_IS_LABEL(uzbl.gui.mainbar_label)) { parsed = expand(b->status_format, 0); gtk_label_set_markup(GTK_LABEL(uzbl.gui.mainbar_label), parsed); g_free(parsed); } } else { - if (b->title_format_long && uzbl.gui.main_window) { + if (b->title_format_long && have_main_window) { parsed = expand(b->title_format_long, 0); if(!current_title || strcmp(current_title, parsed)) gtk_window_set_title (GTK_WINDOW(uzbl.gui.main_window), parsed); -- cgit v1.2.3 From 2c0cfb38749488e30218c6efd26ad824f42faaac Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Mon, 15 Nov 2010 10:05:17 -0700 Subject: change disable_pagecache to enable_pagecache (i was wrong about webkit's default) --- README | 2 +- src/callbacks.c | 4 ++-- src/callbacks.h | 2 +- src/uzbl-core.c | 2 +- src/uzbl-core.h | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/README b/README index c079680..34556f2 100644 --- a/README +++ b/README @@ -337,7 +337,7 @@ file). * `fantasy_font_family`: The default Fantasy font family used to display text. * `monospace_size`: The default size of monospaced font (default 1). * `minimum_font_size`: The minimum font size used to display text (default 1). -* `disable_pagecache`: Disable the webkit pagecache (uses less memory but has to rerender pages when you go back or forward in history) (default 0). +* `enable_pagecache`: Enable the webkit pagecache (it caches rendered pages for a speedup when you go back or forward in history) (default 0). * `disable_plugins`: Disable embedded plugin objects (default 0). * `disable_scripts`: Disable embedded scripting languages (default 0). * `autoload_images`: Automatically load images (default 1). diff --git a/src/callbacks.c b/src/callbacks.c index b32356e..f596472 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -195,9 +195,9 @@ cmd_zoom_level() { } void -cmd_disable_pagecache() { +cmd_enable_pagecache() { g_object_set (G_OBJECT(view_settings()), "enable-page-cache", - !uzbl.behave.disable_pagecache, NULL); + uzbl.behave.enable_pagecache, NULL); } void diff --git a/src/callbacks.h b/src/callbacks.h index 7678541..a4258f2 100644 --- a/src/callbacks.h +++ b/src/callbacks.h @@ -62,7 +62,7 @@ void cmd_set_zoom_type(); void -cmd_disable_pagecache(); +cmd_enable_pagecache(); void cmd_disable_plugins(); diff --git a/src/uzbl-core.c b/src/uzbl-core.c index fb7b641..7e1d31b 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -117,7 +117,7 @@ const struct var_name_to_ptr_t { { "fantasy_font_family", PTR_V_STR(uzbl.behave.fantasy_font_family, 1, cmd_fantasy_font_family)}, { "monospace_size", PTR_V_INT(uzbl.behave.monospace_size, 1, cmd_font_size)}, { "minimum_font_size", PTR_V_INT(uzbl.behave.minimum_font_size, 1, cmd_minimum_font_size)}, - { "disable_pagecache", PTR_V_INT(uzbl.behave.disable_pagecache, 1, cmd_disable_pagecache)}, + { "enable_pagecache", PTR_V_INT(uzbl.behave.enable_pagecache, 1, cmd_enable_pagecache)}, { "disable_plugins", PTR_V_INT(uzbl.behave.disable_plugins, 1, cmd_disable_plugins)}, { "disable_scripts", PTR_V_INT(uzbl.behave.disable_scripts, 1, cmd_disable_scripts)}, { "autoload_images", PTR_V_INT(uzbl.behave.autoload_img, 1, cmd_autoload_img)}, diff --git a/src/uzbl-core.h b/src/uzbl-core.h index d957d68..33dfb01 100644 --- a/src/uzbl-core.h +++ b/src/uzbl-core.h @@ -146,7 +146,7 @@ typedef struct { guint minimum_font_size; gfloat zoom_level; gboolean zoom_type; - guint disable_pagecache; + guint enable_pagecache; guint disable_plugins; guint disable_scripts; guint autoload_img; -- cgit v1.2.3 From 8b349cd89eab4003eb558e98d2bde7bb95e71f4a Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Sun, 21 Nov 2010 22:41:29 -0700 Subject: uzbl-browser: add UZBL_COOKIE_DAEMON and UZBL_EVENT_MANAGER variables --- src/uzbl-browser | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/uzbl-browser b/src/uzbl-browser index 6cd7b54..1b7abe7 100755 --- a/src/uzbl-browser +++ b/src/uzbl-browser @@ -52,18 +52,19 @@ then fi fi -# uzbl-cookie-manager will exit if another instance is already running -uzbl-cookie-manager - -DAEMON_SOCKET=$XDG_CACHE_HOME/uzbl/event_daemon -DAEMON_PID=${DAEMON_SOCKET}.pid +# uzbl-cookie-manager will exit if another instance is already running. +# we could also check if its pid file exists to avoid having to spawn it. +#if [ ! -f "$XDG_CACHE_HOME"/uzbl/cookie_daemon_socket.pid ] +#then + ${UZBL_COOKIE_DAEMON:-uzbl-cookie-manager} +#fi -# uzbl-event-manager will exit if one is already running, but you could -# check if the pid file exists here to avoid having to spawn it for a -# slight speedup -#if [ -f "$DAEMON_PID" ] +# uzbl-event-manager will exit if one is already running. +# we could also check if its pid file exists to avoid having to spawn it. +DAEMON_SOCKET="$XDG_CACHE_HOME"/uzbl/event_daemon +#if [ ! -f "$DAEMON_SOCKET".pid ] #then - uzbl-event-manager -va start + ${UZBL_EVENT_MANAGER:-uzbl-event-manager -va start} #fi exec uzbl-core "$@" $config --connect-socket $DAEMON_SOCKET -- cgit v1.2.3 From f140884503c05d20bbd88114a1f1f10b6de067ef Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Sun, 21 Nov 2010 22:43:14 -0700 Subject: uzbl-browser: quote paths properly --- src/uzbl-browser | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/uzbl-browser b/src/uzbl-browser index 1b7abe7..9756ed1 100755 --- a/src/uzbl-browser +++ b/src/uzbl-browser @@ -8,27 +8,22 @@ # to your $XDG_DATA_HOME/uzbl/scripts/ and edit them PREFIX=/usr/local -if [ -z "$XDG_DATA_HOME" ] -then - export XDG_DATA_HOME=$HOME/.local/share -fi -if [ -z "$XDG_CACHE_HOME" ] -then - export XDG_CACHE_HOME=$HOME/.cache -fi +XDG_DATA_HOME=${XDG_DATA_HOME:-$HOME/.local/share} +export XDG_DATA_HOME -if [ -z "$XDG_CONFIG_HOME" ] -then - export XDG_CONFIG_HOME=$HOME/.config -fi +XDG_CACHE_HOME=${XDG_CACHE_HOME:-$HOME/.cache} +export XDG_CACHE_HOME + +XDG_CONFIG_HOME=${XDG_CONFIG_HOME:-$HOME/.config} +export XDG_CONFIG_HOME # assure the relevant directories exist. -for dir in $XDG_CACHE_HOME/uzbl $XDG_DATA_HOME/uzbl $XDG_CONFIG_HOME/uzbl +for dir in "$XDG_CACHE_HOME"/uzbl "$XDG_DATA_HOME"/uzbl "$XDG_CONFIG_HOME"/uzbl do - if [ ! -d $dir ] + if [ ! -d "$dir" ] then - if ! mkdir -p $dir + if ! mkdir -p "$dir" then echo "could not create $dir" >&2 exit 2 @@ -37,18 +32,19 @@ do done # if no config exists yet in the recommended location, put the default (recommended) config there -if [ ! -f $XDG_CONFIG_HOME/uzbl/config ] +if [ ! -f "$XDG_CONFIG_HOME"/uzbl/config ] then - if [ ! -r $PREFIX/share/uzbl/examples/config/config ] + global_config=$PREFIX/share/uzbl/examples/config/config + if [ ! -r "$global_config" ] then echo "Error: Global config not found; please check if your distribution ships them separately" exit 3 fi - if ! cp $PREFIX/share/uzbl/examples/config/config $XDG_CONFIG_HOME/uzbl/config + if ! cp "$global_config" "$XDG_CONFIG_HOME"/uzbl/config then echo "Could not copy default config to $XDG_CONFIG_HOME/uzbl/config" >&2 - # Run with the global configs as a last resort - config="--config $PREFIX/share/uzbl/examples/config/config" + # Run with the global config as a last resort + config_file=$global_config fi fi @@ -67,4 +63,4 @@ DAEMON_SOCKET="$XDG_CACHE_HOME"/uzbl/event_daemon ${UZBL_EVENT_MANAGER:-uzbl-event-manager -va start} #fi -exec uzbl-core "$@" $config --connect-socket $DAEMON_SOCKET +exec uzbl-core "$@" ${config_file:+--config "$config_file"} --connect-socket $DAEMON_SOCKET -- cgit v1.2.3 From e660b9de3f4331ebf171735b40eb12105218b2d7 Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Sun, 21 Nov 2010 23:15:02 -0700 Subject: set UZBL_UTIL_DIR in uzbl-browser, get rid of the scripts_util_dir variable --- examples/config/config | 1 - src/uzbl-browser | 18 +++++++++++++++++- src/uzbl-core.c | 27 --------------------------- src/uzbl-core.h | 3 --- 4 files changed, 17 insertions(+), 32 deletions(-) (limited to 'src') diff --git a/examples/config/config b/examples/config/config index 847b4af..1457c71 100644 --- a/examples/config/config +++ b/examples/config/config @@ -35,7 +35,6 @@ set set_status = set status_message = # Spawn path shortcuts. In spawn the first dir+path match is used in "dir1:dir2:dir3:executable" set scripts_dir = $XDG_DATA_HOME/uzbl:@prefix/share/uzbl/examples/data:scripts -set scripts_util_dir = @scripts_dir/util # === Hardcoded handlers ===================================================== diff --git a/src/uzbl-browser b/src/uzbl-browser index de4f7af..865447c 100755 --- a/src/uzbl-browser +++ b/src/uzbl-browser @@ -10,6 +10,8 @@ # But this shouldn't cause much problems.. PREFIX=/usr/local +EXAMPLES=$PREFIX/share/uzbl/examples + if [ -z "$XDG_DATA_HOME" ] then export XDG_DATA_HOME=$HOME/.local/share @@ -40,13 +42,27 @@ done # if no config exists yet in the recommended location, put the default (recommended) config there if [ ! -f $XDG_CONFIG_HOME/uzbl/config ] then - if ! cp $PREFIX/share/uzbl/examples/config/config $XDG_CONFIG_HOME/uzbl/config + if ! cp "$EXAMPLES"/config/config $XDG_CONFIG_HOME/uzbl/config then echo "Could not copy default config to $XDG_CONFIG_HOME/uzbl/config" >&2 exit 3 fi fi +# this variable is used by the default helper scripts as a location to +# load shared code from +if [ -z "$UZBL_UTIL_DIR" ] +then + if [ -d "$XDG_DATA_HOME"/uzbl/scripts/util ] + then + UZBL_UTIL_DIR=$XDG_DATA_HOME/uzbl/scripts/util + elif [ -d $EXAMPLES/data/scripts/util ] + then + UZBL_UTIL_DIR=$EXAMPLES/data/scripts/util + fi + export UZBL_UTIL_DIR +fi + # Uncomment this for a slight speedup at the expense of not having # stale cookie daemon sockets cleaned up. #if [ ! -S $XDG_CACHE_HOME/uzbl/cookie_daemon_socket ] diff --git a/src/uzbl-core.c b/src/uzbl-core.c index 13328d0..fd589c0 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -1263,29 +1263,6 @@ sharg_append(GArray *a, const gchar *str) { g_array_append_val(a, s); } -gboolean -uzbl_setup_environ() { - gchar *util_dirs = expand("@scripts_util_dir", 0); - gchar *util_dir = NULL; - gboolean succeed = FALSE; - - if(!util_dirs) { - g_free(util_dirs); - return succeed; - } - - if(!(util_dir = find_existing_file(util_dirs))) { - g_free(util_dirs); - return succeed; - } - - succeed = g_setenv("UZBL_UTIL_DIR", util_dir, TRUE); - - g_free(util_dirs); - g_free(util_dir); - return succeed; -} - // make sure that the args string you pass can properly be interpreted (eg properly escaped against whitespace, quotes etc) gboolean run_command (const gchar *command, const guint npre, const gchar **args, @@ -1297,7 +1274,6 @@ run_command (const gchar *command, const guint npre, const gchar **args, gchar *pid = itos(getpid()); gchar *xwin = itos(uzbl.xwin); guint i; - gboolean environ_set = uzbl_setup_environ(); sharg_append(a, command); for (i = 0; i < npre; i++) /* add n args before the default vars */ @@ -1337,9 +1313,6 @@ run_command (const gchar *command, const guint npre, const gchar **args, printf("Stdout: %s\n", *output_stdout); } } - if (!environ_set) { - g_printerr("failed to set the environment for scripts"); - } if (err) { g_printerr("error on run_command: %s\n", err->message); g_error_free (err); diff --git a/src/uzbl-core.h b/src/uzbl-core.h index 15f7299..5760423 100644 --- a/src/uzbl-core.h +++ b/src/uzbl-core.h @@ -273,9 +273,6 @@ chain (WebKitWebView *page, GArray *argv, GString *result); void close_uzbl (WebKitWebView *page, GArray *argv, GString *result); -gboolean -uzbl_setup_environ(); - gboolean run_command(const gchar *command, const guint npre, const gchar **args, const gboolean sync, char **output_stdout); -- cgit v1.2.3