diff options
author | Adam Chlipala <adam@chlipala.net> | 2012-07-23 09:03:41 -0400 |
---|---|---|
committer | Adam Chlipala <adam@chlipala.net> | 2012-07-23 09:03:41 -0400 |
commit | 8a2b82151a52f3c2e99d60b76026b22b088b9e56 (patch) | |
tree | 4e519e4d4a0bd9a3e0c823866ff23c65992e4d03 /lib/js | |
parent | 0cb456bbab73abfd9c08af101d1dfe71cf2d41d4 (diff) |
Disallow suspending operations in <active code={...}>
Diffstat (limited to 'lib/js')
-rw-r--r-- | lib/js/urweb.js | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/lib/js/urweb.js b/lib/js/urweb.js index 63aab9b5..4435bffa 100644 --- a/lib/js/urweb.js +++ b/lib/js/urweb.js @@ -913,10 +913,21 @@ function setInnerHTML(node, html) { runScripts(node); } +var maySuspend = true; + function active(s) { var span = document.createElement("span"); addNode(span); - setInnerHTML(span, execF(s)); + var ms = maySuspend; + maySuspend = false; + try { + var html = execF(s); + } catch (e) { + maySuspend = ms; + throw e; + } + maySuspend = ms; + setInnerHTML(span, html); } function input(x, s, recreate, type, name) { @@ -1002,10 +1013,10 @@ function dynClass(html, s_class, s_style) { var dummy = document.createElement("body"); dummy.innerHTML = html; - runScripts(dummy); var html = dummy.firstChild; dummy.removeChild(html); addNode(html); + runScripts(html); if (s_class) { var x = document.createElement("script"); @@ -1285,6 +1296,9 @@ function redirect(s) { } function rc(prefix, uri, parse, k, needsSig) { + if (!maySuspend) + er("May not 'rpc' in 'code' for <active>"); + uri = cat(prefix, uri); uri = flattenLocal(uri); var xhr = getXHR(); @@ -1463,6 +1477,9 @@ function listener() { } function rv(chn, parse, k) { + if (!maySuspend) + er("May not 'recv' in 'code' for <active>"); + if (chn == null) return; @@ -1490,6 +1507,9 @@ function rv(chn, parse, k) { } function sl(ms, k) { + if (!maySuspend) + er("May not 'sleep' in 'code' for <active>"); + window.setTimeout(function() { k(null); }, ms); } |