diff options
Diffstat (limited to 'e-util/e-web-view.c')
-rw-r--r-- | e-util/e-web-view.c | 62 |
1 files changed, 55 insertions, 7 deletions
diff --git a/e-util/e-web-view.c b/e-util/e-web-view.c index 00dd6c0ad7..bb02bd16f1 100644 --- a/e-util/e-web-view.c +++ b/e-util/e-web-view.c @@ -551,14 +551,47 @@ web_view_navigation_policy_decision_requested_cb (EWebView *web_view, uri = webkit_network_request_get_uri (request); frame_uri = webkit_web_frame_get_uri (frame); - /* Allow navigation through sections in page */ + /* Allow navigation through fragments in page */ if (uri && *uri && frame_uri && *frame_uri) { - /* The uri should contain the frame uri and the id of the anchor - * element that is separated from uri by hashtag character */ - if (g_str_has_prefix (uri, frame_uri) && strstr (uri, "#")) { - webkit_web_policy_decision_use (policy_decision); - return TRUE; + SoupURI *uri_link, *uri_frame; + + uri_link = soup_uri_new (uri); + uri_frame = soup_uri_new (frame_uri); + if (uri_link && uri_frame) { + const gchar *tmp1, *tmp2; + + tmp1 = soup_uri_get_scheme (uri_link); + tmp2 = soup_uri_get_scheme (uri_frame); + + /* The scheme on both URIs should be the same */ + if (tmp1 && tmp2) { + if (g_ascii_strcasecmp (tmp1, tmp2) != 0) + goto free_uris; + } + + tmp1 = soup_uri_get_host (uri_link); + tmp2 = soup_uri_get_host (uri_frame); + + /* The host on both URIs should be the same */ + if (tmp1 && tmp2) { + if (g_ascii_strcasecmp (tmp1, tmp2) != 0) + goto free_uris; + } + + /* URI from link should have fragment set - could be empty */ + if (soup_uri_get_fragment (uri_link)) { + soup_uri_free (uri_link); + soup_uri_free (uri_frame); + webkit_web_policy_decision_use (policy_decision); + return TRUE; + } } + + free_uris: + if (uri_link) + soup_uri_free (uri_link); + if (uri_frame) + soup_uri_free (uri_frame); } /* XXX WebKitWebView does not provide a class method for @@ -1012,7 +1045,22 @@ web_view_hovering_over_link (EWebView *web_view, format = _("Click to call %s"); else if (g_str_has_prefix (uri, "##")) message = g_strdup (_("Click to hide/unhide addresses")); - else + else if (g_str_has_prefix (uri, "mail:")) { + const gchar *fragment; + SoupURI *soup_uri; + + soup_uri = soup_uri_new (uri); + if (!soup_uri) + goto exit; + + fragment = soup_uri_get_fragment (soup_uri); + if (*fragment) + message = g_strdup_printf (_("Go to the section %s of the message"), fragment); + else + message = g_strdup (_("Go to the beginning of the message")); + + soup_uri_free (soup_uri); + } else message = g_strdup_printf (_("Click to open %s"), uri); if (format == NULL) |