From 0f0b2c13c8c71b97d26f324c02313940acf39ac1 Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Tue, 7 Jul 2009 06:42:48 -0600 Subject: optional markup escaping in expand() --- tests/test-expand.c | 33 ++++++++++++++++++++++++++++----- uzbl.c | 47 ++++++++++++++++++++++++++++++++++------------- uzbl.h | 2 +- 3 files changed, 63 insertions(+), 19 deletions(-) diff --git a/tests/test-expand.c b/tests/test-expand.c index c0eae41..d83bbe5 100644 --- a/tests/test-expand.c +++ b/tests/test-expand.c @@ -27,7 +27,7 @@ extern Uzbl uzbl; -extern gchar* expand(char*, guint); +extern gchar* expand(char*, guint, gboolean); extern gchar* expand_template(const char*, gboolean); extern void make_var_to_name_hash(void); @@ -107,7 +107,7 @@ test_WEBKIT_VERSION (void) { g_string_append(expected, " "); g_string_append(expected, itos(WEBKIT_MICRO_VERSION)); - g_assert_cmpstr(expand("@WEBKIT_MAJOR @WEBKIT_MINOR @WEBKIT_MICRO", 0), ==, g_string_free(expected, FALSE)); + g_assert_cmpstr(expand("@WEBKIT_MAJOR @WEBKIT_MINOR @WEBKIT_MICRO", 0, FALSE), ==, g_string_free(expected, FALSE)); } void @@ -124,17 +124,17 @@ test_UNAMEINFO (void) { g_string_append(expected, " "); g_string_append(expected, uzbl.state.unameinfo.machine); - g_assert_cmpstr(expand("@SYSNAME @NODENAME @KERNREL @KERNVER @ARCH_SYSTEM", 0), ==, g_string_free(expected, FALSE)); + g_assert_cmpstr(expand("@SYSNAME @NODENAME @KERNREL @KERNVER @ARCH_SYSTEM", 0, FALSE), ==, g_string_free(expected, FALSE)); } void test_ARCH_UZBL (void) { - g_assert_cmpstr(expand("@ARCH_UZBL", 0), ==, ARCH); + g_assert_cmpstr(expand("@ARCH_UZBL", 0, FALSE), ==, ARCH); } void test_COMMIT (void) { - g_assert_cmpstr(expand("@COMMIT", 0), ==, COMMIT); + g_assert_cmpstr(expand("@COMMIT", 0, FALSE), ==, COMMIT); } void @@ -180,6 +180,24 @@ test_cmd_useragent_full (void) { g_assert_cmpstr(uzbl.net.useragent, ==, g_string_free(expected, FALSE)); } +void +test_escape_markup (void) { + /* simple expansion */ + uzbl.state.uri = g_strdup("<&>"); + g_assert_cmpstr(expand("@uri", 0, FALSE), ==, uzbl.state.uri); + g_assert_cmpstr(expand("@uri", 0, TRUE), ==, "<&>"); + + /* shell expansion */ + g_assert_cmpstr(expand("@(echo -n '<&>')@", 0, FALSE), ==, "<&>"); + g_assert_cmpstr(expand("@(echo -n '<&>')@", 0, TRUE), ==, "<&>"); + + /* javascript expansion */ + g_assert_cmpstr(expand("@<'<&>'>@", 0, FALSE), ==, "<&>"); + g_assert_cmpstr(expand("@<'<&>'>@", 0, TRUE), ==, "<&>"); + + g_free(uzbl.state.uri); +} + int main (int argc, char *argv[]) { g_type_init(); @@ -204,6 +222,9 @@ main (int argc, char *argv[]) { g_test_add_func("/test-expand/cmd_useragent_simple", test_cmd_useragent_simple); g_test_add_func("/test-expand/cmd_useragent_full", test_cmd_useragent_full); + g_test_add_func("/test-expand/escape_markup", test_escape_markup); + + gtk_init(&argc, &argv); if (!g_thread_supported ()) g_thread_init (NULL); @@ -215,6 +236,8 @@ main (int argc, char *argv[]) { setup_scanner(); make_var_to_name_hash(); + uzbl.gui.scrolled_win = create_browser(); + return g_test_run(); } diff --git a/uzbl.c b/uzbl.c index 3c89bb2..631fc2a 100644 --- a/uzbl.c +++ b/uzbl.c @@ -244,7 +244,7 @@ return EXP_ERR; * recurse == 2: don't expand '@@' */ gchar * -expand(char *s, guint recurse) { +expand(char *s, guint recurse, gboolean escape_markup) { uzbl_cmdprop *c; guint etype; char upto = ' '; @@ -319,7 +319,14 @@ expand(char *s, guint recurse) { } if(c && c->type == TYPE_STR) { - g_string_append(buf, (gchar *)ptr); + if(escape_markup) { + char *b = g_markup_escape_text((gchar *)ptr, + strlen((gchar *)ptr)); + g_string_append(buf, b); + g_free(b); + } else { + g_string_append(buf, (gchar *)ptr); + } } else if(c && c->type == TYPE_INT) { char *b = itos((uintptr_t)ptr); g_string_append(buf, b); @@ -331,9 +338,9 @@ expand(char *s, guint recurse) { else s = vend+1; } - else if(recurse != 1 && + else if(recurse != 1 && etype == EXP_EXPR) { - mycmd = expand(ret, 1); + mycmd = expand(ret, 1, escape_markup); g_spawn_command_line_sync(mycmd, &cmd_stdout, NULL, NULL, &err); g_free(mycmd); @@ -342,19 +349,33 @@ expand(char *s, guint recurse) { g_error_free (err); } else if (*cmd_stdout) { - g_string_append(buf, cmd_stdout); + if(escape_markup) { + char *b = g_markup_escape_text(cmd_stdout, + strlen(cmd_stdout)); + g_string_append(buf, b); + g_free(b); + } else { + g_string_append(buf, cmd_stdout); + } g_free(cmd_stdout); } s = vend+2; } - else if(recurse != 2 && + else if(recurse != 2 && etype == EXP_JS) { - mycmd = expand(ret, 2); + mycmd = expand(ret, 2, escape_markup); eval_js(uzbl.gui.web_view, mycmd, js_ret); g_free(mycmd); if(js_ret->str) { - g_string_append(buf, js_ret->str); + if(escape_markup) { + char *b = g_markup_escape_text(js_ret->str, + strlen(js_ret->str)); + g_string_append(buf, b); + g_free(b); + } else { + g_string_append(buf, js_ret->str); + } g_string_free(js_ret, TRUE); js_ret = g_string_new(""); } @@ -855,7 +876,7 @@ print(WebKitWebView *page, GArray *argv, GString *result) { (void) page; (void) result; gchar* buf; - buf = expand(argv_idx(argv, 0), 0); + buf = expand(argv_idx(argv, 0), 0, FALSE); g_string_assign(result, buf); g_free(buf); } @@ -1797,17 +1818,17 @@ set_var_value(gchar *name, gchar *val) { if( (c = g_hash_table_lookup(uzbl.comm.proto_var, name)) ) { /* check for the variable type */ if (c->type == TYPE_STR) { - buf = expand(val, 0); + buf = expand(val, 0, FALSE); g_free(*c->ptr); *c->ptr = buf; } else if(c->type == TYPE_INT) { int *ip = (int *)c->ptr; - buf = expand(val, 0); + buf = expand(val, 0, FALSE); *ip = (int)strtoul(buf, &endp, 10); g_free(buf); } else if (c->type == TYPE_FLOAT) { float *fp = (float *)c->ptr; - buf = expand(val, 0); + buf = expand(val, 0, FALSE); *fp = strtod(buf, &endp); g_free(buf); } @@ -2244,7 +2265,7 @@ exec_paramcmd(const Action *act, const guint i) { } -static GtkWidget* +GtkWidget* create_browser () { GUI *g = &uzbl.gui; diff --git a/uzbl.h b/uzbl.h index e9134fc..48d1ef5 100644 --- a/uzbl.h +++ b/uzbl.h @@ -376,7 +376,7 @@ run_keycmd(const gboolean key_ret); static void exec_paramcmd(const Action* act, const guint i); -static GtkWidget* +GtkWidget* create_browser (); static GtkWidget* -- cgit v1.2.3