diff options
author | Jose <jose@zeroc.com> | 2015-09-21 21:39:49 +0200 |
---|---|---|
committer | Jose <jose@zeroc.com> | 2015-09-21 21:39:49 +0200 |
commit | db7c44b3867086e4ffaa0251a2dd5f9fe9368807 (patch) | |
tree | 67e30375a920c042ab4bb839a3f397aa086f1ab4 | |
parent | ICE-6634 - Using Ice in background worker. (diff) | |
download | ice-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.
-rw-r--r-- | js/src/Ice/browser/TimerUtil.js | 292 | ||||
-rw-r--r-- | js/test/Ice/promise/Client.js | 36 |
2 files changed, 152 insertions, 176 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(); } } diff --git a/js/test/Ice/promise/Client.js b/js/test/Ice/promise/Client.js index 7a6b4a2efb5..7e3beff8370 100644 --- a/js/test/Ice/promise/Client.js +++ b/js/test/Ice/promise/Client.js @@ -833,16 +833,7 @@ test(i == 10); test(Date.now() - start >= 450 && Date.now() - start <= 650); } - ).exception( - function(ex) - { - promise.fail(ex); - }); - - // - // Now test the static version. - // - p = p.then( + ).then( function() { start = Date.now(); @@ -852,17 +843,9 @@ test(i == 10); test(Date.now() - start >= 450 && Date.now() - start <= 650); } - ).exception( - function(ex) - { - promise.fail(ex); - }); - }); - - // - // Same but with fail - // - p.then( + ) + } + ).then( function() { var f = new Promise(); @@ -879,11 +862,12 @@ out.writeLine("ok"); promise.succeed(); } - ).exception( - function(ex) - { - promise.fail(ex); - }); + ) + } + ).exception( + function(ex) + { + promise.fail(ex); }); } ); |