diff options
author | Péter Szilágyi <peterke@gmail.com> | 2015-11-23 19:03:31 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2015-11-23 19:03:31 +0800 |
commit | f27e826b140089cbeb722feec96b1aae3e7645a3 (patch) | |
tree | 1287b33a28c49fd26e4a843397debf49d5f4dd66 | |
parent | ae9e9efa3155e85428172d8b47782c389efbdb41 (diff) | |
download | go-tangerine-f27e826b140089cbeb722feec96b1aae3e7645a3.tar.gz go-tangerine-f27e826b140089cbeb722feec96b1aae3e7645a3.tar.zst go-tangerine-f27e826b140089cbeb722feec96b1aae3e7645a3.zip |
jrse: fix #1082, fail if setTimeout/setInterval lack callback
-rw-r--r-- | jsre/jsre.go | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/jsre/jsre.go b/jsre/jsre.go index af7d507c6..a4c9d970b 100644 --- a/jsre/jsre.go +++ b/jsre/jsre.go @@ -85,7 +85,6 @@ func (self *JSRE) runEventLoop() { ready := make(chan *jsTimer) newTimer := func(call otto.FunctionCall, interval bool) (*jsTimer, otto.Value) { - delay, _ := call.Argument(1).ToInteger() if 0 >= delay { delay = 1 @@ -105,7 +104,6 @@ func (self *JSRE) runEventLoop() { if err != nil { panic(err) } - return timer, value } @@ -127,8 +125,20 @@ func (self *JSRE) runEventLoop() { } return otto.UndefinedValue() } - vm.Set("setTimeout", setTimeout) - vm.Set("setInterval", setInterval) + vm.Set("_setTimeout", setTimeout) + vm.Set("_setInterval", setInterval) + vm.Run(`var setTimeout = function(args) { + if (arguments.length < 1) { + throw TypeError("Failed to execute 'setTimeout': 1 argument required, but only 0 present."); + } + return _setTimeout.apply(this, arguments); + }`) + vm.Run(`var setInterval = function(args) { + if (arguments.length < 1) { + throw TypeError("Failed to execute 'setInterval': 1 argument required, but only 0 present."); + } + return _setInterval.apply(this, arguments); + }`) vm.Set("clearTimeout", clearTimeout) vm.Set("clearInterval", clearTimeout) @@ -154,7 +164,7 @@ loop: if err != nil { fmt.Println("js error:", err, arguments) } - + _, inreg := registry[timer] // when clearInterval is called from within the callback don't reset it if timer.interval && inreg { timer.timer.Reset(timer.duration) |