Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Errors

/* Any copyright is dedicated to the Public Domain.
"use strict";
/**
* Wait for the result of checkFn to equal expectedValue and run an assertion
* once the value matches.
* @param {function} checkFn - Function which returns value to compare to
* expectedValue.
* @param {*} expectedValue - Value to compare against checkFn return value.
* @param {string} message - Assertion / test message.
*/
async function waitForAndAssertEqual(checkFn, expectedValue, message) {
let checkFnResult;
await BrowserTestUtils.waitForCondition(() => {
checkFnResult = checkFn();
return checkFnResult == expectedValue;
}, message);
Assert.equal(checkFnResult, expectedValue, message);
}
/**
* Test that query selector histogram data is set / unset.
* @param {*} options
* @param {boolean} options.hasTopLevelData - Whether there should be telemetry
* data for top level windows.
* @param {boolean} options.hasFrameData = Whether there should be telemetry
* data for sub-frames.
*/
async function assertQuerySelectorTelemetry({ hasTopLevelData, hasFrameData }) {
// Ensure we have all data from the content process.
await Services.fog.testFlushAllChildren();
let runDurationTopLevel = () =>
Glean.cookieBannersClick.querySelectorRunDurationPerWindowTopLevel.testGetValue() !=
null;
let runDurationFrame = () =>
Glean.cookieBannersClick.querySelectorRunDurationPerWindowFrame.testGetValue() !=
null;
let runCountTopLevel = () =>
Glean.cookieBannersClick.querySelectorRunCountPerWindowTopLevel.testGetValue() !=
null;
let runCountFrame = () =>
Glean.cookieBannersClick.querySelectorRunCountPerWindowFrame.testGetValue() !=
null;
let messagePrefix = hasData => `Should${hasData ? "" : " not"} have`;
await waitForAndAssertEqual(
runCountTopLevel,
hasTopLevelData,
`${messagePrefix(hasTopLevelData)} top-level run count data.`
);
await waitForAndAssertEqual(
runDurationTopLevel,
hasTopLevelData,
`${messagePrefix(hasTopLevelData)} top-level run duration data.`
);
await waitForAndAssertEqual(
runDurationFrame,
hasFrameData,
`${messagePrefix(hasFrameData)} sub-frame run duration data.`
);
await waitForAndAssertEqual(
runCountFrame,
hasFrameData,
`${messagePrefix(hasFrameData)} sub-frame run count data.`
);
}
add_setup(clickTestSetup);
/**
* Tests that, when performing cookie banner clicking, query selector
* performance telemetry is collected.
*/
add_task(async function test_click_query_selector_telemetry() {
// Clear telemetry.
Services.fog.testResetFOG();
// Enable cookie banner handling.
await SpecialPowers.pushPrefEnv({
set: [
["cookiebanners.service.mode", Ci.nsICookieBannerService.MODE_REJECT],
],
});
insertTestClickRules();
info("No telemetry recorded initially.");
await assertQuerySelectorTelemetry({
hasFrameData: false,
hasTopLevelData: false,
});
// No opt out rule for the example.org, the banner shouldn't be clicked.
info("Top level cookie banner with no matching rule.");
await openPageAndVerify({
win: window,
domain: TEST_DOMAIN_B,
testURL: TEST_PAGE_B,
visible: true,
expected: "NoClick",
});
await assertQuerySelectorTelemetry({
hasFrameData: false,
hasTopLevelData: true,
});
Services.cookieBanners.removeAllExecutedRecords(false);
info("Top level cookie banner with matching rule.");
await openPageAndVerify({
win: window,
domain: TEST_DOMAIN_A,
testURL: TEST_PAGE_A,
visible: false,
expected: "OptOut",
});
await assertQuerySelectorTelemetry({
hasFrameData: false,
hasTopLevelData: true,
});
Services.cookieBanners.removeAllExecutedRecords(false);
info("Iframe cookie banner with matching rule.");
await openIframeAndVerify({
win: window,
domain: TEST_DOMAIN_A,
testURL: TEST_PAGE_A,
visible: false,
expected: "OptOut",
});
await assertQuerySelectorTelemetry({
hasFrameData: true,
hasTopLevelData: true,
});
Services.cookieBanners.removeAllExecutedRecords(false);
// Reset test rules and insert only site-specific rules so we can ensure the
// clicking mechanism is only running for the iframe, not the top level.
info("Insert test rules without global rules.");
insertTestClickRules(false);
// Clear telemetry.
info("Clear telemetry.");
Services.fog.testResetFOG();
info("Iframe cookie banner with matching rule.");
await openIframeAndVerify({
win: window,
domain: TEST_DOMAIN_A,
testURL: TEST_PAGE_A,
visible: false,
expected: "OptOut",
});
await assertQuerySelectorTelemetry({
hasFrameData: true,
hasTopLevelData: false,
});
// Clear telemetry.
Services.fog.testResetFOG();
});