| "use strict"; |
| var util = require("./util"); |
| var schedule; |
| var noAsyncScheduler = function() { |
| throw new Error("No async scheduler available\u000a\u000a See http://goo.gl/MqrFmX\u000a"); |
| }; |
| var NativePromise = util.getNativePromise(); |
| if (util.isNode && typeof MutationObserver === "undefined") { |
| var GlobalSetImmediate = global.setImmediate; |
| var ProcessNextTick = process.nextTick; |
| schedule = util.isRecentNode |
| ? function(fn) { GlobalSetImmediate.call(global, fn); } |
| : function(fn) { ProcessNextTick.call(process, fn); }; |
| } else if (typeof NativePromise === "function" && |
| typeof NativePromise.resolve === "function") { |
| var nativePromise = NativePromise.resolve(); |
| schedule = function(fn) { |
| nativePromise.then(fn); |
| }; |
| } else if ((typeof MutationObserver !== "undefined") && |
| !(typeof window !== "undefined" && |
| window.navigator && |
| (window.navigator.standalone || window.cordova)) && |
| ("classList" in document.documentElement)) { |
| schedule = (function() { |
| var div = document.createElement("div"); |
| var opts = {attributes: true}; |
| var toggleScheduled = false; |
| var div2 = document.createElement("div"); |
| var o2 = new MutationObserver(function() { |
| div.classList.toggle("foo"); |
| toggleScheduled = false; |
| }); |
| o2.observe(div2, opts); |
| |
| var scheduleToggle = function() { |
| if (toggleScheduled) return; |
| toggleScheduled = true; |
| div2.classList.toggle("foo"); |
| }; |
| |
| return function schedule(fn) { |
| var o = new MutationObserver(function() { |
| o.disconnect(); |
| fn(); |
| }); |
| o.observe(div, opts); |
| scheduleToggle(); |
| }; |
| })(); |
| } else if (typeof setImmediate !== "undefined") { |
| schedule = function (fn) { |
| setImmediate(fn); |
| }; |
| } else if (typeof setTimeout !== "undefined") { |
| schedule = function (fn) { |
| setTimeout(fn, 0); |
| }; |
| } else { |
| schedule = noAsyncScheduler; |
| } |
| module.exports = schedule; |