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
 | 
						|
    };
 | 
						|
});
 |