devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
177 lines (174 loc) • 6.24 kB
JavaScript
/**
* DevExtreme (cjs/__internal/core/utils/m_ajax_utils.js)
* Version: 24.2.6
* Build date: Mon Mar 17 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getJsonpCallbackName = exports.getAcceptHeader = exports.evalScript = exports.evalCrossDomainScript = void 0;
exports.getMethod = getMethod;
exports.isCrossDomain = exports.getRequestOptions = exports.getRequestHeaders = void 0;
var _dom_adapter = _interopRequireDefault(require("../../../core/dom_adapter"));
var _extend = require("../../../core/utils/extend");
var _window = require("../../../core/utils/window");
function _interopRequireDefault(e) {
return e && e.__esModule ? e : {
default: e
}
}
const window = (0, _window.getWindow)();
const createScript = function(options) {
const script = _dom_adapter.default.createElement("script");
for (const name in options) {
script[name] = options[name]
}
return script
};
const appendToHead = function(element) {
return _dom_adapter.default.getHead().appendChild(element)
};
const removeScript = function(scriptNode) {
scriptNode.parentNode.removeChild(scriptNode)
};
const evalScript = function(code) {
const script = createScript({
text: code
});
appendToHead(script);
removeScript(script)
};
exports.evalScript = evalScript;
const evalCrossDomainScript = function(url) {
const script = createScript({
src: url
});
return new Promise(((resolve, reject) => {
const events = {
load: resolve,
error: reject
};
const loadHandler = function(e) {
events[e.type]();
removeScript(script)
};
for (const event in events) {
_dom_adapter.default.listen(script, event, loadHandler)
}
appendToHead(script)
}))
};
exports.evalCrossDomainScript = evalCrossDomainScript;
function getMethod(options) {
return (options.method || "GET").toUpperCase()
}
const paramsConvert = function(params) {
const result = [];
for (const name in params) {
let value = params[name];
if (void 0 === value) {
continue
}
if (null === value) {
value = ""
}
if ("function" === typeof value) {
value = value()
}
result.push(`${encodeURIComponent(name)}=${encodeURIComponent(value)}`)
}
return result.join("&")
};
const getContentTypeHeader = function(options) {
let defaultContentType;
if (options.data && !options.upload && "GET" !== getMethod(options)) {
defaultContentType = "application/x-www-form-urlencoded;charset=utf-8"
}
return options.contentType || defaultContentType
};
const getAcceptHeader = function(options) {
const dataType = options.dataType || "*";
const scriptAccept = "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript";
const accepts = {
"*": "*/*",
text: "text/plain",
html: "text/html",
xml: "application/xml, text/xml",
json: "application/json, text/javascript",
jsonp: scriptAccept,
script: scriptAccept
};
(0, _extend.extendFromObject)(accepts, options.accepts, true);
return accepts[dataType] ? accepts[dataType] + ("*" !== dataType ? ", */*; q=0.01" : "") : accepts["*"]
};
exports.getAcceptHeader = getAcceptHeader;
const getRequestHeaders = function(options) {
const headers = options.headers || {};
headers["Content-Type"] = headers["Content-Type"] || getContentTypeHeader(options);
headers.Accept = headers.Accept || getAcceptHeader(options);
if (!options.crossDomain && !headers["X-Requested-With"]) {
headers["X-Requested-With"] = "XMLHttpRequest"
}
return headers
};
exports.getRequestHeaders = getRequestHeaders;
const getJsonpOptions = function(options) {
if ("jsonp" === options.dataType) {
const random = Math.random().toString().replace(/\D/g, "");
const callbackName = options.jsonpCallback || `dxCallback${Date.now()}_${random}`;
const callbackParameter = options.jsonp || "callback";
options.data = options.data || {};
options.data[callbackParameter] = callbackName;
return callbackName
}
};
exports.getJsonpCallbackName = getJsonpOptions;
const getRequestOptions = function(options, headers) {
let params = options.data;
const paramsAlreadyString = "string" === typeof params;
let url = options.url || window.location.href;
if (!paramsAlreadyString && !options.cache) {
params = params || {};
params._ = Date.now()
}
if (params && !options.upload) {
if (!paramsAlreadyString) {
params = paramsConvert(params)
}
if ("GET" === getMethod(options)) {
if ("" !== params) {
url += (url.indexOf("?") > -1 ? "&" : "?") + params
}
params = null
} else if (headers["Content-Type"] && headers["Content-Type"].indexOf("application/x-www-form-urlencoded") > -1) {
params = params.replace(/%20/g, "+")
}
}
return {
url: url,
parameters: params
}
};
exports.getRequestOptions = getRequestOptions;
const isCrossDomain = function(url) {
if (!(0, _window.hasWindow)()) {
return true
}
let crossDomain = false;
const originAnchor = _dom_adapter.default.createElement("a");
const urlAnchor = _dom_adapter.default.createElement("a");
originAnchor.href = window.location.href;
try {
urlAnchor.href = url;
urlAnchor.href = urlAnchor.href;
crossDomain = `${originAnchor.protocol}//${originAnchor.host}` !== `${urlAnchor.protocol}//${urlAnchor.host}`
} catch (e) {
crossDomain = true
}
return crossDomain
};
exports.isCrossDomain = isCrossDomain;