Download trace files from Winscope

Added a download file button to DataView.

Bug:
Test: yarn run dev
Change-Id: I203f3f19168c43a0dbefb3ec00237c021380f89f
Merged-In: I203f3f19168c43a0dbefb3ec00237c021380f89f
This commit is contained in:
Adam Pardyl
2019-09-16 18:48:59 +02:00
committed by Vishnu Nair
parent c5708b2f83
commit 2a94ec6dba
6 changed files with 36 additions and 20 deletions

View File

@@ -20,8 +20,8 @@
</md-whiteframe> </md-whiteframe>
<div class="main-content"> <div class="main-content">
<md-layout v-if="!dataLoaded" class="m-2"> <md-layout v-if="!dataLoaded" class="m-2">
<dataadb ref="adb" :store="store" @dataReady="onDataReady" @statusChange="setStatus"/> <dataadb ref="adb" :store="store" @dataReady="onDataReady" @statusChange="setStatus" />
<datainput ref="input" :store="store" @dataReady="onDataReady" @statusChange="setStatus"/> <datainput ref="input" :store="store" @dataReady="onDataReady" @statusChange="setStatus" />
</md-layout> </md-layout>
<md-card v-if="dataLoaded"> <md-card v-if="dataLoaded">
<md-whiteframe md-tag="md-toolbar" md-elevation="0" class="card-toolbar md-transparent md-dense"> <md-whiteframe md-tag="md-toolbar" md-elevation="0" class="card-toolbar md-transparent md-dense">
@@ -87,6 +87,7 @@ export default {
}, },
methods: { methods: {
clear() { clear() {
this.files.forEach(function(item) { item.destroy(); })
this.files = []; this.files = [];
this.activeDataView = null; this.activeDataView = null;
}, },
@@ -200,7 +201,7 @@ export default {
flex-wrap: wrap; flex-wrap: wrap;
} }
.md-layout > .md-card { .md-layout>.md-card {
margin: 0.5em; margin: 0.5em;
} }

View File

@@ -112,7 +112,7 @@
</md-card> </md-card>
</template> </template>
<script> <script>
import { dataFile, FILE_TYPES, DATA_TYPES } from './decode.js' import { FILE_TYPES, DATA_TYPES } from './decode.js'
import LocalStore from './localstore.js' import LocalStore from './localstore.js'
const STATES = { const STATES = {

View File

@@ -52,7 +52,7 @@
</md-card> </md-card>
</template> </template>
<script> <script>
import { detectAndDecode, dataFile, FILE_TYPES, DATA_TYPES } from './decode.js' import { detectAndDecode, FILE_TYPES, DATA_TYPES } from './decode.js'
export default { export default {
name: 'datainput', name: 'datainput',

View File

@@ -15,9 +15,14 @@
<template> <template>
<md-card v-if="file"> <md-card v-if="file">
<md-card-header> <md-card-header>
<div class="md-title"> <md-card-header-text>
<md-icon>{{file.type.icon}}</md-icon> {{file.filename}} <div class="md-title">
</div> <md-icon>{{file.type.icon}}</md-icon> {{file.filename}}
</div>
</md-card-header-text>
<md-button :href="file.blobUrl" :download="file.filename" class="md-icon-button">
<md-icon>save_alt</md-icon>
</md-button>
</md-card-header> </md-card-header>
<traceview v-if="isTrace" :store="store" :file="file" ref="view" /> <traceview v-if="isTrace" :store="store" :file="file" ref="view" />
<videoview v-if="isVideo" :file="file" ref="view" /> <videoview v-if="isVideo" :file="file" ref="view" />
@@ -50,15 +55,15 @@ export default {
computed: { computed: {
isTrace() { isTrace() {
return this.file.type == DATA_TYPES.WINDOW_MANAGER || return this.file.type == DATA_TYPES.WINDOW_MANAGER ||
this.file.type == DATA_TYPES.SURFACE_FLINGER || this.file.type == DATA_TYPES.SURFACE_FLINGER ||
this.file.type == DATA_TYPES.TRANSACTION || this.file.type == DATA_TYPES.WAYLAND this.file.type == DATA_TYPES.TRANSACTION || this.file.type == DATA_TYPES.WAYLAND
}, },
isVideo() { isVideo() {
return this.file.type == DATA_TYPES.SCREEN_RECORDING; return this.file.type == DATA_TYPES.SCREEN_RECORDING;
}, },
isLog() { isLog() {
return this.file.type == DATA_TYPES.WINDOW_LOG return this.file.type == DATA_TYPES.WINDOW_LOG
} },
}, },
components: { components: {
'traceview': TraceView, 'traceview': TraceView,
@@ -74,4 +79,5 @@ export default {
font-size: 4em; font-size: 4em;
color: red; color: red;
} }
</style> </style>

View File

@@ -19,7 +19,7 @@
<h2 class="md-title">Screen</h2> <h2 class="md-title">Screen</h2>
</md-whiteframe> </md-whiteframe>
<md-whiteframe md-elevation="8"> <md-whiteframe md-elevation="8">
<video :id="file.filename" class="screen" :src="videoUri" /> <video :id="file.filename" class="screen" :src="file.data" />
</md-whiteframe> </md-whiteframe>
</md-card> </md-card>
</md-card-content> </md-card-content>
@@ -63,9 +63,6 @@ export default {
selectedIndex() { selectedIndex() {
return this.file.selectedIndex; return this.file.selectedIndex;
}, },
videoUri() {
return "data:video/mp4;base64," + btoa(uint8ToString(this.file.data));
}
}, },
} }

View File

@@ -59,26 +59,32 @@ const DATA_TYPES = {
WINDOW_MANAGER: { WINDOW_MANAGER: {
name: "WindowManager", name: "WindowManager",
icon: "view_compact", icon: "view_compact",
mime: "application/octet-stream",
}, },
SURFACE_FLINGER: { SURFACE_FLINGER: {
name: "SurfaceFlinger", name: "SurfaceFlinger",
icon: "filter_none", icon: "filter_none",
mime: "application/octet-stream",
}, },
SCREEN_RECORDING: { SCREEN_RECORDING: {
name: "Screen recording", name: "Screen recording",
icon: "videocam", icon: "videocam",
mime: "video/mp4",
}, },
TRANSACTION: { TRANSACTION: {
name: "Transaction", name: "Transaction",
icon: "timeline", icon: "timeline",
mime: "application/octet-stream",
}, },
WAYLAND: { WAYLAND: {
name: "Wayland", name: "Wayland",
icon: "filter_none", icon: "filter_none",
mime: "application/octet-stream",
}, },
WINDOW_LOG: { WINDOW_LOG: {
name: "WindowManager log", name: "WindowManager log",
icon: "notes", icon: "notes",
mime: "application/octet-stream",
} }
} }
@@ -219,21 +225,27 @@ function protoDecoder(buffer, fileType, fileName, store) {
} else { } else {
data = [transformed]; data = [transformed];
} }
return dataFile(fileName, data.map(x => x.timestamp), data, fileType.dataType); let blobUrl = URL.createObjectURL(new Blob([buffer], { type: fileType.dataType.mime }));
return dataFile(fileName, data.map(x => x.timestamp), data, blobUrl, fileType.dataType);
} }
function videoDecoder(buffer, fileType, fileName, store) { function videoDecoder(buffer, fileType, fileName, store) {
var [data, timeline] = fileType.decoderParams.videoDecoder(buffer) let [data, timeline] = fileType.decoderParams.videoDecoder(buffer);
return dataFile(fileName, timeline, data, fileType.dataType); let blobUrl = URL.createObjectURL(new Blob([data], { type: fileType.dataType.mime }));
return dataFile(fileName, timeline, blobUrl, blobUrl, fileType.dataType);
} }
function dataFile(filename, timeline, data, type) { function dataFile(filename, timeline, data, blobUrl, type) {
return { return {
filename: filename, filename: filename,
timeline: timeline, timeline: timeline,
data: data, data: data,
blobUrl: blobUrl,
type: type, type: type,
selectedIndex: 0, selectedIndex: 0,
destroy() {
URL.revokeObjectURL(this.blobUrl);
},
} }
} }
@@ -283,4 +295,4 @@ function detectAndDecode(buffer, fileName, store) {
throw new Error('Unable to detect file'); throw new Error('Unable to detect file');
} }
export { detectAndDecode, dataFile, DATA_TYPES, FILE_TYPES }; export { detectAndDecode, DATA_TYPES, FILE_TYPES };