|  | // Copyright 2020 the V8 project authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | const KB = 1024; | 
|  | const MB = KB * KB; | 
|  | const GB = MB * KB; | 
|  | const kMillis2Seconds = 1 / 1000; | 
|  |  | 
|  | function formatBytes(bytes) { | 
|  | const units = [' B', ' KB', ' MB', ' GB']; | 
|  | const divisor = 1024; | 
|  | let index = 0; | 
|  | while (index < units.length && bytes >= divisor) { | 
|  | index++; | 
|  | bytes /= divisor; | 
|  | } | 
|  | return bytes.toFixed(2) + units[index]; | 
|  | } | 
|  |  | 
|  | function formatSeconds(millis) { | 
|  | return (millis * kMillis2Seconds).toFixed(2) + 's'; | 
|  | } | 
|  |  | 
|  | function defineCustomElement(name, generator) { | 
|  | let htmlTemplatePath = name + '-template.html'; | 
|  | fetch(htmlTemplatePath) | 
|  | .then(stream => stream.text()) | 
|  | .then(templateText => customElements.define(name, generator(templateText))); | 
|  | } |