summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adam@chlipala.net>2012-04-27 09:52:16 -0400
committerGravatar Adam Chlipala <adam@chlipala.net>2012-04-27 09:52:16 -0400
commit4b4301a132b8d1144ed08c79b2ad918d70d5d37c (patch)
tree5dca2c2df7a7666a08d5a0bce5878d0e4b49bb2c
parent9b321dff16fd54f662fc9730b97d06afb6b28285 (diff)
Avoid generating empty <script> tags
-rw-r--r--src/c/urweb.c80
-rw-r--r--tests/headDyn.ur10
2 files changed, 61 insertions, 29 deletions
diff --git a/src/c/urweb.c b/src/c/urweb.c
index ab14144d..93635fd1 100644
--- a/src/c/urweb.c
+++ b/src/c/urweb.c
@@ -3223,38 +3223,60 @@ void uw_commit(uw_context ctx) {
} else if (!strncmp(s, "<head>", 6)) {
// <head> is present. Let's add the <script> tags immediately after it.
- size_t lenH = strlen(ctx->script_header), len = uw_buffer_used(&ctx->script);
- size_t lenP = lenH + 40 + len;
- char *start = s + 6, *oldPage = ctx->page.start;
-
- ctx_uw_buffer_check(ctx, "page", &ctx->page, uw_buffer_used(&ctx->page) + lenP);
- start += ctx->page.start - oldPage;
- memmove(start + lenP, start, uw_buffer_used(&ctx->page) - (start - ctx->page.start) + 1);
- ctx->page.front += lenP;
- memcpy(start, ctx->script_header, lenH);
- memcpy(start + lenH, "<script type=\"text/javascript\">", 31);
- memcpy(start + lenH + 31, ctx->script.start, len);
- memcpy(start + lenH + 31 + len, "</script>", 9);
+ // Any freeform JavaScript to include?
+ if (uw_buffer_used(&ctx->script) > 0) {
+ size_t lenH = strlen(ctx->script_header), len = uw_buffer_used(&ctx->script);
+ size_t lenP = lenH + 40 + len;
+ char *start = s + 6, *oldPage = ctx->page.start;
+
+ ctx_uw_buffer_check(ctx, "page", &ctx->page, uw_buffer_used(&ctx->page) + lenP);
+ start += ctx->page.start - oldPage;
+ memmove(start + lenP, start, uw_buffer_used(&ctx->page) - (start - ctx->page.start) + 1);
+ ctx->page.front += lenP;
+ memcpy(start, ctx->script_header, lenH);
+ memcpy(start + lenH, "<script type=\"text/javascript\">", 31);
+ memcpy(start + lenH + 31, ctx->script.start, len);
+ memcpy(start + lenH + 31 + len, "</script>", 9);
+ } else {
+ size_t lenH = strlen(ctx->script_header);
+ char *start = s + 6, *oldPage = ctx->page.start;
+
+ ctx_uw_buffer_check(ctx, "page", &ctx->page, uw_buffer_used(&ctx->page) + lenH);
+ start += ctx->page.start - oldPage;
+ memmove(start + lenH, start, uw_buffer_used(&ctx->page) - (start - ctx->page.start) + 1);
+ ctx->page.front += lenH;
+ memcpy(start, ctx->script_header, lenH);
+ }
} else {
// No <head>. At this point, add it, with <script> tags inside.
- size_t lenH = strlen(ctx->script_header), len = uw_buffer_used(&ctx->script);
- size_t lenP = lenH + 53 + len;
- char *start = s, *oldPage = ctx->page.start;
-
- printf("start = %ld\n", start - ctx->page.start);
-
- ctx_uw_buffer_check(ctx, "page", &ctx->page, uw_buffer_used(&ctx->page) + lenP);
- start += ctx->page.start - oldPage;
- printf("page1 = %s\n", ctx->page.start);
- memmove(start + lenP, start, uw_buffer_used(&ctx->page) - (start - ctx->page.start) + 1);
- printf("page2 = %s\n", ctx->page.start);
- ctx->page.front += lenP;
- memcpy(start, "<head>", 6);
- memcpy(start + 6, ctx->script_header, lenH);
- memcpy(start + 6 + lenH, "<script type=\"text/javascript\">", 31);
- memcpy(start + 6 + lenH + 31, ctx->script.start, len);
- memcpy(start + 6 + lenH + 31 + len, "</script></head>", 16);
+ if (uw_buffer_used(&ctx->script) > 0) {
+ size_t lenH = strlen(ctx->script_header), len = uw_buffer_used(&ctx->script);
+ size_t lenP = lenH + 53 + len;
+ char *start = s, *oldPage = ctx->page.start;
+
+ ctx_uw_buffer_check(ctx, "page", &ctx->page, uw_buffer_used(&ctx->page) + lenP);
+ start += ctx->page.start - oldPage;
+ memmove(start + lenP, start, uw_buffer_used(&ctx->page) - (start - ctx->page.start) + 1);
+ ctx->page.front += lenP;
+ memcpy(start, "<head>", 6);
+ memcpy(start + 6, ctx->script_header, lenH);
+ memcpy(start + 6 + lenH, "<script type=\"text/javascript\">", 31);
+ memcpy(start + 6 + lenH + 31, ctx->script.start, len);
+ memcpy(start + 6 + lenH + 31 + len, "</script></head>", 16);
+ } else {
+ size_t lenH = strlen(ctx->script_header);
+ size_t lenP = lenH + 13;
+ char *start = s, *oldPage = ctx->page.start;
+
+ ctx_uw_buffer_check(ctx, "page", &ctx->page, uw_buffer_used(&ctx->page) + lenP);
+ start += ctx->page.start - oldPage;
+ memmove(start + lenP, start, uw_buffer_used(&ctx->page) - (start - ctx->page.start) + 1);
+ ctx->page.front += lenP;
+ memcpy(start, "<head>", 6);
+ memcpy(start + 6, ctx->script_header, lenH);
+ memcpy(start + 6 + lenH, "</head>", 7);
+ }
}
}
}
diff --git a/tests/headDyn.ur b/tests/headDyn.ur
index 3ad0ea2a..02fb0e03 100644
--- a/tests/headDyn.ur
+++ b/tests/headDyn.ur
@@ -8,3 +8,13 @@ fun main () : transaction page =
<dyn signal={signal x}/>
</body>
</xml>
+
+fun main2 () : transaction page =
+ return <xml>
+ <head>
+ <title>Test</title>
+ </head>
+ <body>
+ <button onclick={alert "Hi"}/>
+ </body>
+ </xml>