summaryrefslogtreecommitdiff
path: root/js/src/Ice/browser/TimerUtil.js
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2015-09-21 21:39:49 +0200
committerJose <jose@zeroc.com>2015-09-21 21:39:49 +0200
commitdb7c44b3867086e4ffaa0251a2dd5f9fe9368807 (patch)
tree67e30375a920c042ab4bb839a3f397aa086f1ab4 /js/src/Ice/browser/TimerUtil.js
parentICE-6634 - Using Ice in background worker. (diff)
downloadice-db7c44b3867086e4ffaa0251a2dd5f9fe9368807.tar.bz2
ice-db7c44b3867086e4ffaa0251a2dd5f9fe9368807.tar.xz
ice-db7c44b3867086e4ffaa0251a2dd5f9fe9368807.zip
JS issue with Promise.delay
When using Firefox and runing Ice from a web worker Promise.delay was not working as expected, sometimes the callback was fired without delay.
Diffstat (limited to 'js/src/Ice/browser/TimerUtil.js')
-rw-r--r--js/src/Ice/browser/TimerUtil.js292
1 files changed, 142 insertions, 150 deletions
diff --git a/js/src/Ice/browser/TimerUtil.js b/js/src/Ice/browser/TimerUtil.js
index 698350d9dc5..b522429ba13 100644
--- a/js/src/Ice/browser/TimerUtil.js
+++ b/js/src/Ice/browser/TimerUtil.js
@@ -30,179 +30,171 @@ function createTimerObject()
Timer.setInterval = function () { setInterval.apply(null, arguments); };
Timer.clearInterval = function () { clearInterval.apply(null, arguments); };
Timer.setImmediate = typeof(setImmediate) == "function" ?
- function () { setImmediate.apply(null, arguments); } : function() { setTimeout.apply(null, arguments); };
+ function () { setImmediate.apply(null, arguments); } :
+ function () { setTimeout.apply(null, arguments); };
return Timer;
}
-if(typeof(WorkerGlobalScope) !== 'undefined' && this instanceof WorkerGlobalScope)
-{
- //
- // If running in a worker we don't need to create a separate worker for the timers
- //
- Ice.Timer = createTimerObject();
-}
-else
-{
- Ice.__M.require(module,
- [
- "../Ice/HashMap",
- ]);
- var HashMap = Ice.HashMap;
+Ice.__M.require(module,
+ [
+ "../Ice/HashMap",
+ ]);
- var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
+var HashMap = Ice.HashMap;
- var _timers = new HashMap();
+var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
- var _SetTimeoutType = 0,
- _SetIntervalType = 1,
- _SetImmediateType = 2,
- _ClearTimeoutType = 3,
- _ClearIntervalType = 4;
+var _timers = new HashMap();
- var Timer = {};
- var worker;
+var _SetTimeoutType = 0,
+ _SetIntervalType = 1,
+ _SetImmediateType = 2,
+ _ClearTimeoutType = 3,
+ _ClearIntervalType = 4;
- var _nextId = 0;
+var Timer = {};
+var worker;
- var nextId = function()
- {
- if(_nextId == MAX_SAFE_INTEGER)
- {
- _nextId = 0;
- }
- return _nextId++;
- };
+var _nextId = 0;
- Timer.setTimeout = function(cb, ms)
+var nextId = function()
+{
+ if(_nextId == MAX_SAFE_INTEGER)
{
- var id = nextId();
- _timers.set(id, cb);
- worker.postMessage({type: _SetTimeoutType, id: id, ms: ms});
- return id;
- };
+ _nextId = 0;
+ }
+ return _nextId++;
+};
- Timer.clearTimeout = function(id)
- {
- _timers.delete(id);
- worker.postMessage({type: _ClearTimeoutType, id: id});
- };
+Timer.setTimeout = function(cb, ms)
+{
+ var id = nextId();
+ _timers.set(id, cb);
+ worker.postMessage({type: _SetTimeoutType, id: id, ms: ms});
+ return id;
+};
- Timer.setInterval = function(cb, ms)
- {
- var id = nextId();
- _timers.set(id, cb);
- worker.postMessage({type: _SetIntervalType, id: id, ms: ms});
- return id;
- };
+Timer.clearTimeout = function(id)
+{
+ _timers.delete(id);
+ worker.postMessage({type: _ClearTimeoutType, id: id});
+};
- Timer.clearInterval = function(id)
- {
- _timers.delete(id);
- worker.postMessage({type: _ClearIntervalType, 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.setImmediate = function(cb)
- {
- var id = nextId();
- _timers.set(id, cb);
- worker.postMessage({type: _SetImmediateType, id: id});
- 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)
+Timer.onmessage = function(e)
+{
+ var cb;
+ if(e.data.type === _SetIntervalType)
{
- var cb;
- if(e.data.type === _SetIntervalType)
- {
- cb = _timers.get(e.data.id);
- }
- else
- {
- cb = _timers.delete(e.data.id);
- }
+ cb = _timers.get(e.data.id);
+ }
+ else
+ {
+ cb = _timers.delete(e.data.id);
+ }
- if(cb !== undefined)
- {
- cb.call();
- }
- };
+ if(cb !== undefined)
+ {
+ cb.call();
+ }
+};
- var workerCode = function()
+var workerCode = function()
+{
+ return "(" +
+ function()
{
- return "(" +
- function()
+ //
+ // jshint worker: true
+ //
+ var _wSetTimeoutType = 0,
+ _wSetIntervalType = 1,
+ _wSetImmediateType = 2,
+ _wClearTimeoutType = 3,
+ _wClearIntervalType = 4;
+
+ var timers = {};
+
+ self.onmessage = function(e)
{
- //
- // 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)
{
- 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
- //
- }.toString() + "());";
- };
-
- if(worker === undefined)
+ 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
+ //
+ }.toString() + "());";
+};
+
+if(worker === undefined)
+{
+ var url;
+ try
{
- var url;
- try
- {
- url = window.URL.createObjectURL(new Blob([workerCode()], {type : 'text/javascript'}));
- worker = new Worker(url);
- worker.onmessage = Timer.onmessage;
- Ice.Timer = Timer;
- }
- catch(ex)
- {
- window.URL.revokeObjectURL(url);
-
- //
- // Fallback on setInterval/setTimeout if the worker creating failed. Some IE10 and IE11 don't
- // support creating workers from blob URLs for instance.
- //
- Ice.Timer = createTimerObject();
- }
+ url = URL.createObjectURL(new Blob([workerCode()], {type : 'text/javascript'}));
+ worker = new Worker(url);
+ worker.onmessage = Timer.onmessage;
+ Ice.Timer = Timer;
+ }
+ catch(ex)
+ {
+ URL.revokeObjectURL(url);
+
+ //
+ // Fallback on setInterval/setTimeout if the worker creating failed. Some IE10 and IE11 don't
+ // support creating workers from blob URLs for instance.
+ //
+ Ice.Timer = createTimerObject();
}
}