• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1"use strict";
2var util = require("./util");
3var schedule;
4var noAsyncScheduler = function() {
5    throw new Error("No async scheduler available\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
6};
7var NativePromise = util.getNativePromise();
8if (util.isNode && typeof MutationObserver === "undefined") {
9    var GlobalSetImmediate = global.setImmediate;
10    var ProcessNextTick = process.nextTick;
11    schedule = util.isRecentNode
12                ? function(fn) { GlobalSetImmediate.call(global, fn); }
13                : function(fn) { ProcessNextTick.call(process, fn); };
14} else if (typeof NativePromise === "function" &&
15           typeof NativePromise.resolve === "function") {
16    var nativePromise = NativePromise.resolve();
17    schedule = function(fn) {
18        nativePromise.then(fn);
19    };
20} else if ((typeof MutationObserver !== "undefined") &&
21          !(typeof window !== "undefined" &&
22            window.navigator &&
23            (window.navigator.standalone || window.cordova)) &&
24          ("classList" in document.documentElement)) {
25    schedule = (function() {
26        var div = document.createElement("div");
27        var opts = {attributes: true};
28        var toggleScheduled = false;
29        var div2 = document.createElement("div");
30        var o2 = new MutationObserver(function() {
31            div.classList.toggle("foo");
32            toggleScheduled = false;
33        });
34        o2.observe(div2, opts);
35
36        var scheduleToggle = function() {
37            if (toggleScheduled) return;
38            toggleScheduled = true;
39            div2.classList.toggle("foo");
40        };
41
42        return function schedule(fn) {
43            var o = new MutationObserver(function() {
44                o.disconnect();
45                fn();
46            });
47            o.observe(div, opts);
48            scheduleToggle();
49        };
50    })();
51} else if (typeof setImmediate !== "undefined") {
52    schedule = function (fn) {
53        setImmediate(fn);
54    };
55} else if (typeof setTimeout !== "undefined") {
56    schedule = function (fn) {
57        setTimeout(fn, 0);
58    };
59} else {
60    schedule = noAsyncScheduler;
61}
62module.exports = schedule;
63