Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
*/
const emptyPage =
getRootDirectory(gTestPath).replace(
) + "empty.html";
add_task(async function test_clientrects_all_metrics() {
info("Testing all ClientRects metrics collection...");
await BrowserTestUtils.withNewTab({ gBrowser, url: emptyPage }, () =>
GleanPings.userCharacteristics.testSubmission(
() => {
info("Testing Element.getClientRects() metrics...");
for (let i = 1; i <= 12; i++) {
const metricNum = String(i).padStart(2, "0");
const value =
Glean.characteristics[
`clientrectsElementGcr${metricNum}`
].testGetValue();
Assert.notEqual(
value,
null,
`Element GCR ${metricNum} should be collected`
);
Assert.notEqual(
value,
"",
`Element GCR ${metricNum} should not be empty`
);
const parsed = JSON.parse(value);
Assert.strictEqual(
typeof parsed,
"object",
`Element GCR ${metricNum} should be an object`
);
Assert.ok(
"w" in parsed && "h" in parsed,
`Element GCR ${metricNum} should have width and height`
);
}
info("All 12 Element.getClientRects() metrics validated");
info("Testing Element.getBoundingClientRect() metrics...");
for (let i = 1; i <= 12; i++) {
const metricNum = String(i).padStart(2, "0");
const value =
Glean.characteristics[
`clientrectsElementGbcr${metricNum}`
].testGetValue();
Assert.notEqual(
value,
null,
`Element GBCR ${metricNum} should be collected`
);
Assert.notEqual(
value,
"",
`Element GBCR ${metricNum} should not be empty`
);
const parsed = JSON.parse(value);
Assert.strictEqual(
typeof parsed,
"object",
`Element GBCR ${metricNum} should be an object`
);
Assert.ok(
"w" in parsed && "h" in parsed,
`Element GBCR ${metricNum} should have width and height`
);
}
info("All 12 Element.getBoundingClientRect() metrics validated");
info("Testing Range.getClientRects() metrics...");
for (let i = 1; i <= 12; i++) {
const metricNum = String(i).padStart(2, "0");
const value =
Glean.characteristics[
`clientrectsRangeGcr${metricNum}`
].testGetValue();
Assert.notEqual(
value,
null,
`Range GCR ${metricNum} should be collected`
);
Assert.notEqual(
value,
"",
`Range GCR ${metricNum} should not be empty`
);
const parsed = JSON.parse(value);
Assert.strictEqual(
typeof parsed,
"object",
`Range GCR ${metricNum} should be an object`
);
Assert.ok(
"w" in parsed && "h" in parsed,
`Range GCR ${metricNum} should have width and height`
);
}
info("All 12 Range.getClientRects() metrics validated");
info("Testing Range.getBoundingClientRect() metrics...");
for (let i = 1; i <= 12; i++) {
const metricNum = String(i).padStart(2, "0");
const value =
Glean.characteristics[
`clientrectsRangeGbcr${metricNum}`
].testGetValue();
Assert.notEqual(
value,
null,
`Range GBCR ${metricNum} should be collected`
);
Assert.notEqual(
value,
"",
`Range GBCR ${metricNum} should not be empty`
);
const parsed = JSON.parse(value);
Assert.strictEqual(
typeof parsed,
"object",
`Range GBCR ${metricNum} should be an object`
);
Assert.ok(
"w" in parsed && "h" in parsed,
`Range GBCR ${metricNum} should have width and height`
);
}
info("All 12 Range.getBoundingClientRect() metrics validated");
info("Testing additional ClientRects metrics...");
const knownDimensions =
Glean.characteristics.clientrectsKnownDimensions.testGetValue();
Assert.notEqual(
knownDimensions,
null,
"Known dimensions should be collected"
);
const knownParsed = JSON.parse(knownDimensions);
Assert.ok(
"w" in knownParsed && "h" in knownParsed,
"Known dimensions should have width and height"
);
const ghostDimensions =
Glean.characteristics.clientrectsGhostDimensions.testGetValue();
Assert.notEqual(
ghostDimensions,
null,
"Ghost dimensions should be collected"
);
const ghostParsed = JSON.parse(ghostDimensions);
Assert.equal(ghostParsed.w, 0, "Ghost element width should be 0");
Assert.equal(ghostParsed.h, 0, "Ghost element height should be 0");
info("Testing individual emoji metrics...");
for (let i = 1; i <= 6; i++) {
const metricNum = String(i).padStart(2, "0");
const value =
Glean.characteristics[
`clientrectsEmoji${metricNum}`
].testGetValue();
Assert.notEqual(
value,
null,
`Emoji ${metricNum} should be collected`
);
Assert.notEqual(value, "", `Emoji ${metricNum} should not be empty`);
const parsed = JSON.parse(value);
Assert.strictEqual(
typeof parsed,
"object",
`Emoji ${metricNum} should be an object`
);
Assert.ok(
"w" in parsed && "h" in parsed,
`Emoji ${metricNum} should have width and height`
);
}
info("All 6 emoji metrics validated");
info("All additional ClientRects metrics validated");
},
async () => {
const populated = TestUtils.topicObserved(
"user-characteristics-populating-data-done",
() => true
);
Services.obs.notifyObservers(
null,
"user-characteristics-testing-please-populate-data"
);
await populated;
GleanPings.userCharacteristics.submit();
}
)
);
});