Support lazy evaluation

This commit is contained in:
redhoodsu
2018-08-18 12:48:55 +08:00
parent 72ac4134b0
commit 8d244e7a87
5 changed files with 65 additions and 34 deletions

View File

@@ -15,6 +15,7 @@ Display console logs. Implementation detail follows the [console api spec](https
|displayExtraInfo |boolean|Display extra information | |displayExtraInfo |boolean|Display extra information |
|displayUnenumerable|boolean|Display unenumerable properties| |displayUnenumerable|boolean|Display unenumerable properties|
|displayGetterVal |boolean|Access getter value | |displayGetterVal |boolean|Access getter value |
|lazyEvaluation |boolean|Stringify object when clicked |
|viewLogInSources |boolean|View log in sources panel | |viewLogInSources |boolean|View log in sources panel |
|displayIfErr |boolean|Auto display if error occurs | |displayIfErr |boolean|Auto display if error occurs |
|useWorker |boolean|Use web worker | |useWorker |boolean|Use web worker |

View File

@@ -210,6 +210,7 @@ export default class Console extends Tool {
displayExtraInfo: false, displayExtraInfo: false,
displayUnenumerable: true, displayUnenumerable: true,
displayGetterVal: false, displayGetterVal: false,
lazyEvaluation: true,
viewLogInSources: false, viewLogInSources: false,
displayIfErr: false, displayIfErr: false,
useWorker: true, useWorker: true,
@@ -227,6 +228,7 @@ export default class Console extends Tool {
logger.displayHeader(cfg.get('displayExtraInfo')) logger.displayHeader(cfg.get('displayExtraInfo'))
logger.displayUnenumerable(cfg.get('displayUnenumerable')) logger.displayUnenumerable(cfg.get('displayUnenumerable'))
logger.displayGetterVal(cfg.get('displayGetterVal')) logger.displayGetterVal(cfg.get('displayGetterVal'))
logger.lazyEvaluation(cfg.get('lazyEvaluation'))
if (sources) logger.viewLogInSources(cfg.get('viewLogInSources')) if (sources) logger.viewLogInSources(cfg.get('viewLogInSources'))
logger.maxNum(maxLogNum) logger.maxNum(maxLogNum)
@@ -244,6 +246,8 @@ export default class Console extends Tool {
return logger.displayUnenumerable(val) return logger.displayUnenumerable(val)
case 'displayGetterVal': case 'displayGetterVal':
return logger.displayGetterVal(val) return logger.displayGetterVal(val)
case 'lazyEvaluation':
return logger.lazyEvaluation(val)
case 'viewLogInSources': case 'viewLogInSources':
return logger.viewLogInSources(val) return logger.viewLogInSources(val)
case 'useWorker': case 'useWorker':
@@ -262,6 +266,7 @@ export default class Console extends Tool {
.switch(cfg, 'displayExtraInfo', 'Display Extra Information') .switch(cfg, 'displayExtraInfo', 'Display Extra Information')
.switch(cfg, 'displayUnenumerable', 'Display Unenumerable Properties') .switch(cfg, 'displayUnenumerable', 'Display Unenumerable Properties')
.switch(cfg, 'displayGetterVal', 'Access Getter Value') .switch(cfg, 'displayGetterVal', 'Access Getter Value')
.switch(cfg, 'lazyEvaluation', 'Lazy Evaluation')
if (isWorkerSupported) settings.switch(cfg, 'useWorker', 'Use Web Worker') if (isWorkerSupported) settings.switch(cfg, 'useWorker', 'Use Web Worker')
if (sources) if (sources)

View File

@@ -1,4 +1,4 @@
<li> <li class="eruda-log-container">
{{#if displayHeader}} {{#if displayHeader}}
<div class="eruda-header"> <div class="eruda-header">
<span data-mark="time">{{time}}</span> <span>{{from}}</span> <span data-mark="time">{{time}}</span> <span>{{from}}</span>

View File

@@ -23,7 +23,9 @@ import {
isArr, isArr,
unique, unique,
contain, contain,
isEmpty isEmpty,
clone,
noop
} from '../lib/util' } from '../lib/util'
export default class Log { export default class Log {
@@ -82,25 +84,36 @@ export default class Log {
return false return false
} }
extractObj(cb = noop) {
let { args, type } = this
let setSrc = result => {
this.src = result
cb()
}
if (type === 'table') {
extractObj(args[0], {}, setSrc)
} else {
extractObj(
args.length === 1 && isObj(args[0]) ? args[0] : args,
{},
setSrc
)
}
}
_formatMsg() { _formatMsg() {
let { type, id, displayHeader, time, from, args } = this let { type, id, displayHeader, time, from, args } = this
if (this._needSrc()) { // Don't change original args for lazy evaluation.
let setSrc = result => (this.src = result) args = clone(args)
if (type === 'table') {
extractObj(args[0], {}, setSrc) if (this._needSrc() && !Log.lazyEvaluation) {
} else { this.extractObj()
extractObj(
args.length === 1 && isObj(args[0]) ? args[0] : args,
{},
setSrc
)
}
} }
let msg = '', let msg = ''
icon, let icon
err let err
switch (type) { switch (type) {
case 'log': case 'log':
@@ -148,7 +161,9 @@ export default class Log {
this.value = msg this.value = msg
msg = render({ msg, type, icon, id, displayHeader, time, from }) msg = render({ msg, type, icon, id, displayHeader, time, from })
delete this.args if (!this._needSrc() || !Log.lazyEvaluation) {
delete this.args
}
this.formattedMsg = msg this.formattedMsg = msg
} }
static click(type, log, $el) { static click(type, log, $el) {
@@ -172,6 +187,11 @@ export default class Log {
} else { } else {
$json.addClass('eruda-hidden') $json.addClass('eruda-hidden')
} }
} else if (log.args) {
log.extractObj(function() {
Log.click(type, log, $el)
delete log.args
})
} }
break break
case 'error': case 'error':
@@ -187,6 +207,7 @@ export default class Log {
Log.showGetterVal = false Log.showGetterVal = false
Log.showUnenumerable = true Log.showUnenumerable = true
Log.showSrcInSources = false Log.showSrcInSources = false
Log.lazyEvaluation = true
let getAbstract = wrap(origGetAbstract, function(fn, obj) { let getAbstract = wrap(origGetAbstract, function(fn, obj) {
return fn(obj, { return fn(obj, {
@@ -241,12 +262,12 @@ function formatTable(args) {
return ret return ret
} }
let regJsUrl = /https?:\/\/([0-9.\-A-Za-z]+)(?::(\d+))?\/[A-Z.a-z0-9/]*\.js/g, let regJsUrl = /https?:\/\/([0-9.\-A-Za-z]+)(?::(\d+))?\/[A-Z.a-z0-9/]*\.js/g
regErudaJs = /eruda(\.min)?\.js/ let regErudaJs = /eruda(\.min)?\.js/
function formatErr(err) { function formatErr(err) {
let lines = err.stack ? err.stack.split('\n') : [], let lines = err.stack ? err.stack.split('\n') : []
msg = `${err.message || lines[0]}<br/>` let msg = `${err.message || lines[0]}<br/>`
lines = lines.filter(val => !regErudaJs.test(val)).map(val => escape(val)) lines = lines.filter(val => !regErudaJs.test(val)).map(val => escape(val))

View File

@@ -52,6 +52,9 @@ export default class Logger extends Emitter {
displayGetterVal(flag) { displayGetterVal(flag) {
Log.showGetterVal = flag Log.showGetterVal = flag
} }
lazyEvaluation(flag) {
Log.lazyEvaluation = flag
}
viewLogInSources(flag) { viewLogInSources(flag) {
Log.showSrcInSources = flag Log.showSrcInSources = flag
} }
@@ -191,9 +194,9 @@ export default class Logger extends Emitter {
return this return this
} }
insert(type, args) { insert(type, args) {
let logs = this._logs, let logs = this._logs
$el = this._$el, let $el = this._$el
el = $el.get(0) let el = $el.get(0)
let isAtBottom = el.scrollTop === el.scrollHeight - el.offsetHeight let isAtBottom = el.scrollTop === el.scrollHeight - el.offsetHeight
@@ -214,7 +217,7 @@ export default class Logger extends Emitter {
lastLog.addCount() lastLog.addCount()
if (log.time) lastLog.updateTime(log.time) if (log.time) lastLog.updateTime(log.time)
$el $el
.find('li') .find('.eruda-log-container')
.last() .last()
.remove() .remove()
log = lastLog log = lastLog
@@ -225,14 +228,15 @@ export default class Logger extends Emitter {
if (this._maxNum !== 'infinite' && logs.length > this._maxNum) { if (this._maxNum !== 'infinite' && logs.length > this._maxNum) {
$el $el
.find('li') .find('.eruda-log-container')
.first() .first()
.remove() .remove()
logs.shift() logs.shift()
} }
if (this._filterLog(log) && this._container.active) if (this._filterLog(log) && this._container.active) {
$el.append(log.formattedMsg) $el.append(log.formattedMsg)
}
this.emit('insert', log) this.emit('insert', log)
@@ -250,8 +254,8 @@ export default class Logger extends Emitter {
if (filter === 'all') return logs if (filter === 'all') return logs
let isFilterRegExp = isRegExp(filter), let isFilterRegExp = isRegExp(filter)
isFilterFn = isFn(filter) let isFilterFn = isFn(filter)
return logs.filter(log => { return logs.filter(log => {
if (log.ignoreFilter) return true if (log.ignoreFilter) return true
@@ -295,11 +299,11 @@ export default class Logger extends Emitter {
let self = this let self = this
this._$el.on('click', '.eruda-log-item', function() { this._$el.on('click', '.eruda-log-item', function() {
let $el = $(this), let $el = $(this)
id = $el.data('id'), let id = $el.data('id')
type = $el.data('type'), let type = $el.data('type')
logs = self._logs, let logs = self._logs
log let log
for (let i = 0, len = logs.length; i < len; i++) { for (let i = 0, len = logs.length; i < len; i++) {
log = logs[i] log = logs[i]