UNPKG

2.17 kBJavaScriptView Raw
1/** @license MIT License (c) copyright 2010-2014 original author or authors */
2/** @author Brian Cavalier */
3/** @author John Hann */
4
5/*global process,document,setTimeout,clearTimeout,MutationObserver,WebKitMutationObserver*/
6(function(define) { 'use strict';
7define(function(require) {
8 /*jshint maxcomplexity:6*/
9
10 // Sniff "best" async scheduling option
11 // Prefer process.nextTick or MutationObserver, then check for
12 // setTimeout, and finally vertx, since its the only env that doesn't
13 // have setTimeout
14
15 var MutationObs;
16 var capturedSetTimeout = typeof setTimeout !== 'undefined' && setTimeout;
17
18 // Default env
19 var setTimer = function(f, ms) { return setTimeout(f, ms); };
20 var clearTimer = function(t) { return clearTimeout(t); };
21 var asap = function (f) { return capturedSetTimeout(f, 0); };
22
23 // Detect specific env
24 if (isNode()) { // Node
25 asap = function (f) { return process.nextTick(f); };
26
27 } else if (MutationObs = hasMutationObserver()) { // Modern browser
28 asap = initMutationObserver(MutationObs);
29
30 } else if (!capturedSetTimeout) { // vert.x
31 var vertxRequire = require;
32 var vertx = vertxRequire('vertx');
33 setTimer = function (f, ms) { return vertx.setTimer(ms, f); };
34 clearTimer = vertx.cancelTimer;
35 asap = vertx.runOnLoop || vertx.runOnContext;
36 }
37
38 return {
39 setTimer: setTimer,
40 clearTimer: clearTimer,
41 asap: asap
42 };
43
44 function isNode () {
45 return typeof process !== 'undefined' &&
46 Object.prototype.toString.call(process) === '[object process]';
47 }
48
49 function hasMutationObserver () {
50 return (typeof MutationObserver !== 'undefined' && MutationObserver) ||
51 (typeof WebKitMutationObserver !== 'undefined' && WebKitMutationObserver);
52 }
53
54 function initMutationObserver(MutationObserver) {
55 var scheduled;
56 var node = document.createTextNode('');
57 var o = new MutationObserver(run);
58 o.observe(node, { characterData: true });
59
60 function run() {
61 var f = scheduled;
62 scheduled = void 0;
63 f();
64 }
65
66 var i = 0;
67 return function (f) {
68 scheduled = f;
69 node.data = (i ^= 1);
70 };
71 }
72});
73}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));