summaryrefslogtreecommitdiff
path: root/js/src/Ice/browser/TimerUtil.js
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2015-01-14 18:17:02 +0100
committerJose <jose@zeroc.com>2015-01-14 18:17:02 +0100
commit30b27854f46bb9ef663fc214681e5dada0496f1b (patch)
tree7d9c6332b3c12d0d3a1ab42f1c6f9aa4c3a76452 /js/src/Ice/browser/TimerUtil.js
parentFixed a bunch of objc file headers (diff)
downloadice-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.js161
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;