164 lines
4.4 KiB
JavaScript
Executable File
164 lines
4.4 KiB
JavaScript
Executable File
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
/* inspired by http://github.com/requirejs/text */
|
|
/*global XDomainRequest */
|
|
|
|
define(['module'], function (module) {
|
|
'use strict';
|
|
|
|
var xmlRegExp = /^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,
|
|
bodyRegExp = /<body[^>]*>\s*([\s\S]+)\s*<\/body>/im,
|
|
stripReg = /!strip$/i,
|
|
defaultConfig = module.config && module.config() || {};
|
|
|
|
/**
|
|
* Strips <?xml ...?> declarations so that external SVG and XML documents can be
|
|
* added to a document without worry.
|
|
* Also, if the string is an HTML document, only the part inside the body tag is returned.
|
|
*
|
|
* @param {String} external
|
|
* @returns {String}
|
|
*/
|
|
function stripContent(external) {
|
|
var matches;
|
|
|
|
if (!external) {
|
|
return '';
|
|
}
|
|
|
|
matches = external.match(bodyRegExp);
|
|
external = matches ?
|
|
matches[1] :
|
|
external.replace(xmlRegExp, '');
|
|
|
|
return external;
|
|
}
|
|
|
|
/**
|
|
* Checks that url match current location
|
|
*
|
|
* @param {String} url
|
|
* @returns {Boolean}
|
|
*/
|
|
function sameDomain(url) {
|
|
var uProtocol, uHostName, uPort,
|
|
xdRegExp = /^([\w:]+)?\/\/([^\/\\]+)/i,
|
|
location = window.location,
|
|
match = xdRegExp.exec(url);
|
|
|
|
if (!match) {
|
|
return true;
|
|
}
|
|
uProtocol = match[1];
|
|
uHostName = match[2];
|
|
|
|
uHostName = uHostName.split(':');
|
|
uPort = uHostName[1] || '';
|
|
uHostName = uHostName[0];
|
|
|
|
return (!uProtocol || uProtocol === location.protocol) &&
|
|
(!uHostName || uHostName.toLowerCase() === location.hostname.toLowerCase()) &&
|
|
(!uPort && !uHostName || uPort === location.port);
|
|
}
|
|
|
|
/**
|
|
* @returns {XMLHttpRequest|XDomainRequest|null}
|
|
*/
|
|
function createRequest(url) {
|
|
var xhr = new XMLHttpRequest();
|
|
|
|
if (!sameDomain(url) && typeof XDomainRequest !== 'undefined') {
|
|
xhr = new XDomainRequest();
|
|
}
|
|
|
|
return xhr;
|
|
}
|
|
|
|
/**
|
|
* XHR requester. Returns value to callback.
|
|
*
|
|
* @param {String} url
|
|
* @param {Function} callback
|
|
* @param {Function} fail
|
|
* @param {Object} headers
|
|
*/
|
|
function getContent(url, callback, fail, headers) {
|
|
var xhr = createRequest(url),
|
|
header;
|
|
|
|
xhr.open('GET', url);
|
|
|
|
/*eslint-disable max-depth */
|
|
if ('setRequestHeader' in xhr && headers) {
|
|
for (header in headers) {
|
|
if (headers.hasOwnProperty(header)) {
|
|
xhr.setRequestHeader(header.toLowerCase(), headers[header]);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
xhr.onreadystatechange = function () {
|
|
var status, err;
|
|
|
|
//Do not explicitly handle errors, those should be
|
|
//visible via console output in the browser.
|
|
if (xhr.readyState === 4) {
|
|
status = xhr.status || 0;
|
|
|
|
if (status > 399 && status < 600) {
|
|
//An http 4xx or 5xx error. Signal an error.
|
|
err = new Error(url + ' HTTP status: ' + status);
|
|
err.xhr = xhr;
|
|
|
|
if (fail) {
|
|
fail(err);
|
|
}
|
|
} else {
|
|
callback(xhr.responseText);
|
|
|
|
if (defaultConfig.onXhrComplete) {
|
|
defaultConfig.onXhrComplete(xhr, url);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
/*eslint-enable max-depth */
|
|
|
|
if (defaultConfig.onXhr) {
|
|
defaultConfig.onXhr(xhr, url);
|
|
}
|
|
|
|
xhr.send();
|
|
}
|
|
|
|
/**
|
|
* Main method used by RequireJs.
|
|
*
|
|
* @param {String} name - has format: some.module.filext!strip
|
|
* @param {Function} req
|
|
* @param {Function|undefined} onLoad
|
|
*/
|
|
function loadContent(name, req, onLoad) {
|
|
|
|
var toStrip = stripReg.test(name),
|
|
url = req.toUrl(name.replace(stripReg, '')),
|
|
headers = defaultConfig.headers;
|
|
|
|
getContent(url, function (content) {
|
|
content = toStrip ? stripContent(content) : content;
|
|
onLoad(content);
|
|
}, onLoad.error, headers);
|
|
}
|
|
|
|
return {
|
|
load: loadContent,
|
|
get: getContent
|
|
};
|
|
});
|