summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adam@chlipala.net>2012-07-25 08:20:15 -0400
committerGravatar Adam Chlipala <adam@chlipala.net>2012-07-25 08:20:15 -0400
commit59fbe515a0462e98ab3cbb78a1f136f382ab927a (patch)
tree5bad8880a0a764f7d77e14b382ddb07ec268fb18
parent6f9747dbea34c09ae40f9859f63ad77abc1bd950 (diff)
Change 'spawn' implementation to allow blocking within <active code>
-rw-r--r--lib/js/urweb.js8
-rw-r--r--tests/activeBlock.ur10
2 files changed, 14 insertions, 4 deletions
diff --git a/lib/js/urweb.js b/lib/js/urweb.js
index 56066d26..1beb63c3 100644
--- a/lib/js/urweb.js
+++ b/lib/js/urweb.js
@@ -1297,7 +1297,7 @@ function redirect(s) {
function rc(prefix, uri, parse, k, needsSig) {
if (!maySuspend)
- er("May not 'rpc' in 'code' for <active>");
+ er("May not 'rpc' in main thread of 'code' for <active>");
uri = cat(prefix, uri);
uri = flattenLocal(uri);
@@ -1478,7 +1478,7 @@ function listener() {
function rv(chn, parse, k) {
if (!maySuspend)
- er("May not 'recv' in 'code' for <active>");
+ er("May not 'recv' in main thread of 'code' for <active>");
if (chn == null)
return;
@@ -1508,13 +1508,13 @@ function rv(chn, parse, k) {
function sl(ms, k) {
if (!maySuspend)
- er("May not 'sleep' in 'code' for <active>");
+ er("May not 'sleep' in main thread of 'code' for <active>");
window.setTimeout(function() { k(null); }, ms);
}
function sp(e) {
- execF(e, null);
+ window.setTimeout(function() { execF(e); }, 0);
}
diff --git a/tests/activeBlock.ur b/tests/activeBlock.ur
new file mode 100644
index 00000000..5560edda
--- /dev/null
+++ b/tests/activeBlock.ur
@@ -0,0 +1,10 @@
+fun main () : transaction page = return <xml><body>
+ <active code={s <- source ""; return <xml>
+ <dyn signal={s <- signal s; return (txt s)}/>
+ <button onclick={fn _ => set s "Hi!"}/>
+ </xml>}/>
+
+ <active code={sleep 1; return <xml>Hi!</xml>}/>
+
+ <active code={spawn (sleep 1; alert "Hi!"); return <xml>Success</xml>}/>
+</body></xml>