diff options
Diffstat (limited to 'browser.c')
-rw-r--r-- | browser.c | 103 |
1 files changed, 90 insertions, 13 deletions
@@ -12,6 +12,7 @@ #include <gio/gio.h> #include <webkit2/webkit2.h> #include <JavaScriptCore/JavaScript.h> +#include "config.h" void client_destroy(GtkWidget *, gpointer); @@ -47,6 +48,7 @@ gboolean key_web_view(GtkWidget *, GdkEvent *, gpointer); void mainwindow_setup(void); void mainwindow_title(gint); void notebook_switch_page(GtkNotebook *, GtkWidget *, guint, gpointer); +gboolean permission_request(WebKitWebView *, WebKitPermissionRequest *, gpointer); gboolean quit_if_nothing_active(void); gboolean remote_msg(GIOChannel *, GIOCondition, gpointer); void run_user_scripts(WebKitWebView *); @@ -186,6 +188,8 @@ client_new(const gchar *uri, WebKitWebView *related_wv, gboolean show, G_CALLBACK(key_web_view), c); g_signal_connect(G_OBJECT(c->web_view), "mouse-target-changed", G_CALLBACK(hover_web_view), c); + g_signal_connect(G_OBJECT(c->web_view), "permission-request", + G_CALLBACK(permission_request), c); g_signal_connect(G_OBJECT(c->web_view), "web-process-crashed", G_CALLBACK(crashed_web_view), c); @@ -655,8 +659,12 @@ ensure_uri_scheme(const gchar *t) f = g_strdup_printf("file://%s", fabs); free(fabs); } - else - f = g_strdup_printf("http://%s", t); + else { + if (g_str_has_prefix(f, "!/")) + f = g_strdup_printf(SEARCH_ENGINE, t + 2); + else + f = g_strdup_printf("http://%s", t); + } return f; } else @@ -845,8 +853,9 @@ icon_location(GtkEntry *entry, GtkEntryIconPosition icon_pos, GdkEvent *event, void init_default_web_context(void) { - gchar *p; + gchar *p, *cf; WebKitWebContext *wc; + WebKitCookieManager *cookiemanager; wc = webkit_web_context_get_default(); @@ -860,6 +869,7 @@ init_default_web_context(void) p = g_build_filename(g_get_user_config_dir(), __NAME__, "web_extensions", NULL); + cf = g_build_filename(g_get_user_cache_dir(), __NAME__, "cookies.txt", NULL); webkit_web_context_set_web_extensions_directory(wc, p); g_free(p); @@ -869,6 +879,9 @@ init_default_web_context(void) trust_user_certs(wc); webkit_web_context_set_favicon_database_directory(wc, NULL); + + cookiemanager = webkit_web_context_get_cookie_manager(wc); + webkit_cookie_manager_set_persistent_storage(cookiemanager, cf, WEBKIT_COOKIE_PERSISTENT_STORAGE_TEXT); } gboolean @@ -880,7 +893,7 @@ key_common(GtkWidget *widget, GdkEvent *event, gpointer data) if (event->type == GDK_KEY_PRESS) { - if (((GdkEventKey *)event)->state & GDK_MOD1_MASK) + if (((GdkEventKey *)event)->state & GDK_CONTROL_MASK) { switch (((GdkEventKey *)event)->keyval) { @@ -892,11 +905,16 @@ key_common(GtkWidget *widget, GdkEvent *event, gpointer data) webkit_web_view_load_uri(WEBKIT_WEB_VIEW(c->web_view), f); g_free(f); return TRUE; - case GDK_KEY_e: /* new tab (left hand) */ + case GDK_KEY_t: /* new tab (left hand) */ f = ensure_uri_scheme(home_uri); client_new(f, NULL, TRUE, TRUE); g_free(f); return TRUE; + case GDK_KEY_s: + gtk_widget_grab_focus(c->location); + gtk_entry_set_text(GTK_ENTRY(c->location), "!/"); + gtk_editable_set_position(GTK_EDITABLE(c->location), -1); + return TRUE; case GDK_KEY_r: /* reload (left hand) */ webkit_web_view_reload_bypass_cache(WEBKIT_WEB_VIEW( c->web_view)); @@ -911,21 +929,18 @@ key_common(GtkWidget *widget, GdkEvent *event, gpointer data) case GDK_KEY_3: /* search backward (left hand) */ search(c, -1); return TRUE; - case GDK_KEY_l: /* location (BOTH hands) */ + case GDK_KEY_o: /* location (BOTH hands) */ gtk_widget_grab_focus(c->location); return TRUE; - case GDK_KEY_k: /* initiate search (BOTH hands) */ + case GDK_KEY_f: /* initiate search (BOTH hands) */ gtk_widget_grab_focus(c->location); gtk_entry_set_text(GTK_ENTRY(c->location), ":/"); gtk_editable_set_position(GTK_EDITABLE(c->location), -1); return TRUE; - case GDK_KEY_c: /* reload trusted certs (left hand) */ - trust_user_certs(wc); - return TRUE; - case GDK_KEY_a: /* go one tab to the left (left hand) */ + case GDK_KEY_k: /* go one tab to the left (left hand) */ gtk_notebook_prev_page(GTK_NOTEBOOK(mw.notebook)); return TRUE; - case GDK_KEY_s: /* go one tab to the right (left hand) */ + case GDK_KEY_j: /* go one tab to the right (left hand) */ gtk_notebook_next_page(GTK_NOTEBOOK(mw.notebook)); return TRUE; } @@ -936,6 +951,15 @@ key_common(GtkWidget *widget, GdkEvent *event, gpointer data) webkit_web_view_go_back(WEBKIT_WEB_VIEW(c->web_view)); return TRUE; } + else if (((GdkEventKey *)event)->state & GDK_MOD1_MASK) + { + switch (((GdkEventKey *)event)->keyval) + { + case GDK_KEY_c: /* reload trusted certs (left hand) */ + trust_user_certs(wc); + return TRUE; + } + } /* navigate forward (left hand) */ else if (((GdkEventKey *)event)->keyval == GDK_KEY_F3) { @@ -952,7 +976,7 @@ key_downloadmanager(GtkWidget *widget, GdkEvent *event, gpointer data) { if (event->type == GDK_KEY_PRESS) { - if (((GdkEventKey *)event)->state & GDK_MOD1_MASK) + if (((GdkEventKey *)event)->state & GDK_CONTROL_MASK) { switch (((GdkEventKey *)event)->keyval) { @@ -1136,6 +1160,59 @@ notebook_switch_page(GtkNotebook *nb, GtkWidget *p, guint idx, gpointer data) } gboolean +permission_request(WebKitWebView *v, WebKitPermissionRequest *r, gpointer data) +{ + struct Client *c = (struct Client *)data; + const gchar *h; + char *permission_str; + + h = g_uri_get_host(g_uri_parse( + webkit_web_view_get_uri(WEBKIT_WEB_VIEW(c->web_view)), + G_URI_FLAGS_PARSE_RELAXED, + NULL)); + + if (WEBKIT_IS_GEOLOCATION_PERMISSION_REQUEST(r)) + { + permission_str = "Allow '%s' to see your location?"; + } + else if (WEBKIT_IS_NOTIFICATION_PERMISSION_REQUEST(r)) + { + permission_str = "Allow notifications from '%s'?"; + } + else if (WEBKIT_IS_USER_MEDIA_PERMISSION_REQUEST(r)) { + if (webkit_user_media_permission_is_for_audio_device( + WEBKIT_USER_MEDIA_PERMISSION_REQUEST(r))) + permission_str = "Allow '%s' to access your microphone?"; + else if (webkit_user_media_permission_is_for_video_device( + WEBKIT_USER_MEDIA_PERMISSION_REQUEST(r))) + permission_str = "Allow '%s' to access your webcam?"; + else + return FALSE; + } + else { + /* Deny anything that are not listed above */ + return FALSE; + } + GtkWidget *dialog = gtk_message_dialog_new (NULL, + GTK_DIALOG_MODAL, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_YES_NO, + g_strdup_printf(permission_str, h)); + gtk_widget_show(dialog); + gint result = gtk_dialog_run(GTK_DIALOG(dialog)); + switch(result) { + case GTK_RESPONSE_YES: + webkit_permission_request_allow(r); + break; + default: + webkit_permission_request_deny(r); + break; + } + gtk_widget_destroy(dialog); + return TRUE; +} + +gboolean quit_if_nothing_active(void) { if (clients == 0) |