summaryrefslogtreecommitdiff
path: root/content/handlers/html/interaction.c
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2020-04-17 22:43:44 +0100
committerVincent Sanders <vince@kyllikki.org>2020-04-17 22:43:44 +0100
commit084861a31b885c52d87ea0a3d99ebe42af27a713 (patch)
tree09b73150ff5dac515b53001b7867881be12639f5 /content/handlers/html/interaction.c
parent529b94be73a1ba080a72f620c8d1165da02bc66b (diff)
downloadnetsurf-084861a31b885c52d87ea0a3d99ebe42af27a713.tar.gz
netsurf-084861a31b885c52d87ea0a3d99ebe42af27a713.tar.bz2
Implement javascript scheme url script https://wiki.whatwg.org/wiki/URL_schemes
Diffstat (limited to 'content/handlers/html/interaction.c')
-rw-r--r--content/handlers/html/interaction.c45
1 files changed, 42 insertions, 3 deletions
diff --git a/content/handlers/html/interaction.c b/content/handlers/html/interaction.c
index fc688d1d1..7c4d54f2c 100644
--- a/content/handlers/html/interaction.c
+++ b/content/handlers/html/interaction.c
@@ -572,6 +572,7 @@ struct mouse_action_state {
ACTION_NOSEND, /**< do not send status and pointer message */
ACTION_SUBMIT,
ACTION_GO,
+ ACTION_JS,
} action;
} result;
@@ -1057,6 +1058,28 @@ html_object_mouse_action(html_content *html,
/**
+ * determine if a url has a javascript scheme
+ *
+ * \param urm The url to check.
+ * \return true if the url is a javascript scheme else false
+ */
+static bool is_javascript_navigate_url(nsurl *url)
+{
+ bool is_js = false;
+ lwc_string *scheme;
+
+ scheme = nsurl_get_component(url, NSURL_SCHEME);
+ if (scheme != NULL) {
+ if (scheme == corestring_lwc_javascript) {
+ is_js = true;
+ }
+ lwc_string_unref(scheme);
+ }
+ return is_js;
+}
+
+
+/**
* process mouse activity on a link
*/
static nserror
@@ -1125,13 +1148,18 @@ link_mouse_action(html_content *html,
&msg_data);
} else if (mouse & (BROWSER_MOUSE_CLICK_1 | BROWSER_MOUSE_CLICK_2)) {
- mas->result.action = ACTION_GO;
+ if (is_javascript_navigate_url(mas->link.url)) {
+ mas->result.action = ACTION_JS;
+ } else {
+ mas->result.action = ACTION_GO;
+ }
}
return NSERROR_OK;
}
+
/**
* process mouse activity if it is not anything else
*/
@@ -1296,10 +1324,11 @@ mouse_action_drag_none(html_content *html,
browser_mouse_state mouse,
int x, int y)
{
+ nserror res;
struct content *c = (struct content *)html;
union content_msg_data msg_data;
+ lwc_string *path;
- nserror res;
/**
* computed state
*
@@ -1395,6 +1424,16 @@ mouse_action_drag_none(html_content *html,
NULL);
break;
+ case ACTION_JS:
+ path = nsurl_get_component(mas.link.url, NSURL_PATH);
+ if (path != NULL) {
+ html_exec(c,
+ lwc_string_data(path),
+ lwc_string_length(path));
+ lwc_string_unref(path);
+ }
+ break;
+
case ACTION_NOSEND:
case ACTION_NONE:
res = NSERROR_OK;
@@ -1462,7 +1501,7 @@ html_mouse_action(struct content *c,
if (res != NSERROR_OK) {
NSLOG(netsurf, ERROR, "%s", messages_get_errorcode(res));
}
-
+
return res;
}