caffeinated.blog/themes/anatole/assets/js/jquery-migrate.js

837 lines
29 KiB
JavaScript
Raw Permalink Normal View History

/*!
* jQuery Migrate - v3.3.0 - 2020-05-05T01:57Z
* Copyright OpenJS Foundation and other contributors
*/
(function (factory) {
"use strict";
if (typeof define === "function" && define.amd) {
// AMD. Register as an anonymous module.
define(["jquery"], function (jQuery) {
return factory(jQuery, window);
});
} else if (typeof module === "object" && module.exports) {
// Node/CommonJS
// eslint-disable-next-line no-undef
module.exports = factory(require("jquery"), window);
} else {
// Browser globals
factory(jQuery, window);
}
})(function (jQuery, window) {
"use strict";
jQuery.migrateVersion = "3.3.0";
// Returns 0 if v1 == v2, -1 if v1 < v2, 1 if v1 > v2
function compareVersions(v1, v2) {
var i,
rVersionParts = /^(\d+)\.(\d+)\.(\d+)/,
v1p = rVersionParts.exec(v1) || [],
v2p = rVersionParts.exec(v2) || [];
for (i = 1; i <= 3; i++) {
if (+v1p[i] > +v2p[i]) {
return 1;
}
if (+v1p[i] < +v2p[i]) {
return -1;
}
}
return 0;
}
function jQueryVersionSince(version) {
return compareVersions(jQuery.fn.jquery, version) >= 0;
}
(function () {
// Support: IE9 only
// IE9 only creates console object when dev tools are first opened
// IE9 console is a host object, callable but doesn't have .apply()
if (!window.console || !window.console.log) {
return;
}
// Need jQuery 3.0.0+ and no older Migrate loaded
if (!jQuery || !jQueryVersionSince("3.0.0")) {
window.console.log("JQMIGRATE: jQuery 3.0.0+ REQUIRED");
}
if (jQuery.migrateWarnings) {
window.console.log("JQMIGRATE: Migrate plugin loaded multiple times");
}
// Show a message on the console so devs know we're active
window.console.log("JQMIGRATE: Migrate is installed" +
(jQuery.migrateMute ? "" : " with logging active") +
", version " + jQuery.migrateVersion);
})();
var warnedAbout = {};
// By default each warning is only reported once.
jQuery.migrateDeduplicateWarnings = true;
// List of warnings already given; public read only
jQuery.migrateWarnings = [];
// Set to false to disable traces that appear with warnings
if (jQuery.migrateTrace === undefined) {
jQuery.migrateTrace = true;
}
// Forget any warnings we've already given; public
jQuery.migrateReset = function () {
warnedAbout = {};
jQuery.migrateWarnings.length = 0;
};
function migrateWarn(msg) {
var console = window.console;
if (!jQuery.migrateDeduplicateWarnings || !warnedAbout[msg]) {
warnedAbout[msg] = true;
jQuery.migrateWarnings.push(msg);
if (console && console.warn && !jQuery.migrateMute) {
console.warn("JQMIGRATE: " + msg);
if (jQuery.migrateTrace && console.trace) {
console.trace();
}
}
}
}
function migrateWarnProp(obj, prop, value, msg) {
Object.defineProperty(obj, prop, {
configurable: true,
enumerable: true,
get: function () {
migrateWarn(msg);
return value;
},
set: function (newValue) {
migrateWarn(msg);
value = newValue;
}
});
}
function migrateWarnFunc(obj, prop, newFunc, msg) {
obj[prop] = function () {
migrateWarn(msg);
return newFunc.apply(this, arguments);
};
}
if (window.document.compatMode === "BackCompat") {
// JQuery has never supported or tested Quirks Mode
migrateWarn("jQuery is not compatible with Quirks Mode");
}
var findProp,
class2type = {},
oldInit = jQuery.fn.init,
oldFind = jQuery.find,
rattrHashTest = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,
rattrHashGlob = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g,
// Support: Android <=4.0 only
// Make sure we trim BOM and NBSP
rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
jQuery.fn.init = function (arg1) {
var args = Array.prototype.slice.call(arguments);
if (typeof arg1 === "string" && arg1 === "#") {
// JQuery( "#" ) is a bogus ID selector, but it returned an empty set before jQuery 3.0
migrateWarn("jQuery( '#' ) is not a valid selector");
args[0] = [];
}
return oldInit.apply(this, args);
};
jQuery.fn.init.prototype = jQuery.fn;
jQuery.find = function (selector) {
var args = Array.prototype.slice.call(arguments);
// Support: PhantomJS 1.x
// String#match fails to match when used with a //g RegExp, only on some strings
if (typeof selector === "string" && rattrHashTest.test(selector)) {
// The nonstandard and undocumented unquoted-hash was removed in jQuery 1.12.0
// First see if qS thinks it's a valid selector, if so avoid a false positive
try {
window.document.querySelector(selector);
} catch (err1) {
// Didn't *look* valid to qSA, warn and try quoting what we think is the value
selector = selector.replace(rattrHashGlob, function (_, attr, op, value) {
return "[" + attr + op + "\"" + value + "\"]";
});
// If the regexp *may* have created an invalid selector, don't update it
// Note that there may be false alarms if selector uses jQuery extensions
try {
window.document.querySelector(selector);
migrateWarn("Attribute selector with '#' must be quoted: " + args[0]);
args[0] = selector;
} catch (err2) {
migrateWarn("Attribute selector with '#' was not fixed: " + args[0]);
}
}
}
return oldFind.apply(this, args);
};
// Copy properties attached to original jQuery.find method (e.g. .attr, .isXML)
for (findProp in oldFind) {
if (Object.prototype.hasOwnProperty.call(oldFind, findProp)) {
jQuery.find[findProp] = oldFind[findProp];
}
}
// The number of elements contained in the matched element set
migrateWarnFunc(jQuery.fn, "size", function () {
return this.length;
},
"jQuery.fn.size() is deprecated and removed; use the .length property");
migrateWarnFunc(jQuery, "parseJSON", function () {
return JSON.parse.apply(null, arguments);
},
"jQuery.parseJSON is deprecated; use JSON.parse");
migrateWarnFunc(jQuery, "holdReady", jQuery.holdReady,
"jQuery.holdReady is deprecated");
migrateWarnFunc(jQuery, "unique", jQuery.uniqueSort,
"jQuery.unique is deprecated; use jQuery.uniqueSort");
// Now jQuery.expr.pseudos is the standard incantation
migrateWarnProp(jQuery.expr, "filters", jQuery.expr.pseudos,
"jQuery.expr.filters is deprecated; use jQuery.expr.pseudos");
migrateWarnProp(jQuery.expr, ":", jQuery.expr.pseudos,
"jQuery.expr[':'] is deprecated; use jQuery.expr.pseudos");
// Prior to jQuery 3.1.1 there were internal refs so we don't warn there
if (jQueryVersionSince("3.1.1")) {
migrateWarnFunc(jQuery, "trim", function (text) {
return text == null ?
"" :
(text + "").replace(rtrim, "");
},
"jQuery.trim is deprecated; use String.prototype.trim");
}
// Prior to jQuery 3.2 there were internal refs so we don't warn there
if (jQueryVersionSince("3.2.0")) {
migrateWarnFunc(jQuery, "nodeName", function (elem, name) {
return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
},
"jQuery.nodeName is deprecated");
}
if (jQueryVersionSince("3.3.0")) {
migrateWarnFunc(jQuery, "isNumeric", function (obj) {
// As of jQuery 3.0, isNumeric is limited to
// strings and numbers (primitives or objects)
// that can be coerced to finite numbers (gh-2662)
var type = typeof obj;
return (type === "number" || type === "string") &&
// parseFloat NaNs numeric-cast false positives ("")
// ...but misinterprets leading-number strings, e.g. hex literals ("0x...")
// subtraction forces infinities to NaN
!isNaN(obj - parseFloat(obj));
},
"jQuery.isNumeric() is deprecated"
);
// Populate the class2type map
jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),
function (_, name) {
class2type["[object " + name + "]"] = name.toLowerCase();
});
migrateWarnFunc(jQuery, "type", function (obj) {
if (obj == null) {
return obj + "";
}
// Support: Android <=2.3 only (functionish RegExp)
return typeof obj === "object" || typeof obj === "function" ?
class2type[Object.prototype.toString.call(obj)] || "object" :
typeof obj;
},
"jQuery.type is deprecated");
migrateWarnFunc(jQuery, "isFunction",
function (obj) {
return typeof obj === "function";
},
"jQuery.isFunction() is deprecated");
migrateWarnFunc(jQuery, "isWindow",
function (obj) {
return obj != null && obj === obj.window;
},
"jQuery.isWindow() is deprecated"
);
migrateWarnFunc(jQuery, "isArray", Array.isArray,
"jQuery.isArray is deprecated; use Array.isArray"
);
}
// Support jQuery slim which excludes the ajax module
if (jQuery.ajax) {
var oldAjax = jQuery.ajax;
jQuery.ajax = function () {
var jQXHR = oldAjax.apply(this, arguments);
// Be sure we got a jQXHR (e.g., not sync)
if (jQXHR.promise) {
migrateWarnFunc(jQXHR, "success", jQXHR.done,
"jQXHR.success is deprecated and removed");
migrateWarnFunc(jQXHR, "error", jQXHR.fail,
"jQXHR.error is deprecated and removed");
migrateWarnFunc(jQXHR, "complete", jQXHR.always,
"jQXHR.complete is deprecated and removed");
}
return jQXHR;
};
}
var oldRemoveAttr = jQuery.fn.removeAttr,
oldToggleClass = jQuery.fn.toggleClass,
rmatchNonSpace = /\S+/g;
jQuery.fn.removeAttr = function (name) {
var self = this;
jQuery.each(name.match(rmatchNonSpace), function (_i, attr) {
if (jQuery.expr.match.bool.test(attr)) {
migrateWarn("jQuery.fn.removeAttr no longer sets boolean properties: " + attr);
self.prop(attr, false);
}
});
return oldRemoveAttr.apply(this, arguments);
};
jQuery.fn.toggleClass = function (state) {
// Only deprecating no-args or single boolean arg
if (state !== undefined && typeof state !== "boolean") {
return oldToggleClass.apply(this, arguments);
}
migrateWarn("jQuery.fn.toggleClass( boolean ) is deprecated");
// Toggle entire class name of each element
return this.each(function () {
var className = this.getAttribute && this.getAttribute("class") || "";
if (className) {
jQuery.data(this, "__className__", className);
}
// If the element has a class name or if we're passed `false`,
// then remove the whole classname (if there was one, the above saved it).
// Otherwise bring back whatever was previously saved (if anything),
// falling back to the empty string if nothing was stored.
if (this.setAttribute) {
this.setAttribute("class",
className || state === false ?
"" :
jQuery.data(this, "__className__") || ""
);
}
});
};
function camelCase(string) {
return string.replace(/-([a-z])/g, function (_, letter) {
return letter.toUpperCase();
});
}
var oldFnCss,
internalSwapCall = false,
ralphaStart = /^[a-z]/,
// The regex visualized:
//
// /----------\
// | | /-------\
// | / Top \ | | |
// /--- Border ---+-| Right |-+---+- Width -+---\
// | | Bottom | |
// | \ Left / |
// | |
// | /----------\ |
// | /-------------\ | | |- END
// | | | | / Top \ | |
// | | / Margin \ | | | Right | | |
// |---------+-| |-+---+-| Bottom |-+----|
// | \ Padding / \ Left / |
// BEGIN -| |
// | /---------\ |
// | | | |
// | | / Min \ | / Width \ |
// \--------------+-| |-+---| |---/
// \ Max / \ Height /
rautoPx = /^(?:Border(?:Top|Right|Bottom|Left)?(?:Width|)|(?:Margin|Padding)?(?:Top|Right|Bottom|Left)?|(?:Min|Max)?(?:Width|Height))$/;
// If this version of jQuery has .swap(), don't false-alarm on internal uses
if (jQuery.swap) {
jQuery.each(["height", "width", "reliableMarginRight"], function (_, name) {
var oldHook = jQuery.cssHooks[name] && jQuery.cssHooks[name].get;
if (oldHook) {
jQuery.cssHooks[name].get = function () {
var ret;
internalSwapCall = true;
ret = oldHook.apply(this, arguments);
internalSwapCall = false;
return ret;
};
}
});
}
jQuery.swap = function (elem, options, callback, args) {
var ret, name,
old = {};
if (!internalSwapCall) {
migrateWarn("jQuery.swap() is undocumented and deprecated");
}
// Remember the old values, and insert the new ones
for (name in options) {
old[name] = elem.style[name];
elem.style[name] = options[name];
}
ret = callback.apply(elem, args || []);
// Revert the old values
for (name in options) {
elem.style[name] = old[name];
}
return ret;
};
if (jQueryVersionSince("3.4.0") && typeof Proxy !== "undefined") {
jQuery.cssProps = new Proxy(jQuery.cssProps || {}, {
set: function () {
migrateWarn("JQMIGRATE: jQuery.cssProps is deprecated");
return Reflect.set.apply(this, arguments);
}
});
}
// Create a dummy jQuery.cssNumber if missing. It won't be used by jQuery but
// it will prevent code adding new keys to it unconditionally from crashing.
if (!jQuery.cssNumber) {
jQuery.cssNumber = {};
}
function isAutoPx(prop) {
// The first test is used to ensure that:
// 1. The prop starts with a lowercase letter (as we uppercase it for the second regex).
// 2. The prop is not empty.
return ralphaStart.test(prop) &&
rautoPx.test(prop[0].toUpperCase() + prop.slice(1));
}
oldFnCss = jQuery.fn.css;
jQuery.fn.css = function (name, value) {
var origThis = this;
if (typeof name !== "string") {
jQuery.each(name, function (n, v) {
jQuery.fn.css.call(origThis, n, v);
});
}
if (typeof value === "number" && !isAutoPx(camelCase(name))) {
migrateWarn("Use of number-typed values is deprecated in jQuery.fn.css");
}
return oldFnCss.apply(this, arguments);
};
var oldData = jQuery.data;
jQuery.data = function (elem, name, value) {
var curData, sameKeys, key;
// Name can be an object, and each entry in the object is meant to be set as data
if (name && typeof name === "object" && arguments.length === 2) {
curData = jQuery.hasData(elem) && oldData.call(this, elem);
sameKeys = {};
for (key in name) {
if (key !== camelCase(key)) {
migrateWarn("jQuery.data() always sets/gets camelCased names: " + key);
curData[key] = name[key];
} else {
sameKeys[key] = name[key];
}
}
oldData.call(this, elem, sameKeys);
return name;
}
// If the name is transformed, look for the un-transformed name in the data object
if (name && typeof name === "string" && name !== camelCase(name)) {
curData = jQuery.hasData(elem) && oldData.call(this, elem);
if (curData && name in curData) {
migrateWarn("jQuery.data() always sets/gets camelCased names: " + name);
if (arguments.length > 2) {
curData[name] = value;
}
return curData[name];
}
}
return oldData.apply(this, arguments);
};
// Support jQuery slim which excludes the effects module
if (jQuery.fx) {
var intervalValue, intervalMsg,
oldTweenRun = jQuery.Tween.prototype.run,
linearEasing = function (pct) {
return pct;
};
jQuery.Tween.prototype.run = function () {
if (jQuery.easing[this.easing].length > 1) {
migrateWarn(
"'jQuery.easing." + this.easing.toString() + "' should use only one argument"
);
jQuery.easing[this.easing] = linearEasing;
}
oldTweenRun.apply(this, arguments);
};
intervalValue = jQuery.fx.interval || 13;
intervalMsg = "jQuery.fx.interval is deprecated";
// Support: IE9, Android <=4.4
// Avoid false positives on browsers that lack rAF
// Don't warn if document is hidden, jQuery uses setTimeout (#292)
if (window.requestAnimationFrame) {
Object.defineProperty(jQuery.fx, "interval", {
configurable: true,
enumerable: true,
get: function () {
if (!window.document.hidden) {
migrateWarn(intervalMsg);
}
return intervalValue;
},
set: function (newValue) {
migrateWarn(intervalMsg);
intervalValue = newValue;
}
});
}
}
var oldLoad = jQuery.fn.load,
oldEventAdd = jQuery.event.add,
originalFix = jQuery.event.fix;
jQuery.event.props = [];
jQuery.event.fixHooks = {};
migrateWarnProp(jQuery.event.props, "concat", jQuery.event.props.concat,
"jQuery.event.props.concat() is deprecated and removed");
jQuery.event.fix = function (originalEvent) {
var event,
type = originalEvent.type,
fixHook = this.fixHooks[type],
props = jQuery.event.props;
if (props.length) {
migrateWarn("jQuery.event.props are deprecated and removed: " + props.join());
while (props.length) {
jQuery.event.addProp(props.pop());
}
}
if (fixHook && !fixHook._migrated_) {
fixHook._migrated_ = true;
migrateWarn("jQuery.event.fixHooks are deprecated and removed: " + type);
if ((props = fixHook.props) && props.length) {
while (props.length) {
jQuery.event.addProp(props.pop());
}
}
}
event = originalFix.call(this, originalEvent);
return fixHook && fixHook.filter ? fixHook.filter(event, originalEvent) : event;
};
jQuery.event.add = function (elem, types) {
// This misses the multiple-types case but that seems awfully rare
if (elem === window && types === "load" && window.document.readyState === "complete") {
migrateWarn("jQuery(window).on('load'...) called after load event occurred");
}
return oldEventAdd.apply(this, arguments);
};
jQuery.each(["load", "unload", "error"], function (_, name) {
jQuery.fn[name] = function () {
var args = Array.prototype.slice.call(arguments, 0);
// If this is an ajax load() the first arg should be the string URL;
// technically this could also be the "Anything" arg of the event .load()
// which just goes to show why this dumb signature has been deprecated!
// jQuery custom builds that exclude the Ajax module justifiably die here.
if (name === "load" && typeof args[0] === "string") {
return oldLoad.apply(this, args);
}
migrateWarn("jQuery.fn." + name + "() is deprecated");
args.splice(0, 0, name);
if (arguments.length) {
return this.on.apply(this, args);
}
// Use .triggerHandler here because:
// - load and unload events don't need to bubble, only applied to window or image
// - error event should not bubble to window, although it does pre-1.7
// See http://bugs.jquery.com/ticket/11820
this.triggerHandler.apply(this, args);
return this;
};
});
jQuery.each(("blur focus focusin focusout resize scroll click dblclick " +
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
"change select submit keydown keypress keyup contextmenu").split(" "),
function (_i, name) {
// Handle event binding
jQuery.fn[name] = function (data, fn) {
migrateWarn("jQuery.fn." + name + "() event shorthand is deprecated");
return arguments.length > 0 ?
this.on(name, null, data, fn) :
this.trigger(name);
};
});
// Trigger "ready" event only once, on document ready
jQuery(function () {
jQuery(window.document).triggerHandler("ready");
});
jQuery.event.special.ready = {
setup: function () {
if (this === window.document) {
migrateWarn("'ready' event is deprecated");
}
}
};
jQuery.fn.extend({
bind: function (types, data, fn) {
migrateWarn("jQuery.fn.bind() is deprecated");
return this.on(types, null, data, fn);
},
unbind: function (types, fn) {
migrateWarn("jQuery.fn.unbind() is deprecated");
return this.off(types, null, fn);
},
delegate: function (selector, types, data, fn) {
migrateWarn("jQuery.fn.delegate() is deprecated");
return this.on(types, selector, data, fn);
},
undelegate: function (selector, types, fn) {
migrateWarn("jQuery.fn.undelegate() is deprecated");
return arguments.length === 1 ?
this.off(selector, "**") :
this.off(types, selector || "**", fn);
},
hover: function (fnOver, fnOut) {
migrateWarn("jQuery.fn.hover() is deprecated");
return this.on("mouseenter", fnOver).on("mouseleave", fnOut || fnOver);
}
});
var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
origHtmlPrefilter = jQuery.htmlPrefilter,
makeMarkup = function (html) {
var doc = window.document.implementation.createHTMLDocument("");
doc.body.innerHTML = html;
return doc.body && doc.body.innerHTML;
},
warnIfChanged = function (html) {
var changed = html.replace(rxhtmlTag, "<$1></$2>");
if (changed !== html && makeMarkup(html) !== makeMarkup(changed)) {
migrateWarn("HTML tags must be properly nested and closed: " + html);
}
};
jQuery.UNSAFE_restoreLegacyHtmlPrefilter = function () {
jQuery.htmlPrefilter = function (html) {
warnIfChanged(html);
return html.replace(rxhtmlTag, "<$1></$2>");
};
};
jQuery.htmlPrefilter = function (html) {
warnIfChanged(html);
return origHtmlPrefilter(html);
};
var oldOffset = jQuery.fn.offset;
jQuery.fn.offset = function () {
var docElem,
elem = this[0],
bogus = {top: 0, left: 0};
if (!elem || !elem.nodeType) {
migrateWarn("jQuery.fn.offset() requires a valid DOM element");
return undefined;
}
docElem = (elem.ownerDocument || window.document).documentElement;
if (!jQuery.contains(docElem, elem)) {
migrateWarn("jQuery.fn.offset() requires an element connected to a document");
return bogus;
}
return oldOffset.apply(this, arguments);
};
// Support jQuery slim which excludes the ajax module
// The jQuery.param patch is about respecting `jQuery.ajaxSettings.traditional`
// so it doesn't make sense for the slim build.
if (jQuery.ajax) {
var oldParam = jQuery.param;
jQuery.param = function (data, traditional) {
var ajaxTraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
if (traditional === undefined && ajaxTraditional) {
migrateWarn("jQuery.param() no longer uses jQuery.ajaxSettings.traditional");
traditional = ajaxTraditional;
}
return oldParam.call(this, data, traditional);
};
}
var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
jQuery.fn.andSelf = function () {
migrateWarn("jQuery.fn.andSelf() is deprecated and removed, use jQuery.fn.addBack()");
return oldSelf.apply(this, arguments);
};
// Support jQuery slim which excludes the deferred module in jQuery 4.0+
if (jQuery.Deferred) {
var oldDeferred = jQuery.Deferred,
tuples = [
// Action, add listener, callbacks, .then handlers, final state
["resolve", "done", jQuery.Callbacks("once memory"),
jQuery.Callbacks("once memory"), "resolved"],
["reject", "fail", jQuery.Callbacks("once memory"),
jQuery.Callbacks("once memory"), "rejected"],
["notify", "progress", jQuery.Callbacks("memory"),
jQuery.Callbacks("memory")]
];
jQuery.Deferred = function (func) {
var deferred = oldDeferred(),
promise = deferred.promise();
deferred.pipe = promise.pipe = function ( /* fnDone, fnFail, fnProgress */) {
var fns = arguments;
migrateWarn("deferred.pipe() is deprecated");
return jQuery.Deferred(function (newDefer) {
jQuery.each(tuples, function (i, tuple) {
var fn = typeof fns[i] === "function" && fns[i];
// Deferred.done(function() { bind to newDefer or newDefer.resolve })
// deferred.fail(function() { bind to newDefer or newDefer.reject })
// deferred.progress(function() { bind to newDefer or newDefer.notify })
deferred[tuple[1]](function () {
var returned = fn && fn.apply(this, arguments);
if (returned && typeof returned.promise === "function") {
returned.promise()
.done(newDefer.resolve)
.fail(newDefer.reject)
.progress(newDefer.notify);
} else {
newDefer[tuple[0] + "With"](
this === promise ? newDefer.promise() : this,
fn ? [returned] : arguments
);
}
});
});
fns = null;
}).promise();
};
if (func) {
func.call(deferred, deferred);
}
return deferred;
};
// Preserve handler of uncaught exceptions in promise chains
jQuery.Deferred.exceptionHook = oldDeferred.exceptionHook;
}
return jQuery;
});