1 var ctx = require('./_ctx')
2 , invoke = require('./_invoke')
3 , html = require('./_html')
4 , cel = require('./_dom-create')
5 , global = require('./_global')
6 , process = global.process
7 , setTask = global.setImmediate
8 , clearTask = global.clearImmediate
9 , MessageChannel = global.MessageChannel
12 , ONREADYSTATECHANGE = 'onreadystatechange'
13 , defer, channel, port;
16 if(queue.hasOwnProperty(id)){
22 var listener = function(event){
25 // Node.js 0.9+ & IE10+ has setImmediate, otherwise:
26 if(!setTask || !clearTask){
27 setTask = function setImmediate(fn){
29 while(arguments.length > i)args.push(arguments[i++]);
30 queue[++counter] = function(){
31 invoke(typeof fn == 'function' ? fn : Function(fn), args);
36 clearTask = function clearImmediate(id){
40 if(require('./_cof')(process) == 'process'){
42 process.nextTick(ctx(run, id, 1));
44 // Browsers with MessageChannel, includes WebWorkers
45 } else if(MessageChannel){
46 channel = new MessageChannel;
48 channel.port1.onmessage = listener;
49 defer = ctx(port.postMessage, port, 1);
50 // Browsers with postMessage, skip WebWorkers
51 // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
52 } else if(global.addEventListener && typeof postMessage == 'function' && !global.importScripts){
54 global.postMessage(id + '', '*');
56 global.addEventListener('message', listener, false);
58 } else if(ONREADYSTATECHANGE in cel('script')){
60 html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function(){
61 html.removeChild(this);
68 setTimeout(ctx(run, id, 1), 0);