Bug 1952996 - add active experiments, active addons, and the h1-in-section-ua-styles pref to the broken site reports; r=Gijs,android-reviewers,calu,beth,npoon

Differential Revision: https://phabricator.services.mozilla.com/D242042
This commit is contained in:
Thomas Wisniewski
2025-03-22 01:36:04 +00:00
parent d725eb1a1f
commit 4f77a2ac81
15 changed files with 605 additions and 2 deletions

View File

@@ -642,6 +642,7 @@ export var ReportBrokenSite = new (class ReportBrokenSite {
const gTabInfo = Glean.brokenSiteReportTabInfo;
const gAntitracking = Glean.brokenSiteReportTabInfoAntitracking;
const gFrameworks = Glean.brokenSiteReportTabInfoFrameworks;
const gBrowserInfo = Glean.brokenSiteReportBrowserInfo;
const gApp = Glean.brokenSiteReportBrowserInfoApp;
const gGraphics = Glean.brokenSiteReportBrowserInfoGraphics;
const gPrefs = Glean.brokenSiteReportBrowserInfoPrefs;
@@ -682,7 +683,19 @@ export var ReportBrokenSite = new (class ReportBrokenSite {
gFrameworks[name].set(value);
}
const { app, graphics, locales, platform, prefs, security } = browser;
const {
addons,
app,
experiments,
graphics,
locales,
platform,
prefs,
security,
} = browser;
gBrowserInfo.addons.set(addons);
gBrowserInfo.experiments.set(experiments);
gApp.defaultLocales.set(locales);
gApp.defaultUseragentString.set(app.defaultUserAgent);
@@ -699,6 +712,9 @@ export var ReportBrokenSite = new (class ReportBrokenSite {
gPrefs.globalPrivacyControlEnabled.set(
prefs["privacy.globalprivacycontrol.enabled"]
);
gPrefs.h1InSectionUseragentStylesEnabled.set(
prefs["layout.css.h1-in-section-ua-styles.enabled"]
);
gPrefs.installtriggerEnabled.set(
prefs["extensions.InstallTrigger.enabled"]
);

View File

@@ -6,6 +6,9 @@ support-files = [
"sendMoreInfoTestEndpoint.html",
]
["browser_addon_data_sent.js"]
support-files = [ "send_more_info.js" ]
["browser_antitracking_data_sent.js"]
support-files = [ "send_more_info.js" ]
@@ -13,6 +16,9 @@ support-files = [ "send_more_info.js" ]
["browser_error_messages.js"]
["browser_experiment_data_sent.js"]
support-files = [ "send_more_info.js" ]
["browser_keyboard_navigation.js"]
["browser_parent_menuitems.js"]

View File

@@ -0,0 +1,99 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
/* Tests to ensure that the right data is sent for
* private windows and when ETP blocks content.
*/
/* import-globals-from send.js */
/* import-globals-from send_more_info.js */
"use strict";
const { AddonTestUtils } = ChromeUtils.importESModule(
"resource://testing-common/AddonTestUtils.sys.mjs"
);
AddonTestUtils.initMochitest(this);
Services.scriptloader.loadSubScript(
getRootDirectory(gTestPath) + "send_more_info.js",
this
);
add_common_setup();
const TEMP_ID = "testtempaddon@tests.mozilla.org";
const TEMP_NAME = "Temporary Addon";
const TEMP_VERSION = "0.1.0";
const PERM_ID = "testpermaddon@tests.mozilla.org";
const PERM_NAME = "Permanent Addon";
const PERM_VERSION = "0.2.0";
const DISABLED_ID = "testdisabledaddon@tests.mozilla.org";
const DISABLED_NAME = "Disabled Addon";
const DISABLED_VERSION = "0.3.0";
const EXPECTED_ADDONS = [
{ id: PERM_ID, name: PERM_NAME, temporary: false, version: PERM_VERSION },
{ id: TEMP_ID, name: TEMP_NAME, temporary: true, version: TEMP_VERSION },
];
function loadAddon(id, name, version, isTemp = false) {
return ExtensionTestUtils.loadExtension({
manifest: {
browser_specific_settings: { gecko: { id } },
name,
version,
},
useAddonManager: isTemp ? "temporary" : "permanent",
});
}
async function installAddons() {
const temp = await loadAddon(TEMP_ID, TEMP_NAME, TEMP_VERSION, true);
await temp.startup();
const perm = await loadAddon(PERM_ID, PERM_NAME, PERM_VERSION);
await perm.startup();
const dis = await loadAddon(DISABLED_ID, DISABLED_NAME, DISABLED_VERSION);
await dis.startup();
await (await AddonManager.getAddonByID(DISABLED_ID)).disable();
return async () => {
await temp.unload();
await perm.unload();
await dis.unload();
};
}
add_task(async function testSendButton() {
ensureReportBrokenSitePreffedOn();
ensureReasonOptional();
const addonCleanup = await installAddons();
const tab = await openTab(REPORTABLE_PAGE_URL);
await testSend(tab, AppMenu(), {
addons: EXPECTED_ADDONS,
});
closeTab(tab);
await addonCleanup();
});
add_task(async function testSendingMoreInfo() {
ensureReportBrokenSitePreffedOn();
ensureSendMoreInfoEnabled();
const addonCleanup = await installAddons();
const tab = await openTab(REPORTABLE_PAGE_URL);
await testSendMoreInfo(tab, HelpMenu(), {
addons: EXPECTED_ADDONS,
});
closeTab(tab);
await addonCleanup();
});

View File

@@ -0,0 +1,83 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
/* Tests to ensure that the right data is sent for
* private windows and when ETP blocks content.
*/
/* import-globals-from send.js */
/* import-globals-from send_more_info.js */
"use strict";
Services.scriptloader.loadSubScript(
getRootDirectory(gTestPath) + "send_more_info.js",
this
);
const { ExperimentAPI } = ChromeUtils.importESModule(
"resource://nimbus/ExperimentAPI.sys.mjs"
);
const { ExperimentFakes } = ChromeUtils.importESModule(
"resource://testing-common/NimbusTestUtils.sys.mjs"
);
add_common_setup();
const EXPECTED_EXPERIMENTS_IN_REPORT = [
{ slug: "test-experiment", branch: "branch", kind: "nimbusExperiment" },
{ slug: "test-experiment-rollout", branch: "branch", kind: "nimbusRollout" },
];
let EXPERIMENT_CLEANUPS;
add_setup(async function () {
await ExperimentAPI.ready();
EXPERIMENT_CLEANUPS = [
await ExperimentFakes.enrollWithFeatureConfig(
{ featureId: "feature", value: { enabled: true } },
{ slug: "test-experiment", branchSlug: "branch" }
),
await ExperimentFakes.enrollWithFeatureConfig(
{ featureId: "feature", value: { enabled: true } },
{ slug: "test-experiment-rollout", isRollout: true, branchSlug: "branch" }
),
];
const disable = await ExperimentFakes.enrollWithFeatureConfig(
{ featureId: "feature-disabled", value: { enabled: false } },
{ slug: "test-experiment-disabled", active: false }
);
disable();
});
add_task(async function testSendButton() {
ensureReportBrokenSitePreffedOn();
ensureReasonOptional();
const tab = await openTab(REPORTABLE_PAGE_URL);
await testSend(tab, AppMenu(), {
experiments: EXPECTED_EXPERIMENTS_IN_REPORT,
});
closeTab(tab);
});
add_task(async function testSendingMoreInfo() {
ensureReportBrokenSitePreffedOn();
ensureSendMoreInfoEnabled();
const tab = await openTab(REPORTABLE_PAGE_URL);
await testSendMoreInfo(tab, HelpMenu(), {
experiments: EXPECTED_EXPERIMENTS_IN_REPORT,
});
closeTab(tab);
});
add_task(async function teardown() {
for (const cleanup of EXPERIMENT_CLEANUPS) {
cleanup();
}
});

View File

@@ -108,7 +108,9 @@ async function getExpectedWebCompatInfo(tab, snapshot, fullAppData = false) {
securitySoftware;
const browserInfo = {
addons: [],
app,
experiments: [],
graphics: {
devicesJson(actualStr) {
const expected = getExpectedGraphicsDevices(snapshot);
@@ -161,6 +163,10 @@ async function getExpectedWebCompatInfo(tab, snapshot, fullAppData = false) {
"privacy.globalprivacycontrol.enabled",
false
),
h1InSectionUseragentStylesEnabled: Services.prefs.getBoolPref(
"layout.css.h1-in-section-ua-styles.enabled",
false
),
installtriggerEnabled: Services.prefs.getBoolPref(
"extensions.InstallTrigger.enabled",
false
@@ -246,8 +252,12 @@ function extractBrokenSiteReportFromGleanPing(Glean) {
Glean.brokenSiteReportTabInfoFrameworks
);
ping.browserInfo = {
addons: Array.from(Glean.brokenSiteReportBrowserInfo.addons.testGetValue()),
app: extractPingData(Glean.brokenSiteReportBrowserInfoApp),
graphics: extractPingData(Glean.brokenSiteReportBrowserInfoGraphics),
experiments: Array.from(
Glean.brokenSiteReportBrowserInfo.experiments.testGetValue()
),
prefs: extractPingData(Glean.brokenSiteReportBrowserInfoPrefs),
security: extractPingData(Glean.brokenSiteReportBrowserInfoSecurity),
system: extractPingData(Glean.brokenSiteReportBrowserInfoSystem),
@@ -269,6 +279,14 @@ async function testSend(tab, menu, expectedOverrides = {}) {
expected.description = description;
expected.breakageCategory = breakageCategory;
if (expectedOverrides.addons) {
expected.browserInfo.addons = expectedOverrides.addons;
}
if (expectedOverrides.experiments) {
expected.browserInfo.experiments = expectedOverrides.experiments;
}
if (expectedOverrides.antitracking) {
expected.tabInfo.antitracking = expectedOverrides.antitracking;
}

View File

@@ -34,6 +34,8 @@ async function reformatExpectedWebCompatInfo(tab, overrides) {
const { devicePixelRatio, hasTouchScreen } = graphics;
const { antitracking, languages, useragentString } = tabInfo;
const addons = overrides.addons || [];
const experiments = overrides.experiments || [];
const atOverrides = overrides.antitracking;
const blockList = atOverrides?.blockList ?? antitracking.blockList;
const hasMixedActiveContentBlocked =
@@ -66,6 +68,8 @@ async function reformatExpectedWebCompatInfo(tab, overrides) {
forcedAcceleratedLayers: "layers.acceleration.force-enabled",
globalPrivacyControlEnabled: "privacy.globalprivacycontrol.enabled",
installtriggerEnabled: "extensions.InstallTrigger.enabled",
h1InSectionUseragentStylesEnabled:
"layout.css.h1-in-section-ua-styles.enabled",
opaqueResponseBlocking: "browser.opaqueResponseBlocking",
resistFingerprintingEnabled: "privacy.resistFingerprinting",
softwareWebrender: "gfx.webrender.software",
@@ -83,10 +87,12 @@ async function reformatExpectedWebCompatInfo(tab, overrides) {
blockList,
details: {
additionalData: {
addons,
applicationName,
blockList,
buildId: snapshot.application.buildID,
devicePixelRatio: parseInt(devicePixelRatio),
experiments,
finalUserAgent: useragentString,
fissionEnabled,
gfxData: {

View File

@@ -12947,6 +12947,67 @@ broken_site_report.tab_info.frameworks:
- webcompat-reporting-tool-telemetry@mozilla.com
send_in_pings:
- broken-site-report
broken_site_report.browser_info:
addons:
type: object
structure:
type: array
items:
type: object
properties:
id:
type: string
name:
type: string
temporary:
type: boolean
version:
type: string
expires: never
data_sensitivity:
- interaction
description: >
Active user-installed addons (not themes).
List of objects with `id`, `name`, `temporary`, and `version`.
For instance, `[{"id":"addon-name@email.org", "name":"My Addon", "temporary":false, "version":"0.1.0"}]`
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1952996
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1952996
notification_emails:
- twisniewski@mozilla.com
- webcompat-reporting-tool-telemetry@mozilla.com
send_in_pings:
- broken-site-report
experiments:
type: object
structure:
type: array
items:
type: object
properties:
branch:
type: string
slug:
type: string
kind:
type: string
expires: never
data_sensitivity:
- interaction
description: >
Experiments in which the user is actively enrolled.
List of objects with `branch`, `slug`, and `kind`.
For instance, `[{"branch":"some-branch", "slug":"some-experiment", "kind":"nimbusExperiment"}]`
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1952996
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1952996
notification_emails:
- twisniewski@mozilla.com
- webcompat-reporting-tool-telemetry@mozilla.com
send_in_pings:
- broken-site-report
broken_site_report.browser_info.app:
default_locales:
type: string_list

View File

@@ -54,7 +54,9 @@ data class WebCompatInfoDto(
/**
* WebCompat browser data.
*
* @property addons The addon data.
* @property app The app data.
* @property experiments The experiment data.
* @property graphics The graphics data.
* @property locales The locales data.
* @property platform The platform data.
@@ -62,12 +64,43 @@ data class WebCompatInfoDto(
*/
@Serializable
data class WebCompatBrowserDto(
val addons: List<AddonDto>,
val app: AppDto? = null,
val experiments: List<ExperimentDto>,
val graphics: GraphicsDto? = null,
val locales: List<String>,
val platform: PlatformDto,
val prefs: PrefsDto,
) {
/**
* WebCompat addon data.
*
* @property id The addon's id.
* @property name The addon's name.
* @property temporary Boolean, whether the add-on is temporarily installed.
* @property version The addon's version.
*/
@Serializable
data class AddonDto(
val id: String,
val name: String,
val temporary: Boolean,
val version: String,
)
/**
* WebCompat experiment data.
*
* @property branch The experiment's branch slug.
* @property slug The experiment's slug.
* @property kind The kind of experiment (nimbusExperiment, nimbusRollout).
*/
@Serializable
data class ExperimentDto(
val branch: String,
val slug: String,
val kind: String,
)
/**
* WebCompat app data.

View File

@@ -9,6 +9,7 @@ import kotlinx.coroutines.launch
import mozilla.components.lib.state.Middleware
import mozilla.components.lib.state.MiddlewareContext
import org.mozilla.fenix.GleanMetrics.BrokenSiteReport
import org.mozilla.fenix.GleanMetrics.BrokenSiteReportBrowserInfo
import org.mozilla.fenix.GleanMetrics.BrokenSiteReportBrowserInfoApp
import org.mozilla.fenix.GleanMetrics.BrokenSiteReportBrowserInfoGraphics
import org.mozilla.fenix.GleanMetrics.BrokenSiteReportBrowserInfoPrefs
@@ -87,6 +88,31 @@ class WebCompatReporterSubmissionMiddleware(
}
private fun setBrowserInfoMetrics(browserInfo: WebCompatInfoDto.WebCompatBrowserDto) {
val addons = BrokenSiteReportBrowserInfo.AddonsObject()
for (addon in browserInfo.addons) {
addons.add(
BrokenSiteReportBrowserInfo.AddonsObjectItem(
id = addon.id,
name = addon.name,
temporary = addon.temporary,
version = addon.version,
),
)
}
BrokenSiteReportBrowserInfo.addons.set(addons)
val experiments = BrokenSiteReportBrowserInfo.ExperimentsObject()
for (experiment in browserInfo.experiments) {
experiments.add(
BrokenSiteReportBrowserInfo.ExperimentsObjectItem(
branch = experiment.branch,
slug = experiment.slug,
kind = experiment.kind,
),
)
}
BrokenSiteReportBrowserInfo.experiments.set(experiments)
browserInfo.app?.let {
BrokenSiteReportBrowserInfoApp.defaultUseragentString.set(it.defaultUserAgent)
}

View File

@@ -47,9 +47,17 @@ class DefaultWebCompatReporterRetrievalServiceTest {
isPrivateBrowsing = false,
),
browser = WebCompatInfoDto.WebCompatBrowserDto(
addons = listOf(
WebCompatInfoDto.WebCompatBrowserDto.AddonDto(id = "id.temp", name = "name1", temporary = true, version = "version1"),
WebCompatInfoDto.WebCompatBrowserDto.AddonDto(id = "id.perm", name = "name2", temporary = false, version = "version2"),
),
app = WebCompatInfoDto.WebCompatBrowserDto.AppDto(
defaultUserAgent = "testDefaultUserAgent",
),
experiments = listOf(
WebCompatInfoDto.WebCompatBrowserDto.ExperimentDto(branch = "branch1", slug = "slug1", kind = "kind1"),
WebCompatInfoDto.WebCompatBrowserDto.ExperimentDto(branch = "branch2", slug = "slug2", kind = "kind2"),
),
graphics = WebCompatInfoDto.WebCompatBrowserDto.GraphicsDto(
devices = buildJsonArray {
addJsonObject {
@@ -138,9 +146,17 @@ class DefaultWebCompatReporterRetrievalServiceTest {
isPrivateBrowsing = false,
),
browser = WebCompatInfoDto.WebCompatBrowserDto(
addons = listOf(
WebCompatInfoDto.WebCompatBrowserDto.AddonDto(id = "id.temp", name = "name1", temporary = true, version = "version1"),
WebCompatInfoDto.WebCompatBrowserDto.AddonDto(id = "id.perm", name = "name2", temporary = false, version = "version2"),
),
app = WebCompatInfoDto.WebCompatBrowserDto.AppDto(
defaultUserAgent = "testDefaultUserAgent",
),
experiments = listOf(
WebCompatInfoDto.WebCompatBrowserDto.ExperimentDto(branch = "branch1", slug = "slug1", kind = "kind1"),
WebCompatInfoDto.WebCompatBrowserDto.ExperimentDto(branch = "branch2", slug = "slug2", kind = "kind2"),
),
graphics = WebCompatInfoDto.WebCompatBrowserDto.GraphicsDto(
devices = buildJsonArray {
addJsonObject {

View File

@@ -22,6 +22,7 @@ import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.GleanMetrics.BrokenSiteReport
import org.mozilla.fenix.GleanMetrics.BrokenSiteReportBrowserInfo
import org.mozilla.fenix.GleanMetrics.BrokenSiteReportBrowserInfoApp
import org.mozilla.fenix.GleanMetrics.BrokenSiteReportBrowserInfoGraphics
import org.mozilla.fenix.GleanMetrics.BrokenSiteReportBrowserInfoPrefs
@@ -79,6 +80,16 @@ class WebCompatReporterSubmissionMiddlewareTest {
BrokenSiteReportTabInfoAntitracking.isPrivateBrowsing.testGetValue(),
)
assertEquals(
BrokenSiteReportBrowserInfo.AddonsObject(),
BrokenSiteReportBrowserInfo.addons.testGetValue(),
)
assertEquals(
BrokenSiteReportBrowserInfo.ExperimentsObject(),
BrokenSiteReportBrowserInfo.experiments.testGetValue(),
)
assertEquals(
"testDefaultUserAgent",
BrokenSiteReportBrowserInfoApp.defaultUseragentString.testGetValue(),
@@ -208,6 +219,19 @@ class WebCompatReporterSubmissionMiddlewareTest {
assertNull(BrokenSiteReportTabInfoAntitracking.hasTrackingContentBlocked.testGetValue())
assertNull(BrokenSiteReportTabInfoAntitracking.isPrivateBrowsing.testGetValue())
assertNull(BrokenSiteReportBrowserInfo.addons.testGetValue())
assertNull(BrokenSiteReportBrowserInfo.experiments.testGetValue())
assertEquals(
BrokenSiteReportBrowserInfo.AddonsObject(),
BrokenSiteReportBrowserInfo.addons.testGetValue(),
)
assertEquals(
BrokenSiteReportBrowserInfo.ExperimentsObject(),
BrokenSiteReportBrowserInfo.experiments.testGetValue(),
)
assertEquals(
"testDefaultUserAgent",
BrokenSiteReportBrowserInfoApp.defaultUseragentString.testGetValue(),
@@ -234,6 +258,16 @@ class WebCompatReporterSubmissionMiddlewareTest {
BrokenSiteReportBrowserInfoGraphics.monitorsJson.testGetValue(),
)
assertEquals(
BrokenSiteReportBrowserInfo.AddonsObject(),
BrokenSiteReportBrowserInfo.addons.testGetValue(),
)
assertEquals(
BrokenSiteReportBrowserInfo.ExperimentsObject(),
BrokenSiteReportBrowserInfo.experiments.testGetValue(),
)
assertEquals(
listOf("en-CA", "en-US"),
BrokenSiteReportBrowserInfoApp.defaultLocales.testGetValue(),
@@ -317,6 +351,9 @@ class WebCompatReporterSubmissionMiddlewareTest {
assertNull(BrokenSiteReportTabInfoAntitracking.hasTrackingContentBlocked.testGetValue())
assertNull(BrokenSiteReportTabInfoAntitracking.isPrivateBrowsing.testGetValue())
assertNull(BrokenSiteReportBrowserInfo.addons.testGetValue())
assertNull(BrokenSiteReportBrowserInfo.experiments.testGetValue())
assertNull(BrokenSiteReportBrowserInfoApp.defaultUseragentString.testGetValue())
assertNull(BrokenSiteReportBrowserInfoGraphics.devicesJson.testGetValue())
@@ -389,9 +426,17 @@ class WebCompatReporterSubmissionMiddlewareTest {
isPrivateBrowsing = false,
),
browser = WebCompatInfoDto.WebCompatBrowserDto(
addons = listOf(
WebCompatInfoDto.WebCompatBrowserDto.AddonDto(id = "id.temp", name = "name1", temporary = true, version = "version1"),
WebCompatInfoDto.WebCompatBrowserDto.AddonDto(id = "id.perm", name = "name2", temporary = false, version = "version2"),
),
app = WebCompatInfoDto.WebCompatBrowserDto.AppDto(
defaultUserAgent = "testDefaultUserAgent",
),
experiments = listOf(
WebCompatInfoDto.WebCompatBrowserDto.ExperimentDto(branch = "branch1", slug = "slug1", kind = "kind1"),
WebCompatInfoDto.WebCompatBrowserDto.ExperimentDto(branch = "branch2", slug = "slug2", kind = "kind2"),
),
graphics = WebCompatInfoDto.WebCompatBrowserDto.GraphicsDto(
devices = buildJsonArray {
addJsonObject {

View File

@@ -17,9 +17,33 @@ object WebCompatTestData {
"isPrivateBrowsing": false
},
"browser": {
"addons": [
{
"id": "id.temp",
"name": "name1",
"temporary": true,
"version": "version1"
}, {
"id": "id.perm",
"name": "name2",
"temporary": false,
"version": "version2"
}
],
"app": {
"defaultUserAgent": "testDefaultUserAgent"
},
"experiments": [
{
"branch": "branch1",
"slug": "slug1",
"kind": "kind1"
}, {
"branch": "branch2",
"slug": "slug2",
"kind": "kind2"
}
],
"graphics": {
"devices": [
{ "id": "device1" },
@@ -78,9 +102,33 @@ object WebCompatTestData {
"isPrivateBrowsing": false
},
"browser": {
"addons": [
{
"id": "id.temp",
"name": "name1",
"temporary": true,
"version": "version1"
}, {
"id": "id.perm",
"name": "name2",
"temporary": false,
"version": "version2"
}
],
"app": {
"defaultUserAgent": "testDefaultUserAgent"
},
"experiments": [
{
"branch": "branch1",
"slug": "slug1",
"kind": "kind1"
}, {
"branch": "branch2",
"slug": "slug2",
"kind": "kind2"
}
],
"graphics": {
"devices": [
{ "id": "device1" },

View File

@@ -294,7 +294,16 @@ export class ReportBrokenSiteChild extends JSWindowActorChild {
message.blockList = blockList;
const { app, graphics, locales, prefs, platform, security } = browser;
const {
addons,
app,
experiments,
graphics,
locales,
prefs,
platform,
security,
} = browser;
const {
applicationName,
@@ -315,10 +324,12 @@ export class ReportBrokenSiteChild extends JSWindowActorChild {
} = platform;
const additionalData = {
addons,
applicationName,
blockList,
buildId,
devicePixelRatio,
experiments,
finalUserAgent: userAgent,
fissionEnabled,
gfxData: graphics,

View File

@@ -187,6 +187,7 @@ export class ReportBrokenSiteParent extends JSWindowActorParent {
"gfx.webrender.software",
"browser.opaqueResponseBlocking",
"extensions.InstallTrigger.enabled",
"layout.css.h1-in-section-ua-styles.enabled",
"privacy.resistFingerprinting",
"privacy.globalprivacycontrol.enabled",
"network.cookie.cookieBehavior.optInPartitioning",
@@ -246,10 +247,63 @@ export class ReportBrokenSiteParent extends JSWindowActorParent {
return result;
}
static AUTOMATION_ADDON_IDS = [
"mochikit@mozilla.org",
"special-powers@mozilla.org",
];
static WANTED_ADDON_LOCATIONS = ["app-profile", "app-temporary"];
#getActiveAddons(troubleshootingInfo) {
const { addons } = troubleshootingInfo;
if (!addons) {
return [];
}
// We only care about enabled addons (not themes) the user
// installed, not ones bundled with Firefox.
const toReport = addons.filter(
({ id, isActive, type, locationName }) =>
(!Cu.isInAutomation ||
!ReportBrokenSiteParent.AUTOMATION_ADDON_IDS.includes(id)) &&
isActive &&
type === "extension" &&
ReportBrokenSiteParent.WANTED_ADDON_LOCATIONS.includes(locationName)
);
return toReport.map(({ id, name, version, locationName }) => {
return {
id,
name,
temporary: locationName === "app-temporary",
version,
};
});
}
#getActiveExperiments(troubleshootingInfo) {
if (!troubleshootingInfo?.normandy) {
return [];
}
const {
normandy: { nimbusExperiments, nimbusRollouts },
} = troubleshootingInfo;
return [
nimbusExperiments.map(({ slug, branch }) => {
return { slug, branch: branch.slug, kind: "nimbusExperiment" };
}),
nimbusRollouts.map(({ slug, branch }) => {
return { slug, branch: branch.slug, kind: "nimbusRollout" };
}),
]
.flat()
.sort((a, b) => a.slug.localeCompare(b.slug));
}
async #getBrowserInfo() {
const troubleshootingInfo = await Troubleshoot.snapshot();
return {
addons: this.#getActiveAddons(troubleshootingInfo),
app: this.#getAppInfo(troubleshootingInfo),
experiments: this.#getActiveExperiments(troubleshootingInfo),
graphics: this.#getGraphicsInfo(troubleshootingInfo),
locales: troubleshootingInfo.intl.localeService.available,
prefs: this.#getPrefs(),

View File

@@ -255,6 +255,70 @@ broken_site_report.tab_info.frameworks:
- broken-site-report
broken_site_report.browser_info:
addons:
type: object
structure:
type: array
items:
type: object
properties:
id:
type: string
name:
type: string
temporary:
type: boolean
version:
type: string
expires: never
data_sensitivity:
- interaction
description: >
Active user-installed addons (not themes).
List of objects with `id`, `name`, `temporary`, and `version`.
For instance, `[{"id":"addon-name@email.org", "name":"My Addon", "temporary":false, "version":"0.1.0"}]`
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1952996
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1952996
notification_emails:
- twisniewski@mozilla.com
- webcompat-reporting-tool-telemetry@mozilla.com
send_in_pings:
- broken-site-report
experiments:
type: object
structure:
type: array
items:
type: object
properties:
branch:
type: string
slug:
type: string
kind:
type: string
expires: never
data_sensitivity:
- interaction
description: >
Experiments in which the user is actively enrolled.
List of objects with `branch`, `slug`, and `kind`.
For instance, `[{"branch":"some-branch", "slug":"some-experiment", "kind":"nimbusExperiment"}]`
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1952996
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1952996
notification_emails:
- twisniewski@mozilla.com
- webcompat-reporting-tool-telemetry@mozilla.com
send_in_pings:
- broken-site-report
broken_site_report.browser_info.app:
default_locales:
type: string_list
@@ -555,6 +619,23 @@ broken_site_report.browser_info.prefs:
send_in_pings:
- broken-site-report
h1_in_section_useragent_styles_enabled:
type: boolean
expires: never
data_sensitivity:
- interaction
description: >
Value of `layout.css.h1-in-section-ua-styles.enabled`
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1952996
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1852340#c16
notification_emails:
- twisniewski@mozilla.com
- webcompat-reporting-tool-telemetry@mozilla.com
send_in_pings:
- broken-site-report
resist_fingerprinting_enabled:
type: boolean
expires: never