| /* Copyright 2025 The Chromium Authors |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. */ |
| |
| import {assert} from '//resources/js/assert.js'; |
| import type {BigBuffer} from '//resources/mojo/mojo/public/mojom/base/big_buffer.mojom-webui.js'; |
| import type {Token} from '//resources/mojo/mojo/public/mojom/base/token.mojom-webui.js'; |
| |
| export function getTokenAsUuidString(uuid: Token): string { |
| const highHex = uuid.high.toString(16).padStart(16, '0'); |
| const lowHex = uuid.low.toString(16).padStart(16, '0'); |
| return `${lowHex.slice(0, 8)}-${lowHex.slice(8, 12)}-${ |
| lowHex.slice(12, 16)}-${highHex.slice(0, 4)}-${highHex.slice(4)}`; |
| } |
| |
| function getArrayFromBigBuffer(bigBuffer: BigBuffer): Uint8Array { |
| if (Array.isArray(bigBuffer.bytes)) { |
| return new Uint8Array(bigBuffer.bytes); |
| } |
| assert(!!bigBuffer.sharedMemory, 'sharedMemory must be defined here'); |
| const sharedMemory = bigBuffer.sharedMemory; |
| const {buffer, result} = |
| sharedMemory.bufferHandle.mapBuffer(0, sharedMemory.size); |
| assert(result === Mojo.RESULT_OK, 'Could not map buffer'); |
| return new Uint8Array(buffer); |
| } |
| |
| // Create the temporary element here to hold the data to download the trace |
| // since it is only obtained after downloadData_ is called. This way we can |
| // perform a download directly in JS without touching the element that |
| // triggers the action. Initiate download a resource identified by |url| into |
| // |filename|. |
| function downloadUrl(fileName: string, url: string): void { |
| const a = document.createElement('a'); |
| a.href = url; |
| a.download = fileName; |
| a.click(); |
| } |
| |
| export function downloadTraceData(data: BigBuffer, uuid: Token): void { |
| const bytes = getArrayFromBigBuffer(data); |
| const blob = new Blob([bytes], { |
| type: 'application/octet-stream', |
| }); |
| downloadUrl(`${getTokenAsUuidString(uuid)}.gz`, URL.createObjectURL(blob)); |
| } |