summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--D132929.diff18
-rw-r--r--D133209.diff197
-rw-r--r--D133485.diff31
-rw-r--r--D133634.diff119
-rw-r--r--D133885.diff33
-rw-r--r--D134141.diff12
-rw-r--r--build-arm-wasm.patch21
-rw-r--r--build-disable-elfhack.patch10
-rw-r--r--build-python-glean.patch1763
-rw-r--r--firefox.spec31
-rw-r--r--mozilla-1667096.patch42
-rw-r--r--mozilla-1753402.patch12
-rw-r--r--sources4
14 files changed, 51 insertions, 2244 deletions
diff --git a/.gitignore b/.gitignore
index b09031a..9a0d014 100644
--- a/.gitignore
+++ b/.gitignore
@@ -491,3 +491,5 @@ firefox-3.6.4.source.tar.bz2
/firefox-96.0.1.source.tar.xz
/firefox-96.0.3.source.tar.xz
/firefox-langpacks-96.0.3-20220131.tar.xz
+/firefox-97.0.source.tar.xz
+/firefox-langpacks-97.0-20220208.tar.xz
diff --git a/D132929.diff b/D132929.diff
deleted file mode 100644
index 0a61842..0000000
--- a/D132929.diff
+++ /dev/null
@@ -1,18 +0,0 @@
-diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp
---- a/widget/gtk/nsWindow.cpp
-+++ b/widget/gtk/nsWindow.cpp
-@@ -2946,7 +2946,12 @@
- uint32_t timestamp = GDK_CURRENT_TIME;
-
- nsGTKToolkit* GTKToolkit = nsGTKToolkit::GetToolkit();
-- if (GTKToolkit) timestamp = GTKToolkit->GetFocusTimestamp();
-+ if (GTKToolkit) {
-+ timestamp = GTKToolkit->GetFocusTimestamp();
-+ }
-+ if (!timestamp) {
-+ timestamp = GetLastUserInputTime();
-+ }
-
- LOG(" requesting toplevel activation [%p]\n", (void*)toplevelWindow);
- gtk_window_present_with_time(GTK_WINDOW(toplevelWindow->mShell),
-
diff --git a/D133209.diff b/D133209.diff
deleted file mode 100644
index 81908f9..0000000
--- a/D133209.diff
+++ /dev/null
@@ -1,197 +0,0 @@
-diff --git a/widget/gtk/nsGtkKeyUtils.h b/widget/gtk/nsGtkKeyUtils.h
---- a/widget/gtk/nsGtkKeyUtils.h
-+++ b/widget/gtk/nsGtkKeyUtils.h
-@@ -202,6 +202,22 @@
- * from xkb_keymap. We call that from Wayland backend routines.
- */
- static void SetModifierMasks(xkb_keymap* aKeymap);
-+
-+ /**
-+ * Wayland global focus handlers
-+ */
-+ static void SetFocusIn(wl_surface* aFocusSurface, uint32_t aFocusSerial);
-+ static void SetFocusOut(wl_surface* aFocusSurface);
-+ static void GetFocusInfo(wl_surface** aFocusSurface, uint32_t* aFocusSerial);
-+
-+ static void SetSeat(wl_seat* aSeat);
-+ static wl_seat* GetSeat();
-+
-+ /**
-+ * EnsureInstance() is provided on Wayland to register Wayland callbacks
-+ * early.
-+ */
-+ static void EnsureInstance();
- #endif
-
- /**
-@@ -467,6 +483,12 @@
- void SetModifierMask(xkb_keymap* aKeymap, ModifierIndex aModifierIndex,
- const char* aModifierName);
- #endif
-+
-+#ifdef MOZ_WAYLAND
-+ wl_seat* mSeat = nullptr;
-+ wl_surface* mFocusSurface = nullptr;
-+ uint32_t mFocusSerial = 0;
-+#endif
- };
-
- } // namespace widget
-diff --git a/widget/gtk/nsGtkKeyUtils.cpp b/widget/gtk/nsGtkKeyUtils.cpp
---- a/widget/gtk/nsGtkKeyUtils.cpp
-+++ b/widget/gtk/nsGtkKeyUtils.cpp
-@@ -331,6 +331,10 @@
- return sInstance;
- }
-
-+#ifdef MOZ_WAYLAND
-+void KeymapWrapper::EnsureInstance() { (void)GetInstance(); }
-+#endif
-+
- /* static */
- void KeymapWrapper::Shutdown() {
- if (sInstance) {
-@@ -720,10 +724,15 @@
-
- static void keyboard_handle_enter(void* data, struct wl_keyboard* keyboard,
- uint32_t serial, struct wl_surface* surface,
-- struct wl_array* keys) {}
-+ struct wl_array* keys) {
-+ KeymapWrapper::SetFocusIn(surface, serial);
-+}
-+
- static void keyboard_handle_leave(void* data, struct wl_keyboard* keyboard,
- uint32_t serial, struct wl_surface* surface) {
-+ KeymapWrapper::SetFocusOut(surface);
- }
-+
- static void keyboard_handle_key(void* data, struct wl_keyboard* keyboard,
- uint32_t serial, uint32_t time, uint32_t key,
- uint32_t state) {}
-@@ -760,6 +769,7 @@
- if (strcmp(interface, "wl_seat") == 0) {
- auto* seat =
- WaylandRegistryBind<wl_seat>(registry, id, &wl_seat_interface, 1);
-+ KeymapWrapper::SetSeat(seat);
- wl_seat_add_listener(seat, &seat_listener, data);
- }
- }
-@@ -2411,5 +2421,40 @@
- altLatinCharCodes.mShiftedCharCode));
- }
-
-+#ifdef MOZ_WAYLAND
-+void KeymapWrapper::SetFocusIn(wl_surface* aFocusSurface,
-+ uint32_t aFocusSerial) {
-+ KeymapWrapper* keymapWrapper = KeymapWrapper::GetInstance();
-+ keymapWrapper->mFocusSurface = aFocusSurface;
-+ keymapWrapper->mFocusSerial = aFocusSerial;
-+}
-+
-+void KeymapWrapper::SetFocusOut(wl_surface* aFocusSurface) {
-+ KeymapWrapper* keymapWrapper = KeymapWrapper::GetInstance();
-+ if (aFocusSurface == keymapWrapper->mFocusSurface) {
-+ keymapWrapper->mFocusSurface = nullptr;
-+ keymapWrapper->mFocusSerial = 0;
-+ }
-+}
-+
-+void KeymapWrapper::GetFocusInfo(wl_surface** aFocusSurface,
-+ uint32_t* aFocusSerial) {
-+ KeymapWrapper* keymapWrapper = KeymapWrapper::GetInstance();
-+ *aFocusSurface = keymapWrapper->mFocusSurface;
-+ *aFocusSerial = keymapWrapper->mFocusSerial;
-+}
-+
-+void KeymapWrapper::SetSeat(wl_seat* aSeat) {
-+ KeymapWrapper* keymapWrapper = KeymapWrapper::GetInstance();
-+ keymapWrapper->mSeat = aSeat;
-+}
-+
-+wl_seat* KeymapWrapper::GetSeat() {
-+ KeymapWrapper* keymapWrapper = KeymapWrapper::GetInstance();
-+ return keymapWrapper->mSeat;
-+}
-+
-+#endif
-+
- } // namespace widget
- } // namespace mozilla
-diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp
---- a/widget/gtk/nsWindow.cpp
-+++ b/widget/gtk/nsWindow.cpp
-@@ -2862,8 +2862,7 @@
- };
-
- void nsWindow::RequestFocusWaylandWindow(RefPtr<nsWindow> aWindow) {
-- LOG("nsWindow::RequestWindowFocusWayland(%p) gFocusWindow [%p]",
-- (void*)aWindow, gFocusWindow);
-+ LOG("nsWindow::RequestWindowFocusWayland(%p)", (void*)aWindow);
-
- RefPtr<nsWaylandDisplay> display = WaylandDisplayGet();
- xdg_activation_v1* xdg_activation = display->GetXdgActivation();
-@@ -2872,17 +2871,11 @@
- return;
- }
-
-- // We use xdg-activation protocol to transfer focus from gFocusWindow to
-- // aWindow. Quit if no window is focused.
-- if (gFocusWindow != this) {
-- LOG(" there isn't any focused window to transfer focus from, quit.");
-- return;
-- }
--
-- wl_surface* surface =
-- mGdkWindow ? gdk_wayland_window_get_wl_surface(mGdkWindow) : nullptr;
-- if (!surface) {
-- LOG(" requesting window is hidden/unmapped, quit.");
-+ wl_surface* focusSurface;
-+ uint32_t focusSerial;
-+ KeymapWrapper::GetFocusInfo(&focusSurface, &focusSerial);
-+ if (!focusSurface) {
-+ LOG(" We're missing focused window, quit.");
- return;
- }
-
-@@ -2894,9 +2887,9 @@
- // callback.
- xdg_activation_token_v1_add_listener(aWindow->mXdgToken, &token_listener,
- do_AddRef(aWindow).take());
-- xdg_activation_token_v1_set_serial(aWindow->mXdgToken, GetLastUserInputTime(),
-- display->GetSeat());
-- xdg_activation_token_v1_set_surface(aWindow->mXdgToken, surface);
-+ xdg_activation_token_v1_set_serial(aWindow->mXdgToken, focusSerial,
-+ KeymapWrapper::GetSeat());
-+ xdg_activation_token_v1_set_surface(aWindow->mXdgToken, focusSurface);
- xdg_activation_token_v1_commit(aWindow->mXdgToken);
- }
- #endif
-@@ -2959,11 +2952,7 @@
-
- #ifdef MOZ_WAYLAND
- if (GdkIsWaylandDisplay()) {
-- if (gFocusWindow) {
-- gFocusWindow->RequestFocusWaylandWindow(toplevelWindow);
-- } else {
-- LOG(" RequestFocusWaylandWindow(): we're missing focused window!");
-- }
-+ RequestFocusWaylandWindow(toplevelWindow);
- }
- #endif
- if (GTKToolkit) GTKToolkit->SetFocusTimestamp(0);
-@@ -5359,6 +5348,14 @@
- a11y::PreInit();
- #endif
-
-+#ifdef MOZ_WAYLAND
-+ // Ensure that KeymapWrapper is created on Wayland as we need it for
-+ // keyboard focus tracking.
-+ if (GdkIsWaylandDisplay()) {
-+ KeymapWrapper::EnsureInstance();
-+ }
-+#endif
-+
- // Ensure that the toolkit is created.
- nsGTKToolkit::GetToolkit();
-
-
diff --git a/D133485.diff b/D133485.diff
deleted file mode 100644
index 6785c55..0000000
--- a/D133485.diff
+++ /dev/null
@@ -1,31 +0,0 @@
-diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp
---- a/widget/gtk/nsWindow.cpp
-+++ b/widget/gtk/nsWindow.cpp
-@@ -2879,6 +2879,10 @@
- return;
- }
-
-+ LOG(" requesting xdg-activation token, surface ID %d serial %d seat ID %d",
-+ wl_proxy_get_id((struct wl_proxy*)focusSurface), focusSerial,
-+ wl_proxy_get_id((struct wl_proxy*)KeymapWrapper::GetSeat()));
-+
- // Store activation token at activated window for further release.
- g_clear_pointer(&aWindow->mXdgToken, xdg_activation_token_v1_destroy);
- aWindow->mXdgToken = xdg_activation_v1_get_activation_token(xdg_activation);
-@@ -2941,6 +2945,7 @@
- nsGTKToolkit* GTKToolkit = nsGTKToolkit::GetToolkit();
- if (GTKToolkit) {
- timestamp = GTKToolkit->GetFocusTimestamp();
-+ GTKToolkit->SetFocusTimestamp(0);
- }
- if (!timestamp) {
- timestamp = GetLastUserInputTime();
-@@ -2955,7 +2960,6 @@
- RequestFocusWaylandWindow(toplevelWindow);
- }
- #endif
-- if (GTKToolkit) GTKToolkit->SetFocusTimestamp(0);
- }
- return;
- }
-
diff --git a/D133634.diff b/D133634.diff
deleted file mode 100644
index 3c9d642..0000000
--- a/D133634.diff
+++ /dev/null
@@ -1,119 +0,0 @@
-diff --git a/widget/gtk/nsGtkKeyUtils.cpp b/widget/gtk/nsGtkKeyUtils.cpp
---- a/widget/gtk/nsGtkKeyUtils.cpp
-+++ b/widget/gtk/nsGtkKeyUtils.cpp
-@@ -2424,17 +2424,23 @@
- #ifdef MOZ_WAYLAND
- void KeymapWrapper::SetFocusIn(wl_surface* aFocusSurface,
- uint32_t aFocusSerial) {
-+ LOGW("KeymapWrapper::SetFocusIn() surface %p ID %d serial %d", aFocusSurface,
-+ aFocusSurface ? wl_proxy_get_id((struct wl_proxy*)aFocusSurface) : 0,
-+ aFocusSerial);
-+
- KeymapWrapper* keymapWrapper = KeymapWrapper::GetInstance();
- keymapWrapper->mFocusSurface = aFocusSurface;
- keymapWrapper->mFocusSerial = aFocusSerial;
- }
-
-+// aFocusSurface can be null in case that focused surface is already destroyed.
- void KeymapWrapper::SetFocusOut(wl_surface* aFocusSurface) {
- KeymapWrapper* keymapWrapper = KeymapWrapper::GetInstance();
-- if (aFocusSurface == keymapWrapper->mFocusSurface) {
-- keymapWrapper->mFocusSurface = nullptr;
-- keymapWrapper->mFocusSerial = 0;
-- }
-+ LOGW("KeymapWrapper::SetFocusOut surface %p ID %d", aFocusSurface,
-+ aFocusSurface ? wl_proxy_get_id((struct wl_proxy*)aFocusSurface) : 0);
-+
-+ keymapWrapper->mFocusSurface = nullptr;
-+ keymapWrapper->mFocusSerial = 0;
- }
-
- void KeymapWrapper::GetFocusInfo(wl_surface** aFocusSurface,
-@@ -2453,7 +2459,6 @@
- KeymapWrapper* keymapWrapper = KeymapWrapper::GetInstance();
- return keymapWrapper->mSeat;
- }
--
- #endif
-
- } // namespace widget
-diff --git a/widget/gtk/nsWindow.h b/widget/gtk/nsWindow.h
---- a/widget/gtk/nsWindow.h
-+++ b/widget/gtk/nsWindow.h
-@@ -386,8 +386,7 @@
-
- #ifdef MOZ_WAYLAND
- // Use xdg-activation protocol to transfer focus from gFocusWindow to aWindow.
-- // RequestFocusWaylandWindow needs to be called on focused window only.
-- void RequestFocusWaylandWindow(RefPtr<nsWindow> aWindow);
-+ static void RequestFocusWaylandWindow(RefPtr<nsWindow> aWindow);
- void FocusWaylandWindow(const char* aTokenID);
-
- bool GetCSDDecorationOffset(int* aDx, int* aDy);
-diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp
---- a/widget/gtk/nsWindow.cpp
-+++ b/widget/gtk/nsWindow.cpp
-@@ -2845,6 +2845,9 @@
- return;
- }
-
-+ LOG(" requesting xdg-activation, surface ID %d",
-+ wl_proxy_get_id((struct wl_proxy*)surface));
-+
- xdg_activation_v1* xdg_activation = WaylandDisplayGet()->GetXdgActivation();
- xdg_activation_v1_activate(xdg_activation, aTokenID, surface);
- }
-@@ -2862,12 +2865,17 @@
- };
-
- void nsWindow::RequestFocusWaylandWindow(RefPtr<nsWindow> aWindow) {
-- LOG("nsWindow::RequestWindowFocusWayland(%p)", (void*)aWindow);
-+ LOGW("nsWindow::RequestFocusWaylandWindow(%p) gFocusWindow %p",
-+ (void*)aWindow, gFocusWindow);
-+
-+ if (!gFocusWindow) {
-+ LOGW(" missing gFocusWindow, quit.");
-+ }
-
- RefPtr<nsWaylandDisplay> display = WaylandDisplayGet();
- xdg_activation_v1* xdg_activation = display->GetXdgActivation();
- if (!xdg_activation) {
-- LOG(" xdg-activation is missing, quit.");
-+ LOGW(" xdg-activation is missing, quit.");
- return;
- }
-
-@@ -2875,13 +2883,25 @@
- uint32_t focusSerial;
- KeymapWrapper::GetFocusInfo(&focusSurface, &focusSerial);
- if (!focusSurface) {
-- LOG(" We're missing focused window, quit.");
-- return;
-- }
--
-- LOG(" requesting xdg-activation token, surface ID %d serial %d seat ID %d",
-- wl_proxy_get_id((struct wl_proxy*)focusSurface), focusSerial,
-- wl_proxy_get_id((struct wl_proxy*)KeymapWrapper::GetSeat()));
-+ LOGW(" We're missing focused window, quit.");
-+ return;
-+ }
-+
-+ GdkWindow* gdkWindow = gtk_widget_get_window(gFocusWindow->mShell);
-+ wl_surface* surface =
-+ gdkWindow ? gdk_wayland_window_get_wl_surface(gdkWindow) : nullptr;
-+ if (focusSurface != surface) {
-+ LOGW(" focused surface %p and gFocusWindow surface %p don't match, quit.",
-+ focusSurface, surface);
-+ return;
-+ }
-+
-+ LOGW(
-+ " requesting xdg-activation token, surface %p ID %d serial %d seat ID "
-+ "%d",
-+ focusSurface,
-+ focusSurface ? wl_proxy_get_id((struct wl_proxy*)focusSurface) : 0,
-+ focusSerial, wl_proxy_get_id((struct wl_proxy*)KeymapWrapper::GetSeat()));
-
- // Store activation token at activated window for further release.
- g_clear_pointer(&aWindow->mXdgToken, xdg_activation_token_v1_destroy);
-
diff --git a/D133885.diff b/D133885.diff
deleted file mode 100644
index 246fc2a..0000000
--- a/D133885.diff
+++ /dev/null
@@ -1,33 +0,0 @@
-diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp
---- a/widget/gtk/nsWindow.cpp
-+++ b/widget/gtk/nsWindow.cpp
-@@ -2868,7 +2868,7 @@
- LOGW("nsWindow::RequestFocusWaylandWindow(%p) gFocusWindow %p",
- (void*)aWindow, gFocusWindow);
-
-- if (!gFocusWindow) {
-+ if (!gFocusWindow || gFocusWindow->IsDestroyed()) {
- LOGW(" missing gFocusWindow, quit.");
- }
-
-@@ -2883,13 +2883,16 @@
- uint32_t focusSerial;
- KeymapWrapper::GetFocusInfo(&focusSurface, &focusSerial);
- if (!focusSurface) {
-- LOGW(" We're missing focused window, quit.");
-+ LOGW(" We're missing KeymapWrapper focused window, quit.");
- return;
- }
-
- GdkWindow* gdkWindow = gtk_widget_get_window(gFocusWindow->mShell);
-- wl_surface* surface =
-- gdkWindow ? gdk_wayland_window_get_wl_surface(gdkWindow) : nullptr;
-+ if (!gdkWindow) {
-+ LOGW(" gFocusWindow is not mapped, quit.");
-+ return;
-+ }
-+ wl_surface* surface = gdk_wayland_window_get_wl_surface(gdkWindow);
- if (focusSurface != surface) {
- LOGW(" focused surface %p and gFocusWindow surface %p don't match, quit.",
- focusSurface, surface);
-
diff --git a/D134141.diff b/D134141.diff
deleted file mode 100644
index ef0b9fb..0000000
--- a/D134141.diff
+++ /dev/null
@@ -1,12 +0,0 @@
-diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp
---- a/widget/gtk/nsWindow.cpp
-+++ b/widget/gtk/nsWindow.cpp
-@@ -2870,6 +2870,7 @@
-
- if (!gFocusWindow || gFocusWindow->IsDestroyed()) {
- LOGW(" missing gFocusWindow, quit.");
-+ return;
- }
-
- RefPtr<nsWaylandDisplay> display = WaylandDisplayGet();
-
diff --git a/build-arm-wasm.patch b/build-arm-wasm.patch
deleted file mode 100644
index bd841ab..0000000
--- a/build-arm-wasm.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-diff -up firefox-72.0.2/js/src/wasm/WasmSignalHandlers.cpp.old firefox-72.0.2/js/src/wasm/WasmSignalHandlers.cpp
---- firefox-72.0.2/js/src/wasm/WasmSignalHandlers.cpp.old 2020-01-17 23:34:41.000000000 +0200
-+++ firefox-72.0.2/js/src/wasm/WasmSignalHandlers.cpp 2020-02-02 08:07:54.670341986 +0200
-@@ -249,7 +249,16 @@ using mozilla::DebugOnly;
- #endif
-
- #ifdef WASM_EMULATE_ARM_UNALIGNED_FP_ACCESS
--# include <sys/user.h>
-+struct user_vfp {
-+ unsigned long long fpregs[32];
-+ unsigned long fpscr;
-+};
-+
-+struct user_vfp_exc {
-+ unsigned long fpexc;
-+ unsigned long fpinst;
-+ unsigned long fpinst2;
-+};
- #endif
-
- #if defined(ANDROID)
diff --git a/build-disable-elfhack.patch b/build-disable-elfhack.patch
index faaf669..04d49f2 100644
--- a/build-disable-elfhack.patch
+++ b/build-disable-elfhack.patch
@@ -1,7 +1,7 @@
-diff -up firefox-84.0/toolkit/moz.configure.disable-elfhack firefox-84.0/toolkit/moz.configure
---- firefox-84.0/toolkit/moz.configure.disable-elfhack 2020-12-10 12:37:30.727243266 +0100
-+++ firefox-84.0/toolkit/moz.configure 2020-12-10 12:39:42.771967894 +0100
-@@ -1280,7 +1280,7 @@ with only_when("--enable-compile-environ
+diff -up firefox-97.0/toolkit/moz.configure.disable-elfhack firefox-97.0/toolkit/moz.configure
+--- firefox-97.0/toolkit/moz.configure.disable-elfhack 2022-02-08 09:58:47.518047952 +0100
++++ firefox-97.0/toolkit/moz.configure 2022-02-08 10:17:49.552945956 +0100
+@@ -1273,7 +1273,7 @@ with only_when("--enable-compile-environ
help="{Enable|Disable} elf hacks",
)
@@ -9,4 +9,4 @@ diff -up firefox-84.0/toolkit/moz.configure.disable-elfhack firefox-84.0/toolkit
+ set_config("USE_ELF_HACK", depends_if("--enable-elf-hack")(lambda _: False))
- @depends(check_build_environment)
+ @depends(build_environment)
diff --git a/build-python-glean.patch b/build-python-glean.patch
deleted file mode 100644
index 1da2987..0000000
--- a/build-python-glean.patch
+++ /dev/null
@@ -1,1763 +0,0 @@
-diff --git a/Cargo.lock b/Cargo.lock
---- a/Cargo.lock
-+++ b/Cargo.lock
-@@ -1994,9 +1994,9 @@
-
- [[package]]
- name = "glean"
--version = "42.1.0"
--source = "registry+https://github.com/rust-lang/crates.io-index"
--checksum = "af977f3ee276d391cbf940639a5b95378c2b0031d5624c019142d286be4a1a21"
-+version = "42.3.0"
-+source = "registry+https://github.com/rust-lang/crates.io-index"
-+checksum = "34d40d192d10509d941937248fe4594d47617abf34496686c809cfdb31ae8506"
- dependencies = [
- "chrono",
- "crossbeam-channel",
-@@ -2014,9 +2014,9 @@
-
- [[package]]
- name = "glean-core"
--version = "42.1.0"
--source = "registry+https://github.com/rust-lang/crates.io-index"
--checksum = "f50f24e5e7c2abef542a9cb67f7367538db56f54fcae0fae8d3a1e0ac63470a3"
-+version = "42.3.0"
-+source = "registry+https://github.com/rust-lang/crates.io-index"
-+checksum = "349ebbb162d58911547b48e5fbf90d45854e3e1ba03332f41b80a6611867c013"
- dependencies = [
- "bincode",
- "chrono",
-@@ -2034,9 +2034,9 @@
-
- [[package]]
- name = "glean-ffi"
--version = "42.1.0"
--source = "registry+https://github.com/rust-lang/crates.io-index"
--checksum = "26738a3a19d212595c76a765b3e29fc9a0e1c5e7d15a8352ac94ec8536b65cd5"
-+version = "42.3.0"
-+source = "registry+https://github.com/rust-lang/crates.io-index"
-+checksum = "9e29c3f0b9dbde127254f375499df382d5fa9c3c2b33bfcb393485876fe79fb2"
- dependencies = [
- "android_logger",
- "env_logger",
-diff --git a/build.gradle b/build.gradle
---- a/build.gradle
-+++ b/build.gradle
-@@ -36,7 +36,7 @@
- topsrcdir = gradle.mozconfig.topsrcdir
- topobjdir = gradle.mozconfig.topobjdir
-
-- gleanVersion = "42.1.0"
-+ gleanVersion = "42.3.0"
- if (gleanVersion != getRustVersionFor("glean")) {
- throw new StopExecutionException("Mismatched Glean version, expected: ${gleanVersion}," +
- " found ${getRustVersionFor("glean")}")
-diff --git a/build/mach_virtualenv_packages.txt b/build/mach_virtualenv_packages.txt
---- a/build/mach_virtualenv_packages.txt
-+++ b/build/mach_virtualenv_packages.txt
-@@ -1,7 +1,7 @@
- packages.txt:build/common_virtualenv_packages.txt
- # glean-sdk may not be installable if a wheel isn't available
- # and it has to be built from source.
--pypi-optional:glean-sdk==40.0.0:telemetry will not be collected
-+pypi-optional:glean-sdk==42.3.0:telemetry will not be collected
- # Mach gracefully handles the case where `psutil` is unavailable.
- # We aren't (yet) able to pin packages in automation, so we have to
- # support down to the oldest locally-installed version (5.4.2).
-diff --git a/third_party/python/glean_parser/glean_parser-3.6.0.dist-info/RECORD b/third_party/python/glean_parser/glean_parser-3.6.0.dist-info/RECORD
-deleted file mode 100644
---- a/third_party/python/glean_parser/glean_parser-3.6.0.dist-info/RECORD
-+++ /dev/null
-@@ -1,35 +0,0 @@
--glean_parser/__init__.py,sha256=kaoYIRhwZiOE1d8TniW1SHSlEivLBXZQJJ3eiDcamvQ,538
--glean_parser/__main__.py,sha256=FGU4ETmwkPLtzUYOkqmAGElkDKFS98Q-WoXnpAFJH5M,6137
--glean_parser/coverage.py,sha256=2IwC4XMDtDamMkBFoYilmqJzW4gyypq65YVCur8SNas,4405
--glean_parser/csharp.py,sha256=tOrwOLjJCnfie0GvhWvg0Q3fnP4VFQM_4GRaaAqUh4I,5242
--glean_parser/data_review.py,sha256=ZwzL5SD-rC37OHDI9dCq7Z6-NUwARlRgBRb-kRsFGzA,4762
--glean_parser/javascript.py,sha256=U4QaG5DXfmpqEQoScyNSuoTCUJ-5CYts8jyC3o2bWZs,7849
--glean_parser/kotlin.py,sha256=204c61dRCCmnPRtPHzoCtLBwraG2Xs3_AF5HKbBuziI,11105
--glean_parser/lint.py,sha256=jwD0yZ99RZIrmzEBeC3BB9CPPBHcGHmn-oyUjoqNNyI,14470
--glean_parser/markdown.py,sha256=0auYAmzIrX0kqmQyq9DKkRRvTE66yAYdrU-YMgLhrpw,8996
--glean_parser/metrics.py,sha256=jUO4XwatfM4sJGVPcyfbUNb5aW4i9kVYp49OEBASvoM,11350
--glean_parser/parser.py,sha256=sO0kfhicG7xZOfYwNOt0rueBEVgK-YO9M6hVUqQKFP8,13286
--glean_parser/pings.py,sha256=_mrY0idUGMODEMG3fCMRgO8_B9CnXko_FbrOcUnezV0,2667
--glean_parser/swift.py,sha256=3pkl6u3JaQrT8Oz0HONoiq46DUdHCEUDcn_lmZXoCVM,6408
--glean_parser/translate.py,sha256=lnPT3wyzD_YO4Yj6qFAHkP8OZlvVymwK-06QgulnlIs,7394
--glean_parser/util.py,sha256=B7vX7fdmnP-L_yxiFk5csuN5yTOOJXTVR_zJoW13Snc,13701
--glean_parser/validate_ping.py,sha256=0TNvILH6dtzJDys3W8Kqorw6kk03me73OCUDtpoHcXU,2118
--glean_parser/schemas/metrics.1-0-0.schema.yaml,sha256=cND3cvi6iBfPUVmtfIBQfGJV9AALpbvN7nu8E33_J-o,19566
--glean_parser/schemas/metrics.2-0-0.schema.yaml,sha256=IHDSGcfcl9EstXXb7vn_d9x1wtjD_ANJn6ufpCiqBWY,20248
--glean_parser/schemas/pings.1-0-0.schema.yaml,sha256=hwCnsKpEysmrmVp-QHGBArEkVY3vaU1rVsxlTwhAzws,4315
--glean_parser/schemas/pings.2-0-0.schema.yaml,sha256=xUNDwflVSmTcsZL_46uoAbBKROiIPFQRSBt12qiRMt4,3971
--glean_parser/templates/csharp.jinja2,sha256=tPj09JzgSK0YyNb53WkL8WFTA7fcVXyiJ7V-bARnfM0,4354
--glean_parser/templates/javascript.jinja2,sha256=osiIk9cZusDNDjW-ojwOGQulXkxPINmbgNOJx-h5iG8,1825
--glean_parser/templates/kotlin.buildinfo.jinja2,sha256=z9tPgvmNnf8E8gpx7FAWh35oXad8Dlv_UrpqN9CXetY,780
--glean_parser/templates/kotlin.geckoview.jinja2,sha256=K0c1BeKSXDVbshC3gpWALCQFp2JtsoqWhGyN1ScPhC0,5077
--glean_parser/templates/kotlin.jinja2,sha256=fsFXKI_fKwj5AEO4odJ5sRvoC5geW59_DhU6GATaA90,4475
--glean_parser/templates/markdown.jinja2,sha256=tOMN62xEGA1p8QoMKnpCVXUiK_jI5GwLuvCnuOROy8c,3381
--glean_parser/templates/qmldir.jinja2,sha256=m6IGsp-tgTiOfQ7VN8XW6GqX0gJqJkt3B6Pkaul6FVo,156
--glean_parser/templates/swift.jinja2,sha256=McprjDExS3Ao62_eTvEwl-ZHNIbYDOJe05gv1nd4trM,4791
--glean_parser-3.6.0.dist-info/AUTHORS.md,sha256=jBsSsn3EpmpLejgHMhzU1XTFwkCARqYeUs9iGLNgwkQ,432
--glean_parser-3.6.0.dist-info/LICENSE,sha256=HyVuytGSiAUQ6ErWBHTqt1iSGHhLmlC8fO7jTCuR8dU,16725
--glean_parser-3.6.0.dist-info/METADATA,sha256=eQfxIRqcsGKQFWnaKB1WQ-XVUcu2cuO71ytkBf8MyGA,20755
--glean_parser-3.6.0.dist-info/WHEEL,sha256=OqRkF0eY5GHssMorFjlbTIq072vpHpF60fIQA6lS9xA,92
--glean_parser-3.6.0.dist-info/entry_points.txt,sha256=s-clJTIqp-PpJD-n3AnIQZFkTafIrzsTbAPX9vNY018,69
--glean_parser-3.6.0.dist-info/top_level.txt,sha256=q7T3duD-9tYZFyDry6Wv2LcdMsK2jGnzdDFhxWcT2Z8,13
--glean_parser-3.6.0.dist-info/RECORD,,
-diff --git a/third_party/python/glean_parser/glean_parser-3.6.0.dist-info/AUTHORS.md b/third_party/python/glean_parser/glean_parser-4.3.1.dist-info/AUTHORS.md
-rename from third_party/python/glean_parser/glean_parser-3.6.0.dist-info/AUTHORS.md
-rename to third_party/python/glean_parser/glean_parser-4.3.1.dist-info/AUTHORS.md
-diff --git a/third_party/python/glean_parser/glean_parser-3.6.0.dist-info/LICENSE b/third_party/python/glean_parser/glean_parser-4.3.1.dist-info/LICENSE
-rename from third_party/python/glean_parser/glean_parser-3.6.0.dist-info/LICENSE
-rename to third_party/python/glean_parser/glean_parser-4.3.1.dist-info/LICENSE
-diff --git a/third_party/python/glean_parser/glean_parser-3.6.0.dist-info/METADATA b/third_party/python/glean_parser/glean_parser-4.3.1.dist-info/METADATA
-rename from third_party/python/glean_parser/glean_parser-3.6.0.dist-info/METADATA
-rename to third_party/python/glean_parser/glean_parser-4.3.1.dist-info/METADATA
---- a/third_party/python/glean_parser/glean_parser-3.6.0.dist-info/METADATA
-+++ b/third_party/python/glean_parser/glean_parser-4.3.1.dist-info/METADATA
-@@ -1,6 +1,6 @@
- Metadata-Version: 2.1
- Name: glean-parser
--Version: 3.6.0
-+Version: 4.3.1
- Summary: Parser tools for Mozilla's Glean telemetry
- Home-page: https://github.com/mozilla/glean_parser
- Author: Michael Droettboom
-@@ -16,12 +16,13 @@
- Classifier: Programming Language :: Python :: 3.7
- Classifier: Programming Language :: Python :: 3.8
- Classifier: Programming Language :: Python :: 3.9
-+Classifier: Programming Language :: Python :: 3.10
- Description-Content-Type: text/markdown
- Requires-Dist: appdirs (>=1.4)
- Requires-Dist: Click (>=7)
- Requires-Dist: diskcache (>=4)
- Requires-Dist: Jinja2 (>=2.10.1)
--Requires-Dist: jsonschema (<4,>=3.0.2)
-+Requires-Dist: jsonschema (>=3.0.2)
- Requires-Dist: PyYAML (>=5.3.1)
- Requires-Dist: yamllint (>=1.18.0)
- Requires-Dist: iso8601 (>=0.1.10) ; python_version <= "3.6"
-@@ -84,6 +85,42 @@
-
- ## Unreleased
-
-+## 4.3.1
-+
-+- BUGFIX: Skip tags for code generation ([#409](https://github.com/mozilla/glean_parser/pull/409))
-+
-+## 4.3.0
-+
-+- Support tags in glean parser ([bug 1734011](https://bugzilla.mozilla.org/show_bug.cgi?id=1734011))
-+
-+## 4.2.0
-+
-+- Improve the schema validation error messages. They will no longer include `OrderedDict(...)` on Python 3.7 and later ([bug 1733395](https://bugzilla.mozilla.org/show_bug.cgi?id=1733395))
-+- Officially support Python 3.10
-+
-+## 4.1.1 (2021-09-28)
-+
-+- Update private import paths on Javascript / Typescript templates. ([bug 1702468](https://bugzilla.mozilla.org/show_bug.cgi?id=1702468))
-+
-+## 4.1.0 (2021-09-16)
-+
-+- Add support for Node.js platform on Javascript / Typescript templates. ([bug 1728982](https://bugzilla.mozilla.org/show_bug.cgi?id=1728982))
-+
-+## 4.0.0 (2021-08-20)
-+
-+- Add support for Text metric type ([#374](https://github.com/mozilla/glean_parser/pull/374))
-+- Reserve the `default` ping name. It can't be used as a ping name, but it can be used in `send_in_pings` ([#376](https://github.com/mozilla/glean_parser/pull/376))
-+
-+## 3.8.0 (2021-08-18)
-+
-+- Expose ping reasons enum on JavaScript / TypeScript templates. ([bug 1719136](https://bugzilla.mozilla.org/show_bug.cgi?id=1719136))
-+- Define an interface with the allowed extras for each event on the TypeScript template. ([bug 1693487](https://bugzilla.mozilla.org/show_bug.cgi?id=1693487))
-+
-+## 3.7.0 (2021-07-13)
-+
-+- New lint: Check for redundant words in ping names ([#355](https://github.com/mozilla/glean_parser/pull/355))
-+- Add support for URL metric type ([#361](https://github.com/mozilla/glean_parser/pull/361))
-+
- ## 3.6.0 (2021-06-11)
-
- - Add a command `data-review` to generate a skeleton Data Review Request for all metrics matching a supplied bug number. ([bug 1704541](https://bugzilla.mozilla.org/show_bug.cgi?id=1704541))
-@@ -99,9 +136,9 @@
-
- ## 3.4.0 (2021-05-28)
-
--- Add missing import for Kotlin code ([#339](https://github.com/mozilla/glean_parser/pull/341))
--- Use a plain Kotlin type in the generated interface implementation ([#339](https://github.com/mozilla/glean_parser/pull/341))
--- Generate additional generics for event metrics ([#339](https://github.com/mozilla/glean_parser/pull/341))
-+- Add missing import for Kotlin code ([#339](https://github.com/mozilla/glean_parser/pull/339))
-+- Use a plain Kotlin type in the generated interface implementation ([#339](https://github.com/mozilla/glean_parser/pull/339))
-+- Generate additional generics for event metrics ([#339](https://github.com/mozilla/glean_parser/pull/339))
- - For Kotlin skip generating `GleanBuildInfo.kt` when requested (with `with_buildinfo=false`) ([#341](https://github.com/mozilla/glean_parser/pull/341))
-
- ## 3.3.2 (2021-05-18)
-diff --git a/third_party/python/glean_parser/glean_parser-4.3.1.dist-info/RECORD b/third_party/python/glean_parser/glean_parser-4.3.1.dist-info/RECORD
-new file mode 100644
---- /dev/null
-+++ b/third_party/python/glean_parser/glean_parser-4.3.1.dist-info/RECORD
-@@ -0,0 +1,37 @@
-+glean_parser/__init__.py,sha256=kaoYIRhwZiOE1d8TniW1SHSlEivLBXZQJJ3eiDcamvQ,538
-+glean_parser/__main__.py,sha256=1lA0kuQkEIMZSnG8xYha5dASadwEHI5-MeHmuNqyViA,6509
-+glean_parser/coverage.py,sha256=2IwC4XMDtDamMkBFoYilmqJzW4gyypq65YVCur8SNas,4405
-+glean_parser/csharp.py,sha256=tOrwOLjJCnfie0GvhWvg0Q3fnP4VFQM_4GRaaAqUh4I,5242
-+glean_parser/data_review.py,sha256=TA87mbyUQeDOB1T344gfsXePScBEZ9TdyWLy5TJCpHU,4765
-+glean_parser/javascript.py,sha256=e2hslgxRB56aS2_JVOkatKexrblcz6-XqsDnGuw0MPQ,8150
-+glean_parser/kotlin.py,sha256=INVHy3yC2xwm9ZFL9atr99C4DDsOwvRKnCiaJcLql_o,11192
-+glean_parser/lint.py,sha256=CM9OMH-sIxuErvfQktbWkeKIIVzG28pPxqMGO1Espok,17018
-+glean_parser/markdown.py,sha256=0auYAmzIrX0kqmQyq9DKkRRvTE66yAYdrU-YMgLhrpw,8996
-+glean_parser/metrics.py,sha256=Z0gkVMHH-u4eCu_bpsu5JKm9gumZhCz1Jq-xSmHjo8k,11621
-+glean_parser/parser.py,sha256=vIGJGOz0S4cAIdlzeEoiBbmoEgxLKvGdSStVHt8LvX8,15463
-+glean_parser/pings.py,sha256=6XakkO9jnQc2oojLQJvTCMwF7w-BEm6rR54tunCb38o,2805
-+glean_parser/swift.py,sha256=FWOp1Qr8U4xQvOfcu23FttCc4Nc8P7PkJTqm-V7bC4Y,6437
-+glean_parser/tags.py,sha256=bemKYvcbMO4JrghiNSe-A4BNNDtx_FlUPkgrPPJy84Y,1391
-+glean_parser/translate.py,sha256=ZyWEEp1bQO2-cneiC-YvbCuTUEra-xgp33X6dkvtgUY,7476
-+glean_parser/util.py,sha256=gsP8MqfgEs0sDKbz4sV2CfvmDT6MP73dOdNcmOx_K9k,14160
-+glean_parser/validate_ping.py,sha256=0TNvILH6dtzJDys3W8Kqorw6kk03me73OCUDtpoHcXU,2118
-+glean_parser/schemas/metrics.1-0-0.schema.yaml,sha256=cND3cvi6iBfPUVmtfIBQfGJV9AALpbvN7nu8E33_J-o,19566
-+glean_parser/schemas/metrics.2-0-0.schema.yaml,sha256=asAWdpMUkUWDT0sTN26ivoLey50ggGxLUN4aW6OcQpY,22138
-+glean_parser/schemas/pings.1-0-0.schema.yaml,sha256=hwCnsKpEysmrmVp-QHGBArEkVY3vaU1rVsxlTwhAzws,4315
-+glean_parser/schemas/pings.2-0-0.schema.yaml,sha256=rD1s-rfz1xC9biHyLfBCnsoQxVYHwpe_S05awfe2xDA,4363
-+glean_parser/schemas/tags.1-0-0.schema.yaml,sha256=OGXIJlvvVW1vaqB_NVZnwKeZ-sLlfH57vjBSHbj6DNI,1231
-+glean_parser/templates/csharp.jinja2,sha256=tPj09JzgSK0YyNb53WkL8WFTA7fcVXyiJ7V-bARnfM0,4354
-+glean_parser/templates/javascript.jinja2,sha256=Qiv0lxsqVABzdME1MRsmezwtwn8_hHdH9S_v8fJAh-E,2647
-+glean_parser/templates/kotlin.buildinfo.jinja2,sha256=z9tPgvmNnf8E8gpx7FAWh35oXad8Dlv_UrpqN9CXetY,780
-+glean_parser/templates/kotlin.geckoview.jinja2,sha256=K0c1BeKSXDVbshC3gpWALCQFp2JtsoqWhGyN1ScPhC0,5077
-+glean_parser/templates/kotlin.jinja2,sha256=fsFXKI_fKwj5AEO4odJ5sRvoC5geW59_DhU6GATaA90,4475
-+glean_parser/templates/markdown.jinja2,sha256=tOMN62xEGA1p8QoMKnpCVXUiK_jI5GwLuvCnuOROy8c,3381
-+glean_parser/templates/qmldir.jinja2,sha256=m6IGsp-tgTiOfQ7VN8XW6GqX0gJqJkt3B6Pkaul6FVo,156
-+glean_parser/templates/swift.jinja2,sha256=McprjDExS3Ao62_eTvEwl-ZHNIbYDOJe05gv1nd4trM,4791
-+glean_parser-4.3.1.dist-info/AUTHORS.md,sha256=jBsSsn3EpmpLejgHMhzU1XTFwkCARqYeUs9iGLNgwkQ,432
-+glean_parser-4.3.1.dist-info/LICENSE,sha256=HyVuytGSiAUQ6ErWBHTqt1iSGHhLmlC8fO7jTCuR8dU,16725
-+glean_parser-4.3.1.dist-info/METADATA,sha256=WO52mRW8bTLNVllJhXFPdPETSWm74sEm1o7QLJPJF4g,22416
-+glean_parser-4.3.1.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92
-+glean_parser-4.3.1.dist-info/entry_points.txt,sha256=s-clJTIqp-PpJD-n3AnIQZFkTafIrzsTbAPX9vNY018,69
-+glean_parser-4.3.1.dist-info/top_level.txt,sha256=q7T3duD-9tYZFyDry6Wv2LcdMsK2jGnzdDFhxWcT2Z8,13
-+glean_parser-4.3.1.dist-info/RECORD,,
-diff --git a/third_party/python/glean_parser/glean_parser-3.6.0.dist-info/WHEEL b/third_party/python/glean_parser/glean_parser-4.3.1.dist-info/WHEEL
-rename from third_party/python/glean_parser/glean_parser-3.6.0.dist-info/WHEEL
-rename to third_party/python/glean_parser/glean_parser-4.3.1.dist-info/WHEEL
---- a/third_party/python/glean_parser/glean_parser-3.6.0.dist-info/WHEEL
-+++ b/third_party/python/glean_parser/glean_parser-4.3.1.dist-info/WHEEL
-@@ -1,5 +1,5 @@
- Wheel-Version: 1.0
--Generator: bdist_wheel (0.36.2)
-+Generator: bdist_wheel (0.37.0)
- Root-Is-Purelib: true
- Tag: py3-none-any
-
-diff --git a/third_party/python/glean_parser/glean_parser-3.6.0.dist-info/entry_points.txt b/third_party/python/glean_parser/glean_parser-4.3.1.dist-info/entry_points.txt
-rename from third_party/python/glean_parser/glean_parser-3.6.0.dist-info/entry_points.txt
-rename to third_party/python/glean_parser/glean_parser-4.3.1.dist-info/entry_points.txt
-diff --git a/third_party/python/glean_parser/glean_parser-3.6.0.dist-info/top_level.txt b/third_party/python/glean_parser/glean_parser-4.3.1.dist-info/top_level.txt
-rename from third_party/python/glean_parser/glean_parser-3.6.0.dist-info/top_level.txt
-rename to third_party/python/glean_parser/glean_parser-4.3.1.dist-info/top_level.txt
-diff --git a/third_party/python/glean_parser/glean_parser/__main__.py b/third_party/python/glean_parser/glean_parser/__main__.py
---- a/third_party/python/glean_parser/glean_parser/__main__.py
-+++ b/third_party/python/glean_parser/glean_parser/__main__.py
-@@ -63,7 +63,14 @@
- is_flag=True,
- help=("Do not treat missing input files as an error."),
- )
--def translate(input, format, output, option, allow_reserved, allow_missing_files):
-+@click.option(
-+ "--require-tags",
-+ is_flag=True,
-+ help=("Require tags to be specified for metrics and pings."),
-+)
-+def translate(
-+ input, format, output, option, allow_reserved, allow_missing_files, require_tags
-+):
- """
- Translate metrics.yaml and pings.yaml files to other formats.
- """
-@@ -81,6 +88,7 @@
- {
- "allow_reserved": allow_reserved,
- "allow_missing_files": allow_missing_files,
-+ "require_tags": require_tags,
- },
- )
- )
-@@ -130,7 +138,12 @@
- is_flag=True,
- help=("Do not treat missing input files as an error."),
- )
--def glinter(input, allow_reserved, allow_missing_files):
-+@click.option(
-+ "--require-tags",
-+ is_flag=True,
-+ help=("Require tags to be specified for metrics and pings."),
-+)
-+def glinter(input, allow_reserved, allow_missing_files, require_tags):
- """
- Runs a linter over the metrics.
- """
-@@ -140,6 +153,7 @@
- {
- "allow_reserved": allow_reserved,
- "allow_missing_files": allow_missing_files,
-+ "require_tags": require_tags,
- },
- )
- )
-diff --git a/third_party/python/glean_parser/glean_parser/data_review.py b/third_party/python/glean_parser/glean_parser/data_review.py
---- a/third_party/python/glean_parser/glean_parser/data_review.py
-+++ b/third_party/python/glean_parser/glean_parser/data_review.py
-@@ -135,7 +135,7 @@
-
- TODO: Fill this in.
-
--11. Where do you intend to share the results of your analys
-+11. Where do you intend to share the results of your analysis?
-
- TODO: Fill this in.
-
-diff --git a/third_party/python/glean_parser/glean_parser/javascript.py b/third_party/python/glean_parser/glean_parser/javascript.py
---- a/third_party/python/glean_parser/glean_parser/javascript.py
-+++ b/third_party/python/glean_parser/glean_parser/javascript.py
-@@ -11,7 +11,7 @@
- import enum
- import json
- from pathlib import Path
--from typing import Any, Dict, List, Optional, Union, Callable # noqa
-+from typing import Any, Dict, Optional, Callable
-
- from . import metrics
- from . import util
-@@ -44,7 +44,7 @@
- def class_name_factory(platform: str) -> Callable[[str], str]:
- """
- Returns a function that receives an obj_type and
-- returns the correct class name for that time in the current platform.
-+ returns the correct class name for that type in the current platform.
- """
-
- def class_name(obj_type: str) -> str:
-@@ -63,6 +63,16 @@
- return class_name
-
-
-+def extra_type_name(extra_type: str) -> str:
-+ """
-+ Returns the equivalent TypeScript type to an extra type.
-+ """
-+ if extra_type == "quantity":
-+ return "number"
-+
-+ return extra_type
-+
-+
- def import_path(obj_type: str) -> str:
- """
- Returns the import path of the given object inside the @mozilla/glean package.
-@@ -113,9 +123,10 @@
- options = {}
-
- platform = options.get("platform", "webext")
-- if platform not in ["qt", "webext"]:
-+ accepted_platforms = ["qt", "webext", "node"]
-+ if platform not in accepted_platforms:
- raise ValueError(
-- f"Unknown platform: {platform}. Accepted platforms are qt and webext."
-+ f"Unknown platform: {platform}. Accepted platforms are: {accepted_platforms}." # noqa
- )
- version = options.get("version")
- if platform == "qt" and version is None:
-@@ -127,6 +138,7 @@
- "javascript.jinja2",
- filters=(
- ("class_name", class_name_factory(platform)),
-+ ("extra_type_name", extra_type_name),
- ("import_path", import_path),
- ("js", javascript_datatypes_filter),
- ("args", args),
-diff --git a/third_party/python/glean_parser/glean_parser/kotlin.py b/third_party/python/glean_parser/glean_parser/kotlin.py
---- a/third_party/python/glean_parser/glean_parser/kotlin.py
-+++ b/third_party/python/glean_parser/glean_parser/kotlin.py
-@@ -16,7 +16,9 @@
-
- from . import metrics
- from . import pings
-+from . import tags
- from . import util
-+from .util import DictWrapper
-
-
- def kotlin_datatypes_filter(value: util.JSONType) -> str:
-@@ -176,9 +178,7 @@
- # },
- # "other-type": {}
- # }
-- gecko_metrics: OrderedDict[
-- str, OrderedDict[str, List[Dict[str, str]]]
-- ] = OrderedDict()
-+ gecko_metrics: Dict[str, Dict[str, List[Dict[str, str]]]] = DictWrapper()
-
- # Define scalar-like types.
- SCALAR_LIKE_TYPES = ["boolean", "string", "quantity"]
-@@ -188,8 +188,10 @@
- # Glean SDK and GeckoView. See bug 1566356 for more context.
- for metric in category_val.values():
- # This is not a Gecko metric, skip it.
-- if isinstance(metric, pings.Ping) or not getattr(
-- metric, "gecko_datapoint", False
-+ if (
-+ isinstance(metric, pings.Ping)
-+ or isinstance(metric, tags.Tag)
-+ or not getattr(metric, "gecko_datapoint", False)
- ):
- continue
-
-diff --git a/third_party/python/glean_parser/glean_parser/lint.py b/third_party/python/glean_parser/glean_parser/lint.py
---- a/third_party/python/glean_parser/glean_parser/lint.py
-+++ b/third_party/python/glean_parser/glean_parser/lint.py
-@@ -23,6 +23,7 @@
- from . import metrics
- from . import parser
- from . import pings
-+from . import tags
- from . import util
-
-
-@@ -42,7 +43,7 @@
- """
- Helper function to split words on either `.` or `_`.
- """
-- return re.split("[._]", name)
-+ return re.split("[._-]", name)
-
-
- def _english_list(items: List[str]) -> str:
-@@ -234,6 +235,16 @@
- yield f"Ping '{ping}' seems misspelled. Did you mean '{builtin}'?"
-
-
-+def check_tags_required(
-+ metric_or_ping: Union[metrics.Metric, pings.Ping], parser_config: Dict[str, Any]
-+) -> LintGenerator:
-+
-+ if parser_config.get("require_tags", False) and not len(
-+ metric_or_ping.metadata.get("tags", [])
-+ ):
-+ yield "Tags are required but no tags specified"
-+
-+
- def check_user_lifetime_expiration(
- metric: metrics.Metric, parser_config: Dict[str, Any]
- ) -> LintGenerator:
-@@ -262,6 +273,28 @@
- yield ("Metric has expired. Please consider removing it.")
-
-
-+def check_redundant_ping(
-+ pings: pings.Ping, parser_config: Dict[str, Any]
-+) -> LintGenerator:
-+ """
-+ Check if the pings contains 'ping' as the prefix or suffix, or 'ping' or 'custom'
-+ """
-+ ping_words = _split_words(pings.name)
-+
-+ if len(ping_words) != 0:
-+ ping_first_word = ping_words[0]
-+ ping_last_word = ping_words[-1]
-+
-+ if ping_first_word == "ping":
-+ yield ("The prefix 'ping' is redundant.")
-+ elif ping_last_word == "ping":
-+ yield ("The suffix 'ping' is redundant.")
-+ elif "ping" in ping_words:
-+ yield ("The word 'ping' is redundant.")
-+ elif "custom" in ping_words:
-+ yield ("The word 'custom' is redundant.")
-+
-+
- # The checks that operate on an entire category of metrics:
- # {NAME: (function, is_error)}
- CATEGORY_CHECKS: Dict[
-@@ -281,6 +314,7 @@
- "BUG_NUMBER": (check_bug_number, CheckType.error),
- "BASELINE_PING": (check_valid_in_baseline, CheckType.error),
- "MISSPELLED_PING": (check_misspelled_pings, CheckType.error),
-+ "TAGS_REQUIRED": (check_tags_required, CheckType.error),
- "EXPIRATION_DATE_TOO_FAR": (check_expired_date, CheckType.warning),
- "USER_LIFETIME_EXPIRATION": (check_user_lifetime_expiration, CheckType.warning),
- "EXPIRED": (check_expired_metric, CheckType.warning),
-@@ -293,6 +327,8 @@
- str, Tuple[Callable[[pings.Ping, dict], LintGenerator], CheckType]
- ] = {
- "BUG_NUMBER": (check_bug_number, CheckType.error),
-+ "TAGS_REQUIRED": (check_tags_required, CheckType.error),
-+ "REDUNDANT_PING": (check_redundant_ping, CheckType.error),
- }
-
-
-@@ -310,10 +346,32 @@
- )
-
-
-+def _lint_item_tags(
-+ item_name: str,
-+ item_type: str,
-+ item_tag_names: List[str],
-+ valid_tag_names: List[str],
-+) -> List[GlinterNit]:
-+ invalid_tags = [tag for tag in item_tag_names if tag not in valid_tag_names]
-+ return (
-+ [
-+ GlinterNit(
-+ "INVALID_TAGS",
-+ item_name,
-+ f"Invalid tags specified in {item_type}: {', '.join(invalid_tags)}",
-+ CheckType.error,
-+ )
-+ ]
-+ if len(invalid_tags)
-+ else []
-+ )
-+
-+
- def _lint_pings(
-- category: Dict[str, Union[metrics.Metric, pings.Ping]],
-+ category: Dict[str, Union[metrics.Metric, pings.Ping, tags.Tag]],
- parser_config: Dict[str, Any],
--):
-+ valid_tag_names: List[str],
-+) -> List[GlinterNit]:
- nits: List[GlinterNit] = []
-
- for (ping_name, ping) in sorted(list(category.items())):
-@@ -331,7 +389,14 @@
- )
- for msg in new_nits
- )
--
-+ nits.extend(
-+ _lint_item_tags(
-+ ping_name,
-+ "ping",
-+ ping.metadata.get("tags", []),
-+ valid_tag_names,
-+ )
-+ )
- return nits
-
-
-@@ -351,12 +416,17 @@
- parser_config = {}
-
- nits: List[GlinterNit] = []
-+ valid_tag_names = [tag for tag in objs.get("tags", [])]
- for (category_name, category) in sorted(list(objs.items())):
- if category_name == "pings":
-- nits.extend(_lint_pings(category, parser_config))
-+ nits.extend(_lint_pings(category, parser_config, valid_tag_names))
- continue
-
-- # Make sure the category has only Metrics, not Pings
-+ if category_name == "tags":
-+ # currently we have no linting for tags
-+ continue
-+
-+ # Make sure the category has only Metrics, not Pings or Tags
- category_metrics = dict(
- (name, metric)
- for (name, metric) in category.items()
-@@ -388,6 +458,16 @@
- for msg in new_nits
- )
-
-+ # also check that tags for metric are valid
-+ nits.extend(
-+ _lint_item_tags(
-+ ".".join([metric.category, metric.name]),
-+ "metric",
-+ metric.metadata.get("tags", []),
-+ valid_tag_names,
-+ )
-+ )
-+
- if len(nits):
- print("Sorry, Glean found some glinter nits:", file=file)
- for nit in nits:
-diff --git a/third_party/python/glean_parser/glean_parser/metrics.py b/third_party/python/glean_parser/glean_parser/metrics.py
---- a/third_party/python/glean_parser/glean_parser/metrics.py
-+++ b/third_party/python/glean_parser/glean_parser/metrics.py
-@@ -13,6 +13,7 @@
-
-
- from . import pings
-+from . import tags
- from . import util
-
-
-@@ -47,6 +48,7 @@
- description: str,
- notification_emails: List[str],
- expires: Any,
-+ metadata: Optional[Dict] = None,
- data_reviews: Optional[List[str]] = None,
- version: int = 0,
- disabled: bool = False,
-@@ -71,6 +73,9 @@
- self.description = description
- self.notification_emails = notification_emails
- self.expires = expires
-+ if metadata is None:
-+ metadata = {}
-+ self.metadata = metadata
- if data_reviews is None:
- data_reviews = []
- self.data_reviews = data_reviews
-@@ -312,7 +317,8 @@
- def allowed_extra_keys_with_types(self):
- # Sort keys so that output is deterministic
- return sorted(
-- [(k, v["type"]) for (k, v) in self.extra_keys.items()], key=lambda x: x[0]
-+ [(k, v.get("type", "string")) for (k, v) in self.extra_keys.items()],
-+ key=lambda x: x[0],
- )
-
- @property
-@@ -338,6 +344,10 @@
- typename = "uuid"
-
-
-+class Url(Metric):
-+ typename = "url"
-+
-+
- class Jwe(Metric):
- typename = "jwe"
-
-@@ -391,4 +401,8 @@
- super().__init__(*args, **kwargs)
-
-
--ObjectTree = Dict[str, Dict[str, Union[Metric, pings.Ping]]]
-+class Text(Metric):
-+ typename = "text"
-+
-+
-+ObjectTree = Dict[str, Dict[str, Union[Metric, pings.Ping, tags.Tag]]]
-diff --git a/third_party/python/glean_parser/glean_parser/parser.py b/third_party/python/glean_parser/glean_parser/parser.py
---- a/third_party/python/glean_parser/glean_parser/parser.py
-+++ b/third_party/python/glean_parser/glean_parser/parser.py
-@@ -8,7 +8,6 @@
- Code for parsing metrics.yaml files.
- """
-
--from collections import OrderedDict
- import functools
- from pathlib import Path
- import textwrap
-@@ -19,7 +18,9 @@
-
- from .metrics import Metric, ObjectTree
- from .pings import Ping, RESERVED_PING_NAMES
-+from .tags import Tag
- from . import util
-+from .util import DictWrapper
-
-
- ROOT_DIR = Path(__file__).parent
-@@ -27,6 +28,7 @@
-
- METRICS_ID = "moz://mozilla.org/schemas/glean/metrics/2-0-0"
- PINGS_ID = "moz://mozilla.org/schemas/glean/pings/2-0-0"
-+TAGS_ID = "moz://mozilla.org/schemas/glean/tags/1-0-0"
-
-
- def _update_validator(validator):
-@@ -90,7 +92,7 @@
- except IndexError:
- filetype = None
-
-- if filetype not in ("metrics", "pings"):
-+ if filetype not in ("metrics", "pings", "tags"):
- filetype = None
-
- for error in validate(content, filepath):
-@@ -207,7 +209,7 @@
- "Glean internal use.",
- )
- continue
-- all_objects.setdefault(category_key, OrderedDict())
-+ all_objects.setdefault(category_key, DictWrapper())
-
- if not isinstance(category_val, dict):
- raise TypeError(f"Invalid content for {category_key}")
-@@ -222,6 +224,7 @@
- filepath,
- f"On instance {category_key}.{metric_key}",
- str(e),
-+ metric_val.defined_in["line"],
- )
- metric_obj = None
- else:
-@@ -234,14 +237,15 @@
- f"On instance {category_key}.{metric_key}",
- 'Only internal metrics may specify "all-pings" '
- 'in "send_in_pings"',
-+ metric_val.defined_in["line"],
- )
- metric_obj = None
-
- if metric_obj is not None:
- metric_obj.no_lint = list(set(metric_obj.no_lint + global_no_lint))
-
-- if isinstance(filepath, Path):
-- metric_obj.defined_in["filepath"] = str(filepath)
-+ if isinstance(filepath, Path):
-+ metric_obj.defined_in["filepath"] = str(filepath)
-
- already_seen = sources.get((category_key, metric_key))
- if already_seen is not None:
-@@ -253,6 +257,7 @@
- f"Duplicate metric name '{category_key}.{metric_key}' "
- f"already defined in '{already_seen}'"
- ),
-+ metric_obj.defined_in["line"],
- )
- else:
- all_objects[category_key][metric_key] = metric_obj
-@@ -319,6 +324,58 @@
- sources[ping_key] = filepath
-
-
-+def _instantiate_tags(
-+ all_objects: ObjectTree,
-+ sources: Dict[Any, Path],
-+ content: Dict[str, util.JSONType],
-+ filepath: Path,
-+ config: Dict[str, Any],
-+) -> Generator[str, None, None]:
-+ """
-+ Load a list of tags.yaml files, convert the JSON information into Tag
-+ objects.
-+ """
-+ global_no_lint = content.get("no_lint", [])
-+ assert isinstance(global_no_lint, list)
-+
-+ for tag_key, tag_val in content.items():
-+ if tag_key.startswith("$"):
-+ continue
-+ if tag_key == "no_lint":
-+ continue
-+ if not isinstance(tag_val, dict):
-+ raise TypeError(f"Invalid content for tag {tag_key}")
-+ tag_val["name"] = tag_key
-+ try:
-+ tag_obj = Tag(
-+ defined_in=getattr(tag_val, "defined_in", None),
-+ _validated=True,
-+ **tag_val,
-+ )
-+ except Exception as e:
-+ yield util.format_error(filepath, f"On instance '{tag_key}'", str(e))
-+ continue
-+
-+ if tag_obj is not None:
-+ tag_obj.no_lint = list(set(tag_obj.no_lint + global_no_lint))
-+
-+ if isinstance(filepath, Path) and tag_obj.defined_in is not None:
-+ tag_obj.defined_in["filepath"] = str(filepath)
-+
-+ already_seen = sources.get(tag_key)
-+ if already_seen is not None:
-+ # We've seen this tag name already
-+ yield util.format_error(
-+ filepath,
-+ "",
-+ f"Duplicate tag name '{tag_key}' "
-+ f"already defined in '{already_seen}'",
-+ )
-+ else:
-+ all_objects.setdefault("tags", {})[tag_key] = tag_obj
-+ sources[tag_key] = filepath
-+
-+
- def _preprocess_objects(objs: ObjectTree, config: Dict[str, Any]) -> ObjectTree:
- """
- Preprocess the object tree to better set defaults.
-@@ -348,7 +405,7 @@
- ) -> Generator[str, None, ObjectTree]:
- """
- Parse one or more metrics.yaml and/or pings.yaml files, returning a tree of
-- `metrics.Metric` and `pings.Ping` instances.
-+ `metrics.Metric`, `pings.Ping`, and `tags.Tag` instances.
-
- The result is a generator over any errors. If there are no errors, the
- actual metrics can be obtained from `result.value`. For example::
-@@ -360,11 +417,11 @@
-
- The result value is a dictionary of category names to categories, where
- each category is a dictionary from metric name to `metrics.Metric`
-- instances. There is also the special category `pings` containing all
-- of the `pings.Ping` instances.
-+ instances. There are also the special categories `pings` and `tags`
-+ containing all of the `pings.Ping` and `tags.Tag` instances, respectively.
-
-- :param filepaths: list of Path objects to metrics.yaml and/or pings.yaml
-- files
-+ :param filepaths: list of Path objects to metrics.yaml, pings.yaml, and/or
-+ tags.yaml files
- :param config: A dictionary of options that change parsing behavior.
- Supported keys are:
-
-@@ -379,7 +436,7 @@
- if config is None:
- config = {}
-
-- all_objects: ObjectTree = OrderedDict()
-+ all_objects: ObjectTree = DictWrapper()
- sources: Dict[Any, Path] = {}
- filepaths = util.ensure_list(filepaths)
- for filepath in filepaths:
-@@ -392,5 +449,8 @@
- yield from _instantiate_pings(
- all_objects, sources, content, filepath, config
- )
--
-+ elif filetype == "tags":
-+ yield from _instantiate_tags(
-+ all_objects, sources, content, filepath, config
-+ )
- return _preprocess_objects(all_objects, config)
-diff --git a/third_party/python/glean_parser/glean_parser/pings.py b/third_party/python/glean_parser/glean_parser/pings.py
---- a/third_party/python/glean_parser/glean_parser/pings.py
-+++ b/third_party/python/glean_parser/glean_parser/pings.py
-@@ -14,7 +14,7 @@
- from . import util
-
-
--RESERVED_PING_NAMES = ["baseline", "metrics", "events", "deletion-request"]
-+RESERVED_PING_NAMES = ["baseline", "metrics", "events", "deletion-request", "default"]
-
-
- class Ping:
-@@ -24,6 +24,7 @@
- description: str,
- bugs: List[str],
- notification_emails: List[str],
-+ metadata: Optional[Dict] = None,
- data_reviews: Optional[List[str]] = None,
- include_client_id: bool = False,
- send_if_empty: bool = False,
-@@ -40,6 +41,9 @@
-
- self.bugs = bugs
- self.notification_emails = notification_emails
-+ if metadata is None:
-+ metadata = {}
-+ self.metadata = metadata
- if data_reviews is None:
- data_reviews = []
- self.data_reviews = data_reviews
-@@ -53,7 +57,7 @@
- no_lint = []
- self.no_lint = no_lint
-
-- # _validated indicates whether this metric has already been jsonschema
-+ # _validated indicates whether this ping has already been jsonschema
- # validated (but not any of the Python-level validation).
- if not _validated:
- data: Dict[str, util.JSONType] = {
-diff --git a/third_party/python/glean_parser/glean_parser/schemas/metrics.2-0-0.schema.yaml b/third_party/python/glean_parser/glean_parser/schemas/metrics.2-0-0.schema.yaml
---- a/third_party/python/glean_parser/glean_parser/schemas/metrics.2-0-0.schema.yaml
-+++ b/third_party/python/glean_parser/glean_parser/schemas/metrics.2-0-0.schema.yaml
-@@ -94,6 +94,8 @@
-
- - `uuid`: Record a UUID v4.
-
-+ - `url`: Record a valid URL string.
-+
- - `memory_distribution`: A histogram for recording memory usage
- values. Additional properties: `memory_unit`.
-
-@@ -115,6 +117,8 @@
-
- `labeled_boolean`, `labeled_string`, `labeled_counter`.
-
-+ - `text`: Record long text data.
-+
- type: string
- enum:
- - event
-@@ -129,11 +133,13 @@
- - memory_distribution
- - datetime
- - uuid
-+ - url
- - jwe
- - labeled_boolean
- - labeled_string
- - labeled_counter
- - rate
-+ - text
-
- description:
- title: Description
-@@ -147,6 +153,22 @@
- syntax](https://www.markdownguide.org/basic-syntax/).
- type: string
-
-+ metadata:
-+ title: Metadata
-+ description: |
-+ Additional metadata about this metric. Currently limited to a list of
-+ tags.
-+ type: object
-+ properties:
-+ tags:
-+ title: Tags
-+ description: Which tags are specified for this metric.
-+ type: array
-+ items:
-+ type: string
-+ maxLength: 80
-+ default: {}
-+
- lifetime:
- title: Lifetime
- description: |
-@@ -513,6 +535,9 @@
- - not:
- description: "'pings' is reserved as a category name."
- const: pings
-+ - not:
-+ description: "'tags' is reserved as a category name."
-+ const: tags
- - enum: ['$schema']
-
- properties:
-@@ -622,3 +647,41 @@
- description: |
- `denominator_metric` is only allowed for `rate`.
- maxLength: 0
-+ -
-+ if:
-+ properties:
-+ type:
-+ const: text
-+ then:
-+ properties:
-+ lifetime:
-+ description: >
-+ Text metrics must have ping or application lifetime.
-+ enum:
-+ - ping
-+ - application
-+
-+ data_sensitivity:
-+ description: >
-+ Text metrics require Category 3 (`web_activity`)
-+ or Category 4 (`highly_sensitive`).
-+ type: array
-+ items:
-+ enum:
-+ - web_activity
-+ - highly_sensitive
-+
-+ send_in_pings:
-+ description: |
-+ Text metrics can only be sent in custom pings.
-+ Built-in pings are not allowed.
-+ type: array
-+ items:
-+ allOf:
-+ - $ref: "#/definitions/kebab_case"
-+ - not:
-+ description: >
-+ Text metrics can only be sent in custom pings.
-+ Built-in pings are not allowed."
-+ pattern:
-+ "^(metrics|baseline|events|deletion-request|default|glean_.*)$"
-diff --git a/third_party/python/glean_parser/glean_parser/schemas/pings.2-0-0.schema.yaml b/third_party/python/glean_parser/glean_parser/schemas/pings.2-0-0.schema.yaml
---- a/third_party/python/glean_parser/glean_parser/schemas/pings.2-0-0.schema.yaml
-+++ b/third_party/python/glean_parser/glean_parser/schemas/pings.2-0-0.schema.yaml
-@@ -62,6 +62,22 @@
- syntax](https://www.markdownguide.org/basic-syntax/).
- type: string
-
-+ metadata:
-+ title: Metadata
-+ description: |
-+ Additional metadata about this ping. Currently limited to a list of
-+ tags.
-+ type: object
-+ properties:
-+ tags:
-+ title: Tags
-+ description: Which tags are specified for this ping.
-+ type: array
-+ items:
-+ type: string
-+ maxLength: 80
-+ default: {}
-+
- include_client_id:
- title: Include client id
- description: |
-diff --git a/third_party/python/glean_parser/glean_parser/schemas/tags.1-0-0.schema.yaml b/third_party/python/glean_parser/glean_parser/schemas/tags.1-0-0.schema.yaml
-new file mode 100644
---- /dev/null
-+++ b/third_party/python/glean_parser/glean_parser/schemas/tags.1-0-0.schema.yaml
-@@ -0,0 +1,51 @@
-+# 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/.
-+
-+---
-+$schema: http://json-schema.org/draft-07/schema#
-+title: Tags
-+description: |
-+ Schema for the tags.yaml files for Mozilla's Glean telemetry SDK.
-+
-+ The top-level of the `tags.yaml` file has a key defining the name of each
-+ tag. The values contain metadata about that tag (currently just a
-+ description).
-+
-+$id: moz://mozilla.org/schemas/glean/tags/1-0-0
-+
-+type: object
-+
-+propertyNames:
-+ type: string
-+ maxLength: 80
-+
-+properties:
-+ $schema:
-+ type: string
-+ format: url
-+
-+ no_lint:
-+ title: Lint checks to skip globally
-+ description: |
-+ This parameter lists any lint checks to skip for this whole file.
-+ type: array
-+ items:
-+ type: string
-+
-+additionalProperties:
-+ type: object
-+ properties:
-+ description:
-+ title: Description
-+ description: |
-+ **Required.**
-+
-+ A textual description of this tag.
-+
-+ Descriptions may contain [markdown
-+ syntax](https://www.markdownguide.org/basic-syntax/).
-+ type: string
-+ required:
-+ - description
-+ additionalProperties: false
-diff --git a/third_party/python/glean_parser/glean_parser/swift.py b/third_party/python/glean_parser/glean_parser/swift.py
---- a/third_party/python/glean_parser/glean_parser/swift.py
-+++ b/third_party/python/glean_parser/glean_parser/swift.py
-@@ -15,6 +15,7 @@
-
- from . import metrics
- from . import pings
-+from . import tags
- from . import util
-
- # An (imcomplete) list of reserved keywords in Swift.
-@@ -139,7 +140,7 @@
- """
-
- name: str
-- objs: Dict[str, Union[metrics.Metric, pings.Ping]]
-+ objs: Dict[str, Union[metrics.Metric, pings.Ping, tags.Tag]]
- contains_pings: bool
-
-
-diff --git a/third_party/python/glean_parser/glean_parser/tags.py b/third_party/python/glean_parser/glean_parser/tags.py
-new file mode 100644
---- /dev/null
-+++ b/third_party/python/glean_parser/glean_parser/tags.py
-@@ -0,0 +1,49 @@
-+from typing import Dict, List, Optional
-+from . import util
-+
-+
-+class Tag:
-+ def __init__(
-+ self,
-+ name: str,
-+ description: str,
-+ defined_in: Optional[Dict] = None,
-+ no_lint: Optional[List[str]] = None,
-+ _validated: bool = False,
-+ ):
-+ # Avoid cyclical import
-+ from . import parser
-+
-+ self.name = name
-+ self.description = description
-+ self.defined_in = defined_in
-+ if no_lint is None:
-+ no_lint = []
-+ self.no_lint = no_lint
-+
-+ # _validated indicates whether this tag has already been jsonschema
-+ # validated (but not any of the Python-level validation).
-+ if not _validated:
-+ data: Dict[str, util.JSONType] = {
-+ "$schema": parser.TAGS_ID,
-+ self.name: self._serialize_input(),
-+ }
-+ for error in parser.validate(data):
-+ raise ValueError(error)
-+
-+ @property
-+ def type(self) -> str:
-+ return "tag"
-+
-+ def _serialize_input(self) -> Dict[str, util.JSONType]:
-+ d = self.serialize()
-+ modified_dict = util.remove_output_params(d, "defined_in")
-+ return modified_dict
-+
-+ def serialize(self) -> Dict[str, util.JSONType]:
-+ """
-+ Serialize the tag back to JSON object model.
-+ """
-+ d = self.__dict__.copy()
-+ del d["name"]
-+ return d
-diff --git a/third_party/python/glean_parser/glean_parser/templates/javascript.jinja2 b/third_party/python/glean_parser/glean_parser/templates/javascript.jinja2
---- a/third_party/python/glean_parser/glean_parser/templates/javascript.jinja2
-+++ b/third_party/python/glean_parser/glean_parser/templates/javascript.jinja2
-@@ -1,7 +1,11 @@
- {# The final Javascript/Typescript code is autogenerated, but this
- Jinja2 template is not. Please file bugs! #}
- {% macro obj_declaration(obj) %}
--new {{ obj.type|class_name }}({
-+new {{ obj.type|class_name }}{% if obj.extra_keys and lang == "typescript" %}<{
-+ {% for name, type in obj.allowed_extra_keys_with_types %}
-+ {{ name }}?: {{ type|extra_type_name }},
-+ {% endfor %}
-+}>{% endif %}({
- {% for arg_name in (obj.type|args).common if obj[arg_name] is defined %}
- {{ arg_name|camelize }}: {{ obj[arg_name]|js }},
- {% endfor %}
-@@ -20,14 +24,15 @@
-
- {% if platform != "qt" %}
- {% if has_labeled_metrics %}
--import LabeledMetricType from "@mozilla/glean/{{ platform }}/private/metrics/labeled";
-+import LabeledMetricType from "@mozilla/glean/private/metrics/labeled";
- {% endif %}
- {% for type in types %}
--import {{ type|class_name }} from "@mozilla/glean/{{ platform }}/private/{{ type|import_path }}";
-+import {{ type|class_name }} from "@mozilla/glean/private/{{ type|import_path }}";
- {% endfor %}
- {% else %}
- .import org.mozilla.Glean {{ version }} as Glean
- {% endif %}
-+
- {% for obj in objs.values() %}
- /**
- * {{ obj.description|wordwrap() | replace("\n", "\n * ") }}
-@@ -40,4 +45,29 @@
- {% if platform != "qt" %}export {% endif %}const {{ obj.name|camelize }} = {{ obj_declaration(obj) }};
- {% endif %}
-
-+{% if obj|attr("_generate_enums") %}
-+{% for name, suffix in obj["_generate_enums"] %}
-+{% if obj|attr(name)|length and name == "reason_codes" %}
-+/**
-+ * Reason codes for `{{ obj.identifier() }}`.
-+ *
-+ * @readonly
-+ * @enum {string}
-+ */
-+{% if lang == "typescript" %}
-+export enum {{ obj.name|Camelize }}{{ name|Camelize }} {
-+ {% for key in obj|attr(name) %}
-+ {{ key|Camelize }} = "{{ key }}",
-+ {% endfor %}
-+}
-+{% else %}
-+{% if platform != "qt" %}export {% endif %}const {{ obj.name|Camelize }}{{ name|Camelize }} = {
-+ {% for key in obj|attr(name) %}
-+ "{{ key|Camelize }}": "{{ key }}",
-+ {% endfor %}
-+}
-+{% endif %}
-+{% endif %}
- {% endfor %}
-+{% endif %}
-+{% endfor %}
-diff --git a/third_party/python/glean_parser/glean_parser/translate.py b/third_party/python/glean_parser/glean_parser/translate.py
---- a/third_party/python/glean_parser/glean_parser/translate.py
-+++ b/third_party/python/glean_parser/glean_parser/translate.py
-@@ -148,6 +148,9 @@
- if parser_config.get("allow_reserved"):
- options["allow_reserved"] = True
-
-+ # We don't render tags anywhere yet.
-+ all_objects.value.pop("tags", None)
-+
- # Write everything out to a temporary directory, and then move it to the
- # real directory, for transactional integrity.
- with tempfile.TemporaryDirectory() as tempdir:
-diff --git a/third_party/python/glean_parser/glean_parser/util.py b/third_party/python/glean_parser/glean_parser/util.py
---- a/third_party/python/glean_parser/glean_parser/util.py
-+++ b/third_party/python/glean_parser/glean_parser/util.py
-@@ -11,7 +11,7 @@
- from pathlib import Path
- import sys
- import textwrap
--from typing import Any, Callable, Iterable, Sequence, Tuple, Union
-+from typing import Any, Callable, Iterable, Sequence, Tuple, Union, Optional
- import urllib.request
-
- import appdirs # type: ignore
-@@ -39,6 +39,20 @@
- # https://stackoverflow.com/questions/34667108/ignore-dates-and-times-while-parsing-yaml
-
-
-+# A wrapper around OrderedDict for Python < 3.7 (where dict ordering is not
-+# maintained by default), and regular dict everywhere else.
-+if sys.version_info < (3, 7):
-+
-+ class DictWrapper(OrderedDict):
-+ pass
-+
-+
-+else:
-+
-+ class DictWrapper(dict):
-+ pass
-+
-+
- class _NoDatesSafeLoader(yaml.SafeLoader):
- @classmethod
- def remove_implicit_resolver(cls, tag_to_remove):
-@@ -77,7 +91,7 @@
-
- def _construct_mapping_adding_line(loader, node):
- loader.flatten_mapping(node)
-- mapping = OrderedDict(loader.construct_pairs(node))
-+ mapping = DictWrapper(loader.construct_pairs(node))
- mapping.defined_in = {"line": node.start_mark.line}
- return mapping
-
-@@ -96,7 +110,7 @@
- yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, data.items()
- )
-
-- OrderedDumper.add_representer(OrderedDict, _dict_representer)
-+ OrderedDumper.add_representer(DictWrapper, _dict_representer)
- return yaml.dump(data, Dumper=OrderedDumper, **kwargs)
-
-
-@@ -112,7 +126,7 @@
- """
- # If in py.test, support bits of literal JSON/YAML content
- if TESTING_MODE and isinstance(path, dict):
-- return path
-+ return yaml_load(yaml.dump(path))
-
- if path.suffix == ".json":
- with path.open("r", encoding="utf-8") as fd:
-@@ -313,12 +327,19 @@
-
- description = error.schema.get("description")
- if description:
-- parts.extend(["", "Documentation for this node:", _utils.indent(description)])
-+ parts.extend(
-+ ["", "Documentation for this node:", textwrap.indent(description, " ")]
-+ )
-
- return "\n".join(parts)
-
-
--def format_error(filepath: Union[str, Path], header: str, content: str) -> str:
-+def format_error(
-+ filepath: Union[str, Path],
-+ header: str,
-+ content: str,
-+ lineno: Optional[int] = None,
-+) -> str:
- """
- Format a jsonshema validation error.
- """
-@@ -326,10 +347,12 @@
- filepath = filepath.resolve()
- else:
- filepath = "<string>"
-+ if lineno:
-+ filepath = f"{filepath}:{lineno}"
- if header:
-- return f"{filepath}: {header}\n{_utils.indent(content)}"
-+ return f"{filepath}: {header}\n{textwrap.indent(content, ' ')}"
- else:
-- return f"{filepath}:\n{_utils.indent(content)}"
-+ return f"{filepath}:\n{textwrap.indent(content, ' ')}"
-
-
- def parse_expires(expires: str) -> datetime.date:
-diff --git a/third_party/python/requirements.in b/third_party/python/requirements.in
---- a/third_party/python/requirements.in
-+++ b/third_party/python/requirements.in
-@@ -15,7 +15,7 @@
- esprima==4.0.1
- fluent.migrate==0.11
- fluent.syntax==0.18.1
--glean_parser==3.6.0
-+glean_parser==4.3.1
- jsmin==2.1.0
- json-e==2.7.0
- mozilla-version==0.3.4
-diff --git a/third_party/python/requirements.txt b/third_party/python/requirements.txt
---- a/third_party/python/requirements.txt
-+++ b/third_party/python/requirements.txt
-@@ -162,9 +162,9 @@
- # -r requirements-mach-vendor-python.in
- # compare-locales
- # fluent.migrate
--glean_parser==3.6.0 \
-- --hash=sha256:1da46764d93ec563eb93235bd477814444742d1ee6b5231dc6684cebf46a6057 \
-- --hash=sha256:655a2038ec0be5364f351f592d5476fe7b028ebb0d9fd75f07c6c54287859552
-+glean_parser==4.3.1 \
-+ --hash=sha256:a8924a3a4aca7fba35dc69d93031993d6481c6ec9cd43362c068eb3e18ea43e8 \
-+ --hash=sha256:c194aba35a57ff9d139527c5321ef526599794994e355bad4c314bd3ab64c3eb
- # via -r requirements-mach-vendor-python.in
- idna-ssl==1.1.0 \
- --hash=sha256:a933e3bb13da54383f9e8f35dc4f9cb9eb9b3b78c6b36f311254d6d0d92c6c7c
-diff --git a/third_party/rust/glean-core/.cargo-checksum.json b/third_party/rust/glean-core/.cargo-checksum.json
---- a/third_party/rust/glean-core/.cargo-checksum.json
-+++ b/third_party/rust/glean-core/.cargo-checksum.json
-@@ -1 +1 @@
--{"files":{"Cargo.lock":"160efaf0386c8c6b321d94b4d24ea0993603a921e342c43934aca1912f65d62e","Cargo.toml":"028150cbc9ce890ea9186c1903d18809476a27a66f4211c65884995ad5044ae8","LICENSE":"1f256ecad192880510e84ad60474eab7589218784b9a50bc7ceee34c2b91f1d5","README.md":"026495898699b54608eb4ec16074ffafc57920d80ccb59961c501a1ea28c9985","examples/sample.rs":"05469332ffa58c661628eb2f260dfd59085c371b0ef0f8b6e9cb77c230b9bb04","src/common_metric_data.rs":"0ce52740ab6d880df5127336ced68be30da568cd2a94301dc16d4e3f527134c9","src/coverage.rs":"49613fd310bd24d779472720975fbe6c97ec370a95eb55f10afa43f67539c942","src/database/mod.rs":"458e3c8af2af5345e02dea32b36f7521d4428c2ea65c225337008af56d00c6f6","src/debug.rs":"53b19f5a1ba8b35ab1ce78332cb2e8283b2068c9068d71c3be1f58bd8af792c3","src/error.rs":"97172a791efdf8b791a04ae7961085fbef4391b313ff3ffb24e9381f2901fccc","src/error_recording.rs":"42af60683cb30eba821b955fe156ce43a114c0f6f3f3b5b84566659398137671","src/event_database/mod.rs":"95d665a039236ede25dd479b19f0ddc32c0dd79cef2fbcc2ef3bab1540680276","src/histogram/exponential.rs":"389d48bab03f7229445ee4d4c8a4c49f6b43303f658dc954da75142f3c040dc6","src/histogram/functional.rs":"1a63a305b48bcef7bc38136b40d916df4bb8f098dc602514ada54a9b091f6951","src/histogram/linear.rs":"5642c8983c3c1ce9b69c6ac99133c8ed5e67abe2398c5dbcf67e69d66880f4ca","src/histogram/mod.rs":"11e5d3b6440a33a3e5544d0e03ffd69fa2fdcabe603ad75e0327f3ed548e8ce3","src/internal_metrics.rs":"5626effec67bf0f9ee12609b77cf04741eac1827123039999d4adb28a3cc5976","src/internal_pings.rs":"5ed4669b6f09d660401f44c8279e0a5fea0262e48de40e85595bd25dc70b05f3","src/lib.rs":"49f36f867e0412d514fdddee9c40d71e020dbc27fe0efebe6808d9a16872b986","src/lib_unit_tests.rs":"17b0eaad81f946ddef89ee076f4d138e427638ee7536be128b30d4e7280dcf7b","src/macros.rs":"3f3fc8c36dd05b7528b66b27e95b6494505a7a1f48abd013218de23ada6b5a43","src/metrics/boolean.rs":"49e2f5be78055f61543db1d4d57cc06064a812a8f45c9d0e753df8325edc9041","src/metrics/counter.rs":"e3e2a195b597ea1559991b992f44a8a5f291b592a5c6946e93e01066f276efbb","src/metrics/custom_distribution.rs":"7ea1c54802e15bb490fdc8b396998ec474bfca2f135902a4028a9530fbb5dd98","src/metrics/datetime.rs":"75f0b7c41301eb881decff363947510a6cc1a9d2203357be32d1ee169c22ff4c","src/metrics/denominator.rs":"511e4123779a6d9159bb0911069f7dcb979899a0fae0d200da854685b59d3348","src/metrics/event.rs":"d6e4a52dbde7fbd44c21df567508c35acf046e08c6ea593bbb65fa25223a2b40","src/metrics/experiment.rs":"3f3ede015bb63fd5f71fc6a90421b25d8002faf71c0766b27bf59b5ae8b8d0da","src/metrics/jwe.rs":"8e1c2e204c285a428cf58f0e7d7ee0662294208b6b48706658a6f44cf412575a","src/metrics/labeled.rs":"c8ef8419447cc0f659eacfd685f6db806e38588bf4792ab97f468b9b23f644d8","src/metrics/memory_distribution.rs":"c2d75dfe9f67a21087b36af64816e703e6b56551b970fac642552116af97f2b5","src/metrics/memory_unit.rs":"d7a678e5242febd021283b30c0099a9e62729944816a3f17d2d91e2808bc0570","src/metrics/mod.rs":"069b6790de4abcaeb8ec06797a1e85344baff6b86844508b2d75d67eb00dc5d5","src/metrics/ping.rs":"b9d344cbfdbe8aff99a83423bd0af465a7228b503f92fe912ddac24904f4eca9","src/metrics/quantity.rs":"2eb6e34f7b0a292df26cddb4295bca7b82557320eff157bf854822c4a7fccb7e","src/metrics/rate.rs":"ba297a593d340568ee1f8061a6ba4f8970220ab2a83c7af290393538c6dd9bc4","src/metrics/string.rs":"8b47de25d4354c9ccf71a5558b287241a4d80c5832ac82e280543bb800996f54","src/metrics/string_list.rs":"c956616cfd1d0fce3c2e61f0b054235f455db2295d128f08b3db2ddcdd11bdbe","src/metrics/time_unit.rs":"9bb3f6c03b1d385008b254f36ed35daf22f9a6fa2d18e007c9b70aac767cde50","src/metrics/timespan.rs":"1252babc991f8c79cbd5027f3a332c28eb63fb0a956d19a18c670ab4f2e60ba3","src/metrics/timing_distribution.rs":"b885514ef2e84c970403f85bcdb09a24abf9822dbd78129fba9d37de388520a8","src/metrics/url.rs":"b83b1de16d2397fa31e52855ccc024a050c0b429af8ffb3ff1519b68b923241d","src/metrics/uuid.rs":"ebe5560fcc76b230d304172f0ab69dc3f5e41924dad8aa30090bd38b103d0ade","src/ping/mod.rs":"0d164c2ec2822658d571356f3d00f24410f9c1e63f31101fc5d0fb20a014ee1b","src/scheduler.rs":"829846308ae9ed558fbaa62e8134ec90571803673d304c8ce370de7117e1cc76","src/storage/mod.rs":"58fc22abaa2c3643a15992ea02c664909a8d6446e5a259044b4780895b2faf10","src/system.rs":"2e2a7436075bd1a34c118202a4d18e58236947696ce3d824e97d9c06ddf0c171","src/traits/boolean.rs":"f17f16f379b777e435e38e810e25336a919f4aeeefb1b4e7cf7749c0ef173fd9","src/traits/counter.rs":"631208036059d498a4485c74c2a80c24a5f13bffeb1053bdf5cce06af0e9d361","src/traits/custom_distribution.rs":"1b3ffda6e857bfa8ad5be412e88f3d9706ededf5a86407364ae19a81f06ef798","src/traits/datetime.rs":"2f4b9e64161c15c912b6a915045dd9840f76229d144a4d1542c54eb4f3b3406b","src/traits/event.rs":"ce9a9395748734b241f35b31c4cddf0ce6a8eca6d700aaeea427b0ae29ce507d","src/traits/jwe.rs":"80cdc61e6d99d7c05139c9d05288290c731b1be61afcbd4a4c415973665ea194","src/traits/labeled.rs":"7f3281fc0a1a745238e7e260463f397dfa61717408fe9d260dc9767d9c659e52","src/traits/memory_distribution.rs":"0b72ffde68eb97f01a57afbc5c6109565ec9435561984d34696622bf5a57d559","src/traits/mod.rs":"88cec83fcff8dfab768953b901ee95fed186f7540afdc9606407aff71f1919df","src/traits/numerator.rs":"9690a1b4487521565bd488e9a938aa66f93045c63f0f0ee6e864e0341395659b","src/traits/ping.rs":"8831c106c03afeb458b0b028fa1ce61f056ebf8e82bc0a171a1bff255d920748","src/traits/quantity.rs":"087d7a4b58f0eb7c766a0202dcf38a52d172ce4edf626211ffe5d94ed02ae754","src/traits/rate.rs":"9d0da25895d4c43cdece43dd57e515ab2fb907e8c9a239807976e3d9197d2955","src/traits/string.rs":"48e5623c7db59b8e6454fbc7fb6e2395f808c9a0fa721d7c07b72abb171eb1ad","src/traits/string_list.rs":"5d5773d5a130323dd82ca95f4ecdccdd6b237afe2eadf8655363bd6b7e8508c1","src/traits/timespan.rs":"29251233847c5cdd200a61472132c62ded27fe2c13835b09424384bf144d82db","src/traits/timing_distribution.rs":"5e619d445e6ef3f19ca69bcdfe02d19b150c5a46855d195703b6d2f55e538636","src/traits/url.rs":"a01331623af4fa8af6e71becffff60060832bef5e48a15df6dc23b41225f689e","src/traits/uuid.rs":"bd78515611ba406d8b1bda35a9fe30c317512a9afcea7c5dece8fced7d410a92","src/upload/directory.rs":"571cfee0347b40b239d0d946625de6265bbea4f433c8316da715ded8f590aca1","src/upload/mod.rs":"34bcb67a5980e2c8b5145553b83e130ed4db40dab6d5c53bc9978469e6b93223","src/upload/policy.rs":"c250957a37783e74af8002cd80ba06ef9780a389fb0f61b8b665b79688f0a360","src/upload/request.rs":"7939e77bde4b55263446c3660b6831bafa27308bc983a51e1679321e962f372f","src/upload/result.rs":"d73454e81f185e4e28c887f7b496bffad7baac74c8f1b719885f940f909a530d","src/util.rs":"a89e21f0f4fe14a5a1a5369a0f2c20d1184816ccfe2b5b1599d3779660772f27","tests/boolean.rs":"9f4830f3b5f5ab6768060917deb1f546324a4744b8ed893197e31a0aed092947","tests/common/mod.rs":"28c77637c5e75a6a57c0aeb4b082de1b5d8015d507b557ca365aa5adbf208af8","tests/counter.rs":"39a2cd40335c164b3e7407f5505bbf571d7e4a71f032d476a7939f7dd1af90d0","tests/custom_distribution.rs":"596575504ad4eab2765b5b88245dcc92dc68e83d04c93deb4b27692c142c0b94","tests/datetime.rs":"4b4ab629a0f0ae789416b67f0efdfe1142fdb18f9d3a0b5182d8d840e4a6655c","tests/event.rs":"cb78dfc0a2315253da8ef6663b81979dd5b0638bb6c31456f16ce4e9bb50c67a","tests/jwe.rs":"dc8a73d1e1925ac49061e8bb5c8de01230aa364942a22470e37aa88965b0eaba","tests/labeled.rs":"cedd548bd8089dfa316cfdfaa1985fb5cd1294e6ba5956b6012c3f01975e8de9","tests/memory_distribution.rs":"0c03d0a491150f508dc12ecac7e5db70043f3a7de2f90cc6b3509aba90549821","tests/metrics.rs":"0560e0645321628015610bbf1a90c0adbb12ad42e5a068399073572120377cbb","tests/ping.rs":"a15c619b2d3c70c3cb669d02b959109bcf231440bdcfe3cac7508a3e310cd181","tests/ping_maker.rs":"aa7921c9dcea278003c719136eeea9b711d0be12bf736cc9a79b70b69cf6109f","tests/quantity.rs":"2543f0f57085d27b0bc0c25c24c17a7e376ac673cf9265a3a9dec202920679c5","tests/storage.rs":"d8d50aba92e17a3053fd80788f5fbbcc8f82293c11c19b58e2de6c4ee45f71ff","tests/string.rs":"9c3e21bfa3ad0b75373f8f5addb8ac023ac5336ac9f969e92b89ea6fda675fdd","tests/string_list.rs":"2b83710b949bea4bd0f6b2029069887f3ea87312b00091e5aa3c7bda0fb9073c","tests/timespan.rs":"bb61e4cfb843b3f387378409ee1a88ef4b8f32b2181af686baacee262b8bca2b","tests/timing_distribution.rs":"23f48e26cc4a9646c77a395fe724fa1c337caa69ea5c358056057cb1bbf4c7e6","tests/uuid.rs":"cf0df9e330344c6e00cd51faaf21dc74c5e47f892b525e0f83623c92a6378be8"},"package":"f50f24e5e7c2abef542a9cb67f7367538db56f54fcae0fae8d3a1e0ac63470a3"}
-\ No newline at end of file
-+{"files":{"Cargo.lock":"4648d6743263ca9feb905d5f706ad214e8d691c865df5ba1c6844faf962db150","Cargo.toml":"5413e453d11bb3bc682e18334640e24d8d2e3cc80192bec297544277e0bb5cab","LICENSE":"1f256ecad192880510e84ad60474eab7589218784b9a50bc7ceee34c2b91f1d5","README.md":"026495898699b54608eb4ec16074ffafc57920d80ccb59961c501a1ea28c9985","examples/sample.rs":"05469332ffa58c661628eb2f260dfd59085c371b0ef0f8b6e9cb77c230b9bb04","src/common_metric_data.rs":"0ce52740ab6d880df5127336ced68be30da568cd2a94301dc16d4e3f527134c9","src/coverage.rs":"49613fd310bd24d779472720975fbe6c97ec370a95eb55f10afa43f67539c942","src/database/mod.rs":"458e3c8af2af5345e02dea32b36f7521d4428c2ea65c225337008af56d00c6f6","src/debug.rs":"90158cc5d488ba67b60d06647e54e59a1d7bdeb906087e4fe4cfab4373c1cc6c","src/error.rs":"97172a791efdf8b791a04ae7961085fbef4391b313ff3ffb24e9381f2901fccc","src/error_recording.rs":"42af60683cb30eba821b955fe156ce43a114c0f6f3f3b5b84566659398137671","src/event_database/mod.rs":"95d665a039236ede25dd479b19f0ddc32c0dd79cef2fbcc2ef3bab1540680276","src/histogram/exponential.rs":"389d48bab03f7229445ee4d4c8a4c49f6b43303f658dc954da75142f3c040dc6","src/histogram/functional.rs":"1a63a305b48bcef7bc38136b40d916df4bb8f098dc602514ada54a9b091f6951","src/histogram/linear.rs":"5642c8983c3c1ce9b69c6ac99133c8ed5e67abe2398c5dbcf67e69d66880f4ca","src/histogram/mod.rs":"11e5d3b6440a33a3e5544d0e03ffd69fa2fdcabe603ad75e0327f3ed548e8ce3","src/internal_metrics.rs":"5626effec67bf0f9ee12609b77cf04741eac1827123039999d4adb28a3cc5976","src/internal_pings.rs":"5ed4669b6f09d660401f44c8279e0a5fea0262e48de40e85595bd25dc70b05f3","src/lib.rs":"49f36f867e0412d514fdddee9c40d71e020dbc27fe0efebe6808d9a16872b986","src/lib_unit_tests.rs":"17b0eaad81f946ddef89ee076f4d138e427638ee7536be128b30d4e7280dcf7b","src/macros.rs":"3f3fc8c36dd05b7528b66b27e95b6494505a7a1f48abd013218de23ada6b5a43","src/metrics/boolean.rs":"49e2f5be78055f61543db1d4d57cc06064a812a8f45c9d0e753df8325edc9041","src/metrics/counter.rs":"e3e2a195b597ea1559991b992f44a8a5f291b592a5c6946e93e01066f276efbb","src/metrics/custom_distribution.rs":"7ea1c54802e15bb490fdc8b396998ec474bfca2f135902a4028a9530fbb5dd98","src/metrics/datetime.rs":"75f0b7c41301eb881decff363947510a6cc1a9d2203357be32d1ee169c22ff4c","src/metrics/denominator.rs":"511e4123779a6d9159bb0911069f7dcb979899a0fae0d200da854685b59d3348","src/metrics/event.rs":"d6e4a52dbde7fbd44c21df567508c35acf046e08c6ea593bbb65fa25223a2b40","src/metrics/experiment.rs":"3f3ede015bb63fd5f71fc6a90421b25d8002faf71c0766b27bf59b5ae8b8d0da","src/metrics/jwe.rs":"8e1c2e204c285a428cf58f0e7d7ee0662294208b6b48706658a6f44cf412575a","src/metrics/labeled.rs":"e77459b593b2b6b375a1dacb1c9192fb47dcb5a294935c2c30aeea8e6f5432cd","src/metrics/memory_distribution.rs":"c2d75dfe9f67a21087b36af64816e703e6b56551b970fac642552116af97f2b5","src/metrics/memory_unit.rs":"d7a678e5242febd021283b30c0099a9e62729944816a3f17d2d91e2808bc0570","src/metrics/mod.rs":"069b6790de4abcaeb8ec06797a1e85344baff6b86844508b2d75d67eb00dc5d5","src/metrics/ping.rs":"b9d344cbfdbe8aff99a83423bd0af465a7228b503f92fe912ddac24904f4eca9","src/metrics/quantity.rs":"2eb6e34f7b0a292df26cddb4295bca7b82557320eff157bf854822c4a7fccb7e","src/metrics/rate.rs":"ba297a593d340568ee1f8061a6ba4f8970220ab2a83c7af290393538c6dd9bc4","src/metrics/string.rs":"8b47de25d4354c9ccf71a5558b287241a4d80c5832ac82e280543bb800996f54","src/metrics/string_list.rs":"c956616cfd1d0fce3c2e61f0b054235f455db2295d128f08b3db2ddcdd11bdbe","src/metrics/time_unit.rs":"9bb3f6c03b1d385008b254f36ed35daf22f9a6fa2d18e007c9b70aac767cde50","src/metrics/timespan.rs":"1252babc991f8c79cbd5027f3a332c28eb63fb0a956d19a18c670ab4f2e60ba3","src/metrics/timing_distribution.rs":"b885514ef2e84c970403f85bcdb09a24abf9822dbd78129fba9d37de388520a8","src/metrics/url.rs":"b83b1de16d2397fa31e52855ccc024a050c0b429af8ffb3ff1519b68b923241d","src/metrics/uuid.rs":"ebe5560fcc76b230d304172f0ab69dc3f5e41924dad8aa30090bd38b103d0ade","src/ping/mod.rs":"0d164c2ec2822658d571356f3d00f24410f9c1e63f31101fc5d0fb20a014ee1b","src/scheduler.rs":"829846308ae9ed558fbaa62e8134ec90571803673d304c8ce370de7117e1cc76","src/storage/mod.rs":"265e0ff9f3b769f6167afd6e498760c0505fe8431f52fb84f377b20b2b15670e","src/system.rs":"2e2a7436075bd1a34c118202a4d18e58236947696ce3d824e97d9c06ddf0c171","src/traits/boolean.rs":"f17f16f379b777e435e38e810e25336a919f4aeeefb1b4e7cf7749c0ef173fd9","src/traits/counter.rs":"631208036059d498a4485c74c2a80c24a5f13bffeb1053bdf5cce06af0e9d361","src/traits/custom_distribution.rs":"1b3ffda6e857bfa8ad5be412e88f3d9706ededf5a86407364ae19a81f06ef798","src/traits/datetime.rs":"2f4b9e64161c15c912b6a915045dd9840f76229d144a4d1542c54eb4f3b3406b","src/traits/event.rs":"ce9a9395748734b241f35b31c4cddf0ce6a8eca6d700aaeea427b0ae29ce507d","src/traits/jwe.rs":"80cdc61e6d99d7c05139c9d05288290c731b1be61afcbd4a4c415973665ea194","src/traits/labeled.rs":"7f3281fc0a1a745238e7e260463f397dfa61717408fe9d260dc9767d9c659e52","src/traits/memory_distribution.rs":"0b72ffde68eb97f01a57afbc5c6109565ec9435561984d34696622bf5a57d559","src/traits/mod.rs":"88cec83fcff8dfab768953b901ee95fed186f7540afdc9606407aff71f1919df","src/traits/numerator.rs":"9690a1b4487521565bd488e9a938aa66f93045c63f0f0ee6e864e0341395659b","src/traits/ping.rs":"8831c106c03afeb458b0b028fa1ce61f056ebf8e82bc0a171a1bff255d920748","src/traits/quantity.rs":"087d7a4b58f0eb7c766a0202dcf38a52d172ce4edf626211ffe5d94ed02ae754","src/traits/rate.rs":"9d0da25895d4c43cdece43dd57e515ab2fb907e8c9a239807976e3d9197d2955","src/traits/string.rs":"48e5623c7db59b8e6454fbc7fb6e2395f808c9a0fa721d7c07b72abb171eb1ad","src/traits/string_list.rs":"5d5773d5a130323dd82ca95f4ecdccdd6b237afe2eadf8655363bd6b7e8508c1","src/traits/timespan.rs":"29251233847c5cdd200a61472132c62ded27fe2c13835b09424384bf144d82db","src/traits/timing_distribution.rs":"5e619d445e6ef3f19ca69bcdfe02d19b150c5a46855d195703b6d2f55e538636","src/traits/url.rs":"a01331623af4fa8af6e71becffff60060832bef5e48a15df6dc23b41225f689e","src/traits/uuid.rs":"bd78515611ba406d8b1bda35a9fe30c317512a9afcea7c5dece8fced7d410a92","src/upload/directory.rs":"571cfee0347b40b239d0d946625de6265bbea4f433c8316da715ded8f590aca1","src/upload/mod.rs":"34bcb67a5980e2c8b5145553b83e130ed4db40dab6d5c53bc9978469e6b93223","src/upload/policy.rs":"c250957a37783e74af8002cd80ba06ef9780a389fb0f61b8b665b79688f0a360","src/upload/request.rs":"7939e77bde4b55263446c3660b6831bafa27308bc983a51e1679321e962f372f","src/upload/result.rs":"d73454e81f185e4e28c887f7b496bffad7baac74c8f1b719885f940f909a530d","src/util.rs":"a89e21f0f4fe14a5a1a5369a0f2c20d1184816ccfe2b5b1599d3779660772f27","tests/boolean.rs":"9f4830f3b5f5ab6768060917deb1f546324a4744b8ed893197e31a0aed092947","tests/common/mod.rs":"28c77637c5e75a6a57c0aeb4b082de1b5d8015d507b557ca365aa5adbf208af8","tests/counter.rs":"39a2cd40335c164b3e7407f5505bbf571d7e4a71f032d476a7939f7dd1af90d0","tests/custom_distribution.rs":"596575504ad4eab2765b5b88245dcc92dc68e83d04c93deb4b27692c142c0b94","tests/datetime.rs":"4b4ab629a0f0ae789416b67f0efdfe1142fdb18f9d3a0b5182d8d840e4a6655c","tests/event.rs":"cb78dfc0a2315253da8ef6663b81979dd5b0638bb6c31456f16ce4e9bb50c67a","tests/jwe.rs":"dc8a73d1e1925ac49061e8bb5c8de01230aa364942a22470e37aa88965b0eaba","tests/labeled.rs":"cedd548bd8089dfa316cfdfaa1985fb5cd1294e6ba5956b6012c3f01975e8de9","tests/memory_distribution.rs":"0c03d0a491150f508dc12ecac7e5db70043f3a7de2f90cc6b3509aba90549821","tests/metrics.rs":"0560e0645321628015610bbf1a90c0adbb12ad42e5a068399073572120377cbb","tests/ping.rs":"a15c619b2d3c70c3cb669d02b959109bcf231440bdcfe3cac7508a3e310cd181","tests/ping_maker.rs":"aa7921c9dcea278003c719136eeea9b711d0be12bf736cc9a79b70b69cf6109f","tests/quantity.rs":"2543f0f57085d27b0bc0c25c24c17a7e376ac673cf9265a3a9dec202920679c5","tests/storage.rs":"d8d50aba92e17a3053fd80788f5fbbcc8f82293c11c19b58e2de6c4ee45f71ff","tests/string.rs":"9c3e21bfa3ad0b75373f8f5addb8ac023ac5336ac9f969e92b89ea6fda675fdd","tests/string_list.rs":"2b83710b949bea4bd0f6b2029069887f3ea87312b00091e5aa3c7bda0fb9073c","tests/timespan.rs":"bb61e4cfb843b3f387378409ee1a88ef4b8f32b2181af686baacee262b8bca2b","tests/timing_distribution.rs":"23f48e26cc4a9646c77a395fe724fa1c337caa69ea5c358056057cb1bbf4c7e6","tests/uuid.rs":"cf0df9e330344c6e00cd51faaf21dc74c5e47f892b525e0f83623c92a6378be8"},"package":"349ebbb162d58911547b48e5fbf90d45854e3e1ba03332f41b80a6611867c013"}
-\ No newline at end of file
-diff --git a/third_party/rust/glean-core/Cargo.lock b/third_party/rust/glean-core/Cargo.lock
---- a/third_party/rust/glean-core/Cargo.lock
-+++ b/third_party/rust/glean-core/Cargo.lock
-@@ -54,9 +54,9 @@
-
- [[package]]
- name = "cc"
--version = "1.0.71"
-+version = "1.0.72"
- source = "registry+https://github.com/rust-lang/crates.io-index"
--checksum = "79c2681d6594606957bbb8631c4b90a7fcaaa72cdb714743a437b156d6a7eedd"
-+checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee"
-
- [[package]]
- name = "cfg-if"
-@@ -80,9 +80,9 @@
-
- [[package]]
- name = "crc32fast"
--version = "1.2.1"
-+version = "1.3.0"
- source = "registry+https://github.com/rust-lang/crates.io-index"
--checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a"
-+checksum = "738c290dfaea84fc1ca15ad9c168d083b05a714e1efddd8edaab678dc28d2836"
- dependencies = [
- "cfg-if",
- ]
-@@ -154,7 +154,7 @@
-
- [[package]]
- name = "glean-core"
--version = "42.1.0"
-+version = "42.3.0"
- dependencies = [
- "bincode",
- "chrono",
-@@ -208,9 +208,9 @@
-
- [[package]]
- name = "iso8601"
--version = "0.4.0"
-+version = "0.4.1"
- source = "registry+https://github.com/rust-lang/crates.io-index"
--checksum = "cee08a007a59a8adfc96f69738ddf59e374888dfd84b49c4b916543067644d58"
-+checksum = "0a59a3f2be6271b2a844cd0dd13bf8ccc88a9540482d872c7ce58ab1c4db9fab"
- dependencies = [
- "nom",
- ]
-@@ -229,9 +229,9 @@
-
- [[package]]
- name = "libc"
--version = "0.2.104"
-+version = "0.2.109"
- source = "registry+https://github.com/rust-lang/crates.io-index"
--checksum = "7b2f96d100e1cf1929e7719b7edb3b90ab5298072638fccd77be9ce942ecdfce"
-+checksum = "f98a04dce437184842841303488f70d0188c5f51437d2a834dc097eafa909a01"
-
- [[package]]
- name = "lmdb-rkv"
-@@ -278,6 +278,12 @@
- checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a"
-
- [[package]]
-+name = "minimal-lexical"
-+version = "0.2.1"
-+source = "registry+https://github.com/rust-lang/crates.io-index"
-+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
-+
-+[[package]]
- name = "miniz_oxide"
- version = "0.4.4"
- source = "registry+https://github.com/rust-lang/crates.io-index"
-@@ -289,11 +295,12 @@
-
- [[package]]
- name = "nom"
--version = "5.1.2"
-+version = "7.1.0"
- source = "registry+https://github.com/rust-lang/crates.io-index"
--checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af"
-+checksum = "1b1d11e1ef389c76fe5b81bcaf2ea32cf88b62bc494e19f493d0b30e7a930109"
- dependencies = [
- "memchr",
-+ "minimal-lexical",
- "version_check",
- ]
-
-@@ -358,15 +365,15 @@
-
- [[package]]
- name = "pkg-config"
--version = "0.3.20"
-+version = "0.3.23"
- source = "registry+https://github.com/rust-lang/crates.io-index"
--checksum = "7c9b1041b4387893b91ee6746cddfc28516aff326a3519fb2adf820932c5e6cb"
-+checksum = "d1a3ea4f0dd7f1f3e512cf97bf100819aa547f36a6eccac8dbaae839eb92363e"
-
- [[package]]
- name = "ppv-lite86"
--version = "0.2.14"
-+version = "0.2.15"
- source = "registry+https://github.com/rust-lang/crates.io-index"
--checksum = "c3ca011bd0129ff4ae15cd04c4eef202cadf6c51c21e47aba319b4e0501db741"
-+checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba"
-
- [[package]]
- name = "proc-macro-hack"
-@@ -376,9 +383,9 @@
-
- [[package]]
- name = "proc-macro2"
--version = "1.0.30"
-+version = "1.0.33"
- source = "registry+https://github.com/rust-lang/crates.io-index"
--checksum = "edc3358ebc67bc8b7fa0c007f945b0b18226f78437d61bec735a9eb96b61ee70"
-+checksum = "fb37d2df5df740e582f28f8560cf425f52bb267d872fe58358eadb554909f07a"
- dependencies = [
- "unicode-xid",
- ]
-@@ -475,9 +482,9 @@
-
- [[package]]
- name = "ryu"
--version = "1.0.5"
-+version = "1.0.6"
- source = "registry+https://github.com/rust-lang/crates.io-index"
--checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
-+checksum = "3c9613b5a66ab9ba26415184cfc41156594925a9cf3a2057e57f31ff145f6568"
-
- [[package]]
- name = "serde"
-@@ -501,9 +508,9 @@
-
- [[package]]
- name = "serde_json"
--version = "1.0.68"
-+version = "1.0.72"
- source = "registry+https://github.com/rust-lang/crates.io-index"
--checksum = "0f690853975602e1bfe1ccbf50504d67174e3bcf340f23b5ea9992e0587a52d8"
-+checksum = "d0ffa0837f2dfa6fb90868c2b5468cad482e175f7dad97e7421951e663f2b527"
- dependencies = [
- "itoa",
- "ryu",
-@@ -512,9 +519,9 @@
-
- [[package]]
- name = "syn"
--version = "1.0.80"
-+version = "1.0.82"
- source = "registry+https://github.com/rust-lang/crates.io-index"
--checksum = "d010a1623fbd906d51d650a9916aaefc05ffa0e4053ff7fe601167f3e715d194"
-+checksum = "8daf5dd0bb60cbd4137b1b587d2fc0ae729bc07cf01cd70b36a1ed5ade3b9d59"
- dependencies = [
- "proc-macro2",
- "quote",
-@@ -576,9 +583,9 @@
-
- [[package]]
- name = "tinyvec"
--version = "1.5.0"
-+version = "1.5.1"
- source = "registry+https://github.com/rust-lang/crates.io-index"
--checksum = "f83b2a3d4d9091d0abd7eba4dc2710b1718583bd4d8992e2190720ea38f391f7"
-+checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2"
- dependencies = [
- "tinyvec_macros",
- ]
-diff --git a/third_party/rust/glean-core/Cargo.toml b/third_party/rust/glean-core/Cargo.toml
---- a/third_party/rust/glean-core/Cargo.toml
-+++ b/third_party/rust/glean-core/Cargo.toml
-@@ -12,7 +12,7 @@
- [package]
- edition = "2018"
- name = "glean-core"
--version = "42.1.0"
-+version = "42.3.0"
- authors = ["Jan-Erik Rediger <jrediger@mozilla.com>", "The Glean Team <glean-team@mozilla.com>"]
- include = ["/README.md", "/LICENSE", "/src", "/examples", "/tests", "/Cargo.toml"]
- description = "A modern Telemetry library"
-@@ -21,7 +21,7 @@
- license = "MPL-2.0"
- repository = "https://github.com/mozilla/glean"
- [package.metadata.glean]
--glean-parser = "4.2.0"
-+glean-parser = "4.3.1"
- [dependencies.bincode]
- version = "1.2.1"
-
-diff --git a/third_party/rust/glean-core/src/debug.rs b/third_party/rust/glean-core/src/debug.rs
---- a/third_party/rust/glean-core/src/debug.rs
-+++ b/third_party/rust/glean-core/src/debug.rs
-@@ -234,7 +234,7 @@
- return false;
- }
-
-- tags.iter().all(|x| validate_tag(x))
-+ tags.iter().all(validate_tag)
- }
-
- #[cfg(test)]
-diff --git a/third_party/rust/glean-core/src/metrics/labeled.rs b/third_party/rust/glean-core/src/metrics/labeled.rs
---- a/third_party/rust/glean-core/src/metrics/labeled.rs
-+++ b/third_party/rust/glean-core/src/metrics/labeled.rs
-@@ -182,8 +182,7 @@
-
- /// Strips the label off of a complete identifier
- pub fn strip_label(identifier: &str) -> &str {
-- // safe unwrap, first field of a split always valid
-- identifier.splitn(2, '/').next().unwrap()
-+ identifier.split_once('/').map_or(identifier, |s| s.0)
- }
-
- /// Validates a dynamic label, changing it to `OTHER_LABEL` if it's invalid.
-diff --git a/third_party/rust/glean-core/src/storage/mod.rs b/third_party/rust/glean-core/src/storage/mod.rs
---- a/third_party/rust/glean-core/src/storage/mod.rs
-+++ b/third_party/rust/glean-core/src/storage/mod.rs
-@@ -203,7 +203,7 @@
- let mut snapshotter = |metric_id: &[u8], metric: &Metric| {
- let metric_id = String::from_utf8_lossy(metric_id).into_owned();
- if metric_id.ends_with("#experiment") {
-- let name = metric_id.splitn(2, '#').next().unwrap(); // safe unwrap, first field of a split always valid
-+ let (name, _) = metric_id.split_once('#').unwrap(); // safe unwrap, we ensured there's a `#` in the string
- snapshot.insert(name.to_string(), metric.as_json());
- }
- };
-diff --git a/third_party/rust/glean-ffi/.cargo-checksum.json b/third_party/rust/glean-ffi/.cargo-checksum.json
---- a/third_party/rust/glean-ffi/.cargo-checksum.json
-+++ b/third_party/rust/glean-ffi/.cargo-checksum.json
-@@ -1 +1 @@
--{"files":{"Cargo.toml":"36b60da27ddb5d5cdada09162dff4c147caa0edf9406eb23b44e1730e8ac2372","LICENSE":"1f256ecad192880510e84ad60474eab7589218784b9a50bc7ceee34c2b91f1d5","README.md":"bfe00cc2501c9b15d5bc463c6db30ebbf8d7b5d6c555cf3827ae529fc9e7d6cc","cbindgen.toml":"ac25d1bc2ab7d6afaf25cfa0d35233f93b01f7129088cdd1fa89b9d987a8c564","glean.h":"bbe571147f9fee34f7deac1057c541f00523317328e591446d4c96bbe84c99eb","src/boolean.rs":"0d1d59d0c13cdb63592a9513f2abcf3d1a8260d6523cc7d1af40cfcb4c75572a","src/byte_buffer.rs":"eeb6df25da7b393517f0c993e1e99a0acbccd7678b1127ce0e471d0e53a4bb45","src/counter.rs":"4d8f41285e4a9dbfa2733cdf937905006b475c0af7a501df73fde4ca77818e82","src/custom_distribution.rs":"b0b3b23289e413e7d150e8dae8217e6bd409cbbab68abb127f146041bcbfaf45","src/datetime.rs":"a5c1c993605b1a8ff044d88de4f4a385aff1a781cb8cb45573b90882da801fae","src/event.rs":"ef6dd4f0493ae223e4f7091d5779e46b33ea9864c2a4e5953811a7d9e8884c32","src/fd_logger.rs":"0f8197bb086f49413cca30a72bae029f663842fc3b78ceef6d0854a070b1cdfd","src/ffi_string_ext.rs":"389ae94dcdace1f56ca2c87207e865edda6d42da45733f1027e0a4dcfa86c492","src/from_raw.rs":"b17515a58d7e303ee746ea54c1c1c6d0523dc4de0bd8157dfaba2a610da637bb","src/handlemap_ext.rs":"3b1b088a2de197a0c3eaae0f2f0915d53602f51c13d27f48297f52cd885d5abc","src/jwe.rs":"72adff64900ca16d6527e8d6a436ac2ba85f738d6e92e33f3d71df32b485d0c3","src/labeled.rs":"9cc706511961dbe62350d62b39e9b2c3a9c9e9f53d5577274e273c0f826cd8c3","src/lib.rs":"b5bee8a36a3d0e32eaa01caad0ca57f8649b61b0f99cd3df1f697c27ec9fc47a","src/macros.rs":"e11614edb156552617354d7f6120c8e60ffeb6632ebc19d2b7c6c3e88523b01b","src/memory_distribution.rs":"08ef15e340f2e7ab2f4f83cd8e883c864d4affb94458e80198c106393bfb6bd8","src/ping_type.rs":"6401bcf4342ec1e4ba3782e2b67b3320aa96c9eddc03fc3c75ecc54e2f08a619","src/quantity.rs":"f72781ea642b5f7e363e9fecaded143d1afd772575603763543f1df3448ec337","src/string.rs":"199a238f3524eb36643d82b63df5c7f013adedb6af80632a2675f8562f34e692","src/string_list.rs":"12e2fbbdc08a1b8da1885fb14acd59ab27c8b598a24dc15a4eaca16636540a54","src/timespan.rs":"b7ac51dbfd5169d8c688c3fd2db51e38b6173c925ca14d7b0e8353f225b30a50","src/timing_distribution.rs":"4b5962729fb0b4c9ebf65a5fc5af105357652fcc282c6f8840f328452ba86ac6","src/upload.rs":"320c6e97df0a87040d2a269765401cd67da50f0a226c95a9a314f22452116f7c","src/url.rs":"2dfaf006cd4024ee07eb37dc312201b027d774f6c9881e556774cc09077a6290","src/uuid.rs":"c9ea7225fac53b55a8aeef39cd33470228c0a178185aa74b8fa652657994e404","src/weak.rs":"0199f4ef38d667f0b9f8ef3c5505ff15cd6e911bc83c27e7e9954fdffe1be0bb"},"package":"26738a3a19d212595c76a765b3e29fc9a0e1c5e7d15a8352ac94ec8536b65cd5"}
-\ No newline at end of file
-+{"files":{"Cargo.toml":"2592f1c0a12f24250790a516f0c194543afa412205dab039dcbb9c5faba5e00e","LICENSE":"1f256ecad192880510e84ad60474eab7589218784b9a50bc7ceee34c2b91f1d5","README.md":"bfe00cc2501c9b15d5bc463c6db30ebbf8d7b5d6c555cf3827ae529fc9e7d6cc","cbindgen.toml":"ac25d1bc2ab7d6afaf25cfa0d35233f93b01f7129088cdd1fa89b9d987a8c564","glean.h":"bbe571147f9fee34f7deac1057c541f00523317328e591446d4c96bbe84c99eb","src/boolean.rs":"0d1d59d0c13cdb63592a9513f2abcf3d1a8260d6523cc7d1af40cfcb4c75572a","src/byte_buffer.rs":"eeb6df25da7b393517f0c993e1e99a0acbccd7678b1127ce0e471d0e53a4bb45","src/counter.rs":"4d8f41285e4a9dbfa2733cdf937905006b475c0af7a501df73fde4ca77818e82","src/custom_distribution.rs":"b0b3b23289e413e7d150e8dae8217e6bd409cbbab68abb127f146041bcbfaf45","src/datetime.rs":"a5c1c993605b1a8ff044d88de4f4a385aff1a781cb8cb45573b90882da801fae","src/event.rs":"ef6dd4f0493ae223e4f7091d5779e46b33ea9864c2a4e5953811a7d9e8884c32","src/fd_logger.rs":"0f8197bb086f49413cca30a72bae029f663842fc3b78ceef6d0854a070b1cdfd","src/ffi_string_ext.rs":"389ae94dcdace1f56ca2c87207e865edda6d42da45733f1027e0a4dcfa86c492","src/from_raw.rs":"b17515a58d7e303ee746ea54c1c1c6d0523dc4de0bd8157dfaba2a610da637bb","src/handlemap_ext.rs":"3b1b088a2de197a0c3eaae0f2f0915d53602f51c13d27f48297f52cd885d5abc","src/jwe.rs":"72adff64900ca16d6527e8d6a436ac2ba85f738d6e92e33f3d71df32b485d0c3","src/labeled.rs":"9cc706511961dbe62350d62b39e9b2c3a9c9e9f53d5577274e273c0f826cd8c3","src/lib.rs":"b5bee8a36a3d0e32eaa01caad0ca57f8649b61b0f99cd3df1f697c27ec9fc47a","src/macros.rs":"e11614edb156552617354d7f6120c8e60ffeb6632ebc19d2b7c6c3e88523b01b","src/memory_distribution.rs":"08ef15e340f2e7ab2f4f83cd8e883c864d4affb94458e80198c106393bfb6bd8","src/ping_type.rs":"6401bcf4342ec1e4ba3782e2b67b3320aa96c9eddc03fc3c75ecc54e2f08a619","src/quantity.rs":"f72781ea642b5f7e363e9fecaded143d1afd772575603763543f1df3448ec337","src/string.rs":"199a238f3524eb36643d82b63df5c7f013adedb6af80632a2675f8562f34e692","src/string_list.rs":"12e2fbbdc08a1b8da1885fb14acd59ab27c8b598a24dc15a4eaca16636540a54","src/timespan.rs":"b7ac51dbfd5169d8c688c3fd2db51e38b6173c925ca14d7b0e8353f225b30a50","src/timing_distribution.rs":"4b5962729fb0b4c9ebf65a5fc5af105357652fcc282c6f8840f328452ba86ac6","src/upload.rs":"320c6e97df0a87040d2a269765401cd67da50f0a226c95a9a314f22452116f7c","src/url.rs":"2dfaf006cd4024ee07eb37dc312201b027d774f6c9881e556774cc09077a6290","src/uuid.rs":"c9ea7225fac53b55a8aeef39cd33470228c0a178185aa74b8fa652657994e404","src/weak.rs":"0199f4ef38d667f0b9f8ef3c5505ff15cd6e911bc83c27e7e9954fdffe1be0bb"},"package":"9e29c3f0b9dbde127254f375499df382d5fa9c3c2b33bfcb393485876fe79fb2"}
-\ No newline at end of file
-diff --git a/third_party/rust/glean-ffi/Cargo.toml b/third_party/rust/glean-ffi/Cargo.toml
---- a/third_party/rust/glean-ffi/Cargo.toml
-+++ b/third_party/rust/glean-ffi/Cargo.toml
-@@ -12,7 +12,7 @@
- [package]
- edition = "2018"
- name = "glean-ffi"
--version = "42.1.0"
-+version = "42.3.0"
- authors = ["Jan-Erik Rediger <jrediger@mozilla.com>", "The Glean Team <glean-team@mozilla.com>"]
- include = ["/README.md", "/LICENSE", "/src", "/tests", "/Cargo.toml", "/cbindgen.toml", "/glean.h"]
- description = "FFI layer for Glean, a modern Telemetry library"
-@@ -28,7 +28,7 @@
- version = "0.4.0"
-
- [dependencies.glean-core]
--version = "42.1.0"
-+version = "42.3.0"
-
- [dependencies.log]
- version = "0.4.8"
-diff --git a/third_party/rust/glean/.cargo-checksum.json b/third_party/rust/glean/.cargo-checksum.json
---- a/third_party/rust/glean/.cargo-checksum.json
-+++ b/third_party/rust/glean/.cargo-checksum.json
-@@ -1 +1 @@
--{"files":{"Cargo.toml":"c2a549ca03146a345f13ce7e8dd498f9532bab9e0ef90669d257479a81b98fe9","LICENSE":"1f256ecad192880510e84ad60474eab7589218784b9a50bc7ceee34c2b91f1d5","README.md":"fd9e0ca6907917ea6bec5de05e15dd21d20fae1cb7f3250467bb20231a8e1065","src/common_test.rs":"bd7ab2f6384bea8971f97ba68b11c946899303891bc534898f7aabbf27f9008a","src/configuration.rs":"4acbedba16d45f6404ccedde86e8aa33eea8c1b9554210cb69c79ff2ec9040c9","src/core_metrics.rs":"0593192ec0fa1b4d267411cdfb75c70f78578083eca91f6e09cd08346de32264","src/dispatcher/global.rs":"460ccfec311163b469c54f63f4cb41e057b93421ccb7675e435c2994d478cd4b","src/dispatcher/mod.rs":"9f59e466fbbcc3e1bdc42659822a2a2c4b8250456858ee885e53b16458f4a47e","src/glean_metrics.rs":"151b6e5acc12436c33c75e2e0a18f9769179d3c7fdc60a22fa02afb76feaf00f","src/lib.rs":"f663c617f655e0b24dfc8bcb77659a209e8d2440c71ff2477f8b2d2b520fff17","src/net/http_uploader.rs":"9e8c1837ca0d3f6ea165ec936ab054173c4fe95a958710176c33b4d4d1d98beb","src/net/mod.rs":"284bcf182156c52ea25fa33bcc48d80b4970ee3c187a4ea3a06602cc34c710bf","src/pings.rs":"2dfccd84848e1933aa4f6a7a707c58ec794c8f73ef2d93ea4d4df71d4e6abc31","src/private/boolean.rs":"eeadc0529e2c69a930479f208746799b064b27facab8306c1c10c650e83fb63c","src/private/counter.rs":"0bc8a2d0df72e47b7365ff80bfc16427a5da701fd0adadeedbcce13cebcd79ce","src/private/custom_distribution.rs":"6d1271fb91e9d51a8dcf5eb9d540b3757ebe9cc998b196943ed8c729f62afc67","src/private/datetime.rs":"cb8f26f74d318e2118d6ae1b15972557eb205d4d8b24795fb0d08fdea2bc3f56","src/private/denominator.rs":"95332737f3ac80346f4811440a2141cd427692819bd04d5d3ac7374299dc20b0","src/private/event.rs":"b674ceb85351b7989bd25ed4f5d98c5c9b31e2a03f13b054a8c0dbef54190e49","src/private/labeled.rs":"2cd90d132954ee3ada43ff1ad538072ba43eece7a53ed89811a2a7b43a4819f1","src/private/memory_distribution.rs":"8b78a0e33601081d76639445c8b4875a4fe7c3aded720bb43afdabe86e0fd6ee","src/private/mod.rs":"63368b123fecb6de210ec634b8d387799b4b9dd960016335ebc3c6851e81628f","src/private/numerator.rs":"334ac2ad3d8dd7b9f02f1ca5391b683d50fbc8c6728a12882a68bb067604c800","src/private/ping.rs":"915fc42994e0929656daee5511946ac1f56fe0d4d704e97e13795771d9890180","src/private/quantity.rs":"528675cd388010b89e6ac23c9152701c78d32c2dcd0b5e9abf1a50a52ee818a5","src/private/rate.rs":"7ddfdb3d5f2d1887b378caa3769ade92ea0fbd193f6e760f5f383c8b3e9f3aff","src/private/recorded_experiment_data.rs":"66b2601902a2dc2b7a283717c21ce754de94fcca30d12e0398195c8ad49c90af","src/private/string.rs":"c85ded40b1409793ae5b78da692bc2e708f8d55defb76ec5f515096d32f206c9","src/private/string_list.rs":"472ad79fba4b9bcde0ff5b3e05fd8e0aaa3d1d2941fc181faf2ceb90f1d518bd","src/private/timespan.rs":"19ed08aa5103b685a3a0b9f06f2c60250d55f3c8f36337f8c7bdbb2dfdb92786","src/private/timing_distribution.rs":"ee7fa0c3d5427e371b5413373cb1f5841ac10df9b7ca08316ef724e7ad3591d9","src/private/url.rs":"223de8a025e2f749255103402eecb5582961c2b5af7492e294362a0e8f55c414","src/private/uuid.rs":"2b69ddaf3978aaa31c625c0f3eb948c44369744334aacc6b5a2b217268d244a7","src/system.rs":"ff23a5b94f52dab484342dfed702412bc29ab1bbfd5af326033d8e07e7b9075f","src/test.rs":"0cbe4f51fa01b1ca04e4b726e8eb729c3504086bc6b0d644e2114a5a4473165a","tests/common/mod.rs":"4837df2e771929cc077e6fb9a9239645e8e0f7bc6c9f409b71c4d147edf334fc","tests/init_fails.rs":"1e832fe454962ddb1155d546bb71b6395aa9936f848ff0fbe88affaaab7dfae3","tests/never_init.rs":"1f33b8ce7ca3514b57b48cc16d98408974c85cf8aa7d13257ffc2ad878ebb295","tests/no_time_to_init.rs":"4d61e4196d8eef23f3bcb24b59bd0b0379c1f2cb50f03434a53996ab097bfb17","tests/overflowing_preinit.rs":"81ff97745789fd5f58f86364488c011b4503648f1366b12e26755edc54323150","tests/persist_ping_lifetime.rs":"adfab91baf978f464e265eae828fcc03aa6eef83422d3918ffb680b2c2ec859e","tests/persist_ping_lifetime_nopanic.rs":"92f4739b21c0d46cb368eafea43bfb822d8dee96412d5f4fc32e01636f0cf244","tests/schema.rs":"621caef0cc7f98c79740422835485fea2343ca105d0d9a7eec6ded9cfad6232c","tests/simple.rs":"2f58d3ff90005231f2febd21f66ee41d06302618408ea990b446510449c3444f"},"package":"af977f3ee276d391cbf940639a5b95378c2b0031d5624c019142d286be4a1a21"}
-\ No newline at end of file
-+{"files":{"Cargo.toml":"8f777d1de11f0143f451977e300df83a66fef432819f377c2378710791fdec53","LICENSE":"1f256ecad192880510e84ad60474eab7589218784b9a50bc7ceee34c2b91f1d5","README.md":"fd9e0ca6907917ea6bec5de05e15dd21d20fae1cb7f3250467bb20231a8e1065","src/common_test.rs":"bd7ab2f6384bea8971f97ba68b11c946899303891bc534898f7aabbf27f9008a","src/configuration.rs":"4acbedba16d45f6404ccedde86e8aa33eea8c1b9554210cb69c79ff2ec9040c9","src/core_metrics.rs":"0593192ec0fa1b4d267411cdfb75c70f78578083eca91f6e09cd08346de32264","src/dispatcher/global.rs":"460ccfec311163b469c54f63f4cb41e057b93421ccb7675e435c2994d478cd4b","src/dispatcher/mod.rs":"9f59e466fbbcc3e1bdc42659822a2a2c4b8250456858ee885e53b16458f4a47e","src/glean_metrics.rs":"d376e4f40ec620ce31667451a78adc1146213016e100c0d457505ec240ab31bf","src/lib.rs":"5ecf8102426bbfbd941a7e19bb79a65485a90d9842783a1940c42ebdec61e183","src/net/http_uploader.rs":"9e8c1837ca0d3f6ea165ec936ab054173c4fe95a958710176c33b4d4d1d98beb","src/net/mod.rs":"284bcf182156c52ea25fa33bcc48d80b4970ee3c187a4ea3a06602cc34c710bf","src/pings.rs":"02a3ddb4e77d2033fb5a8fc9bbec09ad5500691e0bd2a1db334805cba88670fd","src/private/boolean.rs":"eeadc0529e2c69a930479f208746799b064b27facab8306c1c10c650e83fb63c","src/private/counter.rs":"0bc8a2d0df72e47b7365ff80bfc16427a5da701fd0adadeedbcce13cebcd79ce","src/private/custom_distribution.rs":"6d1271fb91e9d51a8dcf5eb9d540b3757ebe9cc998b196943ed8c729f62afc67","src/private/datetime.rs":"cb8f26f74d318e2118d6ae1b15972557eb205d4d8b24795fb0d08fdea2bc3f56","src/private/denominator.rs":"95332737f3ac80346f4811440a2141cd427692819bd04d5d3ac7374299dc20b0","src/private/event.rs":"b674ceb85351b7989bd25ed4f5d98c5c9b31e2a03f13b054a8c0dbef54190e49","src/private/labeled.rs":"2cd90d132954ee3ada43ff1ad538072ba43eece7a53ed89811a2a7b43a4819f1","src/private/memory_distribution.rs":"8b78a0e33601081d76639445c8b4875a4fe7c3aded720bb43afdabe86e0fd6ee","src/private/mod.rs":"63368b123fecb6de210ec634b8d387799b4b9dd960016335ebc3c6851e81628f","src/private/numerator.rs":"334ac2ad3d8dd7b9f02f1ca5391b683d50fbc8c6728a12882a68bb067604c800","src/private/ping.rs":"915fc42994e0929656daee5511946ac1f56fe0d4d704e97e13795771d9890180","src/private/quantity.rs":"528675cd388010b89e6ac23c9152701c78d32c2dcd0b5e9abf1a50a52ee818a5","src/private/rate.rs":"7ddfdb3d5f2d1887b378caa3769ade92ea0fbd193f6e760f5f383c8b3e9f3aff","src/private/recorded_experiment_data.rs":"66b2601902a2dc2b7a283717c21ce754de94fcca30d12e0398195c8ad49c90af","src/private/string.rs":"c85ded40b1409793ae5b78da692bc2e708f8d55defb76ec5f515096d32f206c9","src/private/string_list.rs":"472ad79fba4b9bcde0ff5b3e05fd8e0aaa3d1d2941fc181faf2ceb90f1d518bd","src/private/timespan.rs":"19ed08aa5103b685a3a0b9f06f2c60250d55f3c8f36337f8c7bdbb2dfdb92786","src/private/timing_distribution.rs":"ee7fa0c3d5427e371b5413373cb1f5841ac10df9b7ca08316ef724e7ad3591d9","src/private/url.rs":"223de8a025e2f749255103402eecb5582961c2b5af7492e294362a0e8f55c414","src/private/uuid.rs":"2b69ddaf3978aaa31c625c0f3eb948c44369744334aacc6b5a2b217268d244a7","src/system.rs":"ff23a5b94f52dab484342dfed702412bc29ab1bbfd5af326033d8e07e7b9075f","src/test.rs":"0cbe4f51fa01b1ca04e4b726e8eb729c3504086bc6b0d644e2114a5a4473165a","tests/common/mod.rs":"4837df2e771929cc077e6fb9a9239645e8e0f7bc6c9f409b71c4d147edf334fc","tests/init_fails.rs":"1e832fe454962ddb1155d546bb71b6395aa9936f848ff0fbe88affaaab7dfae3","tests/never_init.rs":"1f33b8ce7ca3514b57b48cc16d98408974c85cf8aa7d13257ffc2ad878ebb295","tests/no_time_to_init.rs":"4d61e4196d8eef23f3bcb24b59bd0b0379c1f2cb50f03434a53996ab097bfb17","tests/overflowing_preinit.rs":"be7e9a7984162da33f17a5edae29e1e07e5d0b27e8830f7f32bb238a7e788638","tests/persist_ping_lifetime.rs":"adfab91baf978f464e265eae828fcc03aa6eef83422d3918ffb680b2c2ec859e","tests/persist_ping_lifetime_nopanic.rs":"92f4739b21c0d46cb368eafea43bfb822d8dee96412d5f4fc32e01636f0cf244","tests/schema.rs":"621caef0cc7f98c79740422835485fea2343ca105d0d9a7eec6ded9cfad6232c","tests/simple.rs":"2f58d3ff90005231f2febd21f66ee41d06302618408ea990b446510449c3444f"},"package":"34d40d192d10509d941937248fe4594d47617abf34496686c809cfdb31ae8506"}
-\ No newline at end of file
-diff --git a/third_party/rust/glean/Cargo.toml b/third_party/rust/glean/Cargo.toml
---- a/third_party/rust/glean/Cargo.toml
-+++ b/third_party/rust/glean/Cargo.toml
-@@ -12,7 +12,7 @@
- [package]
- edition = "2018"
- name = "glean"
--version = "42.1.0"
-+version = "42.3.0"
- authors = ["Jan-Erik Rediger <jrediger@mozilla.com>", "The Glean Team <glean-team@mozilla.com>"]
- include = ["/README.md", "/LICENSE", "/src", "/tests", "/Cargo.toml"]
- description = "Glean SDK Rust language bindings"
-@@ -28,7 +28,7 @@
- version = "0.5"
-
- [dependencies.glean-core]
--version = "42.1.0"
-+version = "42.3.0"
-
- [dependencies.inherent]
- version = "0.1.4"
-diff --git a/third_party/rust/glean/src/glean_metrics.rs b/third_party/rust/glean/src/glean_metrics.rs
---- a/third_party/rust/glean/src/glean_metrics.rs
-+++ b/third_party/rust/glean/src/glean_metrics.rs
-@@ -17,8 +17,8 @@
- #[allow(non_upper_case_globals)]
- pub static preinit_tasks_overflow: Lazy<CounterMetric> = Lazy::new(|| {
- CounterMetric::new(CommonMetricData {
-- name: "glean.error".into(),
-- category: "preinit_tasks_overflow".into(),
-+ category: "glean.error".into(),
-+ name: "preinit_tasks_overflow".into(),
- send_in_pings: vec!["metrics".into()],
- lifetime: Lifetime::Ping,
- disabled: false,
-diff --git a/third_party/rust/glean/src/lib.rs b/third_party/rust/glean/src/lib.rs
---- a/third_party/rust/glean/src/lib.rs
-+++ b/third_party/rust/glean/src/lib.rs
-@@ -566,7 +566,7 @@
- return false;
- }
-
-- glean.submit_ping_by_name(ping, reason.as_deref())
-+ glean.submit_ping_by_name(ping, reason)
- });
-
- if submitted_ping {
-diff --git a/third_party/rust/glean/src/pings.rs b/third_party/rust/glean/src/pings.rs
---- a/third_party/rust/glean/src/pings.rs
-+++ b/third_party/rust/glean/src/pings.rs
-@@ -44,7 +44,7 @@
- #[allow(non_upper_case_globals)]
- pub static events: Lazy<PingType> = Lazy::new(|| {
- PingType::new(
-- "metrics",
-+ "events",
- true,
- false,
- vec![
-diff --git a/third_party/rust/glean/tests/overflowing_preinit.rs b/third_party/rust/glean/tests/overflowing_preinit.rs
---- a/third_party/rust/glean/tests/overflowing_preinit.rs
-+++ b/third_party/rust/glean/tests/overflowing_preinit.rs
-@@ -37,8 +37,8 @@
- #[allow(non_upper_case_globals)]
- pub static preinit_tasks_overflow: Lazy<CounterMetric> = Lazy::new(|| {
- CounterMetric::new(CommonMetricData {
-- name: "glean.error".into(),
-- category: "preinit_tasks_overflow".into(),
-+ category: "glean.error".into(),
-+ name: "preinit_tasks_overflow".into(),
- send_in_pings: vec!["metrics".into()],
- lifetime: Lifetime::Ping,
- disabled: false,
-diff --git a/toolkit/components/glean/Cargo.toml b/toolkit/components/glean/Cargo.toml
---- a/toolkit/components/glean/Cargo.toml
-+++ b/toolkit/components/glean/Cargo.toml
-@@ -6,7 +6,7 @@
- license = "MPL-2.0"
-
- [dependencies]
--glean = { version = "42.1.0", features = ["rkv-safe-mode"] }
-+glean = { version = "42.3.0", features = ["rkv-safe-mode"] }
- # In theory we only need this for `target_os = "android"` builds.
- # Cargo has the ability to do that with `[target.'cfg(target_os = "android")'.dependencies]`.
- # However that seems to confuse `cbindgen` quite a lot;
-@@ -15,7 +15,7 @@
- # So for now we unconditionally depend on it, but in the code we only `extern crate` it on Android builds.
- # While `glean-ffi` is still built (I think it is),
- # it's not linked into the final library.
--glean-ffi = "42.1.0"
-+glean-ffi = "42.3.0"
- log = "0.4"
- nserror = { path = "../../../xpcom/rust/nserror" }
- nsstring = { path = "../../../xpcom/rust/nsstring" }
-diff --git a/toolkit/components/glean/api/Cargo.toml b/toolkit/components/glean/api/Cargo.toml
---- a/toolkit/components/glean/api/Cargo.toml
-+++ b/toolkit/components/glean/api/Cargo.toml
-@@ -8,7 +8,7 @@
- [dependencies]
- bincode = "1.0"
- chrono = "0.4.10"
--glean = "42.1.0"
-+glean = "42.3.0"
- inherent = "0.1.4"
- log = "0.4"
- nsstring = { path = "../../../../xpcom/rust/nsstring", optional = true }
-diff --git a/toolkit/components/glean/docs/dev/updating_parser.md b/toolkit/components/glean/docs/dev/updating_parser.md
---- a/toolkit/components/glean/docs/dev/updating_parser.md
-+++ b/toolkit/components/glean/docs/dev/updating_parser.md
-@@ -5,14 +5,13 @@
-
- [glean-parser]: https://pypi.org/project/glean-parser/
-
--To update the in-tree glean-parser run
-+To update the in-tree glean-parser change the version in `third_party/python/requirements.in`,
-+then run
-
- ```
--./mach vendor python glean_parser==M.m.p
-+./mach vendor python
- ```
-
--where `M.m.p` is the version number, e.g. 1.28.0.
--
- ```eval_rst
- .. note::
-
-diff --git a/toolkit/components/glean/docs/dev/updating_sdk.md b/toolkit/components/glean/docs/dev/updating_sdk.md
---- a/toolkit/components/glean/docs/dev/updating_sdk.md
-+++ b/toolkit/components/glean/docs/dev/updating_sdk.md
-@@ -12,6 +12,7 @@
- 2. Run `mach vendor rust`.
- This fetches all dependencies and adds them to `third_pary/rust`.
- 3. Update the version of `gleanVersion` in `build.gradle` to the same version.
-+4. Update the version of `glean-sdk` in `build/mach_virtualenv_packages.txt`.
-
- ## Version mismatches of Rust dependencies
-
-diff --git a/toolkit/components/glean/tests/test_pings.yaml b/toolkit/components/glean/tests/test_pings.yaml
---- a/toolkit/components/glean/tests/test_pings.yaml
-+++ b/toolkit/components/glean/tests/test_pings.yaml
-@@ -23,6 +23,8 @@
- notification_emails:
- - chutten@mozilla.com
- - glean-team@mozilla.com
-+ no_lint:
-+ - REDUNDANT_PING
-
- test-ping:
- description: |
-@@ -36,3 +38,5 @@
- notification_emails:
- - chutten@mozilla.com
- - glean-team@mozilla.com
-+ no_lint:
-+ - REDUNDANT_PING
-
diff --git a/firefox.spec b/firefox.spec
index 85206db..7dadbf1 100644
--- a/firefox.spec
+++ b/firefox.spec
@@ -126,7 +126,7 @@ ExcludeArch: aarch64
%if %{?system_nss}
%global nspr_version 4.26
%global nspr_build_version %{nspr_version}
-%global nss_version 3.73
+%global nss_version 3.74
%global nss_build_version %{nss_version}
%endif
@@ -162,13 +162,13 @@ ExcludeArch: aarch64
Summary: Mozilla Firefox Web browser
Name: firefox
-Version: 96.0.3
+Version: 97.0
Release: 1%{?pre_tag}%{?dist}
URL: https://www.mozilla.org/firefox/
License: MPLv1.1 or GPLv2+ or LGPLv2+
Source0: https://archive.mozilla.org/pub/firefox/releases/%{version}%{?pre_version}/source/firefox-%{version}%{?pre_version}.source.tar.xz
%if %{with langpacks}
-Source1: firefox-langpacks-%{version}%{?pre_version}-20220131.tar.xz
+Source1: firefox-langpacks-%{version}%{?pre_version}-20220208.tar.xz
%endif
Source2: cbindgen-vendor.tar.xz
Source10: firefox-mozconfig
@@ -210,16 +210,14 @@ Patch41: build-disable-elfhack.patch
Patch44: build-arm-libopus.patch
Patch46: firefox-nss-version.patch
Patch47: fedora-shebang-build.patch
-#Patch48: build-arm-wasm.patch
Patch49: build-arm-libaom.patch
Patch53: firefox-gcc-build.patch
-# This should be fixed in Firefox 83
Patch54: mozilla-1669639.patch
Patch55: firefox-testing.patch
Patch57: firefox-disable-ffvpx-with-vapi.patch
Patch61: firefox-glibc-dynstack.patch
Patch62: build-python.patch
-Patch63: build-python-glean.patch
+Patch64: mozilla-1753402.patch
# Test patches
# Generate without context by
@@ -244,13 +242,6 @@ Patch402: mozilla-1196777.patch
Patch407: mozilla-1667096.patch
Patch408: mozilla-1663844.patch
Patch415: mozilla-1670333.patch
-# xdg-activation backports from 97.0
-Patch421: D132929.diff
-Patch422: D133209.diff
-Patch423: D133485.diff
-Patch424: D133634.diff
-Patch425: D133885.diff
-Patch426: D134141.diff
# PGO/LTO patches
Patch600: pgo.patch
@@ -465,8 +456,7 @@ This package contains results of tests executed during build.
%patch54 -p1 -b .1669639
%patch55 -p1 -b .testing
%patch57 -p1 -b .ffvpx-with-vapi
-%patch63 -p1 -b .build-python-glean.patch
-#%patch62 -p1 -b .build-python
+%patch64 -p1 -b .1753402
# Test patches
%patch100 -p1 -b .firefox-tests-xpcshell
@@ -490,14 +480,6 @@ This package contains results of tests executed during build.
%patch408 -p1 -b .1663844
%patch415 -p1 -b .1670333
-# xdg-activation backports from 97.0
-%patch421 -p1 -b .D132929
-%patch422 -p1 -b .D133209
-%patch423 -p1 -b .D133485
-%patch424 -p1 -b .D133634
-%patch425 -p1 -b .D133885
-%patch426 -p1 -b .D134141
-
# PGO patches
%if %{build_with_pgo}
%if !%{build_with_clang}
@@ -1061,6 +1043,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
#---------------------------------------------------------------------
%changelog
+* Tue Feb 8 2022 Martin Stransky <stransky@redhat.com> - 97.0-1
+- Updated to 97.0
+
* Mon Jan 31 2022 Martin Stransky <stransky@redhat.com> - 96.0.3-1
- Updated to 96.0.3
diff --git a/mozilla-1667096.patch b/mozilla-1667096.patch
index ba87fbe..8a82677 100644
--- a/mozilla-1667096.patch
+++ b/mozilla-1667096.patch
@@ -1,18 +1,19 @@
-diff -up firefox-94.0/media/ffvpx/libavcodec/codec_list.c.1667096 firefox-94.0/media/ffvpx/libavcodec/codec_list.c
---- firefox-94.0/media/ffvpx/libavcodec/codec_list.c.1667096 2021-10-28 20:03:38.000000000 +0200
-+++ firefox-94.0/media/ffvpx/libavcodec/codec_list.c 2021-11-01 11:02:50.898723802 +0100
-@@ -11,4 +11,8 @@ static const AVCodec * const codec_list[
+diff -up firefox-97.0/media/ffvpx/libavcodec/codec_list.c.1667096 firefox-97.0/media/ffvpx/libavcodec/codec_list.c
+--- firefox-97.0/media/ffvpx/libavcodec/codec_list.c.1667096 2022-02-08 10:21:17.151809054 +0100
++++ firefox-97.0/media/ffvpx/libavcodec/codec_list.c 2022-02-08 10:25:11.374078784 +0100
+@@ -11,6 +11,9 @@ static const AVCodec * const codec_list[
#if CONFIG_MP3_DECODER
&ff_mp3_decoder,
#endif
+#ifdef CONFIG_LIBFDK_AAC
+ &ff_libfdk_aac_decoder,
+#endif
-+
- NULL };
-diff -up firefox-94.0/media/ffvpx/libavcodec/libfdk-aacdec.c.1667096 firefox-94.0/media/ffvpx/libavcodec/libfdk-aacdec.c
---- firefox-94.0/media/ffvpx/libavcodec/libfdk-aacdec.c.1667096 2021-11-01 11:02:50.899723835 +0100
-+++ firefox-94.0/media/ffvpx/libavcodec/libfdk-aacdec.c 2021-11-01 11:02:50.899723835 +0100
+ #if CONFIG_AV1_DECODER
+ &ff_av1_decoder,
+ #endif
+diff -up firefox-97.0/media/ffvpx/libavcodec/libfdk-aacdec.c.1667096 firefox-97.0/media/ffvpx/libavcodec/libfdk-aacdec.c
+--- firefox-97.0/media/ffvpx/libavcodec/libfdk-aacdec.c.1667096 2022-02-08 10:21:17.151809054 +0100
++++ firefox-97.0/media/ffvpx/libavcodec/libfdk-aacdec.c 2022-02-08 10:21:17.151809054 +0100
@@ -0,0 +1,409 @@
+/*
+ * AAC decoder wrapper
@@ -423,10 +424,10 @@ diff -up firefox-94.0/media/ffvpx/libavcodec/libfdk-aacdec.c.1667096 firefox-94.
+ FF_CODEC_CAP_INIT_CLEANUP,
+ .wrapper_name = "libfdk",
+};
-diff -up firefox-94.0/media/ffvpx/libavcodec/moz.build.1667096 firefox-94.0/media/ffvpx/libavcodec/moz.build
---- firefox-94.0/media/ffvpx/libavcodec/moz.build.1667096 2021-10-28 20:03:43.000000000 +0200
-+++ firefox-94.0/media/ffvpx/libavcodec/moz.build 2021-11-01 11:02:50.899723835 +0100
-@@ -104,6 +104,12 @@ if not CONFIG['MOZ_FFVPX_AUDIOONLY']:
+diff -up firefox-97.0/media/ffvpx/libavcodec/moz.build.1667096 firefox-97.0/media/ffvpx/libavcodec/moz.build
+--- firefox-97.0/media/ffvpx/libavcodec/moz.build.1667096 2022-02-02 22:01:47.000000000 +0100
++++ firefox-97.0/media/ffvpx/libavcodec/moz.build 2022-02-08 10:21:17.151809054 +0100
+@@ -111,6 +111,12 @@ if not CONFIG['MOZ_FFVPX_AUDIOONLY']:
]
USE_LIBS += ['mozva']
@@ -439,14 +440,15 @@ diff -up firefox-94.0/media/ffvpx/libavcodec/moz.build.1667096 firefox-94.0/medi
if CONFIG['MOZ_LIBAV_FFT']:
SOURCES += [
'avfft.c',
-diff -up firefox-94.0/toolkit/moz.configure.1667096 firefox-94.0/toolkit/moz.configure
---- firefox-94.0/toolkit/moz.configure.1667096 2021-11-01 11:02:50.899723835 +0100
-+++ firefox-94.0/toolkit/moz.configure 2021-11-01 11:04:28.545873853 +0100
-@@ -1878,6 +1878,14 @@ with only_when(compile_environment):
- & jpeg_arm_neon_vld1q_u8_x4,
- )
+diff -up firefox-97.0/toolkit/moz.configure.1667096 firefox-97.0/toolkit/moz.configure
+--- firefox-97.0/toolkit/moz.configure.1667096 2022-02-08 10:21:17.152809035 +0100
++++ firefox-97.0/toolkit/moz.configure 2022-02-08 10:24:31.734885827 +0100
+@@ -1969,6 +1969,15 @@ with only_when(compile_environment):
+
+ set_config("MOZ_SYSTEM_PNG", True, when="--with-system-png")
-+# fdk aac support
++# FDK AAC support
++# ==============================================================
+option('--with-system-fdk-aac',
+ help='Use system libfdk-aac (located with pkgconfig)')
+
diff --git a/mozilla-1753402.patch b/mozilla-1753402.patch
new file mode 100644
index 0000000..e53e73b
--- /dev/null
+++ b/mozilla-1753402.patch
@@ -0,0 +1,12 @@
+diff --git a/tools/profiler/rust-api/build.rs b/tools/profiler/rust-api/build.rs
+--- a/tools/profiler/rust-api/build.rs
++++ b/tools/profiler/rust-api/build.rs
+@@ -61,6 +61,7 @@
+ let mut builder = Builder::default()
+ .enable_cxx_namespaces()
+ .with_codegen_config(CodegenConfig::TYPES | CodegenConfig::VARS | CodegenConfig::FUNCTIONS)
++ .disable_untagged_union()
+ .size_t_is_usize(true);
+
+ for dir in SEARCH_PATHS.iter() {
+
diff --git a/sources b/sources
index 733c1d2..9e974d6 100644
--- a/sources
+++ b/sources
@@ -1,4 +1,4 @@
SHA512 (cbindgen-vendor.tar.xz) = b9ab1498be90ecf60822df7021f8812f124550d97f8cd687c69d3ab56fc5fb714bfe88c78c978a1794d211724909a9a5cad6a4b483fa05f762909c45d5075520
SHA512 (mochitest-python.tar.gz) = 18e1aeb475df5fbf1fe3838897d5ac2f3114aa349030713fc2be27af087b1b12f57642621b87bd052f324a7cb7fbae5f36b21502191d85692f62c8cdd69c8bf2
-SHA512 (firefox-96.0.3.source.tar.xz) = 3dd5fbc96e369d5f4fb3eca778c2bd3e2313d089f867de9fac3556810a797e9b5629ef1b8840fb2f22a18df7de95ea1993eee052f691d861a555cea544b05966
-SHA512 (firefox-langpacks-96.0.3-20220131.tar.xz) = 2c44690ed3ba6a0ba0ccb621598f8d6c619308b9a24cc6b39317603450e33b356b73d5c6ec41a34765c749067f7cd3c842ff0688b9d921377284671dc008de8a
+SHA512 (firefox-97.0.source.tar.xz) = a913695a42cb06ee9bda2a20e65cc573e40ca93e9f75b7ee0a43ebd1935b371e7e80d5fc8d5f126ad0712ab848635a8624bbeed43807e5c179537aa32c884186
+SHA512 (firefox-langpacks-97.0-20220208.tar.xz) = 40c15f6c30566268fbc9c148d70f48bbf9f029b5d13c263e8e97917c96823d6bda552b1fd18e3f778117187c7fe44da0343dfd228bf66648a259e13cb1f94f28
bgstack15