jrse: fix #1082, fail if setTimeout/setInterval lack callback
This commit is contained in:
		
							parent
							
								
									ae9e9efa31
								
							
						
					
					
						commit
						f27e826b14
					
				
							
								
								
									
										20
									
								
								jsre/jsre.go
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								jsre/jsre.go
									
									
									
									
									
								
							| @ -85,7 +85,6 @@ func (self *JSRE) runEventLoop() { | |||||||
| 	ready := make(chan *jsTimer) | 	ready := make(chan *jsTimer) | ||||||
| 
 | 
 | ||||||
| 	newTimer := func(call otto.FunctionCall, interval bool) (*jsTimer, otto.Value) { | 	newTimer := func(call otto.FunctionCall, interval bool) (*jsTimer, otto.Value) { | ||||||
| 
 |  | ||||||
| 		delay, _ := call.Argument(1).ToInteger() | 		delay, _ := call.Argument(1).ToInteger() | ||||||
| 		if 0 >= delay { | 		if 0 >= delay { | ||||||
| 			delay = 1 | 			delay = 1 | ||||||
| @ -105,7 +104,6 @@ func (self *JSRE) runEventLoop() { | |||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			panic(err) | 			panic(err) | ||||||
| 		} | 		} | ||||||
| 
 |  | ||||||
| 		return timer, value | 		return timer, value | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| @ -127,8 +125,20 @@ func (self *JSRE) runEventLoop() { | |||||||
| 		} | 		} | ||||||
| 		return otto.UndefinedValue() | 		return otto.UndefinedValue() | ||||||
| 	} | 	} | ||||||
| 	vm.Set("setTimeout", setTimeout) | 	vm.Set("_setTimeout", setTimeout) | ||||||
| 	vm.Set("setInterval", setInterval) | 	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("clearTimeout", clearTimeout) | ||||||
| 	vm.Set("clearInterval", clearTimeout) | 	vm.Set("clearInterval", clearTimeout) | ||||||
| 
 | 
 | ||||||
| @ -154,7 +164,7 @@ loop: | |||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				fmt.Println("js error:", err, arguments) | 				fmt.Println("js error:", err, arguments) | ||||||
| 			} | 			} | ||||||
| 		 | 
 | ||||||
| 			_, inreg := registry[timer] // when clearInterval is called from within the callback don't reset it
 | 			_, inreg := registry[timer] // when clearInterval is called from within the callback don't reset it
 | ||||||
| 			if timer.interval && inreg { | 			if timer.interval && inreg { | ||||||
| 				timer.timer.Reset(timer.duration) | 				timer.timer.Reset(timer.duration) | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user