env.js 2.1 KB

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