summaryrefslogtreecommitdiff
path: root/browser.c
diff options
context:
space:
mode:
Diffstat (limited to 'browser.c')
-rw-r--r--browser.c103
1 files changed, 90 insertions, 13 deletions
diff --git a/browser.c b/browser.c
index 77ea6ff..2ecf0b5 100644
--- a/browser.c
+++ b/browser.c
@@ -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)