103 lines
2.6 KiB
JavaScript
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);
|