/* 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/. */
"use strict";
const { AppConstants } = ChromeUtils.importESModule(
"resource://gre/modules/AppConstants.sys.mjs"
);
function updatePrefsAndDefines() {
let upload = Services.prefs.getBoolPref(
"datareporting.healthreport.uploadEnabled"
);
document.l10n.setAttributes(
document.querySelector(
"[data-l10n-id='about-glean-data-upload']"),
"about-glean-data-upload",
{
"data-upload-pref-value": upload,
}
);
let port = Services.prefs.getIntPref(
"telemetry.fog.test.localhost_port");
document.l10n.setAttributes(
document.querySelector(
"[data-l10n-id='about-glean-local-port']"),
"about-glean-local-port",
{
"local-port-pref-value": port,
}
);
document.l10n.setAttributes(
document.querySelector(
"[data-l10n-id='about-glean-glean-android']"),
"about-glean-glean-android",
{
"glean-android-define-value": AppConstants.MOZ_GLEAN_ANDROID }
);
document.l10n.setAttributes(
document.querySelector(
"[data-l10n-id='about-glean-moz-official']"),
"about-glean-moz-official",
{
"moz-official-define-value": AppConstants.MOZILLA_OFFICIAL }
);
// Knowing what we know, and copying logic from viaduct_uploader.rs,
// (which is documented in Preferences and Defines),
// tell the fine user whether and why upload is disabled.
let uploadMessageEl = document.getElementById(
"upload-status");
let uploadL10nId =
"about-glean-upload-enabled";
if (!upload) {
uploadL10nId =
"about-glean-upload-disabled";
}
else if (port < 0 || (port == 0 && !AppConstants.MOZILLA_OFFICIAL)) {
uploadL10nId =
"about-glean-upload-fake-enabled";
// This message has a link to the Glean Debug Ping Viewer in it.
// We must add the anchor element now so that Fluent can match it.
let a = document.createElement(
"a");
a.href =
"https://debug-ping-preview.firebaseapp.com/";
a.setAttribute(
"data-l10n-name",
"glean-debug-ping-viewer");
uploadMessageEl.appendChild(a);
}
else if (port > 0) {
uploadL10nId =
"about-glean-upload-enabled-local";
}
document.l10n.setAttributes(uploadMessageEl, uploadL10nId);
}
function camelToKebab(str) {
let out =
"";
for (let i = 0; i < str.length; i++) {
let c = str.charAt(i);
if (c == c.toUpperCase()) {
out +=
"-";
c = c.toLowerCase();
}
out += c;
}
return out;
}
// I'm consciously omitting "deletion-request" until someone can come up with
// a use-case for sending it via about:glean.
const GLEAN_BUILTIN_PINGS = [
"metrics",
"events",
"baseline"];
const NO_PING =
"(don't submit any ping)";
function refillPingNames() {
let select = document.getElementById(
"ping-names");
let pings = GLEAN_BUILTIN_PINGS.slice().concat(Object.keys(GleanPings));
pings.forEach(ping => {
let option = document.createElement(
"option");
option.textContent = camelToKebab(ping);
select.appendChild(option);
});
let option = document.createElement(
"option");
document.l10n.setAttributes(option,
"about-glean-no-ping-label");
option.value = NO_PING;
select.appendChild(option);
}
// If there's been a previous tag, use it.
// If not, be _slightly_ clever and derive a default one from the profile dir.
function fillDebugTag() {
const DEBUG_TAG_PREF =
"telemetry.fog.aboutGlean.debugTag";
let debugTag;
if (Services.prefs.prefHasUserValue(DEBUG_TAG_PREF)) {
debugTag = Services.prefs.getStringPref(DEBUG_TAG_PREF);
}
else {
const debugTagPrefix =
"about-glean-";
const profileDir = Services.dirsvc.get(
"ProfD", Ci.nsIFile).path;
let charSum = Array.from(profileDir).reduce(
(prev, cur) => prev + cur.charCodeAt(0),
0
);
debugTag = debugTagPrefix + (charSum % 1000);
}
let tagInput = document.getElementById(
"tag-pings");
tagInput.value = debugTag;
const updateDebugTagValues = () => {
document.l10n.setAttributes(
document.querySelector(
"[data-l10n-id='about-glean-label-for-controls-submit']"
),
"about-glean-label-for-controls-submit",
{
"debug-tag": tagInput.value }
);
const GDPV_ROOT =
"https://debug-ping-preview.firebaseapp.com/pings/";
let gdpvLink = document.querySelector(
"[data-l10n-name='gdpv-tagged-pings-link']"
);
gdpvLink.href = GDPV_ROOT + tagInput.value;
};
tagInput.addEventListener(
"change", () => {
Services.prefs.setStringPref(DEBUG_TAG_PREF, tagInput.value);
updateDebugTagValues();
});
updateDebugTagValues();
}
function showTab(button) {
let current_tab = document.querySelector(
".active");
let category = button.getAttribute(
"id").substring(
"category-".length);
let content = document.getElementById(category);
if (current_tab == content) {
return;
}
current_tab.classList.remove(
"active");
current_tab.hidden =
true;
content.classList.add(
"active");
content.hidden =
false;
let current_button = document.querySelector(
"[selected=true]");
current_button.removeAttribute(
"selected");
button.setAttribute(
"selected",
"true");
}
function onLoad() {
let menu = document.getElementById(
"categories");
menu.addEventListener(
"click",
function click(e) {
if (e.target && e.target.parentNode == menu) {
showTab(e.target);
}
});
showTab(document.getElementById(
"category-about-glean"));
updatePrefsAndDefines();
refillPingNames();
fillDebugTag();
document.getElementById(
"controls-submit").addEventListener(
"click", () => {
let tag = document.getElementById(
"tag-pings").value;
let log = document.getElementById(
"log-pings").checked;
let ping = document.getElementById(
"ping-names").value;
let feedbackToast = document.getElementById(
"feedback");
Services.fog.setLogPings(log);
Services.fog.setTagPings(tag);
if (ping != NO_PING) {
Services.fog.sendPing(ping);
feedbackToast.setAttribute(
"data-l10n-id",
"about-glean-feedback-settings-and-ping"
);
}
else {
feedbackToast.setAttribute(
"data-l10n-id",
"about-glean-feedback-settings-only"
);
}
feedbackToast.style.visibility =
"visible";
setTimeout(() => {
feedbackToast.style.visibility =
"hidden";
}, 3000);
});
}
window.addEventListener(
"load", onLoad);