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:
@@ -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"]
|
||||
);
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
@@ -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();
|
||||
}
|
||||
});
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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" },
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user