diff lib/js/urweb.js @ 2121:f89be9cd2087

Support 'dynClass' and 'dynStyle' for <body>
author Adam Chlipala <adam@chlipala.net>
date Tue, 03 Mar 2015 15:55:00 -0500
parents 9e9c915f554c
children 248e2b32954b
line wrap: on
line diff
--- a/lib/js/urweb.js	Mon Feb 16 14:52:56 2015 -0500
+++ b/lib/js/urweb.js	Tue Mar 03 15:55:00 2015 -0500
@@ -1200,7 +1200,7 @@
         x.dead = false;
         x.signal = s_class;
         x.sources = null;
-        x.closures = htmlCls;
+        x.closures = null;
 
         x.recreate = function(v) {
             for (var ls = x.closures; ls != htmlCls; ls = ls.next)
@@ -1237,6 +1237,56 @@
     }
 }
 
+function bodyDynClass(s_class, s_style) {
+    if (suspendScripts)
+        return;
+
+    var htmlCls = null;
+
+    if (s_class) {
+        var x = document.createElement("script");
+        x.dead = false;
+        x.signal = s_class;
+        x.sources = null;
+        x.closures = htmlCls;
+
+        x.recreate = function(v) {
+            for (var ls = x.closures; ls != htmlCls; ls = ls.next)
+                freeClosure(ls.data);
+
+            var cls = {v : null};
+            document.body.className = flatten(cls, v);
+            console.log("className to + " + document.body.className);
+	    x.closures = concat(cls.v, htmlCls);
+        }
+
+        document.body.appendChild(x);
+        populate(x);
+    }
+
+    if (s_style) {
+        var htmlCls2 = s_class ? null : htmlCls;
+        var y = document.createElement("script");
+        y.dead = false;
+        y.signal = s_style;
+        y.sources = null;
+        y.closures = htmlCls2;
+
+        y.recreate = function(v) {
+            for (var ls = y.closures; ls != htmlCls2; ls = ls.next)
+                freeClosure(ls.data);
+
+            var cls = {v : null};
+            document.body.style.cssText = flatten(cls, v);
+            console.log("style to + " + document.body.style.cssText);
+	    y.closures = concat(cls.v, htmlCls2);
+        }
+
+        document.body.appendChild(y);
+        populate(y);
+    }
+}
+
 function addOnChange(x, f) {
     var old = x.onchange;
     if (old == null)