UNPKG

gulp-bird

Version:
137 lines (126 loc) 3.8 kB
/** * vConsole Default Tab * * @author WechatFE */ import $ from '../lib/query.js'; import * as tool from '../lib/tool.js'; import VConsoleLogTab from './log.js'; import tplTabbox from './tabbox_default.html'; import tplItemCode from './item_code.html'; class VConsoleDefaultTab extends VConsoleLogTab { constructor(...args) { super(...args); this.tplTabbox = tplTabbox; this.windowOnError = null; } onReady() { let that = this; super.onReady(); $.bind($.one('.vc-cmd', this.$tabbox), 'submit', function(e) { e.preventDefault(); let $input = $.one('.vc-cmd-input', e.target), cmd = $input.value; $input.value = ''; if (cmd !== '') { that.evalCommand(cmd); } }); // create a global variable to save custom command's result let code = ''; code += 'if (!!window) {'; code += 'window.__vConsole_cmd_result = undefined;'; code += 'window.__vConsole_cmd_error = false;'; code += '}'; let script = document.createElement('SCRIPT'); script.innerHTML = code; document.documentElement.appendChild(script); document.documentElement.removeChild(script); } /** * replace window.console & window.onerror with vConsole method * @private */ mockConsole() { super.mockConsole(); var that = this; if (tool.isFunction(window.onerror)) { this.windowOnError = window.onerror; } window.onerror = function(message, source, lineNo, colNo, error) { let msg = message; if (source) { msg += "\n" + source.replace(location.origin, ''); } if (lineNo || colNo) { msg += ':' + lineNo + ':' + colNo; } that.printLog({logType:'error', logs:[msg], noOrigin:true}); if (tool.isFunction(that.windowOnError)) { that.windowOnError.call(window, message, source, lineNo, colNo, error); } }; } /** * * @private */ evalCommand(cmd) { // print command to console this.printLog({ logType: 'log', content: $.render(tplItemCode, {content: cmd, type: 'input'}), noMeta: true, style: '' }); // do not use `eval` or `new Function` to avoid `unsafe-eval` CSP rule let code = ''; code += 'try {\n'; code += 'window.__vConsole_cmd_result = (function() {\n'; code += 'return ' + cmd + ';\n'; code += '})();\n'; code += 'window.__vConsole_cmd_error = false;\n'; code += '} catch (e) {\n'; code += 'window.__vConsole_cmd_result = e.message;\n'; code += 'window.__vConsole_cmd_error = true;\n'; code += '}'; let script = document.createElement('SCRIPT'); script.innerHTML = code; document.documentElement.appendChild(script); let result = window.__vConsole_cmd_result, error = window.__vConsole_cmd_error; document.documentElement.removeChild(script); // print result to console if (error == false) { let $content; if (tool.isArray(result) || tool.isObject(result)) { $content = this.getFoldedLine(result); } else { if (tool.isNull(result)) { result = 'null'; } else if (tool.isUndefined(result)) { result = 'undefined'; } else if (tool.isFunction(result)) { result = 'function()' } else if (tool.isString(result)) { result = '"' + result + '"'; } $content = $.render(tplItemCode, {content: result, type: 'output'}); } this.printLog({ logType: 'log', content: $content, noMeta: true, style: '' }); } else { this.printLog({ logType: 'error', logs: [result], noMeta: true, style: '' }); } } } // END class export default VConsoleDefaultTab;