X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=surf.c;h=492c8369f0c7c4740a59b700e595eef7d98907c9;hb=bc73b48743eb0b51905322cad25b4647569e7996;hp=6dc32ea0e729f40e46f21e3e736dfb9584bdb478;hpb=62f54a3745f193223def1c14a19a8581af1c00ed;p=surf.git diff --git a/surf.c b/surf.c index 6dc32ea..492c836 100644 --- a/surf.c +++ b/surf.c @@ -21,7 +21,6 @@ #include #define LENGTH(x) (sizeof x / sizeof x[0]) -#define CLEANMASK(mask) (mask & ~(GDK_MOD2_MASK)) enum { AtomFind, AtomGo, AtomUri, AtomLast }; @@ -38,6 +37,7 @@ typedef struct Client { char *title, *linkhover; const char *uri, *needle; gint progress; + gboolean sslfailed; struct Client *next; gboolean zoomed; } Client; @@ -103,6 +103,7 @@ static void setup(void); static void sigchld(int unused); static void source(Client *c, const Arg *arg); static void spawn(Client *c, const Arg *arg); +static void eval(Client *c, const Arg *arg); static void stop(Client *c, const Arg *arg); static void titlechange(WebKitWebView *v, WebKitWebFrame* frame, const char* title, Client *c); static void update(Client *c); @@ -144,16 +145,25 @@ cleanup(void) { g_free(stylefile); } +void +evalscript(WebKitWebFrame *frame, JSContextRef js, char *script, char* scriptname) { + JSStringRef jsscript, jsscriptname; + JSValueRef exception = NULL; + + jsscript = JSStringCreateWithUTF8CString(script); + jsscriptname = JSStringCreateWithUTF8CString(scriptname); + JSEvaluateScript(js, jsscript, JSContextGetGlobalObject(js), jsscriptname, 0, &exception); + JSStringRelease(jsscript); + JSStringRelease(jsscriptname); +} + void runscript(WebKitWebFrame *frame, JSContextRef js) { - JSStringRef jsscript; char *script; - JSValueRef exception = NULL; GError *error; - + if(g_file_get_contents(scriptfile, &script, NULL, &error)) { - jsscript = JSStringCreateWithUTF8CString(script); - JSEvaluateScript(js, jsscript, JSContextGetGlobalObject(js), NULL, 0, &exception); + evalscript(frame, webkit_web_frame_get_global_context(frame), script, scriptfile); } } @@ -251,8 +261,11 @@ drawindicator(Client *c) { w = c->indicator; width = c->progress * w->allocation.width / 100; gc = gdk_gc_new(w->window); - gdk_color_parse(strstr(uri, "https://") == uri ? - progress_trust : progress, &fg); + if(strstr(uri, "https://") == uri) + gdk_color_parse(c->sslfailed ? + progress_untrust : progress_trust, &fg); + else + gdk_color_parse(progress, &fg); gdk_gc_set_rgb_fg_color(gc, &fg); gdk_draw_rectangle(w->window, w->style->bg_gc[GTK_WIDGET_STATE(w)], @@ -345,7 +358,7 @@ keypress(GtkWidget* w, GdkEventKey *ev, Client *c) { updatewinid(c); for(i = 0; i < LENGTH(keys); i++) { if(gdk_keyval_to_lower(ev->keyval) == keys[i].keyval - && CLEANMASK(ev->state) == keys[i].mod + && (ev->state & keys[i].mod) == keys[i].mod && keys[i].func) { keys[i].func(c, &(keys[i].arg)); processed = TRUE; @@ -368,9 +381,24 @@ linkhover(WebKitWebView *v, const char* t, const char* l, Client *c) { void loadstatuschange(WebKitWebView *view, GParamSpec *pspec, Client *c) { + WebKitWebFrame *frame; + WebKitWebDataSource *src; + WebKitNetworkRequest *request; + SoupMessage *msg; + char *uri; + switch(webkit_web_view_get_load_status (c->view)) { case WEBKIT_LOAD_COMMITTED: - setatom(c, AtomUri, geturi(c)); + uri = geturi(c); + if(strstr(uri, "https://") == uri) { + frame = webkit_web_view_get_main_frame(c->view); + 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; + } + setatom(c, AtomUri, uri); break; case WEBKIT_LOAD_FINISHED: c->progress = 0; @@ -699,6 +727,10 @@ setup(void) { soup_session_remove_feature_by_type(s, soup_cookie_jar_get_type()); g_signal_connect_after(G_OBJECT(s), "request-started", G_CALLBACK(newrequest), NULL); + /* ssl */ + g_object_set(G_OBJECT(s), "ssl-ca-file", cafile, NULL); + g_object_set(G_OBJECT(s), "ssl-strict", strictssl, NULL); + /* proxy */ if((proxy = getenv("http_proxy")) && strcmp(proxy, "")) { new_proxy = g_strrstr(proxy, "http://") ? g_strdup(proxy) : @@ -740,6 +772,12 @@ spawn(Client *c, const Arg *arg) { } } +void +eval(Client *c, const Arg *arg) { + WebKitWebFrame *frame = webkit_web_view_get_main_frame(c->view); + evalscript(frame, webkit_web_frame_get_global_context(frame), ((char **)arg->v)[0], ""); +} + void stop(Client *c, const Arg *arg) { webkit_web_view_stop_loading(c->view);