87 lines
2.9 KiB
JavaScript
87 lines
2.9 KiB
JavaScript
goog.provide("goog.async.nextTick");
|
|
goog.require("goog.debug.entryPointRegistry");
|
|
goog.require("goog.dom");
|
|
goog.require("goog.dom.TagName");
|
|
goog.require("goog.functions");
|
|
goog.require("goog.labs.userAgent.browser");
|
|
goog.require("goog.labs.userAgent.engine");
|
|
goog.async.nextTick = function(callback, opt_context, opt_useSetImmediate) {
|
|
var cb = callback;
|
|
if (opt_context) {
|
|
cb = goog.bind(callback, opt_context);
|
|
}
|
|
cb = goog.async.nextTick.wrapCallback_(cb);
|
|
if (typeof goog.global.setImmediate === "function" && (opt_useSetImmediate || goog.async.nextTick.useSetImmediate_())) {
|
|
goog.global.setImmediate(cb);
|
|
return;
|
|
}
|
|
if (!goog.async.nextTick.nextTickImpl) {
|
|
goog.async.nextTick.nextTickImpl = goog.async.nextTick.getNextTickImpl_();
|
|
}
|
|
goog.async.nextTick.nextTickImpl(cb);
|
|
};
|
|
goog.async.nextTick.useSetImmediate_ = function() {
|
|
if (!goog.global.Window || !goog.global.Window.prototype) {
|
|
return true;
|
|
}
|
|
if (goog.labs.userAgent.browser.isEdge() || goog.global.Window.prototype.setImmediate != goog.global.setImmediate) {
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
goog.async.nextTick.nextTickImpl;
|
|
goog.async.nextTick.getNextTickImpl_ = function() {
|
|
var Channel = goog.global["MessageChannel"];
|
|
if (typeof Channel === "undefined" && typeof window !== "undefined" && window.postMessage && window.addEventListener && !goog.labs.userAgent.engine.isPresto()) {
|
|
Channel = function() {
|
|
var iframe = goog.dom.createElement(goog.dom.TagName.IFRAME);
|
|
iframe.style.display = "none";
|
|
document.documentElement.appendChild(iframe);
|
|
var win = iframe.contentWindow;
|
|
var doc = win.document;
|
|
doc.open();
|
|
doc.close();
|
|
var message = "callImmediate" + Math.random();
|
|
var origin = win.location.protocol == "file:" ? "*" : win.location.protocol + "//" + win.location.host;
|
|
var onmessage = goog.bind(function(e) {
|
|
if (origin != "*" && e.origin != origin || e.data != message) {
|
|
return;
|
|
}
|
|
this["port1"].onmessage();
|
|
}, this);
|
|
win.addEventListener("message", onmessage, false);
|
|
this["port1"] = {};
|
|
this["port2"] = {postMessage:function() {
|
|
win.postMessage(message, origin);
|
|
}};
|
|
};
|
|
}
|
|
if (typeof Channel !== "undefined" && !goog.labs.userAgent.browser.isIE()) {
|
|
var channel = new Channel();
|
|
var head = {};
|
|
var tail = head;
|
|
channel["port1"].onmessage = function() {
|
|
if (head.next !== undefined) {
|
|
head = head.next;
|
|
var cb = head.cb;
|
|
head.cb = null;
|
|
cb();
|
|
}
|
|
};
|
|
return function(cb) {
|
|
tail.next = {cb:cb};
|
|
tail = tail.next;
|
|
channel["port2"].postMessage(0);
|
|
};
|
|
}
|
|
return function(cb) {
|
|
goog.global.setTimeout(cb, 0);
|
|
};
|
|
};
|
|
goog.async.nextTick.wrapCallback_ = goog.functions.identity;
|
|
goog.debug.entryPointRegistry.register(function(transformer) {
|
|
goog.async.nextTick.wrapCallback_ = transformer;
|
|
});
|
|
|
|
//# sourceMappingURL=goog.async.nexttick.js.map
|