blob: d469238154d07d8084305650a62c49b952af4dfb [file] [log] [blame]
// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import chart from "./chart.js";
import dom from "./dom.js";
import url from "./url.js";
var commits = null;
const benchmarks = new Set();
const selectedBenchmarks = new Set();
const legends = new Set();
const selectedLegends = new Set();
const zoom = { left: -1, right: -1 };
function forEachBenchmark(callback) {
for (const benchmark of benchmarks.values()) {
callback(benchmark, selectedBenchmarks.has(benchmark));
}
}
function forEachSelectedBenchmark(callback) {
forEachBenchmark((benchmark, selected) => {
if (selected) {
callback(benchmark);
}
});
}
function getCommit(index, zoom) {
return getCommits(zoom)[index];
}
function getCommitFromContext(context) {
const elementInfo = context[0];
var commit;
if (elementInfo.dataset.type == 'line') {
commit = getCommit(elementInfo.dataIndex, zoom);
} else {
console.assert(elementInfo.dataset.type == 'scatter');
commit = getCommit(elementInfo.raw.x, null);
}
return commit;
}
function getCommitDescriptionFromContext(context) {
const commit = getCommitFromContext(context);
const elementInfo = context[0];
const dataset = chart.get().data.datasets[elementInfo.datasetIndex];
return `App: ${dataset.benchmark}\n`
+ `Author: ${commit.author}\n`
+ `Submitted: ${new Date(commit.submitted * 1000).toLocaleString()}\n`
+ `Hash: ${commit.hash}\n`
+ `Index: ${commit.index}`;
}
function getCommits(zoom) {
const commitsForSelectedBranch = commits.filter(commit => dom.isCommitSelected(commit));
if (zoom) {
return commitsForSelectedBranch.slice(zoom.left, zoom.right);
}
return commitsForSelectedBranch;
}
function hasLegend(legend) {
return legends.has(legend);
}
function importCommits(url) {
return import(url, { with: { type: "json" }})
.then(module => {
commits = module.default;
commits.reverseInPlace();
// Amend the commits with their unique index.
var mainIndex = 0;
var releaseIndex = 0;
for (var i = 0; i < commits.length; i++) {
const commit = commits[i];
if (commit.version) {
commit.index = releaseIndex++;
} else {
commit.index = mainIndex++;
}
}
return commits;
});
}
function initializeBenchmarks() {
for (const commit of commits.values()) {
for (const benchmark in commit.benchmarks) {
benchmarks.add(benchmark);
}
}
for (const benchmark of benchmarks.values()) {
if (url.matches(benchmark)) {
selectedBenchmarks.add(benchmark);
}
}
if (selectedBenchmarks.size == 0) {
const randomBenchmarkIndex = Math.floor(Math.random() * benchmarks.size);
const randomBenchmark = Array.from(benchmarks)[randomBenchmarkIndex];
selectedBenchmarks.add(randomBenchmark);
}
}
function initializeLegends(legendsInfo) {
for (var legend in legendsInfo) {
legends.add(legend);
if (url.contains(legend)) {
selectedLegends.add(legend);
}
}
if (selectedLegends.size == 0) {
for (let [legend, legendInfo] of Object.entries(legendsInfo)) {
if (legendInfo.default) {
selectedLegends.add(legend);
}
}
}
}
function initializeZoom() {
const filteredCommits = resetZoom();
for (const urlOption of url.values()) {
if (urlOption.startsWith('L')) {
var left = parseInt(urlOption.substring(1));
if (isNaN(left)) {
continue;
}
left = left >= 0 ? left : filteredCommits.length + left;
if (left < 0) {
zoom.left = 0;
} else if (left >= filteredCommits.length) {
zoom.left = filteredCommits.length - 1;
} else {
zoom.left = left;
}
}
}
}
function resetZoom() {
const filteredCommits = getCommits(null);
zoom.left = Math.max(0, filteredCommits.length - 75);
zoom.right = filteredCommits.length;
return filteredCommits;
}
function handleKeyDownEvent(e, callback) {
if (selectedBenchmarks.size != 1) {
return;
}
const [selectedBenchmark] = selectedBenchmarks;
var benchmarkToSelect = null;
var previousBenchmark = null;
for (const benchmark of benchmarks.values()) {
if (previousBenchmark != null) {
if (e.key == 'ArrowLeft' && benchmark == selectedBenchmark) {
benchmarkToSelect = previousBenchmark;
break;
} else if (e.key === 'ArrowRight' && previousBenchmark == selectedBenchmark) {
benchmarkToSelect = benchmark;
break;
}
}
previousBenchmark = benchmark;
}
if (benchmarkToSelect != null) {
selectedBenchmarks.clear();
selectedBenchmarks.add(benchmarkToSelect);
document.getElementById(selectedBenchmark).checked = false;
document.getElementById(benchmarkToSelect).checked = true;
callback();
}
}
function isLegendSelected(legend) {
return selectedLegends.has(legend);
}
export default {
benchmarks: benchmarks,
commits: getCommits,
legends: legends,
selectedBenchmarks: selectedBenchmarks,
selectedLegends: selectedLegends,
forEachBenchmark: forEachBenchmark,
forEachSelectedBenchmark: forEachSelectedBenchmark,
getCommit: getCommit,
getCommitFromContext: getCommitFromContext,
getCommitDescriptionFromContext: getCommitDescriptionFromContext,
handleKeyDownEvent: handleKeyDownEvent,
hasLegend: hasLegend,
initializeBenchmarks: initializeBenchmarks,
initializeLegends: initializeLegends,
initializeZoom: initializeZoom,
importCommits: importCommits,
isLegendSelected: isLegendSelected,
resetZoom: resetZoom,
zoom: zoom
};