optional markup escaping in expand()
authorBrendan Taylor <whateley@gmail.com>
Tue, 7 Jul 2009 12:42:48 +0000 (06:42 -0600)
committerBrendan Taylor <whateley@gmail.com>
Tue, 7 Jul 2009 12:42:48 +0000 (06:42 -0600)
tests/test-expand.c
uzbl.c
uzbl.h

index c0eae41..d83bbe5 100644 (file)
@@ -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 (file)
--- 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 (file)
--- 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*