function computeStackTraceFromStackProp(ex) {
	        if (typeof ex.stack === 'undefined' || !ex.stack) return;

	        var chrome = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|<anonymous>).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,
	            gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|\[native).*?)(?::(\d+))?(?::(\d+))?\s*$/i,
	            winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i,
	            lines = ex.stack.split('\n'),
	            stack = [],
	            parts,
	            element,
	            reference = /^(.*) is undefined$/.exec(ex.message);

	        for (var i = 0, j = lines.length; i < j; ++i) {
	            if ((parts = chrome.exec(lines[i]))) {
	                var isNative = parts[2] && parts[2].indexOf('native') !== -1;
	                element = {
	                    'url': !isNative ? parts[2] : null,
	                    'func': parts[1] || UNKNOWN_FUNCTION,
	                    'args': isNative ? [parts[2]] : [],
	                    'line': parts[3] ? +parts[3] : null,
	                    'column': parts[4] ? +parts[4] : null
	                };
	            } else if ( parts = winjs.exec(lines[i]) ) {
	                element = {
	                    'url': parts[2],
	                    'func': parts[1] || UNKNOWN_FUNCTION,
	                    'args': [],
	                    'line': +parts[3],
	                    'column': parts[4] ? +parts[4] : null
	                };
	            } else if ((parts = gecko.exec(lines[i]))) {
	                element = {
	                    'url': parts[3],
	                    'func': parts[1] || UNKNOWN_FUNCTION,
	                    'args': parts[2] ? parts[2].split(',') : [],
	                    'line': parts[4] ? +parts[4] : null,
	                    'column': parts[5] ? +parts[5] : null
	                };
	            } else {
	                continue;
	            }

	            if (!element.func && element.line) {
	                element.func = UNKNOWN_FUNCTION;
	            }

	            stack.push(element);
	        }

	        if (!stack.length) {
	            return null;
	        }

	        if (!stack[0].column && typeof ex.columnNumber !== 'undefined') {
	            // FireFox uses this awesome columnNumber property for its top frame
	            // Also note, Firefox's column number is 0-based and everything else expects 1-based,
	            // so adding 1
	            stack[0].column = ex.columnNumber + 1;
	        }

	        return {
	            'name': ex.name,
	            'message': ex.message,
	            'url': getLocationHref(),
	            'stack': stack
	        };
	    }
Computes stack trace information from the stack property.
Chrome and Gecko use this property.
@param {Error} ex
@return {?Object.<string, *>} Stack trace information.