#define CLEANMASK(mask) (mask & (MODKEY|GDK_SHIFT_MASK))
enum { AtomFind, AtomGo, AtomUri, AtomLast };
+
enum {
- ClkDoc = WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT,
- ClkLink = WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK,
- ClkImg = WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE,
- ClkMedia = WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA,
- ClkSel = WEBKIT_HIT_TEST_RESULT_CONTEXT_SELECTION,
- ClkEdit = WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE,
- ClkAny = ClkDoc | ClkLink | ClkImg | ClkMedia | ClkSel | ClkEdit,
+ OnDoc = WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT,
+ OnLink = WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK,
+ OnImg = WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE,
+ OnMedia = WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA,
+ OnEdit = WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE,
+ OnBar = WEBKIT_HIT_TEST_RESULT_CONTEXT_SCROLLBAR,
+ OnSel = WEBKIT_HIT_TEST_RESULT_CONTEXT_SELECTION,
+ OnAny = OnDoc | OnLink | OnImg | OnMedia | OnEdit | OnBar | OnSel,
};
typedef union Arg Arg;
Window xid;
WebKitWebView *view;
WebKitWebInspector *inspector;
- char *title, *linkhover;
+ WebKitHitTestResult *mousepos;
+ const char *title, *targeturi;
const char *needle;
gint progress;
struct Client *next;
static char cookiepolicy_set(const WebKitCookieAcceptPolicy p);
static char *copystr(char **str, const char *src);
-static WebKitWebView *createwindow(WebKitWebView *v, WebKitWebFrame *f,
- Client *c);
+static GtkWidget *createview(WebKitWebView *v, WebKitNavigationAction *a,
+ Client *c);
static gboolean decidedownload(WebKitWebView *v, WebKitWebFrame *f,
WebKitNetworkRequest *r, gchar *m,
WebKitWebPolicyDecision *p, Client *c);
static void eval(Client *c, const Arg *arg);
static void find(Client *c, const Arg *arg);
static void fullscreen(Client *c, const Arg *arg);
-static void geopolicyrequested(WebKitWebView *v, WebKitWebFrame *f,
- WebKitGeolocationPolicyDecision *d, Client *c);
+static gboolean permissionrequested(WebKitWebView *v,
+ WebKitPermissionRequest *r, Client *c);
static const char *getatom(Client *c, int a);
static void gettogglestat(Client *c);
static void getpagestat(Client *c);
static gboolean keypress(GtkAccelGroup *group, GObject *obj, guint key,
GdkModifierType mods, Client *c);
-static void linkhover(WebKitWebView *v, const char* t, const char* l,
- Client *c);
+static void mousetargetchanged(WebKitWebView *v, WebKitHitTestResult *h,
+ guint modifiers, Client *c);
static void loadstatuschange(WebKitWebView *view, GParamSpec *pspec,
Client *c);
static void loaduri(Client *c, const Arg *arg);
static void sigchld(int unused);
static void spawn(Client *c, const Arg *arg);
static void stop(Client *c, const Arg *arg);
-static void titlechange(WebKitWebView *view, GParamSpec *pspec, Client *c);
+static void titlechanged(WebKitWebView *view, GParamSpec *ps, Client *c);
static void titlechangeleave(void *a, void *b, Client *c);
static void toggle(Client *c, const Arg *arg);
static void togglecookiepolicy(Client *c, const Arg *arg);
return tmp;
}
-WebKitWebView *
-createwindow(WebKitWebView *v, WebKitWebFrame *f, Client *c)
+GtkWidget *
+createview(WebKitWebView *v, WebKitNavigationAction *a, Client *c)
{
- Client *n = newclient();
- return n->view;
+ Client *n;
+
+ switch (webkit_navigation_action_get_navigation_type(a)) {
+ case WEBKIT_NAVIGATION_TYPE_OTHER: /* fallthrough */
+ /*
+ * popup windows of type “other” are almost always triggered
+ * by user gesture, so inverse the logic here
+ */
+ if (webkit_navigation_action_is_user_gesture(a)) {
+ return NULL;
+ break;
+ }
+ case WEBKIT_NAVIGATION_TYPE_LINK_CLICKED: /* fallthrough */
+ case WEBKIT_NAVIGATION_TYPE_FORM_SUBMITTED: /* fallthrough */
+ case WEBKIT_NAVIGATION_TYPE_BACK_FORWARD: /* fallthrough */
+ case WEBKIT_NAVIGATION_TYPE_RELOAD: /* fallthrough */
+ case WEBKIT_NAVIGATION_TYPE_FORM_RESUBMITTED:
+ n = newclient(c);
+ break;
+ default:
+ return NULL;
+ break;
+ }
+
+ return GTK_WIDGET(n->view);
}
gboolean
c->fullscreen = !c->fullscreen;
}
-void
-geopolicyrequested(WebKitWebView *v, WebKitWebFrame *f,
- WebKitGeolocationPolicyDecision *d, Client *c)
+gboolean
+permissionrequested(WebKitWebView *v, WebKitPermissionRequest *r, Client *c)
{
- if (allowgeolocation)
- webkit_geolocation_policy_allow(d);
- else
- webkit_geolocation_policy_deny(d);
+ if (WEBKIT_IS_GEOLOCATION_PERMISSION_REQUEST(r)) {
+ if (allowgeolocation)
+ webkit_permission_request_allow(r);
+ else
+ webkit_permission_request_deny(r);
+ return TRUE;
+ }
+
+ return FALSE;
}
const char *
}
void
-linkhover(WebKitWebView *v, const char* t, const char* l, Client *c)
+mousetargetchanged(WebKitWebView *v, WebKitHitTestResult *h, guint modifiers,
+ Client *c)
{
- if (l) {
- c->linkhover = copystr(&c->linkhover, l);
- } else if (c->linkhover) {
- free(c->linkhover);
- c->linkhover = NULL;
- }
+ WebKitHitTestResultContext hc;
+
+ /* Keep the hit test to know where is the pointer on the next click */
+ c->mousepos = h;
+
+ hc = webkit_hit_test_result_get_context(h);
+
+ if (hc & OnLink)
+ c->targeturi = webkit_hit_test_result_get_link_uri(h);
+ else if (hc & OnImg)
+ c->targeturi = webkit_hit_test_result_get_image_uri(h);
+ else if (hc & OnMedia)
+ c->targeturi = webkit_hit_test_result_get_media_uri(h);
+ else
+ c->targeturi = NULL;
updatetitle(c);
}
g_signal_connect(G_OBJECT(v),
"notify::title",
- G_CALLBACK(titlechange), c);
+ G_CALLBACK(titlechanged), c);
g_signal_connect(G_OBJECT(v),
- "hovering-over-link",
- G_CALLBACK(linkhover), c);
+ "mouse-target-changed",
+ G_CALLBACK(mousetargetchanged), c);
g_signal_connect(G_OBJECT(v),
- "geolocation-policy-decision-requested",
- G_CALLBACK(geopolicyrequested), c);
+ "permission-request",
+ G_CALLBACK(permissionrequested), c);
g_signal_connect(G_OBJECT(v),
- "create-web-view",
- G_CALLBACK(createwindow), c);
+ "create",
+ G_CALLBACK(createview), c);
g_signal_connect(G_OBJECT(v), "ready-to-show",
G_CALLBACK(showview), c);
g_signal_connect(G_OBJECT(v),
}
void
-titlechange(WebKitWebView *view, GParamSpec *pspec, Client *c)
+titlechanged(WebKitWebView *view, GParamSpec *ps, Client *c)
{
- const gchar *t = webkit_web_view_get_title(view);
- if (t) {
- c->title = copystr(&c->title, t);
- updatetitle(c);
- }
+ c->title = webkit_web_view_get_title(c->view);
+ updatetitle(c);
}
void