stab-crashes/addon_related_signatures.js

125 строки
3.0 KiB
JavaScript

let options = {
channel: {
value: null,
type: "option",
},
};
function getOption(name) {
return options[name].value;
}
function getOptionType(name) {
return options[name].type;
}
function setOption(name, value) {
return (options[name].value = value);
}
let onLoad = new Promise(function (resolve, reject) {
window.onload = resolve;
});
function getAddons(obj) {
return obj["addons"]
.reduce((prev, cur) => {
return prev.concat(
Object.getOwnPropertyNames(cur["item"])
.filter((elem) => elem.startsWith("Addon"))
.map((elem) => {
return {
name: elem.substring(
elem.indexOf('"') + 1,
elem.lastIndexOf('"')
),
support: cur["count_group"] / obj["total"],
};
})
);
}, [])
.filter((addon, i, addons) => addons.indexOf(addon) === i);
}
function addRow(obj) {
let table = document.getElementById("table");
let row = table.insertRow(table.rows.length);
let signature_column = row.insertCell(0);
let signature_link = document.createElement("a");
signature_link.textContent = obj["signature"];
signature_link.href =
"https://crash-stats.mozilla.org/signature/?signature=" +
obj["signature"] +
"&release_channel=" +
getOption("channel") +
"#correlations";
signature_column.appendChild(signature_link);
let addons_column = row.insertCell(1);
let addons_pre = document.createElement("pre");
addons_pre.textContent = getAddons(obj)
.map(
(elem) => elem["name"] + " (" + (elem["support"] * 100).toFixed(2) + "%)"
)
.join(", ");
addons_column.appendChild(addons_pre);
}
function buildTable() {
fetch(
"https://analysis-output.telemetry.mozilla.org/top-signatures-correlations/data/addon_related_signatures.json.gz"
)
.then((response) => response.json())
.then((addon_related_signatures) => {
addon_related_signatures[getOption("channel")]
.sort(
(obj1, obj2) =>
Math.max(...getAddons(obj2).map((elem) => elem["support"])) -
Math.max(...getAddons(obj1).map((elem) => elem["support"]))
)
.forEach((obj) => addRow(obj));
})
.catch(function (err) {
console.error(err);
});
}
function rebuildTable() {
let table = document.getElementById("table");
while (table.rows.length > 1) {
table.deleteRow(table.rows.length - 1);
}
buildTable();
}
onLoad
.then(function () {
Object.keys(options).forEach(function (optionName) {
let optionType = getOptionType(optionName);
let elem = document.getElementById(optionName);
if (optionType === "option") {
setOption(optionName, elem.options[elem.selectedIndex].value);
elem.onchange = function () {
setOption(optionName, elem.options[elem.selectedIndex].value);
rebuildTable();
};
} else {
throw new Error("Unexpected option type.");
}
});
})
.then(function () {
buildTable();
})
.catch(function (err) {
console.error(err);
});