X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=surf.c;h=906d1452ae6fa84c6cf597f5bc347753d39ed903;hb=780cca964ca0cf622746ad6e8cae8beb8047d1df;hp=b6669ae113b7311d4f3c194bf2a438d1b22b4c3a;hpb=83df29393f99990cea6b0fff3eec66eeb94329ed;p=surf.git diff --git a/surf.c b/surf.c index b6669ae..906d145 100644 --- a/surf.c +++ b/surf.c @@ -47,7 +47,7 @@ typedef struct Client { WebKitWebView *view; WebKitWebInspector *inspector; char *title, *linkhover; - const char *uri, *needle; + const char *needle; gint progress; struct Client *next; gboolean zoomed, fullscreen, isinspecting, sslfailed; @@ -78,8 +78,10 @@ static GdkNativeWindow embed = 0; static gboolean showxid = FALSE; static char winid[64]; static gboolean usingproxy = 0; -static char togglestat[7]; +static char togglestat[8]; static char pagestat[3]; +static GTlsDatabase *tlsdb; +static int policysel = 0; static void addaccelgroup(Client *c); static void beforerequest(WebKitWebView *w, WebKitWebFrame *f, @@ -91,12 +93,16 @@ static gboolean buttonrelease(WebKitWebView *web, GdkEventButton *e, static void cleanup(void); static void clipboard(Client *c, const Arg *arg); +/* Cookiejar implementation */ static void cookiejar_changed(SoupCookieJar *self, SoupCookie *old_cookie, SoupCookie *new_cookie); static void cookiejar_finalize(GObject *self); -static SoupCookieJar *cookiejar_new(const char *filename, gboolean read_only); +static SoupCookieJarAcceptPolicy cookiepolicy_get(void); +static SoupCookieJar *cookiejar_new(const char *filename, gboolean read_only, + SoupCookieJarAcceptPolicy policy); static void cookiejar_set_property(GObject *self, guint prop_id, const GValue *value, GParamSpec *pspec); +static char cookiepolicy_set(const SoupCookieJarAcceptPolicy p); static char *copystr(char **str, const char *src); static WebKitWebView *createwindow(WebKitWebView *v, WebKitWebFrame *f, @@ -161,6 +167,7 @@ static void stop(Client *c, const Arg *arg); static void titlechange(WebKitWebView *v, WebKitWebFrame *frame, const char *title, Client *c); static void toggle(Client *c, const Arg *arg); +static void togglecookiepolicy(Client *c, const Arg *arg); static void togglegeolocation(Client *c, const Arg *arg); static void togglescrollbars(Client *c, const Arg *arg); static void togglestyle(Client *c, const Arg *arg); @@ -295,10 +302,12 @@ cookiejar_init(CookieJar *self) { } static SoupCookieJar * -cookiejar_new(const char *filename, gboolean read_only) { +cookiejar_new(const char *filename, gboolean read_only, + SoupCookieJarAcceptPolicy policy) { return g_object_new(COOKIEJAR_TYPE, SOUP_COOKIE_JAR_TEXT_FILENAME, filename, - SOUP_COOKIE_JAR_READ_ONLY, read_only, NULL); + SOUP_COOKIE_JAR_READ_ONLY, read_only, + SOUP_COOKIE_JAR_ACCEPT_POLICY, policy, NULL); } static void @@ -310,6 +319,36 @@ cookiejar_set_property(GObject *self, guint prop_id, const GValue *value, flock(COOKIEJAR(self)->lock, LOCK_UN); } +static SoupCookieJarAcceptPolicy +cookiepolicy_get(void) { + switch(cookiepolicies[policysel]) { + case 'a': + return SOUP_COOKIE_JAR_ACCEPT_NEVER; + case '@': + return SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY; + case 'A': + default: + break; + } + + return SOUP_COOKIE_JAR_ACCEPT_ALWAYS; +} + +static char +cookiepolicy_set(const SoupCookieJarAcceptPolicy ep) { + switch(ep) { + case SOUP_COOKIE_JAR_ACCEPT_NEVER: + return 'a'; + case SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY: + return '@'; + case SOUP_COOKIE_JAR_ACCEPT_ALWAYS: + default: + break; + } + + return 'A'; +} + static void evalscript(JSContextRef js, char *script, char* scriptname) { JSStringRef jsscript, jsscriptname; @@ -601,8 +640,8 @@ loadstatuschange(WebKitWebView *view, GParamSpec *pspec, Client *c) { src = webkit_web_frame_get_data_source(frame); request = webkit_web_data_source_get_request(src); msg = webkit_network_request_get_message(request); - c->sslfailed = soup_message_get_flags(msg) - ^ SOUP_MESSAGE_CERTIFICATE_TRUSTED; + c->sslfailed = !(soup_message_get_flags(msg) + & SOUP_MESSAGE_CERTIFICATE_TRUSTED); } setatom(c, AtomUri, uri); break; @@ -635,8 +674,10 @@ loaduri(Client *c, const Arg *arg) { : g_strdup_printf("http://%s", uri); } + setatom(c, AtomUri, uri); + /* prevents endless loop */ - if(c->uri && strcmp(u, c->uri) == 0) { + if(strcmp(u, geturi(c)) == 0) { reload(c, &a); } else { webkit_web_view_load_uri(c->view, u); @@ -819,6 +860,9 @@ newclient(void) { webkit_web_view_set_zoom_level(c->view, dpi/96); } } + /* This might conflict with _zoomto96dpi_. */ + if(zoomlevel != 1.0) + webkit_web_view_set_zoom_level(c->view, zoomlevel); if(enableinspector) { c->inspector = WEBKIT_WEB_INSPECTOR( @@ -1007,7 +1051,7 @@ scroll(GtkAdjustment *a, const Arg *arg) { gdouble v; v = gtk_adjustment_get_value(a); - switch (arg->i){ + switch(arg->i) { case +10000: case -10000: v += gtk_adjustment_get_page_increment(a) * @@ -1039,6 +1083,7 @@ setup(void) { char *new_proxy; SoupURI *puri; SoupSession *s; + GError *error = NULL; /* clean up any zombies immediately */ sigchld(0); @@ -1061,11 +1106,17 @@ setup(void) { /* cookie jar */ soup_session_add_feature(s, - SOUP_SESSION_FEATURE(cookiejar_new(cookiefile, - FALSE))); + SOUP_SESSION_FEATURE(cookiejar_new(cookiefile, FALSE, + cookiepolicy_get()))); /* ssl */ - g_object_set(G_OBJECT(s), "ssl-ca-file", cafile, NULL); + tlsdb = g_tls_file_database_new(cafile, &error); + + if(error) { + g_warning("Error loading SSL database %s: %s", cafile, error->message); + g_error_free(error); + } + g_object_set(G_OBJECT(s), "tls-database", tlsdb, NULL); g_object_set(G_OBJECT(s), "ssl-strict", strictssl, NULL); /* proxy */ @@ -1142,6 +1193,37 @@ toggle(Client *c, const Arg *arg) { reload(c, &a); } +static void +togglecookiepolicy(Client *c, const Arg *arg) { + SoupCookieJar *jar; + SoupCookieJarAcceptPolicy policy; + + jar = SOUP_COOKIE_JAR( + soup_session_get_feature( + webkit_get_default_session(), + SOUP_TYPE_COOKIE_JAR)); + g_object_get(G_OBJECT(jar), "accept-policy", &policy, NULL); + + policysel++; + if(policysel >= strlen(cookiepolicies)) + policysel = 0; + + g_object_set(G_OBJECT(jar), "accept-policy", + cookiepolicy_get(), NULL); + + updatetitle(c); + /* Do not reload. */ +} + +static void +togglegeolocation(Client *c, const Arg *arg) { + Arg a = { .b = FALSE }; + + allowgeolocation ^= 1; + + reload(c, &a); +} + static void twitch(Client *c, const Arg *arg) { GtkAdjustment *a; @@ -1160,15 +1242,6 @@ twitch(Client *c, const Arg *arg) { gtk_adjustment_set_value(a, v); } -static void -togglegeolocation(Client *c, const Arg *arg) { - Arg a = { .b = FALSE }; - - allowgeolocation ^= 1; - - reload(c, &a); -} - static void togglescrollbars(Client *c, const Arg *arg) { GtkPolicyType vspolicy; @@ -1206,27 +1279,30 @@ static void gettogglestat(Client *c){ gboolean value; char *uri; + int p = 0; WebKitWebSettings *settings = webkit_web_view_get_settings(c->view); + togglestat[p++] = cookiepolicy_set(cookiepolicy_get()); + g_object_get(G_OBJECT(settings), "enable-caret-browsing", &value, NULL); - togglestat[0] = value? 'C': 'c'; + togglestat[p++] = value? 'C': 'c'; - togglestat[1] = allowgeolocation? 'G': 'g'; + togglestat[p++] = allowgeolocation? 'G': 'g'; g_object_get(G_OBJECT(settings), "auto-load-images", &value, NULL); - togglestat[2] = value? 'I': 'i'; + togglestat[p++] = value? 'I': 'i'; g_object_get(G_OBJECT(settings), "enable-scripts", &value, NULL); - togglestat[3] = value? 'S': 's'; + togglestat[p++] = value? 'S': 's'; g_object_get(G_OBJECT(settings), "enable-plugins", &value, NULL); - togglestat[4] = value? 'V': 'v'; + togglestat[p++] = value? 'V': 'v'; g_object_get(G_OBJECT(settings), "user-stylesheet-uri", &uri, NULL); - togglestat[5] = uri[0] ? 'M': 'm'; + togglestat[p++] = uri[0] ? 'M': 'm'; - togglestat[6] = '\0'; + togglestat[p] = '\0'; } static void @@ -1279,8 +1355,10 @@ updatewinid(Client *c) { static void usage(void) { die("usage: %s [-bBfFgGiIkKnNpPsSvx]" + " [-a cookiepolicies ] " " [-c cookiefile] [-e xid] [-r scriptfile]" - " [-t stylefile] [-u useragent] [uri]\n", basename(argv0)); + " [-t stylefile] [-u useragent] [-z zoomlevel]" + " [uri]\n", basename(argv0)); } static void @@ -1382,6 +1460,9 @@ main(int argc, char *argv[]) { case 'x': showxid = TRUE; break; + case 'z': + zoomlevel = strtof(EARGF(usage()), NULL); + break; default: usage(); } ARGEND;