diff options
author | Jose <jose@zeroc.com> | 2015-01-14 18:17:02 +0100 |
---|---|---|
committer | Jose <jose@zeroc.com> | 2015-01-14 18:17:02 +0100 |
commit | 30b27854f46bb9ef663fc214681e5dada0496f1b (patch) | |
tree | 7d9c6332b3c12d0d3a1ab42f1c6f9aa4c3a76452 /js/src/Ice/browser/TimerUtil.js | |
parent | Fixed a bunch of objc file headers (diff) | |
download | ice-30b27854f46bb9ef663fc214681e5dada0496f1b.tar.bz2 ice-30b27854f46bb9ef663fc214681e5dada0496f1b.tar.xz ice-30b27854f46bb9ef663fc214681e5dada0496f1b.zip |
Fixed (ICE-6224) - IceJS browser tests do not run when in the background
Diffstat (limited to 'js/src/Ice/browser/TimerUtil.js')
-rw-r--r-- | js/src/Ice/browser/TimerUtil.js | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/js/src/Ice/browser/TimerUtil.js b/js/src/Ice/browser/TimerUtil.js new file mode 100644 index 00000000000..05f660d2815 --- /dev/null +++ b/js/src/Ice/browser/TimerUtil.js @@ -0,0 +1,161 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2015 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +// +// jshint browser: true +// +var Ice = require("../Ice/ModuleRegistry").Ice; +Ice.__M.require(module, + [ + "../Ice/HashMap", + ]); + +var HashMap = Ice.HashMap; + +var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; + +var _timers = new HashMap(); + +var _SetTimeoutType = 0, + _SetIntervalType = 1, + _SetImmediateType = 2, + _ClearTimeoutType = 3, + _ClearIntervalType = 4; + +var Timer = {}; +var worker; + +var _nextId = 0; + +function nextId() +{ + if(_nextId == MAX_SAFE_INTEGER) + { + _nextId = 0; + } + return _nextId++; +} +Timer.setTimeout = function(cb, ms) +{ + var id = nextId(); + _timers.set(id, cb); + worker.postMessage({type: _SetTimeoutType, id: id, ms: ms}); + return id; +}; + +Timer.clearTimeout = function(id) +{ + _timers.delete(id); + worker.postMessage({type: _ClearTimeoutType, id: id}); +}; + +Timer.setInterval = function(cb, ms) +{ + var id = nextId(); + _timers.set(id, cb); + worker.postMessage({type: _SetIntervalType, id: id, ms: ms}); + return id; +}; + +Timer.clearInterval = function(id) +{ + _timers.delete(id); + worker.postMessage({type: _ClearIntervalType, id: id}); +}; + +Timer.setImmediate = function(cb) +{ + var id = nextId(); + _timers.set(id, cb); + worker.postMessage({type: _SetImmediateType, id: id}); + return id; +}; + +Timer.onmessage = function(e) +{ + var cb; + if(e.data.type === _SetIntervalType) + { + cb = _timers.get(e.data.id); + } + else + { + cb = _timers.delete(e.data.id); + } + + if(cb !== undefined) + { + cb.call(); + } +}; + + +function workerCode() +{ + function w() + { + // + // jshint worker: true + // + var _wSetTimeoutType = 0, + _wSetIntervalType = 1, + _wSetImmediateType = 2, + _wClearTimeoutType = 3, + _wClearIntervalType = 4; + + var timers = {}; + + self.onmessage = function(e) + { + if(e.data.type == _wSetTimeoutType) + { + timers[e.data.id] = setTimeout(function() + { + self.postMessage(e.data); + }, + e.data.ms); + } + else if(e.data.type == _wSetIntervalType) + { + timers[e.data.id] = setInterval(function() + { + self.postMessage(e.data); + }, + e.data.ms); + } + else if(e.data.type == _wSetImmediateType) + { + self.postMessage(e.data); + } + else if(e.data.type == _wClearTimeoutType) + { + clearTimeout(timers[e.data.id]); + delete timers[e.data.id]; + } + else if(e.data.type == _wClearIntervalType) + { + clearInterval(timers[e.data.id]); + delete timers[e.data.id]; + } + }; + + // + // jshint worker: false + // + }; + return w.toString() + "w();"; +} + +if(worker === undefined) +{ + worker = new Worker(window.URL.createObjectURL(new Blob([workerCode()], {type : 'text/javascript'}))); + worker.onmessage = Timer.onmessage; +} + +Ice.Timer = Timer; |