1*6dbdd20aSAndroid Build Coastguard Worker// Copyright (C) 2021 The Android Open Source Project 2*6dbdd20aSAndroid Build Coastguard Worker// 3*6dbdd20aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*6dbdd20aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*6dbdd20aSAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*6dbdd20aSAndroid Build Coastguard Worker// 7*6dbdd20aSAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*6dbdd20aSAndroid Build Coastguard Worker// 9*6dbdd20aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*6dbdd20aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*6dbdd20aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*6dbdd20aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*6dbdd20aSAndroid Build Coastguard Worker// limitations under the License. 14*6dbdd20aSAndroid Build Coastguard Worker 15*6dbdd20aSAndroid Build Coastguard Workerimport {assetSrc} from '../base/assets'; 16*6dbdd20aSAndroid Build Coastguard Workerimport {download} from '../base/clipboard'; 17*6dbdd20aSAndroid Build Coastguard Workerimport {defer} from '../base/deferred'; 18*6dbdd20aSAndroid Build Coastguard Workerimport {ErrorDetails} from '../base/logging'; 19*6dbdd20aSAndroid Build Coastguard Workerimport {utf8Decode} from '../base/string_utils'; 20*6dbdd20aSAndroid Build Coastguard Workerimport {time} from '../base/time'; 21*6dbdd20aSAndroid Build Coastguard Workerimport {AppImpl} from '../core/app_impl'; 22*6dbdd20aSAndroid Build Coastguard Workerimport {maybeShowErrorDialog} from './error_dialog'; 23*6dbdd20aSAndroid Build Coastguard Worker 24*6dbdd20aSAndroid Build Coastguard Workertype Args = 25*6dbdd20aSAndroid Build Coastguard Worker | UpdateStatusArgs 26*6dbdd20aSAndroid Build Coastguard Worker | JobCompletedArgs 27*6dbdd20aSAndroid Build Coastguard Worker | DownloadFileArgs 28*6dbdd20aSAndroid Build Coastguard Worker | OpenTraceInLegacyArgs 29*6dbdd20aSAndroid Build Coastguard Worker | ErrorArgs; 30*6dbdd20aSAndroid Build Coastguard Worker 31*6dbdd20aSAndroid Build Coastguard Workerinterface UpdateStatusArgs { 32*6dbdd20aSAndroid Build Coastguard Worker kind: 'updateStatus'; 33*6dbdd20aSAndroid Build Coastguard Worker status: string; 34*6dbdd20aSAndroid Build Coastguard Worker} 35*6dbdd20aSAndroid Build Coastguard Worker 36*6dbdd20aSAndroid Build Coastguard Workerinterface JobCompletedArgs { 37*6dbdd20aSAndroid Build Coastguard Worker kind: 'jobCompleted'; 38*6dbdd20aSAndroid Build Coastguard Worker} 39*6dbdd20aSAndroid Build Coastguard Worker 40*6dbdd20aSAndroid Build Coastguard Workerinterface DownloadFileArgs { 41*6dbdd20aSAndroid Build Coastguard Worker kind: 'downloadFile'; 42*6dbdd20aSAndroid Build Coastguard Worker buffer: Uint8Array; 43*6dbdd20aSAndroid Build Coastguard Worker name: string; 44*6dbdd20aSAndroid Build Coastguard Worker} 45*6dbdd20aSAndroid Build Coastguard Worker 46*6dbdd20aSAndroid Build Coastguard Workerinterface OpenTraceInLegacyArgs { 47*6dbdd20aSAndroid Build Coastguard Worker kind: 'openTraceInLegacy'; 48*6dbdd20aSAndroid Build Coastguard Worker buffer: Uint8Array; 49*6dbdd20aSAndroid Build Coastguard Worker} 50*6dbdd20aSAndroid Build Coastguard Worker 51*6dbdd20aSAndroid Build Coastguard Workerinterface ErrorArgs { 52*6dbdd20aSAndroid Build Coastguard Worker kind: 'error'; 53*6dbdd20aSAndroid Build Coastguard Worker error: ErrorDetails; 54*6dbdd20aSAndroid Build Coastguard Worker} 55*6dbdd20aSAndroid Build Coastguard Worker 56*6dbdd20aSAndroid Build Coastguard Workertype OpenTraceInLegacyCallback = ( 57*6dbdd20aSAndroid Build Coastguard Worker name: string, 58*6dbdd20aSAndroid Build Coastguard Worker data: ArrayBuffer | string, 59*6dbdd20aSAndroid Build Coastguard Worker size: number, 60*6dbdd20aSAndroid Build Coastguard Worker) => void; 61*6dbdd20aSAndroid Build Coastguard Worker 62*6dbdd20aSAndroid Build Coastguard Workerasync function makeWorkerAndPost( 63*6dbdd20aSAndroid Build Coastguard Worker msg: unknown, 64*6dbdd20aSAndroid Build Coastguard Worker openTraceInLegacy?: OpenTraceInLegacyCallback, 65*6dbdd20aSAndroid Build Coastguard Worker) { 66*6dbdd20aSAndroid Build Coastguard Worker const promise = defer<void>(); 67*6dbdd20aSAndroid Build Coastguard Worker 68*6dbdd20aSAndroid Build Coastguard Worker function handleOnMessage(msg: MessageEvent): void { 69*6dbdd20aSAndroid Build Coastguard Worker const args: Args = msg.data; 70*6dbdd20aSAndroid Build Coastguard Worker if (args.kind === 'updateStatus') { 71*6dbdd20aSAndroid Build Coastguard Worker AppImpl.instance.omnibox.showStatusMessage(args.status); 72*6dbdd20aSAndroid Build Coastguard Worker } else if (args.kind === 'jobCompleted') { 73*6dbdd20aSAndroid Build Coastguard Worker promise.resolve(); 74*6dbdd20aSAndroid Build Coastguard Worker } else if (args.kind === 'downloadFile') { 75*6dbdd20aSAndroid Build Coastguard Worker download(new File([new Blob([args.buffer])], args.name)); 76*6dbdd20aSAndroid Build Coastguard Worker } else if (args.kind === 'openTraceInLegacy') { 77*6dbdd20aSAndroid Build Coastguard Worker const str = utf8Decode(args.buffer); 78*6dbdd20aSAndroid Build Coastguard Worker openTraceInLegacy?.('trace.json', str, 0); 79*6dbdd20aSAndroid Build Coastguard Worker } else if (args.kind === 'error') { 80*6dbdd20aSAndroid Build Coastguard Worker maybeShowErrorDialog(args.error); 81*6dbdd20aSAndroid Build Coastguard Worker } else { 82*6dbdd20aSAndroid Build Coastguard Worker throw new Error(`Unhandled message ${JSON.stringify(args)}`); 83*6dbdd20aSAndroid Build Coastguard Worker } 84*6dbdd20aSAndroid Build Coastguard Worker } 85*6dbdd20aSAndroid Build Coastguard Worker 86*6dbdd20aSAndroid Build Coastguard Worker const worker = new Worker(assetSrc('traceconv_bundle.js')); 87*6dbdd20aSAndroid Build Coastguard Worker worker.onmessage = handleOnMessage; 88*6dbdd20aSAndroid Build Coastguard Worker worker.postMessage(msg); 89*6dbdd20aSAndroid Build Coastguard Worker return promise; 90*6dbdd20aSAndroid Build Coastguard Worker} 91*6dbdd20aSAndroid Build Coastguard Worker 92*6dbdd20aSAndroid Build Coastguard Workerexport function convertTraceToJsonAndDownload(trace: Blob): Promise<void> { 93*6dbdd20aSAndroid Build Coastguard Worker return makeWorkerAndPost({ 94*6dbdd20aSAndroid Build Coastguard Worker kind: 'ConvertTraceAndDownload', 95*6dbdd20aSAndroid Build Coastguard Worker trace, 96*6dbdd20aSAndroid Build Coastguard Worker format: 'json', 97*6dbdd20aSAndroid Build Coastguard Worker }); 98*6dbdd20aSAndroid Build Coastguard Worker} 99*6dbdd20aSAndroid Build Coastguard Worker 100*6dbdd20aSAndroid Build Coastguard Workerexport function convertTraceToSystraceAndDownload(trace: Blob): Promise<void> { 101*6dbdd20aSAndroid Build Coastguard Worker return makeWorkerAndPost({ 102*6dbdd20aSAndroid Build Coastguard Worker kind: 'ConvertTraceAndDownload', 103*6dbdd20aSAndroid Build Coastguard Worker trace, 104*6dbdd20aSAndroid Build Coastguard Worker format: 'systrace', 105*6dbdd20aSAndroid Build Coastguard Worker }); 106*6dbdd20aSAndroid Build Coastguard Worker} 107*6dbdd20aSAndroid Build Coastguard Worker 108*6dbdd20aSAndroid Build Coastguard Workerexport function convertToJson( 109*6dbdd20aSAndroid Build Coastguard Worker trace: Blob, 110*6dbdd20aSAndroid Build Coastguard Worker openTraceInLegacy: OpenTraceInLegacyCallback, 111*6dbdd20aSAndroid Build Coastguard Worker truncate?: 'start' | 'end', 112*6dbdd20aSAndroid Build Coastguard Worker): Promise<void> { 113*6dbdd20aSAndroid Build Coastguard Worker return makeWorkerAndPost( 114*6dbdd20aSAndroid Build Coastguard Worker { 115*6dbdd20aSAndroid Build Coastguard Worker kind: 'ConvertTraceAndOpenInLegacy', 116*6dbdd20aSAndroid Build Coastguard Worker trace, 117*6dbdd20aSAndroid Build Coastguard Worker truncate, 118*6dbdd20aSAndroid Build Coastguard Worker }, 119*6dbdd20aSAndroid Build Coastguard Worker openTraceInLegacy, 120*6dbdd20aSAndroid Build Coastguard Worker ); 121*6dbdd20aSAndroid Build Coastguard Worker} 122*6dbdd20aSAndroid Build Coastguard Worker 123*6dbdd20aSAndroid Build Coastguard Workerexport function convertTraceToPprofAndDownload( 124*6dbdd20aSAndroid Build Coastguard Worker trace: Blob, 125*6dbdd20aSAndroid Build Coastguard Worker pid: number, 126*6dbdd20aSAndroid Build Coastguard Worker ts: time, 127*6dbdd20aSAndroid Build Coastguard Worker): Promise<void> { 128*6dbdd20aSAndroid Build Coastguard Worker return makeWorkerAndPost({ 129*6dbdd20aSAndroid Build Coastguard Worker kind: 'ConvertTraceToPprof', 130*6dbdd20aSAndroid Build Coastguard Worker trace, 131*6dbdd20aSAndroid Build Coastguard Worker pid, 132*6dbdd20aSAndroid Build Coastguard Worker ts, 133*6dbdd20aSAndroid Build Coastguard Worker }); 134*6dbdd20aSAndroid Build Coastguard Worker} 135