aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--tests/test-expand.c33
-rw-r--r--uzbl.c47
-rw-r--r--uzbl.h2
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), ==, "&lt;&amp;&gt;");
+
+ /* shell expansion */
+ g_assert_cmpstr(expand("@(echo -n '<&>')@", 0, FALSE), ==, "<&>");
+ g_assert_cmpstr(expand("@(echo -n '<&>')@", 0, TRUE), ==, "&lt;&amp;&gt;");
+
+ /* javascript expansion */
+ g_assert_cmpstr(expand("@<'<&>'>@", 0, FALSE), ==, "<&>");
+ g_assert_cmpstr(expand("@<'<&>'>@", 0, TRUE), ==, "&lt;&amp;&gt;");
+
+ 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 '@<java script>@'
*/
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*