123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- /* inspired by http://github.com/requirejs/text */
- /*global XMLHttpRequest, 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
- };
- });
|