You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					79 lines
				
				2.4 KiB
			
		
		
			
		
	
	
					79 lines
				
				2.4 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								var global = require('../internals/global');
							 | 
						||
| 
								 | 
							
								var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;
							 | 
						||
| 
								 | 
							
								var classof = require('../internals/classof-raw');
							 | 
						||
| 
								 | 
							
								var macrotask = require('../internals/task').set;
							 | 
						||
| 
								 | 
							
								var IS_IOS = require('../internals/engine-is-ios');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var MutationObserver = global.MutationObserver || global.WebKitMutationObserver;
							 | 
						||
| 
								 | 
							
								var process = global.process;
							 | 
						||
| 
								 | 
							
								var Promise = global.Promise;
							 | 
						||
| 
								 | 
							
								var IS_NODE = classof(process) == 'process';
							 | 
						||
| 
								 | 
							
								// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`
							 | 
						||
| 
								 | 
							
								var queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask');
							 | 
						||
| 
								 | 
							
								var queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var flush, head, last, notify, toggle, node, promise, then;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// modern engines have queueMicrotask method
							 | 
						||
| 
								 | 
							
								if (!queueMicrotask) {
							 | 
						||
| 
								 | 
							
								  flush = function () {
							 | 
						||
| 
								 | 
							
								    var parent, fn;
							 | 
						||
| 
								 | 
							
								    if (IS_NODE && (parent = process.domain)) parent.exit();
							 | 
						||
| 
								 | 
							
								    while (head) {
							 | 
						||
| 
								 | 
							
								      fn = head.fn;
							 | 
						||
| 
								 | 
							
								      head = head.next;
							 | 
						||
| 
								 | 
							
								      try {
							 | 
						||
| 
								 | 
							
								        fn();
							 | 
						||
| 
								 | 
							
								      } catch (error) {
							 | 
						||
| 
								 | 
							
								        if (head) notify();
							 | 
						||
| 
								 | 
							
								        else last = undefined;
							 | 
						||
| 
								 | 
							
								        throw error;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    } last = undefined;
							 | 
						||
| 
								 | 
							
								    if (parent) parent.enter();
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Node.js
							 | 
						||
| 
								 | 
							
								  if (IS_NODE) {
							 | 
						||
| 
								 | 
							
								    notify = function () {
							 | 
						||
| 
								 | 
							
								      process.nextTick(flush);
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339
							 | 
						||
| 
								 | 
							
								  } else if (MutationObserver && !IS_IOS) {
							 | 
						||
| 
								 | 
							
								    toggle = true;
							 | 
						||
| 
								 | 
							
								    node = document.createTextNode('');
							 | 
						||
| 
								 | 
							
								    new MutationObserver(flush).observe(node, { characterData: true });
							 | 
						||
| 
								 | 
							
								    notify = function () {
							 | 
						||
| 
								 | 
							
								      node.data = toggle = !toggle;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  // environments with maybe non-completely correct, but existent Promise
							 | 
						||
| 
								 | 
							
								  } else if (Promise && Promise.resolve) {
							 | 
						||
| 
								 | 
							
								    // Promise.resolve without an argument throws an error in LG WebOS 2
							 | 
						||
| 
								 | 
							
								    promise = Promise.resolve(undefined);
							 | 
						||
| 
								 | 
							
								    then = promise.then;
							 | 
						||
| 
								 | 
							
								    notify = function () {
							 | 
						||
| 
								 | 
							
								      then.call(promise, flush);
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  // for other environments - macrotask based on:
							 | 
						||
| 
								 | 
							
								  // - setImmediate
							 | 
						||
| 
								 | 
							
								  // - MessageChannel
							 | 
						||
| 
								 | 
							
								  // - window.postMessag
							 | 
						||
| 
								 | 
							
								  // - onreadystatechange
							 | 
						||
| 
								 | 
							
								  // - setTimeout
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    notify = function () {
							 | 
						||
| 
								 | 
							
								      // strange IE + webpack dev server bug - use .call(global)
							 | 
						||
| 
								 | 
							
								      macrotask.call(global, flush);
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = queueMicrotask || function (fn) {
							 | 
						||
| 
								 | 
							
								  var task = { fn: fn, next: undefined };
							 | 
						||
| 
								 | 
							
								  if (last) last.next = task;
							 | 
						||
| 
								 | 
							
								  if (!head) {
							 | 
						||
| 
								 | 
							
								    head = task;
							 | 
						||
| 
								 | 
							
								    notify();
							 | 
						||
| 
								 | 
							
								  } last = task;
							 | 
						||
| 
								 | 
							
								};
							 |