in assets/android-metrics.js [217:305]
colorMax: getAppColor(ds.label),
style: "rgba(255,105,180, .8)",
lineStyle: "dotted",
width: 2
}
}
});
plotChart(metric, dataset, unit);
}
function displayCharts() {
while (window.allCharts.length > 0) {
window.allCharts.pop().destroy();
}
const history = window.historyStatus;
const latestDate = new Date(window.data.at(-1).date);
let cutoffDate = new Date(latestDate);
cutoffDate.setDate(latestDate.getDate() - history);
cutoffDate = cutoffDate.toISOString().split('T')[0];
const filteredData = window.data.filter(row => row.date >= cutoffDate);
window.tests.forEach(test => {
test.metric.forEach(metric => {
displayChartForMetric(filteredData, metric, test.name, test.unit);
});
});
}
const backgroundColorPlugin = {
id: 'backgroundColor',
beforeDraw: (chart) => {
const {ctx, width, height} = chart;
ctx.fillStyle = '#f0f0f0';
ctx.fillRect(0, 0, width, height);
}
};
function fixupStartupTests(data) {
data.forEach(row => {
if (row.suite === 'AndroidStartup:fenix') {
row.suite = 'AndroidStartup';
row.application = 'fenix';
} else if (row.suite === 'AndroidStartup:chrome-m') {
row.suite = 'AndroidStartup';
row.application = 'chrome-m';
} else if (row.test === 'applink_startup' && row.suite === 'newssite-applink-startup' && row.platform === 'android-hw-a55-14-0-aarch64-shippable') {
row.test = 'newssite-applink-startup-a55';
} else if (row.test === 'applink_startup' && row.suite === 'newssite-applink-startup' && row.platform === 'android-hw-p6-13-0-aarch64-shippable') {
row.test = 'newssite-applink-startup-p6';
} else if (row.test === 'applink_startup' && row.suite === 'newssite-applink-startup' && row.platform === 'android-hw-s24-14-0-aarch64-shippable') {
row.test = 'newssite-applink-startup-s24';
} else if (row.test === 'applink_startup' && row.suite === 'shopify-applink-startup') {
row.test = 'shopify-applink-startup';
}
});
}
function fixupPageloadTests(data) {
data.forEach(row => {
if (row.category === 'pageload') {
row.test = `${row.suite}-${row.test}`
}
});
}
function geometricMean(numbers) {
const positiveNumbers = numbers.filter(num => num > 0);
if (positiveNumbers.length === 0) return 0;
const product = positiveNumbers.reduce((acc, num) => acc * num, 1);
return Math.pow(product, 1 / positiveNumbers.length);
}
function fixupResourceTests(data) {
const resourceData = data.filter(row => row.category === 'resource');
let groupedObjects = {};
resourceData.forEach(row => {
const fields = row.test.split('-');
const resource = fields[0]; // "rss", "pss", "cpuTime"
const process = fields[1]; // "gpu", "main", "tab", "total"
const key = `${resource}-${process}-${row.application}-${row.date}`;
if (!groupedObjects[key]) {
groupedObjects[key] = {