src/cm/media/js/lib/yui/yui3-3.15.0/build/timers/timers.js
author Yves-Marie Haussonne <ymh.work+github@gmail.com>
Fri, 09 May 2014 18:35:26 +0200
changeset 656 a84519031134
parent 602 e16a97fb364a
permissions -rw-r--r--
add link to "privacy policy" in the header test
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
602
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     1
YUI.add('timers', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     3
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     4
Provides utilities for timed asynchronous callback execution.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     5
Y.soon is a setImmediate/process.nextTick/setTimeout wrapper.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     6
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     7
This module includes [asap.js](https://github.com/kriskowal/asap) for scheduling
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     8
asynchronous tasks.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     9
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    10
@module timers
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    11
@author Steven Olmsted
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    12
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    13
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    14
// Hack. asap.js is written as a Node module and expects require, module and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    15
// global to be available in the module's scope.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    16
var module = {},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    17
    global = Y.config.global;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    18
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    19
// `asap` only requires a `queue` module that is bundled into this same file.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    20
function require(mod) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    21
    return Queue;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    22
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    23
"use strict";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    24
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    25
module.exports = Queue;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    26
function Queue(capacity) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    27
    this.capacity = this.snap(capacity);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    28
    this.length = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    29
    this.front = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    30
    this.initialize();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    31
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    32
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    33
Queue.prototype.push = function (value) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    34
    var length = this.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    35
    if (this.capacity <= length) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    36
        this.grow(this.snap(this.capacity * this.growFactor));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    37
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    38
    var index = (this.front + length) & (this.capacity - 1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    39
    this[index] = value;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    40
    this.length = length + 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    41
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    42
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    43
Queue.prototype.shift = function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    44
    var front = this.front;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    45
    var result = this[front];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    46
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    47
    this[front] = void 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    48
    this.front = (front + 1) & (this.capacity - 1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    49
    this.length--;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    50
    return result;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    51
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    52
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    53
Queue.prototype.grow = function (capacity) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    54
    var oldFront = this.front;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    55
    var oldCapacity = this.capacity;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    56
    var oldQueue = new Array(oldCapacity);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    57
    var length = this.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    58
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    59
    copy(this, 0, oldQueue, 0, oldCapacity);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    60
    this.capacity = capacity;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    61
    this.initialize();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    62
    this.front = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    63
    if (oldFront + length <= oldCapacity) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    64
        // Can perform direct linear copy
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    65
        copy(oldQueue, oldFront, this, 0, length);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    66
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    67
        // Cannot perform copy directly, perform as much as possible at the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    68
        // end, and then copy the rest to the beginning of the buffer
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    69
        var lengthBeforeWrapping =
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    70
            length - ((oldFront + length) & (oldCapacity - 1));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    71
        copy(
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    72
            oldQueue,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    73
            oldFront,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    74
            this,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    75
            0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    76
            lengthBeforeWrapping
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    77
        );
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    78
        copy(
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    79
            oldQueue,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    80
            0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    81
            this,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    82
            lengthBeforeWrapping,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    83
            length - lengthBeforeWrapping
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    84
        );
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    85
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    86
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    87
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    88
Queue.prototype.initialize = function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    89
    var length = this.capacity;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    90
    for (var i = 0; i < length; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    91
        this[i] = void 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    92
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    93
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    94
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    95
Queue.prototype.snap = function (capacity) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    96
    if (typeof capacity !== "number") {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    97
        return this.minCapacity;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    98
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    99
    return pow2AtLeast(
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   100
        Math.min(this.maxCapacity, Math.max(this.minCapacity, capacity))
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   101
    );
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   102
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   103
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   104
Queue.prototype.maxCapacity = (1 << 30) | 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   105
Queue.prototype.minCapacity = 16;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   106
Queue.prototype.growFactor = 8;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   107
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   108
function copy(source, sourceIndex, target, targetIndex, length) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   109
    for (var index = 0; index < length; ++index) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   110
        target[index + targetIndex] = source[index + sourceIndex];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   111
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   112
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   113
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   114
function pow2AtLeast(n) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   115
    n = n >>> 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   116
    n = n - 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   117
    n = n | (n >> 1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   118
    n = n | (n >> 2);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   119
    n = n | (n >> 4);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   120
    n = n | (n >> 8);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   121
    n = n | (n >> 16);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   122
    return n + 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   123
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   124
"use strict";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   125
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   126
// Use the fastest possible means to execute a task in a future turn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   127
// of the event loop.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   128
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   129
// Queue is a circular buffer with good locality of reference and doesn't
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   130
// allocate new memory unless there are more than `InitialCapacity` parallel
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   131
// tasks in which case it will resize itself generously to x8 more capacity.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   132
// The use case of asap should require no or few amount of resizes during
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   133
// runtime.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   134
// Calling a task frees a slot immediately so if the calling
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   135
// has a side effect of queuing itself again, it can be sustained
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   136
// without additional memory
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   137
// Queue specifically uses
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   138
// http://en.wikipedia.org/wiki/Circular_buffer#Use_a_Fill_Count
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   139
// Because:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   140
// 1. We need fast .length operation, since queue
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   141
//   could have changed after every iteration
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   142
// 2. Modulus can be negated by using power-of-two
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   143
//   capacities and replacing it with bitwise AND
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   144
// 3. It will not be used in a multi-threaded situation.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   145
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   146
var Queue = require("./queue");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   147
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   148
//1024 = InitialCapacity
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   149
var queue = new Queue(1024);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   150
var flushing = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   151
var requestFlush = void 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   152
var hasSetImmediate = typeof setImmediate === "function";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   153
var domain;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   154
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   155
// Avoid shims from browserify.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   156
// The existence of `global` in browsers is guaranteed by browserify.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   157
var process = global.process;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   158
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   159
// Note that some fake-Node environments,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   160
// like the Mocha test runner, introduce a `process` global.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   161
var isNodeJS = !!process && ({}).toString.call(process) === "[object process]";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   162
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   163
function flush() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   164
    /* jshint loopfunc: true */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   165
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   166
    while (queue.length > 0) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   167
        var task = queue.shift();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   168
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   169
        try {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   170
            task.call();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   171
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   172
        } catch (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   173
            if (isNodeJS) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   174
                // In node, uncaught exceptions are considered fatal errors.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   175
                // Re-throw them to interrupt flushing!
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   176
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   177
                // Ensure continuation if an uncaught exception is suppressed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   178
                // listening process.on("uncaughtException") or domain("error").
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   179
                requestFlush();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   180
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   181
                throw e;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   182
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   183
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   184
                // In browsers, uncaught exceptions are not fatal.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   185
                // Re-throw them asynchronously to avoid slow-downs.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   186
                setTimeout(function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   187
                    throw e;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   188
                }, 0);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   189
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   190
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   191
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   192
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   193
    flushing = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   194
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   195
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   196
if (isNodeJS) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   197
    // Node.js
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   198
    requestFlush = function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   199
        // Ensure flushing is not bound to any domain.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   200
        var currentDomain = process.domain;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   201
        if (currentDomain) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   202
            domain = domain || (1,require)("domain");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   203
            domain.active = process.domain = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   204
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   205
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   206
        // Avoid tick recursion - use setImmediate if it exists.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   207
        if (flushing && hasSetImmediate) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   208
            setImmediate(flush);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   209
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   210
            process.nextTick(flush);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   211
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   212
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   213
        if (currentDomain) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   214
            domain.active = process.domain = currentDomain;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   215
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   216
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   217
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   218
} else if (hasSetImmediate) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   219
    // In IE10, or https://github.com/NobleJS/setImmediate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   220
    requestFlush = function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   221
        setImmediate(flush);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   222
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   223
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   224
} else if (typeof MessageChannel !== "undefined") {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   225
    // modern browsers
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   226
    // http://www.nonblocking.io/2011/06/windownexttick.html
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   227
    var channel = new MessageChannel();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   228
    // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   229
    // working message ports the first time a page loads.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   230
    channel.port1.onmessage = function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   231
        requestFlush = requestPortFlush;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   232
        channel.port1.onmessage = flush;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   233
        flush();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   234
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   235
    var requestPortFlush = function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   236
        // Opera requires us to provide a message payload, regardless of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   237
        // whether we use it.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   238
        channel.port2.postMessage(0);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   239
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   240
    requestFlush = function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   241
        setTimeout(flush, 0);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   242
        requestPortFlush();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   243
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   244
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   245
} else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   246
    // old browsers
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   247
    requestFlush = function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   248
        setTimeout(flush, 0);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   249
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   250
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   251
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   252
function asap(task) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   253
    if (isNodeJS && process.domain) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   254
        task = process.domain.bind(task);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   255
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   256
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   257
    queue.push(task);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   258
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   259
    if (!flushing) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   260
        requestFlush();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   261
        flushing = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   262
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   263
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   264
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   265
module.exports = asap;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   266
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   267
Y.soon accepts a callback function.  The callback function will be called
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   268
once in a future turn of the JavaScript event loop.  If the function
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   269
requires a specific execution context or arguments, wrap it with Y.bind.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   270
Y.soon returns an object with a cancel method.  If the cancel method is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   271
called before the callback function, the callback function won't be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   272
called.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   273
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   274
@method soon
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   275
@for YUI
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   276
@param {Function} callbackFunction
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   277
@return {Object} An object with a cancel method.  If the cancel method is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   278
    called before the callback function, the callback function won't be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   279
    called.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   280
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   281
function soon(callbackFunction) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   282
    var canceled;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   283
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   284
    soon._asynchronizer(function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   285
        // Some asynchronizers may provide their own cancellation
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   286
        // methods such as clearImmediate or clearTimeout but some
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   287
        // asynchronizers do not.  For simplicity, cancellation is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   288
        // entirely handled here rather than wrapping the other methods.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   289
        // All asynchronizers are expected to always call this anonymous
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   290
        // function.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   291
        if (!canceled) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   292
            callbackFunction();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   293
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   294
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   295
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   296
    return {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   297
        cancel: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   298
            canceled = 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   299
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   300
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   301
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   302
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   303
soon._asynchronizer = asap;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   304
soon._impl = 'asap';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   305
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   306
Y.soon = soon;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   307
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   308
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   309
}, '@VERSION@', {"requires": ["yui-base"]});