1
0
Fork 0
mirror of https://github.com/openstf/stf synced 2025-10-06 03:50:04 +02:00

Logging implemented (except filtering).

Automatically enable/disable scroll lock based on the scrollbar position.
This commit is contained in:
Gunther Brunner 2014-05-19 22:27:28 +09:00
parent 5be2b8f7d5
commit 1c89235267
9 changed files with 225 additions and 86 deletions

View file

@ -28,7 +28,8 @@
"angular-growl-v2": "JanStevens/angular-growl-2#~0.6.0",
"bluebird": "~1.2.4",
"angular-tree-control": "~0.1.5",
"angular-loading-bar": "~0.4.2"
"angular-loading-bar": "~0.4.2",
"underscore.string": "~2.3.3"
},
"private": true,
"resolutions": {

View file

@ -3,5 +3,4 @@ require('./logcat-table.css')
module.exports = angular.module('stf.logcat-table', [
])
.value('logcatAutoScroll', true)
.directive('logcatTable', require('./logcat-table-directive'))

View file

@ -1,14 +1,39 @@
var _ = require('lodash')
module.exports = function logcatTableDirective($rootScope, $timeout, logcatAutoScroll) {
module.exports = function logcatTableDirective($rootScope, $timeout, LogcatService) {
return {
restrict: 'E',
replace: true,
template: require('./logcat-table.jade'),
link: function (scope, element, attrs) {
var autoScroll = true
var autoScrollDependingOnScrollPosition = true
var scrollPosition = 0
var scrollHeight = 0
var parent = element[0]
var body = element.find('tbody')[0]
LogcatService.addEntryListener = function (entry) {
addRow(entry)
}
function shouldAutoScroll() {
if (autoScrollDependingOnScrollPosition) {
return scrollPosition === scrollHeight
} else {
return true
}
}
function scrollListener(event) {
scrollPosition = event.target.scrollTop + event.target.clientHeight
scrollHeight = event.target.scrollHeight
}
var throttledScrollListener = _.throttle(scrollListener, 100)
parent.addEventListener('scroll', throttledScrollListener, false)
function scrollToBottom() {
parent.scrollTop = parent.scrollHeight + 20
$timeout(function () {
@ -19,28 +44,30 @@ module.exports = function logcatTableDirective($rootScope, $timeout, logcatAutoS
function addRow(data, batchRequest) {
var newRow = body.insertRow(-1)
// newRow.insertCell(-1)
// .appendChild($document.createTextNode(DeviceLogService.linesCounter));
// newRow.insertCell(-1)
// .appendChild($document.createTextNode(data.deviceName));
// newRow.insertCell(-1)
// .appendChild($document.createTextNode(data.levelName));
// newRow.insertCell(-1)
// .appendChild($document.createTextNode(data.dateFormatted));
// if ($rootScope.platform === 'native') {
newRow.classList.add('log-' + data.priorityLabel)
newRow.insertCell(-1)
.appendChild(document.createTextNode(data.pid))
.appendChild(document.createTextNode(LogcatService.numberOfEntries))
//newRow.insertCell(-1)
// .appendChild(document.createTextNode(data.deviceLabel))
newRow.insertCell(-1)
.appendChild(document.createTextNode(data.tid))
.appendChild(document.createTextNode(data.priorityLabel))
newRow.insertCell(-1)
.appendChild(document.createTextNode(data.app))
newRow.insertCell(-1)
.appendChild(document.createTextNode(data.tag))
// }
.appendChild(document.createTextNode(data.dateLabel))
if ($rootScope.platform === 'native') {
newRow.insertCell(-1)
.appendChild(document.createTextNode(data.pid))
newRow.insertCell(-1)
.appendChild(document.createTextNode(data.tid))
//newRow.insertCell(-1)
// .appendChild(document.createTextNode(data.app))
newRow.insertCell(-1)
.appendChild(document.createTextNode(data.tag))
}
newRow.insertCell(-1)
.appendChild(document.createTextNode(data.message))
if (logcatAutoScroll && !batchRequest) {
if (autoScroll && shouldAutoScroll() && !batchRequest) {
_.throttle(scrollToBottom, 10)()
}
}
@ -52,41 +79,51 @@ module.exports = function logcatTableDirective($rootScope, $timeout, logcatAutoS
body = newBody
}
addRow({
"serial": "1cd49783",
"date": 1399964036.984,
"pid": 9246,
"tid": 9540,
"priority": 3,
"tag": "MobileDataStateTracker",
"message": "default: setPolicyDataEnable(enabled=true)"
})
for (var i = 0; i < 50; i++) {
addRow({
"serial": "14141cd49783",
"date": 1399964036.984,
"pid": 9246,
"tid": 9540,
"priority": 3,
"tag": "MobileDataStateTracker",
"message": "XXdefault: setPolicyDataEnable(enabled=true)"
})
scope.clearTable = function () {
LogcatService.clear()
clearTable()
}
$timeout(function () {
for (var i = 0; i < 10; i++) {
addRow({
"serial": "14141cd49783",
"date": 1399964036.984,
"pid": 9246,
"tid": 9540,
"priority": 3,
"tag": "MobileDataStateTracker",
"message": "XXdefault: setPolicyDataEnable(enabled=true)"
})
}
}, 1000)
scope.$on('$destroy', function () {
parent.removeEventListener('scroll', throttledScrollListener)
})
// addRow({
// "serial": "1cd49783",
// "date": 1399964036.984,
// "pid": 9246,
// "tid": 9540,
// "priority": 3,
// "tag": "MobileDataStateTracker",
// "message": "default: setPolicyDataEnable(enabled=true)"
// })
//
// for (var i = 0; i < 50; i++) {
// addRow({
// "serial": "14141cd49783",
// "date": 1399964036.984,
// "pid": 9246,
// "tid": 9540,
// "priority": 3,
// "tag": "MobileDataStateTracker",
// "message": "XXdefault: setPolicyDataEnable(enabled=true)"
// })
// }
//
// $timeout(function () {
// for (var i = 0; i < 10; i++) {
// addRow({
// "serial": "14141cd49783",
// "date": 1399964036.984,
// "pid": 9246,
// "tid": 9540,
// "priority": 3,
// "tag": "MobileDataStateTracker",
// "message": "XXdefault: setPolicyDataEnable(enabled=true)"
// })
// }
// }, 1000)
}

View file

@ -33,39 +33,45 @@
/*color: rgb(48, 57, 66);*/
}
.stf-logcat-table tr td:first-child {
background: #f3f3f3;
color: #800000;
text-align: right;
}
/**
Logging colors
*/
.stf-logcat-table .log-unknown {
.stf-logcat-table .log-Unknown {
color: bisque;
}
.stf-logcat-table .log-default,
.stf-logcat-table .log-silent {
.stf-logcat-table .log-Default,
.stf-logcat-table .log-Silent {
color: darkolivegreen;
}
.stf-logcat-table .log-verbose {
.stf-logcat-table .log-Verbose {
color: blueviolet;
}
.stf-logcat-table .log-debug {
color: rgb(48, 57, 66);
.stf-logcat-table .log-Debug {
color: #020c7d;
}
.stf-logcat-table .log-info {
color: blue;
.stf-logcat-table .log-Info {
color: #177d1c;
}
.stf-logcat-table .log-warn {
.stf-logcat-table .log-Warn {
color: coral;
}
.stf-logcat-table .log-error {
.stf-logcat-table .log-Error {
color: red;
}
.stf-logcat-table .log-fatal {
.stf-logcat-table .log-Fatal {
color: darkcyan;
}

View file

@ -1,3 +1,3 @@
.stf-logcat-table.force-gpu
table.console-message-text.tableX.table-condensedX.selectableX
table.console-message-text.tableX.table-condensed.selectable
tbody

View file

@ -1,11 +1,56 @@
var _ = require('lodash')
var _s = require('underscore.string')
module.exports = function LogcatServiceFactory(socket) {
var LogcatService = {}
module.exports = function LogcatServiceFactory(socket, DeviceService) {
var service = {}
LogcatService.entries = []
service.started = false
LogcatService.logLevels = [
service.maxBuffer = 5000
service.numberOfEntries = 0
service.filters = {
numberOfEntries: 0,
entries: [
{
"serial": "1cd49783",
"date": 1399964036.984,
"pid": 9246,
"tid": 9540,
"priority": 3,
"tag": "MobileDataStateTracker",
"message": "default:(enabled=true)"
}
],
levelNumber: null,
levelNumbers: []
}
service.entries = [
{
"serial": "1cd49783",
"date": 1399964036.984,
"pid": 9246,
"tid": 9540,
"priority": 3,
"tag": "MobileDataStateTracker",
"message": "default:(enabled=true)"
},
{
"serial": "1dcvafaasfafcd49783",
"date": 1399964036.984,
"pid": 9246,
"tid": 9540,
"priority": 2,
"tag": "MobileDataStateTracker",
"message": "default: setPolicyDataEnable(enabled=true)"
}
]
service.logLevels = [
'UNKNOWN',
'DEFAULT',
'VERBOSE',
@ -17,32 +62,48 @@ module.exports = function LogcatServiceFactory(socket) {
'SILENT'
]
var logLevelsLowerCase = _.map(LogcatService.logLevels, function (level) {
var logLevelsLowerCase = _.map(service.logLevels, function (level) {
return level.toLowerCase()
})
var logLevelsCapitalized = _.map(logLevelsLowerCase, function (level) {
//return _.capitalize(level)
return _s.capitalize(level)
})
for (var i = 2; i < 8; ++i) {
service.filters.levelNumbers.push({number: i, name: logLevelsCapitalized[i]})
}
function enhanceEntry(data) {
var date = new Date(data.date)
// data.dateFormatted = _.pad(date.getHours(), 2, '0') + ':' +
// _.pad(date.getMinutes(), 2, '0') + ':' +
// _.pad(date.getSeconds(), 2, '0') + '.' +
// _.pad(date.getMilliseconds(), 3, '0')
var date = new Date(data.date * 1000)
data.dateLabel = _s.pad(date.getHours(), 2, '0') + ':' +
_s.pad(date.getMinutes(), 2, '0') + ':' +
_s.pad(date.getSeconds(), 2, '0') + '.' +
_s.pad(date.getMilliseconds(), 3, '0')
data.deviceLabel = 'Android'
data.priorityLabel = logLevelsCapitalized[data.priority]
return data
}
socket.on('logcat.entry', function (data) {
LogcatService.entries.push(enhanceEntry(data))
service.numberOfEntries++
// console.log(enhanceEntry(data))
service.entries.push(enhanceEntry(data))
if (true) {
service.addEntryListener(data)
}
})
LogcatService.clear = function () {
LogcatService.entries = []
service.clear = function () {
service.numberOfEntries = 0
service.entries = []
}
return LogcatService
return service
}

View file

@ -1,3 +1,16 @@
.enter-fade {
-webkit-transition: 1s linear opacity;
-moz-transition: 1s linear opacity;
-o-transition: 1s linear opacity;
transition: 1s linear opacity;
opacity: 0;
}
.enter-fade.enter-fade-active {
opacity: 1;
}
device-screen canvas {
transition: width 100ms linear, -webkit-transform 250ms ease-in-out;
-webkit-transform-origin: 50% 50%;

View file

@ -4,22 +4,44 @@ module.exports = function LogsCtrl($scope, LogcatService) {
$scope.logEntries = LogcatService.entries
$scope.filters = LogcatService.filters
$scope.started = LogcatService.started
$scope.$watch('started', function (newValue, oldValue) {
if (newValue !== oldValue) {
LogcatService.started = newValue
if (newValue) {
$scope.control.startLogcat(filters).then(function (result) {
})
} else {
$scope.control.stopLogcat()
}
}
})
$scope.$on('$destroy', function () {
// $scope.control.stopLogcat()
})
$scope.clear = function () {
LogcatService.clear()
}
$scope.addFastRow = function (val) {
var e = {
"serial": "1cd49783",
"date": 1399964036.984,
"pid": 9246,
"tid": 9540,
"priority": 3,
"tag": "MobileDataStateTracker",
"message": "default: setPolicyDataEnable(enabled=true)"
}
//console.log(val)
}
}

View file

@ -41,7 +41,7 @@
select(ng-model='filtering.deviceName', ng-options='d for d in filtering.devicesList')
option(value='') {{"Device"|translate}}
td(width='6%')
select(ng-model='filtering.levelNumber', ng-options='l.name for l in filtering.levelNumbers')
select(ng-model='filters.levelNumber', ng-options='l.name for l in filters.levelNumbers')
option(value='') {{"Level"|translate}}
td(width='10%')
input(ng-model='filtering.date', type='text', placeholder='{{"Time"|translate}}')
@ -49,18 +49,18 @@
input(ng-model='filtering.pid', type='text', placeholder='{{"PID"|translate}}')
td(width='8%', ng-if='$root.platform == "native"')
input(ng-model='filtering.tid', type='text', placeholder='{{"TID"|translate}}')
td(width='14%', ng-if='$root.platform == "native"')
//td(width='14%', ng-if='$root.platform == "native"')
input(ng-model='filtering.app', type='text', placeholder='{{"App"|translate}}')
td(width='14%', ng-if='$root.platform == "native"')
input(ng-model='filtering.tag', type='text', placeholder='{{"Tag"|translate}}')
td(width='40%')
input(ng-model='filtering.message', type='text', placeholder='{{"Text"|translate}}')
td(width='0')
button(ng-click='clear()', ng-disabled='false', title='{{"Clear"|translate}}').btn.btn-xs.btn-danger-outline
button(ng-click='clearTable()', ng-disabled='false', title='{{"Clear"|translate}}').btn.btn-xs.btn-danger-outline
i.fa.fa-trash-o
span(translate) Clear
logcat-table
logcat-table(add-row='lastEntry')
//#logcatParent.force-gpu
table#logcatTable.console-message-text.tableX.table-condensedX.selectableX
//thead