1
0
Fork 0
firefox/toolkit/components/nimbus/test/python/dump-targeting-context.js
Daniel Baumann 5e9a113729
Adding upstream version 140.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-25 09:37:52 +02:00

103 lines
2.6 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* globals quit */
"use strict";
const {
PREFS,
TargetingContextRecorder,
ATTRIBUTE_TRANSFORMS,
normalizePrefName,
} = ChromeUtils.importESModule("resource://nimbus/lib/TargetingContextRecorder.sys.mjs");
const { PREF_STRING, PREF_INT, PREF_BOOL } = Ci.nsIPrefBranch;
const DUMP_TARGETING_CONTEXT_PATH = "DUMP_TARGETING_CONTEXT_PATH";
function toGleanMetricsYamlName(attr) {
switch(attr) {
case "isFxAEnabled":
// Would transform to `is_fx_aenabled`.
return "is_fx_a_enabled";
case "isFxASignedIn":
// Would transform to `is_fx_asigned_in`.
return "is_fx_a_signed_in";
case "defaultPDFHandler":
// Would transform to `default_pdfhandler`.
return "default_pdf_handler";
default:
return attr.replaceAll(/[A-Z]+/g, substr => {
return `_${substr.toLowerCase()}`;
});
}
}
function prefTypeToObjectMetricType(pref, type) {
switch (type) {
case PREF_STRING:
return "string";
case PREF_INT:
return "number";
case PREF_BOOL:
return "boolean";
default:
throw new Error(`Unexpected type ${type} for pref ${pref}`);
}
}
/**
* Dump information about the Nimbus targeting context and its environment to a
* JSON file.
*
* This script is used by test_targeting_context_metrics.py to ensure that the
* metrics in the nimbus_targeting_context and nimbus_targeting_environment
* categories in toolkits/components/nimbus/metrics.yaml stay up to date with
* the Nimbus targeting context.
*/
async function main() {
const dumpPath = Services.env.get(DUMP_TARGETING_CONTEXT_PATH);
if (!dumpPath) {
throw new Error(`environment variable ${DUMP_TARGETING_CONTEXT_PATH} is undefined`);
}
const prefs = Object
.entries(PREFS)
.map(([pref, type]) => ({
pref_name: pref,
field_name: normalizePrefName(pref),
type: prefTypeToObjectMetricType(pref, type)
}));
const attrs = Object.keys(ATTRIBUTE_TRANSFORMS).map(attrName => ({
attr_name: attrName,
metric_name: toGleanMetricsYamlName(attrName),
}));
await IOUtils.writeJSON(dumpPath, { prefs, attrs });
}
let exit = false;
let exitStatus = 0;
main().then(
() => { exit = true; },
(exc) => {
console.error(`Unexpected error: ${exc}`);
dump(`${exc.stack}\n`);
exit = true;
exitStatus = 1;
}
);
Services.tm.spinEventLoopUntil("dump-targeting-context.js: waiting for completion", () => exit);
quit(exitStatus);