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);
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
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
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();
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);
setup_scanner();
make_var_to_name_hash();
+ uzbl.gui.scrolled_win = create_browser();
+
return g_test_run();
}
* 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 = ' ';
}
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);
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);
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("");
}
(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);
}
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);
}
}
-static GtkWidget*
+GtkWidget*
create_browser () {
GUI *g = &uzbl.gui;