From e2cfa0f4150567930a5d379dab6fa547a89b2787 Mon Sep 17 00:00:00 2001 From: Claas Augner Date: Wed, 4 Feb 2026 11:17:33 +0100 Subject: [PATCH 01/22] feat(glean): measure TOC clicks Fixes #1030 --- components/generic-toc/server.js | 7 ++++++- components/reference-toc/server.js | 6 +++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/components/generic-toc/server.js b/components/generic-toc/server.js index 54f893d65..5e35def83 100644 --- a/components/generic-toc/server.js +++ b/components/generic-toc/server.js @@ -25,7 +25,12 @@ export class GenericToc extends ServerComponent { ${context.hyData.toc.map( ({ id, text }) => html`
  • - ${text} + ${text}
  • `, )} diff --git a/components/reference-toc/server.js b/components/reference-toc/server.js index 666d55530..f2cf73e7d 100644 --- a/components/reference-toc/server.js +++ b/components/reference-toc/server.js @@ -21,7 +21,11 @@ export class ReferenceToc extends ServerComponent { `; From 9fe1ea93936edffcbc7744cadbde062ae16f836e Mon Sep 17 00:00:00 2001 From: Claas Augner Date: Wed, 4 Feb 2026 11:18:24 +0100 Subject: [PATCH 02/22] feat(glean): measure sidebar filter Fixes #1031 --- components/sidebar-filter/element.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/components/sidebar-filter/element.js b/components/sidebar-filter/element.js index eb9a39348..bbf01e4c3 100644 --- a/components/sidebar-filter/element.js +++ b/components/sidebar-filter/element.js @@ -5,6 +5,7 @@ import { LitElement, html } from "lit"; import { L10nMixin } from "../../l10n/mixin.js"; +import { gleanClick } from "../../utils/glean.js"; import cancelIcon from "../icon/cancel.svg?lit"; import styles from "./element.css?lit"; @@ -91,6 +92,7 @@ class MDNSidebarFilter extends L10nMixin(LitElement) { // Mark that the user has typed if the query is non-empty. if (this.query && this.query.trim().length > 0 && !this.hasTyped) { this.hasTyped = true; + gleanClick("sidebar_filter_typed"); } if (this._quicklinks) { @@ -116,6 +118,14 @@ class MDNSidebarFilter extends L10nMixin(LitElement) { } } + /** + * Event handler for focus events on the text field. + * @private + */ + _onFocus() { + gleanClick("sidebar_filter_focus"); + } + /** * Event handler for input events on the text field. * @param {Event} event The input event. @@ -150,6 +160,7 @@ class MDNSidebarFilter extends L10nMixin(LitElement) { type="text" placeholder=${this.l10n`Filter`} .value=${this.query} + @focus=${this._onFocus} @input=${this._onInput} /> ${this.matchCount === undefined From f5fd5711d354f4d27246e9621a54ab9ceb78f726 Mon Sep 17 00:00:00 2001 From: Claas Augner Date: Wed, 4 Feb 2026 11:19:01 +0100 Subject: [PATCH 03/22] feat(glean): measure a11y menu Fixes #1032 --- components/a11y-menu/server.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/components/a11y-menu/server.js b/components/a11y-menu/server.js index 18104c998..ab90cceb0 100644 --- a/components/a11y-menu/server.js +++ b/components/a11y-menu/server.js @@ -8,8 +8,16 @@ export class A11yMenu extends ServerComponent { */ render(context) { return html``; } } From c395adfa7a1c908e2a48f06f302be54b47b2e43e Mon Sep 17 00:00:00 2001 From: Claas Augner Date: Wed, 4 Feb 2026 11:20:57 +0100 Subject: [PATCH 04/22] feat(glean): measure theme switcher Fixes #1033 --- components/color-theme/element.js | 21 +++++++++++++++++++++ components/dropdown/element.js | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/components/color-theme/element.js b/components/color-theme/element.js index 639017a99..0615667b3 100644 --- a/components/color-theme/element.js +++ b/components/color-theme/element.js @@ -1,6 +1,7 @@ import { LitElement, html } from "lit"; import { L10nMixin } from "../../l10n/mixin.js"; +import { gleanClick } from "../../utils/glean.js"; import styles from "./element.css?lit"; @@ -30,6 +31,8 @@ export class MDNColorTheme extends L10nMixin(LitElement) { const mode = target.dataset.mode; if (mode === "light dark" || mode === "light" || mode === "dark") { this._mode = mode; + const gleanMode = mode === "light dark" ? "os-default" : mode; + gleanClick(`theme_switcher: switch -> ${gleanMode}`); try { localStorage.setItem("theme", mode); } catch (error) { @@ -43,6 +46,11 @@ export class MDNColorTheme extends L10nMixin(LitElement) { } } + /** @param {boolean} open */ + _onDropdownToggle(open) { + gleanClick(`theme_switcher: ${open ? "open" : "close"}`); + } + /** * @param {import("lit").PropertyValues} changedProperties */ @@ -114,6 +122,19 @@ export class MDNColorTheme extends L10nMixin(LitElement) { if (mode === "light dark" || mode === "light" || mode === "dark") { this._mode = mode; } + + // Observe dropdown open/close for Glean + const dropdown = this.shadowRoot?.querySelector("mdn-dropdown"); + if (dropdown) { + const observer = new MutationObserver((mutations) => { + for (const mutation of mutations) { + if (mutation.attributeName === "open") { + this._onDropdownToggle(dropdown.hasAttribute("open")); + } + } + }); + observer.observe(dropdown, { attributes: true }); + } } } diff --git a/components/dropdown/element.js b/components/dropdown/element.js index d4f1bb98c..7a08e4140 100644 --- a/components/dropdown/element.js +++ b/components/dropdown/element.js @@ -22,7 +22,7 @@ export class MDNDropdown extends LitElement { static styles = styles; static properties = { - open: { type: Boolean }, + open: { type: Boolean, reflect: true }, loaded: { type: Boolean, reflect: true }, }; From 372c3fd73a37f8356f9206afe5c15121778f0a0e Mon Sep 17 00:00:00 2001 From: Claas Augner Date: Wed, 4 Feb 2026 11:21:31 +0100 Subject: [PATCH 05/22] feat(glean): measure menu bar login Fixes #1034 --- components/login-button/element.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/components/login-button/element.js b/components/login-button/element.js index c292d5fcf..aa651c3ee 100644 --- a/components/login-button/element.js +++ b/components/login-button/element.js @@ -16,7 +16,9 @@ export class MDNLoginButton extends L10nMixin(LitElement) { } render() { - return html`${this.l10n`Login`}`; } From 2c4723d7ec8ff10c53587e43c4819c7ad06a4cbb Mon Sep 17 00:00:00 2001 From: Claas Augner Date: Wed, 4 Feb 2026 11:22:10 +0100 Subject: [PATCH 06/22] fix(glean): fix baseline banner measurement Add missing toggle event handler for data-glean-toggle-open attribute. Fixes #1035 --- hooks/glean-init.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/hooks/glean-init.js b/hooks/glean-init.js index e01494c45..2320bbb9e 100644 --- a/hooks/glean-init.js +++ b/hooks/glean-init.js @@ -23,6 +23,16 @@ Glean.initialize(GLEAN_APP_ID, uploadEnabled, { channel: GLEAN_CHANNEL, }); +document.addEventListener("toggle", (event) => { + const target = event.target; + if (target instanceof HTMLDetailsElement) { + const gleanId = target.dataset.gleanToggleOpen; + if (gleanId && target.open) { + gleanClick(gleanId); + } + } +}); + document.addEventListener("click", (event) => { const composedTarget = event.composedPath()?.[0]; if (composedTarget !== event.target && composedTarget instanceof Element) { From 43e18d9fa10787c8c2d542f06d3f04593f24e2a9 Mon Sep 17 00:00:00 2001 From: Claas Augner Date: Wed, 4 Feb 2026 11:22:44 +0100 Subject: [PATCH 07/22] feat(glean): measure breadcrumb clicks Fixes #1036 --- components/breadcrumbs/server.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/components/breadcrumbs/server.js b/components/breadcrumbs/server.js index a709313b9..f4b74e1bf 100644 --- a/components/breadcrumbs/server.js +++ b/components/breadcrumbs/server.js @@ -18,6 +18,7 @@ export class Breadcrumbs extends ServerComponent { return nothing; } + const total = parents.length; return html`