diff --git a/.gitignore b/.gitignore index e20be7c..fd8c1c6 100644 --- a/.gitignore +++ b/.gitignore @@ -704,3 +704,46 @@ firefox-3.6.4.source.tar.bz2 /firefox-138.0.1.source.tar.xz /firefox-138.0.3.source.tar.xz /firefox-langpacks-138.0.3-20250512.tar.xz +/firefox-langpacks-138.0.4-20250519.tar.xz +/firefox-138.0.4.source.tar.xz +/firefox-139.0.source.tar.xz +/firefox-langpacks-139.0-20250527.tar.xz +/firefox-langpacks-139.0.4-20250610.tar.xz +/firefox-139.0.4.source.tar.xz +/firefox-140.0.source.tar.xz +/firefox-langpacks-140.0-20250617.tar.xz +/firefox-140.0.1.source.tar.xz +/firefox-langpacks-140.0.1-20250627.tar.xz +/firefox-140.0.4.source.tar.xz +/firefox-langpacks-140.0.4-20250708.tar.xz +/firefox-141.0.source.tar.xz +/firefox-langpacks-141.0-20250717.tar.xz +/firefox-langpacks-141.0-20250718.tar.xz +/firefox-langpacks-141.2.0-20250806.tar.xz +/firefox-141.0.2.source.tar.xz +/firefox-langpacks-141.0.2-20250806.tar.xz +/firefox-langpacks-141.0.3-20250811.tar.xz +/firefox-141.0.3.source.tar.xz +/firefox-142.0.source.tar.xz +/firefox-langpacks-142.0-20250812.tar.xz +/firefox-langpacks-142.0.1-20250827.tar.xz +/firefox-142.0.1.source.tar.xz +/firefox-143.0.1.source.tar.xz +/firefox-langpacks-143.0.1-20250919.tar.xz +/firefox-langpacks-143.0.3-20250930.tar.xz +/firefox-143.0.3.source.tar.xz +/firefox-langpacks-144.0-20251009.tar.xz +/firefox-144.0.source.tar.xz +/firefox-langpacks-144.0-20251010.tar.xz +/firefox-145.0.source.tar.xz +/firefox-langpacks-145.0-20251105.tar.xz +/firefox-langpacks-145.0-20251111.tar.xz +/firefox-145.0.1.source.tar.xz +/firefox-langpacks-145.0.1-20251119.tar.xz +/firefox-146.0.source.tar.xz +/firefox-langpacks-146.0-20251202.tar.xz +/firefox-langpacks-146.0-20251208.tar.xz +/firefox-146.0.1.source.tar.xz +/firefox-langpacks-146.0.1-20251219.tar.xz +/firefox-langpacks-147.0-20260106.tar.xz +/firefox-147.0.source.tar.xz diff --git a/0001-GLIBCXX-fix-for-GCC-12.patch b/0001-GLIBCXX-fix-for-GCC-12.patch index 37d6f50..55153a1 100644 --- a/0001-GLIBCXX-fix-for-GCC-12.patch +++ b/0001-GLIBCXX-fix-for-GCC-12.patch @@ -1,16 +1,6 @@ -From efd5bc0715e5477318be95a76811cda0a89e8289 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= -Date: Fri, 4 Mar 2022 12:00:26 +0100 -Subject: [PATCH] GLIBCXX fix for GCC 12? - ---- - build/unix/stdc++compat/stdc++compat.cpp | 14 ++++++++++++++ - 1 file changed, 14 insertions(+) - -diff --git a/build/unix/stdc++compat/stdc++compat.cpp b/build/unix/stdc++compat/stdc++compat.cpp -index 0180f6bcfa998..8d7a542ff11f0 100644 ---- a/build/unix/stdc++compat/stdc++compat.cpp -+++ b/build/unix/stdc++compat/stdc++compat.cpp +diff -up firefox-142.0/build/unix/stdc++compat/stdc++compat.cpp.0001-GLIBCXX-fix-for-GCC-12 firefox-142.0/build/unix/stdc++compat/stdc++compat.cpp +--- firefox-142.0/build/unix/stdc++compat/stdc++compat.cpp.0001-GLIBCXX-fix-for-GCC-12 2025-08-11 20:04:27.000000000 +0200 ++++ firefox-142.0/build/unix/stdc++compat/stdc++compat.cpp 2025-08-14 15:02:05.496137133 +0200 @@ -24,6 +24,7 @@ GLIBCXX_3.4.27 is from gcc 10 GLIBCXX_3.4.28 is from gcc 10 @@ -19,9 +9,9 @@ index 0180f6bcfa998..8d7a542ff11f0 100644 This file adds the necessary compatibility tricks to avoid symbols with version GLIBCXX_3.4.20 and bigger, keeping binary compatibility with -@@ -69,6 +70,19 @@ void __attribute__((weak)) __throw_bad_array_new_length() { MOZ_CRASH(); } - } // namespace std - #endif +@@ -94,6 +95,19 @@ void operator delete(void* ptr, size_t s + } + # endif +#if _GLIBCXX_RELEASE >= 12 +namespace std { @@ -39,6 +29,3 @@ index 0180f6bcfa998..8d7a542ff11f0 100644 /* While we generally don't build with exceptions, we have some host tools * that do use them. libstdc++ from GCC 5.0 added exception constructors with * char const* argument. Older versions only have a constructor with --- -2.35.1 - diff --git a/D168799.diff b/D168799.diff deleted file mode 100644 index 40dc3b4..0000000 --- a/D168799.diff +++ /dev/null @@ -1,93 +0,0 @@ -diff --git a/extensions/pref/autoconfig/test/unit/test_autoconfig_custom_path.js b/extensions/pref/autoconfig/test/unit/test_autoconfig_custom_path.js ---- a/extensions/pref/autoconfig/test/unit/test_autoconfig_custom_path.js -+++ b/extensions/pref/autoconfig/test/unit/test_autoconfig_custom_path.js -@@ -9,10 +9,13 @@ - let testDirName = do_get_cwd().clone(); - Services.env.set("MOZ_SYSTEM_CONFIG_DIR", testDirName.path); - - updateAppInfo(); - -+ try { -+ Services.dirsvc.undefine("SysConfD"); -+ } catch (e) {} - let customSysConfD = Services.dirsvc.get("SysConfD", Ci.nsIFile); - let parent = customSysConfD.parent; - let child = customSysConfD.leafName; - notEqual("/etc", parent.path, "SysConfD is not in /etc"); - equal("xpcshell", child, "SysConfD is xpcshell"); -diff --git a/extensions/pref/autoconfig/test/unit/test_autoconfig_default_path.js b/extensions/pref/autoconfig/test/unit/test_autoconfig_default_path.js ---- a/extensions/pref/autoconfig/test/unit/test_autoconfig_default_path.js -+++ b/extensions/pref/autoconfig/test/unit/test_autoconfig_default_path.js -@@ -6,8 +6,11 @@ - ); - - function run_test() { - updateAppInfo(); - -+ try { -+ Services.dirsvc.undefine("SysConfD"); -+ } catch (e) {} - let defaultSysConfD = Services.dirsvc.get("SysConfD", Ci.nsIFile); - equal("/etc/xpcshell", defaultSysConfD.path, "SysConfD is in /etc"); - } -diff --git a/modules/libpref/Preferences.cpp b/modules/libpref/Preferences.cpp ---- a/modules/libpref/Preferences.cpp -+++ b/modules/libpref/Preferences.cpp -@@ -4917,27 +4917,10 @@ - ArrayLength(specialFiles)); - if (NS_FAILED(rv)) { - NS_WARNING("Error parsing application default preferences."); - } - --#if defined(MOZ_WIDGET_GTK) -- // Under Flatpak/Snap package, load /etc/firefox/defaults/pref/*.js. -- if (mozilla::widget::IsRunningUnderFlatpakOrSnap()) { -- nsCOMPtr defaultSnapPrefDir; -- rv = NS_GetSpecialDirectory(NS_OS_SYSTEM_CONFIG_DIR, -- getter_AddRefs(defaultSnapPrefDir)); -- NS_ENSURE_SUCCESS(rv, rv); -- defaultSnapPrefDir->AppendNative("defaults"_ns); -- defaultSnapPrefDir->AppendNative("pref"_ns); -- -- rv = pref_LoadPrefsInDir(defaultSnapPrefDir, nullptr, 0); -- if (NS_FAILED(rv)) { -- NS_WARNING("Error parsing application default preferences under Snap."); -- } -- } --#endif -- - // Load jar:$app/omni.jar!/defaults/preferences/*.js - // or jar:$gre/omni.jar!/defaults/preferences/*.js. - RefPtr appJarReader = Omnijar::GetReader(Omnijar::APP); - - // GetReader(Omnijar::APP) returns null when `$app == $gre`, in -@@ -5006,10 +4989,28 @@ - // Do we care if a file provided by this process fails to load? - pref_LoadPrefsInDir(path, nullptr, 0); - } - } - -+#if defined(MOZ_WIDGET_GTK) -+ // To ensure the system-wide preferences are not overwritten by -+ // firefox/browser/defauts/preferences/*.js we need to load -+ // the /etc/firefox/defaults/pref/*.js settings as last. -+ // Under Flatpak, the NS_OS_SYSTEM_CONFIG_DIR points to /app/etc/firefox -+ nsCOMPtr defaultSystemPrefDir; -+ rv = NS_GetSpecialDirectory(NS_OS_SYSTEM_CONFIG_DIR, -+ getter_AddRefs(defaultSystemPrefDir)); -+ NS_ENSURE_SUCCESS(rv, rv); -+ defaultSystemPrefDir->AppendNative("defaults"_ns); -+ defaultSystemPrefDir->AppendNative("pref"_ns); -+ -+ rv = pref_LoadPrefsInDir(defaultSystemPrefDir, nullptr, 0); -+ if (NS_FAILED(rv)) { -+ NS_WARNING("Error parsing application default preferences."); -+ } -+#endif -+ - if (XRE_IsParentProcess()) { - SetupTelemetryPref(); - } - - if (aIsStartup) { - diff --git a/D192061.1699444912.diff b/D192061.1699444912.diff deleted file mode 100644 index a7c4e85..0000000 --- a/D192061.1699444912.diff +++ /dev/null @@ -1,113 +0,0 @@ -diff --git a/widget/gtk/nsUserIdleServiceGTK.cpp b/widget/gtk/nsUserIdleServiceGTK.cpp ---- a/widget/gtk/nsUserIdleServiceGTK.cpp -+++ b/widget/gtk/nsUserIdleServiceGTK.cpp -@@ -149,48 +149,62 @@ - - #ifdef MOZ_ENABLE_DBUS - class UserIdleServiceMutter : public UserIdleServiceImpl { - public: - bool PollIdleTime(uint32_t* aIdleTime) override { -- MOZ_LOG(sIdleLog, LogLevel::Info, -- ("UserIdleServiceMutter::PollIdleTime()\n")); -- -- MOZ_ASSERT(mProxy); -- GUniquePtr error; -+ MOZ_LOG(sIdleLog, LogLevel::Info, ("PollIdleTime() request\n")); - -- RefPtr result = dont_AddRef(g_dbus_proxy_call_sync( -- mProxy, "GetIdletime", nullptr, G_DBUS_CALL_FLAGS_NONE, -1, -- mCancellable, getter_Transfers(error))); -- if (!result) { -- MOZ_LOG(sIdleLog, LogLevel::Info, -- ("UserIdleServiceMutter::PollIdleTime() failed, message: %s\n", -- error->message)); -+ // We're not ready yet -+ if (!mProxy) { - return false; - } -- if (!g_variant_is_of_type(result, G_VARIANT_TYPE_TUPLE) || -- g_variant_n_children(result) != 1) { -- MOZ_LOG( -- sIdleLog, LogLevel::Info, -- ("UserIdleServiceMutter::PollIdleTime() Unexpected params type: %s\n", -- g_variant_get_type_string(result))); -- return false; -+ -+ if (!mPollInProgress) { -+ mPollInProgress = true; -+ DBusProxyCall(mProxy, "GetIdletime", nullptr, G_DBUS_CALL_FLAGS_NONE, -1, -+ mCancellable) -+ ->Then( -+ GetCurrentSerialEventTarget(), __func__, -+ // It's safe to capture this as we use mCancellable to stop -+ // listening. -+ [self = RefPtr{this}, this](RefPtr&& aResult) { -+ if (!g_variant_is_of_type(aResult, G_VARIANT_TYPE_TUPLE) || -+ g_variant_n_children(aResult) != 1) { -+ MOZ_LOG(sIdleLog, LogLevel::Info, -+ ("PollIdleTime() Unexpected params type: %s\n", -+ g_variant_get_type_string(aResult))); -+ mLastIdleTime = 0; -+ return; -+ } -+ RefPtr iTime = -+ dont_AddRef(g_variant_get_child_value(aResult, 0)); -+ if (!g_variant_is_of_type(iTime, G_VARIANT_TYPE_UINT64)) { -+ MOZ_LOG(sIdleLog, LogLevel::Info, -+ ("PollIdleTime() Unexpected params type: %s\n", -+ g_variant_get_type_string(aResult))); -+ mLastIdleTime = 0; -+ return; -+ } -+ uint64_t idleTime = g_variant_get_uint64(iTime); -+ if (idleTime > std::numeric_limits::max()) { -+ idleTime = std::numeric_limits::max(); -+ } -+ mLastIdleTime = idleTime; -+ mPollInProgress = false; -+ MOZ_LOG(sIdleLog, LogLevel::Info, -+ ("Async handler got %d\n", mLastIdleTime)); -+ }, -+ [self = RefPtr{this}, this](GUniquePtr&& aError) { -+ mPollInProgress = false; -+ g_warning("Failed to call GetIdletime(): %s\n", -+ aError->message); -+ }); - } -- RefPtr iTime = dont_AddRef(g_variant_get_child_value(result, 0)); -- if (!g_variant_is_of_type(iTime, G_VARIANT_TYPE_UINT64)) { -- MOZ_LOG( -- sIdleLog, LogLevel::Info, -- ("UserIdleServiceMutter::PollIdleTime() Unexpected params type: %s\n", -- g_variant_get_type_string(result))); -- return false; -- } -- uint64_t idleTime = g_variant_get_uint64(iTime); -- if (idleTime > std::numeric_limits::max()) { -- idleTime = std::numeric_limits::max(); -- } -- *aIdleTime = idleTime; -+ -+ *aIdleTime = mLastIdleTime; - MOZ_LOG(sIdleLog, LogLevel::Info, -- ("UserIdleServiceMutter::PollIdleTime() %d\n", *aIdleTime)); -+ ("PollIdleTime() returns %d\n", *aIdleTime)); - return true; - } - - bool ProbeImplementation( - RefPtr aUserIdleServiceGTK) override { -@@ -229,10 +243,12 @@ - } - - private: - RefPtr mProxy; - RefPtr mCancellable; -+ uint32_t mLastIdleTime = 0; -+ bool mPollInProgress = false; - }; - #endif - - void nsUserIdleServiceGTK::ProbeService() { - MOZ_LOG(sIdleLog, LogLevel::Info, - diff --git a/D192208.1699444906.diff b/D192208.1699444906.diff deleted file mode 100644 index f77a357..0000000 --- a/D192208.1699444906.diff +++ /dev/null @@ -1,201 +0,0 @@ -diff --git a/widget/gtk/nsUserIdleServiceGTK.h b/widget/gtk/nsUserIdleServiceGTK.h ---- a/widget/gtk/nsUserIdleServiceGTK.h -+++ b/widget/gtk/nsUserIdleServiceGTK.h -@@ -14,18 +14,20 @@ - - class nsUserIdleServiceGTK; - - class UserIdleServiceImpl { - public: -- NS_INLINE_DECL_REFCOUNTING(UserIdleServiceImpl); -+ explicit UserIdleServiceImpl(nsUserIdleServiceGTK* aUserIdleService) -+ : mUserIdleServiceGTK(aUserIdleService){}; - - virtual bool PollIdleTime(uint32_t* aIdleTime) = 0; -- virtual bool ProbeImplementation( -- RefPtr aUserIdleServiceGTK) = 0; -+ virtual bool ProbeImplementation() = 0; -+ -+ virtual ~UserIdleServiceImpl() = default; - - protected: -- virtual ~UserIdleServiceImpl() = default; -+ nsUserIdleServiceGTK* mUserIdleServiceGTK; - }; - - #define IDLE_SERVICE_MUTTER 0 - #define IDLE_SERVICE_XSCREENSAVER 1 - #define IDLE_SERVICE_NONE 2 -@@ -61,11 +63,11 @@ - nsUserIdleServiceGTK() = default; - - private: - ~nsUserIdleServiceGTK() = default; - -- RefPtr mIdleService; -+ mozilla::UniquePtr mIdleService; - #ifdef MOZ_ENABLE_DBUS - int mIdleServiceType = IDLE_SERVICE_MUTTER; - #else - int mIdleServiceType = IDLE_SERVICE_XSCREENSAVER; - #endif -diff --git a/widget/gtk/nsUserIdleServiceGTK.cpp b/widget/gtk/nsUserIdleServiceGTK.cpp ---- a/widget/gtk/nsUserIdleServiceGTK.cpp -+++ b/widget/gtk/nsUserIdleServiceGTK.cpp -@@ -74,12 +74,11 @@ - MOZ_LOG(sIdleLog, LogLevel::Warning, - ("XSSQueryExtension returned false!\n")); - return false; - } - -- bool ProbeImplementation( -- RefPtr aUserIdleServiceGTK) override { -+ bool ProbeImplementation() override { - MOZ_LOG(sIdleLog, LogLevel::Info, - ("UserIdleServiceX11::UserIdleServiceX11()\n")); - - if (!mozilla::widget::GdkIsX11Display()) { - return false; -@@ -114,15 +113,17 @@ - // We're missing X11 symbols - return false; - } - - // UserIdleServiceX11 uses sync init, confirm it now. -- aUserIdleServiceGTK->AcceptServiceCallback(); -+ mUserIdleServiceGTK->AcceptServiceCallback(); - return true; - } - -- protected: -+ explicit UserIdleServiceX11(nsUserIdleServiceGTK* aUserIdleService) -+ : UserIdleServiceImpl(aUserIdleService){}; -+ - ~UserIdleServiceX11() { - # ifdef MOZ_X11 - if (mXssInfo) { - XFree(mXssInfo); - } -@@ -164,11 +165,11 @@ - mCancellable) - ->Then( - GetCurrentSerialEventTarget(), __func__, - // It's safe to capture this as we use mCancellable to stop - // listening. -- [self = RefPtr{this}, this](RefPtr&& aResult) { -+ [this](RefPtr&& aResult) { - if (!g_variant_is_of_type(aResult, G_VARIANT_TYPE_TUPLE) || - g_variant_n_children(aResult) != 1) { - MOZ_LOG(sIdleLog, LogLevel::Info, - ("PollIdleTime() Unexpected params type: %s\n", - g_variant_get_type_string(aResult))); -@@ -191,25 +192,25 @@ - mLastIdleTime = idleTime; - mPollInProgress = false; - MOZ_LOG(sIdleLog, LogLevel::Info, - ("Async handler got %d\n", mLastIdleTime)); - }, -- [self = RefPtr{this}, this](GUniquePtr&& aError) { -+ [this](GUniquePtr&& aError) { - mPollInProgress = false; - g_warning("Failed to call GetIdletime(): %s\n", - aError->message); -+ mUserIdleServiceGTK->RejectAndTryNextServiceCallback(); - }); - } - - *aIdleTime = mLastIdleTime; - MOZ_LOG(sIdleLog, LogLevel::Info, - ("PollIdleTime() returns %d\n", *aIdleTime)); - return true; - } - -- bool ProbeImplementation( -- RefPtr aUserIdleServiceGTK) override { -+ bool ProbeImplementation() override { - MOZ_LOG(sIdleLog, LogLevel::Info, - ("UserIdleServiceMutter::UserIdleServiceMutter()\n")); - - mCancellable = dont_AddRef(g_cancellable_new()); - CreateDBusProxyForBus( -@@ -219,23 +220,23 @@ - nullptr, "org.gnome.Mutter.IdleMonitor", - "/org/gnome/Mutter/IdleMonitor/Core", "org.gnome.Mutter.IdleMonitor", - mCancellable) - ->Then( - GetCurrentSerialEventTarget(), __func__, -- [self = RefPtr{this}, service = RefPtr{aUserIdleServiceGTK}]( -- RefPtr&& aProxy) { -- self->mProxy = std::move(aProxy); -- service->AcceptServiceCallback(); -+ [this](RefPtr&& aProxy) { -+ mProxy = std::move(aProxy); -+ mUserIdleServiceGTK->AcceptServiceCallback(); - }, -- [self = RefPtr{this}, service = RefPtr{aUserIdleServiceGTK}]( -- GUniquePtr&& aError) { -- service->RejectAndTryNextServiceCallback(); -+ [this](GUniquePtr&& aError) { -+ mUserIdleServiceGTK->RejectAndTryNextServiceCallback(); - }); - return true; - } - -- protected: -+ explicit UserIdleServiceMutter(nsUserIdleServiceGTK* aUserIdleService) -+ : UserIdleServiceImpl(aUserIdleService){}; -+ - ~UserIdleServiceMutter() { - if (mCancellable) { - g_cancellable_cancel(mCancellable); - mCancellable = nullptr; - } -@@ -257,23 +258,23 @@ - MOZ_ASSERT(!mIdleService); - - switch (mIdleServiceType) { - #ifdef MOZ_ENABLE_DBUS - case IDLE_SERVICE_MUTTER: -- mIdleService = new UserIdleServiceMutter(); -+ mIdleService = MakeUnique(this); - break; - #endif - #ifdef MOZ_X11 - case IDLE_SERVICE_XSCREENSAVER: -- mIdleService = new UserIdleServiceX11(); -+ mIdleService = MakeUnique(this); - break; - #endif - default: - return; - } - -- if (!mIdleService->ProbeImplementation(this)) { -+ if (!mIdleService->ProbeImplementation()) { - RejectAndTryNextServiceCallback(); - } - } - - void nsUserIdleServiceGTK::AcceptServiceCallback() { -@@ -289,19 +290,19 @@ - mIdleServiceType)); - - // Delete recent non-working service - MOZ_ASSERT(mIdleService, "Nothing to reject?"); - mIdleService = nullptr; -+ mIdleServiceInitialized = false; - - mIdleServiceType++; - if (mIdleServiceType < IDLE_SERVICE_NONE) { - MOZ_LOG(sIdleLog, LogLevel::Info, - ("nsUserIdleServiceGTK try next idle service\n")); - ProbeService(); - } else { - MOZ_LOG(sIdleLog, LogLevel::Info, ("nsUserIdleServiceGTK failed\n")); -- mIdleServiceInitialized = false; - } - } - - bool nsUserIdleServiceGTK::PollIdleTime(uint32_t* aIdleTime) { - if (!mIdleServiceInitialized) { - diff --git a/D220551.1729586347.diff b/D220551.1729586347.diff deleted file mode 100644 index 2d8c4e0..0000000 --- a/D220551.1729586347.diff +++ /dev/null @@ -1,1908 +0,0 @@ -diff --git a/widget/gtk/WidgetUtilsGtk.cpp b/widget/gtk/WidgetUtilsGtk.cpp ---- a/widget/gtk/WidgetUtilsGtk.cpp -+++ b/widget/gtk/WidgetUtilsGtk.cpp -@@ -303,11 +303,11 @@ - }; - #endif - - RefPtr RequestWaylandFocusPromise() { - #ifdef MOZ_WAYLAND -- if (!GdkIsWaylandDisplay() || !KeymapWrapper::GetSeat()) { -+ if (!GdkIsWaylandDisplay() || !WaylandDisplayGet()->GetSeat()) { - LOGW("RequestWaylandFocusPromise() failed."); - return nullptr; - } - - RefPtr sourceWindow = nsWindow::GetFocusedWindow(); -@@ -347,11 +347,11 @@ - xdg_activation_v1_get_activation_token(xdg_activation); - xdg_activation_token_v1_add_listener( - aXdgToken, &token_listener, - new XDGTokenRequest(aXdgToken, transferPromise)); - xdg_activation_token_v1_set_serial(aXdgToken, focusSerial, -- KeymapWrapper::GetSeat()); -+ WaylandDisplayGet()->GetSeat()); - xdg_activation_token_v1_set_surface(aXdgToken, focusSurface); - xdg_activation_token_v1_commit(aXdgToken); - - LOGW("RequestWaylandFocusPromise() XDG Token sent"); - -diff --git a/widget/gtk/mozwayland/mozwayland.h b/widget/gtk/mozwayland/mozwayland.h ---- a/widget/gtk/mozwayland/mozwayland.h -+++ b/widget/gtk/mozwayland/mozwayland.h -@@ -29,14 +29,22 @@ - struct wl_proxy* proxy, uint32_t opcode, - const struct wl_interface* interface, ...); - MOZ_EXPORT struct wl_proxy* wl_proxy_marshal_constructor_versioned( - struct wl_proxy* proxy, uint32_t opcode, - const struct wl_interface* interface, uint32_t version, ...); -+MOZ_EXPORT struct wl_proxy* wl_proxy_marshal_flags( -+ struct wl_proxy* proxy, uint32_t opcode, -+ const struct wl_interface* interface, uint32_t version, uint32_t flags, -+ ...); - MOZ_EXPORT void wl_proxy_destroy(struct wl_proxy* proxy); - MOZ_EXPORT void* wl_proxy_create_wrapper(void* proxy); - MOZ_EXPORT void wl_proxy_wrapper_destroy(void* proxy_wrapper); - -+#ifndef WL_MARSHAL_FLAG_DESTROY -+# define WL_MARSHAL_FLAG_DESTROY (1 << 0) -+#endif -+ - /* We need implement some missing functions from wayland-client-protocol.h - */ - #ifndef WL_DATA_DEVICE_MANAGER_DND_ACTION_ENUM - enum wl_data_device_manager_dnd_action { - WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE = 0, -@@ -125,10 +133,407 @@ - wl_proxy_marshal((struct wl_proxy*)wl_surface, WL_SURFACE_DAMAGE_BUFFER, x, y, - width, height); - } - #endif - -+#ifndef WL_POINTER_AXIS_ENUM -+# define WL_POINTER_AXIS_ENUM -+/** -+ * @ingroup iface_wl_pointer -+ * axis types -+ * -+ * Describes the axis types of scroll events. -+ */ -+enum wl_pointer_axis { -+ /** -+ * vertical axis -+ */ -+ WL_POINTER_AXIS_VERTICAL_SCROLL = 0, -+ /** -+ * horizontal axis -+ */ -+ WL_POINTER_AXIS_HORIZONTAL_SCROLL = 1, -+}; -+#endif /* WL_POINTER_AXIS_ENUM */ -+ -+#ifndef WL_POINTER_AXIS_SOURCE_ENUM -+# define WL_POINTER_AXIS_SOURCE_ENUM -+/** -+ * @ingroup iface_wl_pointer -+ * axis source types -+ * -+ * Describes the source types for axis events. This indicates to the -+ * client how an axis event was physically generated; a client may -+ * adjust the user interface accordingly. For example, scroll events -+ * from a "finger" source may be in a smooth coordinate space with -+ * kinetic scrolling whereas a "wheel" source may be in discrete steps -+ * of a number of lines. -+ * -+ * The "continuous" axis source is a device generating events in a -+ * continuous coordinate space, but using something other than a -+ * finger. One example for this source is button-based scrolling where -+ * the vertical motion of a device is converted to scroll events while -+ * a button is held down. -+ * -+ * The "wheel tilt" axis source indicates that the actual device is a -+ * wheel but the scroll event is not caused by a rotation but a -+ * (usually sideways) tilt of the wheel. -+ */ -+enum wl_pointer_axis_source { -+ /** -+ * a physical wheel rotation -+ */ -+ WL_POINTER_AXIS_SOURCE_WHEEL = 0, -+ /** -+ * finger on a touch surface -+ */ -+ WL_POINTER_AXIS_SOURCE_FINGER = 1, -+ /** -+ * continuous coordinate space -+ */ -+ WL_POINTER_AXIS_SOURCE_CONTINUOUS = 2, -+ /** -+ * a physical wheel tilt -+ * @since 6 -+ */ -+ WL_POINTER_AXIS_SOURCE_WHEEL_TILT = 3, -+}; -+/** -+ * @ingroup iface_wl_pointer -+ */ -+# define WL_POINTER_AXIS_SOURCE_WHEEL_TILT_SINCE_VERSION 6 -+#endif /* WL_POINTER_AXIS_SOURCE_ENUM */ -+ -+#ifndef WL_POINTER_AXIS_RELATIVE_DIRECTION_ENUM -+# define WL_POINTER_AXIS_RELATIVE_DIRECTION_ENUM -+/** -+ * @ingroup iface_wl_pointer -+ * axis relative direction -+ * -+ * This specifies the direction of the physical motion that caused a -+ * wl_pointer.axis event, relative to the wl_pointer.axis direction. -+ */ -+enum wl_pointer_axis_relative_direction { -+ /** -+ * physical motion matches axis direction -+ */ -+ WL_POINTER_AXIS_RELATIVE_DIRECTION_IDENTICAL = 0, -+ /** -+ * physical motion is the inverse of the axis direction -+ */ -+ WL_POINTER_AXIS_RELATIVE_DIRECTION_INVERTED = 1, -+}; -+#endif /* WL_POINTER_AXIS_RELATIVE_DIRECTION_ENUM */ -+ -+/** -+ * @ingroup iface_wl_pointer -+ * @struct wl_pointer_listener -+ */ -+struct moz_wl_pointer_listener { -+ /** -+ * enter event -+ * -+ * Notification that this seat's pointer is focused on a certain -+ * surface. -+ * -+ * When a seat's focus enters a surface, the pointer image is -+ * undefined and a client should respond to this event by setting -+ * an appropriate pointer image with the set_cursor request. -+ * @param serial serial number of the enter event -+ * @param surface surface entered by the pointer -+ * @param surface_x surface-local x coordinate -+ * @param surface_y surface-local y coordinate -+ */ -+ void (*enter)(void* data, struct wl_pointer* wl_pointer, uint32_t serial, -+ struct wl_surface* surface, wl_fixed_t surface_x, -+ wl_fixed_t surface_y); -+ /** -+ * leave event -+ * -+ * Notification that this seat's pointer is no longer focused on -+ * a certain surface. -+ * -+ * The leave notification is sent before the enter notification for -+ * the new focus. -+ * @param serial serial number of the leave event -+ * @param surface surface left by the pointer -+ */ -+ void (*leave)(void* data, struct wl_pointer* wl_pointer, uint32_t serial, -+ struct wl_surface* surface); -+ /** -+ * pointer motion event -+ * -+ * Notification of pointer location change. The arguments -+ * surface_x and surface_y are the location relative to the focused -+ * surface. -+ * @param time timestamp with millisecond granularity -+ * @param surface_x surface-local x coordinate -+ * @param surface_y surface-local y coordinate -+ */ -+ void (*motion)(void* data, struct wl_pointer* wl_pointer, uint32_t time, -+ wl_fixed_t surface_x, wl_fixed_t surface_y); -+ /** -+ * pointer button event -+ * -+ * Mouse button click and release notifications. -+ * -+ * The location of the click is given by the last motion or enter -+ * event. The time argument is a timestamp with millisecond -+ * granularity, with an undefined base. -+ * -+ * The button is a button code as defined in the Linux kernel's -+ * linux/input-event-codes.h header file, e.g. BTN_LEFT. -+ * -+ * Any 16-bit button code value is reserved for future additions to -+ * the kernel's event code list. All other button codes above -+ * 0xFFFF are currently undefined but may be used in future -+ * versions of this protocol. -+ * @param serial serial number of the button event -+ * @param time timestamp with millisecond granularity -+ * @param button button that produced the event -+ * @param state physical state of the button -+ */ -+ void (*button)(void* data, struct wl_pointer* wl_pointer, uint32_t serial, -+ uint32_t time, uint32_t button, uint32_t state); -+ /** -+ * axis event -+ * -+ * Scroll and other axis notifications. -+ * -+ * For scroll events (vertical and horizontal scroll axes), the -+ * value parameter is the length of a vector along the specified -+ * axis in a coordinate space identical to those of motion events, -+ * representing a relative movement along the specified axis. -+ * -+ * For devices that support movements non-parallel to axes multiple -+ * axis events will be emitted. -+ * -+ * When applicable, for example for touch pads, the server can -+ * choose to emit scroll events where the motion vector is -+ * equivalent to a motion event vector. -+ * -+ * When applicable, a client can transform its content relative to -+ * the scroll distance. -+ * @param time timestamp with millisecond granularity -+ * @param axis axis type -+ * @param value length of vector in surface-local coordinate space -+ */ -+ void (*axis)(void* data, struct wl_pointer* wl_pointer, uint32_t time, -+ uint32_t axis, wl_fixed_t value); -+ /** -+ * end of a pointer event sequence -+ * -+ * Indicates the end of a set of events that logically belong -+ * together. A client is expected to accumulate the data in all -+ * events within the frame before proceeding. -+ * -+ * All wl_pointer events before a wl_pointer.frame event belong -+ * logically together. For example, in a diagonal scroll motion the -+ * compositor will send an optional wl_pointer.axis_source event, -+ * two wl_pointer.axis events (horizontal and vertical) and finally -+ * a wl_pointer.frame event. The client may use this information to -+ * calculate a diagonal vector for scrolling. -+ * -+ * When multiple wl_pointer.axis events occur within the same -+ * frame, the motion vector is the combined motion of all events. -+ * When a wl_pointer.axis and a wl_pointer.axis_stop event occur -+ * within the same frame, this indicates that axis movement in one -+ * axis has stopped but continues in the other axis. When multiple -+ * wl_pointer.axis_stop events occur within the same frame, this -+ * indicates that these axes stopped in the same instance. -+ * -+ * A wl_pointer.frame event is sent for every logical event group, -+ * even if the group only contains a single wl_pointer event. -+ * Specifically, a client may get a sequence: motion, frame, -+ * button, frame, axis, frame, axis_stop, frame. -+ * -+ * The wl_pointer.enter and wl_pointer.leave events are logical -+ * events generated by the compositor and not the hardware. These -+ * events are also grouped by a wl_pointer.frame. When a pointer -+ * moves from one surface to another, a compositor should group the -+ * wl_pointer.leave event within the same wl_pointer.frame. -+ * However, a client must not rely on wl_pointer.leave and -+ * wl_pointer.enter being in the same wl_pointer.frame. -+ * Compositor-specific policies may require the wl_pointer.leave -+ * and wl_pointer.enter event being split across multiple -+ * wl_pointer.frame groups. -+ * @since 5 -+ */ -+ void (*frame)(void* data, struct wl_pointer* wl_pointer); -+ /** -+ * axis source event -+ * -+ * Source information for scroll and other axes. -+ * -+ * This event does not occur on its own. It is sent before a -+ * wl_pointer.frame event and carries the source information for -+ * all events within that frame. -+ * -+ * The source specifies how this event was generated. If the source -+ * is wl_pointer.axis_source.finger, a wl_pointer.axis_stop event -+ * will be sent when the user lifts the finger off the device. -+ * -+ * If the source is wl_pointer.axis_source.wheel, -+ * wl_pointer.axis_source.wheel_tilt or -+ * wl_pointer.axis_source.continuous, a wl_pointer.axis_stop event -+ * may or may not be sent. Whether a compositor sends an axis_stop -+ * event for these sources is hardware-specific and -+ * implementation-dependent; clients must not rely on receiving an -+ * axis_stop event for these scroll sources and should treat scroll -+ * sequences from these scroll sources as unterminated by default. -+ * -+ * This event is optional. If the source is unknown for a -+ * particular axis event sequence, no event is sent. Only one -+ * wl_pointer.axis_source event is permitted per frame. -+ * -+ * The order of wl_pointer.axis_discrete and wl_pointer.axis_source -+ * is not guaranteed. -+ * @param axis_source source of the axis event -+ * @since 5 -+ */ -+ void (*axis_source)(void* data, struct wl_pointer* wl_pointer, -+ uint32_t axis_source); -+ /** -+ * axis stop event -+ * -+ * Stop notification for scroll and other axes. -+ * -+ * For some wl_pointer.axis_source types, a wl_pointer.axis_stop -+ * event is sent to notify a client that the axis sequence has -+ * terminated. This enables the client to implement kinetic -+ * scrolling. See the wl_pointer.axis_source documentation for -+ * information on when this event may be generated. -+ * -+ * Any wl_pointer.axis events with the same axis_source after this -+ * event should be considered as the start of a new axis motion. -+ * -+ * The timestamp is to be interpreted identical to the timestamp in -+ * the wl_pointer.axis event. The timestamp value may be the same -+ * as a preceding wl_pointer.axis event. -+ * @param time timestamp with millisecond granularity -+ * @param axis the axis stopped with this event -+ * @since 5 -+ */ -+ void (*axis_stop)(void* data, struct wl_pointer* wl_pointer, uint32_t time, -+ uint32_t axis); -+ /** -+ * axis click event -+ * -+ * Discrete step information for scroll and other axes. -+ * -+ * This event carries the axis value of the wl_pointer.axis event -+ * in discrete steps (e.g. mouse wheel clicks). -+ * -+ * This event is deprecated with wl_pointer version 8 - this event -+ * is not sent to clients supporting version 8 or later. -+ * -+ * This event does not occur on its own, it is coupled with a -+ * wl_pointer.axis event that represents this axis value on a -+ * continuous scale. The protocol guarantees that each -+ * axis_discrete event is always followed by exactly one axis event -+ * with the same axis number within the same wl_pointer.frame. Note -+ * that the protocol allows for other events to occur between the -+ * axis_discrete and its coupled axis event, including other -+ * axis_discrete or axis events. A wl_pointer.frame must not -+ * contain more than one axis_discrete event per axis type. -+ * -+ * This event is optional; continuous scrolling devices like -+ * two-finger scrolling on touchpads do not have discrete steps and -+ * do not generate this event. -+ * -+ * The discrete value carries the directional information. e.g. a -+ * value of -2 is two steps towards the negative direction of this -+ * axis. -+ * -+ * The axis number is identical to the axis number in the -+ * associated axis event. -+ * -+ * The order of wl_pointer.axis_discrete and wl_pointer.axis_source -+ * is not guaranteed. -+ * @param axis axis type -+ * @param discrete number of steps -+ * @since 5 -+ * @deprecated Deprecated since version 8 -+ */ -+ void (*axis_discrete)(void* data, struct wl_pointer* wl_pointer, -+ uint32_t axis, int32_t discrete); -+ /** -+ * axis high-resolution scroll event -+ * -+ * Discrete high-resolution scroll information. -+ * -+ * This event carries high-resolution wheel scroll information, -+ * with each multiple of 120 representing one logical scroll step -+ * (a wheel detent). For example, an axis_value120 of 30 is one -+ * quarter of a logical scroll step in the positive direction, a -+ * value120 of -240 are two logical scroll steps in the negative -+ * direction within the same hardware event. Clients that rely on -+ * discrete scrolling should accumulate the value120 to multiples -+ * of 120 before processing the event. -+ * -+ * The value120 must not be zero. -+ * -+ * This event replaces the wl_pointer.axis_discrete event in -+ * clients supporting wl_pointer version 8 or later. -+ * -+ * Where a wl_pointer.axis_source event occurs in the same -+ * wl_pointer.frame, the axis source applies to this event. -+ * -+ * The order of wl_pointer.axis_value120 and wl_pointer.axis_source -+ * is not guaranteed. -+ * @param axis axis type -+ * @param value120 scroll distance as fraction of 120 -+ * @since 8 -+ */ -+ void (*axis_value120)(void* data, struct wl_pointer* wl_pointer, -+ uint32_t axis, int32_t value120); -+ /** -+ * axis relative physical direction event -+ * -+ * Relative directional information of the entity causing the -+ * axis motion. -+ * -+ * For a wl_pointer.axis event, the -+ * wl_pointer.axis_relative_direction event specifies the movement -+ * direction of the entity causing the wl_pointer.axis event. For -+ * example: - if a user's fingers on a touchpad move down and this -+ * causes a wl_pointer.axis vertical_scroll down event, the -+ * physical direction is 'identical' - if a user's fingers on a -+ * touchpad move down and this causes a wl_pointer.axis -+ * vertical_scroll up scroll up event ('natural scrolling'), the -+ * physical direction is 'inverted'. -+ * -+ * A client may use this information to adjust scroll motion of -+ * components. Specifically, enabling natural scrolling causes the -+ * content to change direction compared to traditional scrolling. -+ * Some widgets like volume control sliders should usually match -+ * the physical direction regardless of whether natural scrolling -+ * is active. This event enables clients to match the scroll -+ * direction of a widget to the physical direction. -+ * -+ * This event does not occur on its own, it is coupled with a -+ * wl_pointer.axis event that represents this axis value. The -+ * protocol guarantees that each axis_relative_direction event is -+ * always followed by exactly one axis event with the same axis -+ * number within the same wl_pointer.frame. Note that the protocol -+ * allows for other events to occur between the -+ * axis_relative_direction and its coupled axis event. -+ * -+ * The axis number is identical to the axis number in the -+ * associated axis event. -+ * -+ * The order of wl_pointer.axis_relative_direction, -+ * wl_pointer.axis_discrete and wl_pointer.axis_source is not -+ * guaranteed. -+ * @param axis axis type -+ * @param direction physical direction relative to axis motion -+ * @since 9 -+ */ -+ void (*axis_relative_direction)(void* data, struct wl_pointer* wl_pointer, -+ uint32_t axis, uint32_t direction); -+}; -+ - #ifdef __cplusplus - } - #endif - - #endif /* __MozWayland_h_ */ -diff --git a/widget/gtk/nsGtkKeyUtils.h b/widget/gtk/nsGtkKeyUtils.h ---- a/widget/gtk/nsGtkKeyUtils.h -+++ b/widget/gtk/nsGtkKeyUtils.h -@@ -196,22 +196,19 @@ - /** - * Utility function to set all supported modifier masks - * from xkb_keymap. We call that from Wayland backend routines. - */ - static void SetModifierMasks(xkb_keymap* aKeymap); -+ static void HandleKeymap(uint32_t format, int fd, uint32_t size); - - /** - * 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, int aId); -- static void ClearSeat(int aId); -- static wl_seat* GetSeat(); -- - static void SetKeyboard(wl_keyboard* aKeyboard); - static wl_keyboard* GetKeyboard(); - static void ClearKeyboard(); - - /** -@@ -495,13 +492,10 @@ - void SetModifierMask(xkb_keymap* aKeymap, ModifierIndex aModifierIndex, - const char* aModifierName); - #endif - - #ifdef MOZ_WAYLAND -- static wl_seat* sSeat; -- static int sSeatID; -- static wl_keyboard* sKeyboard; - wl_surface* mFocusSurface = nullptr; - uint32_t mFocusSerial = 0; - #endif - }; - -diff --git a/widget/gtk/nsGtkKeyUtils.cpp b/widget/gtk/nsGtkKeyUtils.cpp ---- a/widget/gtk/nsGtkKeyUtils.cpp -+++ b/widget/gtk/nsGtkKeyUtils.cpp -@@ -63,16 +63,10 @@ - Time KeymapWrapper::sLastRepeatableKeyTime = 0; - #endif - KeymapWrapper::RepeatState KeymapWrapper::sRepeatState = - KeymapWrapper::NOT_PRESSED; - --#ifdef MOZ_WAYLAND --wl_seat* KeymapWrapper::sSeat = nullptr; --int KeymapWrapper::sSeatID = -1; --wl_keyboard* KeymapWrapper::sKeyboard = nullptr; --#endif -- - static const char* GetBoolName(bool aBool) { return aBool ? "TRUE" : "FALSE"; } - - static const char* GetStatusName(nsEventStatus aStatus) { - switch (aStatus) { - case nsEventStatus_eConsumeDoDefault: -@@ -688,12 +682,11 @@ - keymapWrapper->GetGdkModifierMask(HYPER))); - } - - /* This keymap routine is derived from weston-2.0.0/clients/simple-im.c - */ --static void keyboard_handle_keymap(void* data, struct wl_keyboard* wl_keyboard, -- uint32_t format, int fd, uint32_t size) { -+void KeymapWrapper::HandleKeymap(uint32_t format, int fd, uint32_t size) { - KeymapWrapper::ResetKeyboard(); - - if (format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1) { - close(fd); - return; -@@ -722,54 +715,10 @@ - - xkb_keymap_unref(keymap); - - xkb_context_unref(xkb_context); - } -- --static void keyboard_handle_enter(void* data, struct wl_keyboard* keyboard, -- uint32_t serial, struct wl_surface* surface, -- 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) {} --static void keyboard_handle_modifiers(void* data, struct wl_keyboard* keyboard, -- uint32_t serial, uint32_t mods_depressed, -- uint32_t mods_latched, -- uint32_t mods_locked, uint32_t group) {} --static void keyboard_handle_repeat_info(void* data, -- struct wl_keyboard* keyboard, -- int32_t rate, int32_t delay) {} -- --static const struct wl_keyboard_listener keyboard_listener = { -- keyboard_handle_keymap, keyboard_handle_enter, -- keyboard_handle_leave, keyboard_handle_key, -- keyboard_handle_modifiers, keyboard_handle_repeat_info}; -- --static void seat_handle_capabilities(void* data, struct wl_seat* seat, -- unsigned int caps) { -- wl_keyboard* keyboard = KeymapWrapper::GetKeyboard(); -- if ((caps & WL_SEAT_CAPABILITY_KEYBOARD) && !keyboard) { -- keyboard = wl_seat_get_keyboard(seat); -- wl_keyboard_add_listener(keyboard, &keyboard_listener, nullptr); -- KeymapWrapper::SetKeyboard(keyboard); -- } else if (!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && keyboard) { -- KeymapWrapper::ClearKeyboard(); -- } --} -- --static const struct wl_seat_listener seat_listener = { -- seat_handle_capabilities, --}; -- - #endif - - KeymapWrapper::~KeymapWrapper() { - #ifdef MOZ_X11 - gdk_window_remove_filter(nullptr, FilterEvents, this); -@@ -2694,38 +2643,9 @@ - uint32_t* aFocusSerial) { - KeymapWrapper* keymapWrapper = KeymapWrapper::GetInstance(); - *aFocusSurface = keymapWrapper->mFocusSurface; - *aFocusSerial = keymapWrapper->mFocusSerial; - } -- --void KeymapWrapper::SetSeat(wl_seat* aSeat, int aId) { -- sSeat = aSeat; -- sSeatID = aId; -- wl_seat_add_listener(aSeat, &seat_listener, nullptr); --} -- --void KeymapWrapper::ClearSeat(int aId) { -- if (sSeatID == aId) { -- ClearKeyboard(); -- sSeat = nullptr; -- sSeatID = -1; -- } --} -- --wl_seat* KeymapWrapper::GetSeat() { return sSeat; } -- --void KeymapWrapper::SetKeyboard(wl_keyboard* aKeyboard) { -- sKeyboard = aKeyboard; --} -- --wl_keyboard* KeymapWrapper::GetKeyboard() { return sKeyboard; } -- --void KeymapWrapper::ClearKeyboard() { -- if (sKeyboard) { -- wl_keyboard_destroy(sKeyboard); -- sKeyboard = nullptr; -- } --} - #endif - - } // namespace widget - } // namespace mozilla -diff --git a/widget/gtk/nsWaylandDisplay.h b/widget/gtk/nsWaylandDisplay.h ---- a/widget/gtk/nsWaylandDisplay.h -+++ b/widget/gtk/nsWaylandDisplay.h -@@ -14,10 +14,11 @@ - #include "mozilla/widget/gbm.h" - #include "mozilla/widget/fractional-scale-v1-client-protocol.h" - #include "mozilla/widget/idle-inhibit-unstable-v1-client-protocol.h" - #include "mozilla/widget/relative-pointer-unstable-v1-client-protocol.h" - #include "mozilla/widget/pointer-constraints-unstable-v1-client-protocol.h" -+#include "mozilla/widget/pointer-gestures-unstable-v1-client-protocol.h" - #include "mozilla/widget/linux-dmabuf-unstable-v1-client-protocol.h" - #include "mozilla/widget/viewporter-client-protocol.h" - #include "mozilla/widget/xdg-activation-v1-client-protocol.h" - #include "mozilla/widget/xdg-dbus-annotation-v1-client-protocol.h" - #include "mozilla/widget/xdg-output-unstable-v1-client-protocol.h" -@@ -55,19 +56,33 @@ - wp_fractional_scale_manager_v1* GetFractionalScaleManager() { - return mFractionalScaleManager; - } - bool IsPrimarySelectionEnabled() { return mIsPrimarySelectionEnabled; } - -+ wl_pointer* GetPointer() { return mPointer; } -+ void SetPointer(wl_pointer* aPointer); -+ void RemovePointer(); -+ - void SetShm(wl_shm* aShm); -+ -+ void SetKeyboard(wl_keyboard* aKeyboard); -+ wl_keyboard* GetKeyboard() { return mKeyboard; } -+ void ClearKeyboard(); -+ -+ void SetSeat(wl_seat* aSeat, int aSeatId); -+ wl_seat* GetSeat() { return mSeat; } -+ void RemoveSeat(int aSeatId); -+ - void SetCompositor(wl_compositor* aCompositor); - void SetSubcompositor(wl_subcompositor* aSubcompositor); - void SetDataDeviceManager(wl_data_device_manager* aDataDeviceManager); - void SetIdleInhibitManager(zwp_idle_inhibit_manager_v1* aIdleInhibitManager); - void SetViewporter(wp_viewporter* aViewporter); - void SetRelativePointerManager( - zwp_relative_pointer_manager_v1* aRelativePointerManager); - void SetPointerConstraints(zwp_pointer_constraints_v1* aPointerConstraints); -+ void SetPointerGestures(zwp_pointer_gestures_v1* aPointerGestures); - void SetDmabuf(zwp_linux_dmabuf_v1* aDmabuf); - void SetXdgActivation(xdg_activation_v1* aXdgActivation); - void SetXdgDbusAnnotationManager( - xdg_dbus_annotation_manager_v1* aXdgDbusAnnotationManager); - void SetFractionalScaleManager(wp_fractional_scale_manager_v1* aManager) { -@@ -82,13 +97,19 @@ - wl_registry* mRegistry = nullptr; - wl_display* mDisplay = nullptr; - wl_compositor* mCompositor = nullptr; - wl_subcompositor* mSubcompositor = nullptr; - wl_shm* mShm = nullptr; -+ wl_seat* mSeat = nullptr; -+ int mSeatId = -1; -+ wl_keyboard* mKeyboard = nullptr; -+ wl_pointer* mPointer = nullptr; - zwp_idle_inhibit_manager_v1* mIdleInhibitManager = nullptr; - zwp_relative_pointer_manager_v1* mRelativePointerManager = nullptr; - zwp_pointer_constraints_v1* mPointerConstraints = nullptr; -+ zwp_pointer_gestures_v1* mPointerGestures = nullptr; -+ zwp_pointer_gesture_hold_v1* mPointerGestureHold = nullptr; - wp_viewporter* mViewporter = nullptr; - zwp_linux_dmabuf_v1* mDmabuf = nullptr; - xdg_activation_v1* mXdgActivation = nullptr; - xdg_dbus_annotation_manager_v1* mXdgDbusAnnotationManager = nullptr; - wp_fractional_scale_manager_v1* mFractionalScaleManager = nullptr; -diff --git a/widget/gtk/nsWaylandDisplay.cpp b/widget/gtk/nsWaylandDisplay.cpp ---- a/widget/gtk/nsWaylandDisplay.cpp -+++ b/widget/gtk/nsWaylandDisplay.cpp -@@ -17,10 +17,11 @@ - #include "mozilla/ThreadLocal.h" - #include "mozilla/StaticPrefs_widget.h" - #include "mozilla/Sprintf.h" - #include "WidgetUtilsGtk.h" - #include "nsGtkKeyUtils.h" -+#include "nsWindow.h" - - namespace mozilla::widget { - - static nsWaylandDisplay* gWaylandDisplay; - -@@ -55,10 +56,202 @@ - return gWaylandDisplay; - } - - void nsWaylandDisplay::SetShm(wl_shm* aShm) { mShm = aShm; } - -+struct PointerState { -+ wl_surface* surface; -+ -+ nsWindow* GetWindow() { -+ GdkWindow* window = -+ static_cast(wl_surface_get_user_data(surface)); -+ return window ? static_cast( -+ g_object_get_data(G_OBJECT(window), "nsWindow")) -+ : nullptr; -+ } -+} sPointerState; -+ -+static void gesture_hold_begin(void* data, -+ struct zwp_pointer_gesture_hold_v1* hold, -+ uint32_t serial, uint32_t time, -+ struct wl_surface* surface, uint32_t fingers) { -+ RefPtr window = sPointerState.GetWindow(); -+ if (!window) { -+ return; -+ } -+ window->OnTouchpadHoldEvent(GDK_TOUCHPAD_GESTURE_PHASE_BEGIN, time, fingers); -+} -+ -+static void gesture_hold_end(void* data, -+ struct zwp_pointer_gesture_hold_v1* hold, -+ uint32_t serial, uint32_t time, -+ int32_t cancelled) { -+ RefPtr window = sPointerState.GetWindow(); -+ if (!window) { -+ return; -+ } -+ window->OnTouchpadHoldEvent(cancelled ? GDK_TOUCHPAD_GESTURE_PHASE_CANCEL -+ : GDK_TOUCHPAD_GESTURE_PHASE_END, -+ time, 0); -+} -+ -+static const struct zwp_pointer_gesture_hold_v1_listener gesture_hold_listener = -+ {gesture_hold_begin, gesture_hold_end}; -+ -+static void pointer_handle_enter(void* data, struct wl_pointer* pointer, -+ uint32_t serial, struct wl_surface* surface, -+ wl_fixed_t sx, wl_fixed_t sy) { -+ sPointerState.surface = surface; -+} -+ -+static void pointer_handle_leave(void* data, struct wl_pointer* pointer, -+ uint32_t serial, struct wl_surface* surface) { -+ sPointerState.surface = nullptr; -+} -+ -+static void pointer_handle_motion(void* data, struct wl_pointer* pointer, -+ uint32_t time, wl_fixed_t sx, wl_fixed_t sy) { -+} -+ -+static void pointer_handle_button(void* data, struct wl_pointer* pointer, -+ uint32_t serial, uint32_t time, -+ uint32_t button, uint32_t state) {} -+ -+static void pointer_handle_axis(void* data, struct wl_pointer* pointer, -+ uint32_t time, uint32_t axis, -+ wl_fixed_t value) {} -+ -+static void pointer_handle_frame(void* data, struct wl_pointer* pointer) {} -+ -+static void pointer_handle_axis_source( -+ void* data, struct wl_pointer* pointer, -+ /*enum wl_pointer_axis_source */ uint32_t source) {} -+ -+static void pointer_handle_axis_stop(void* data, struct wl_pointer* pointer, -+ uint32_t time, uint32_t axis) {} -+ -+static void pointer_handle_axis_discrete(void* data, struct wl_pointer* pointer, -+ uint32_t axis, int32_t value) {} -+ -+static void pointer_handle_axis_value120(void* data, struct wl_pointer* pointer, -+ uint32_t axis, int32_t value) {} -+ -+static const struct moz_wl_pointer_listener pointer_listener = { -+ pointer_handle_enter, pointer_handle_leave, -+ pointer_handle_motion, pointer_handle_button, -+ pointer_handle_axis, pointer_handle_frame, -+ pointer_handle_axis_source, pointer_handle_axis_stop, -+ pointer_handle_axis_discrete, pointer_handle_axis_value120, -+}; -+ -+void nsWaylandDisplay::SetPointer(wl_pointer* aPointer) { -+ if (!mPointerGestures) { -+ return; -+ } -+ MOZ_DIAGNOSTIC_ASSERT(!mPointer); -+ mPointer = aPointer; -+ wl_pointer_add_listener(mPointer, -+ (const wl_pointer_listener*)&pointer_listener, this); -+ -+ mPointerGestureHold = -+ zwp_pointer_gestures_v1_get_hold_gesture(mPointerGestures, mPointer); -+ zwp_pointer_gesture_hold_v1_set_user_data(mPointerGestureHold, this); -+ zwp_pointer_gesture_hold_v1_add_listener(mPointerGestureHold, -+ &gesture_hold_listener, this); -+} -+ -+void nsWaylandDisplay::RemovePointer() { -+ wl_pointer_release(mPointer); -+ mPointer = nullptr; -+} -+ -+static void seat_handle_capabilities(void* data, struct wl_seat* seat, -+ unsigned int caps) { -+ auto* display = static_cast(data); -+ if (!display) { -+ return; -+ } -+ -+ if ((caps & WL_SEAT_CAPABILITY_POINTER) && !display->GetPointer()) { -+ display->SetPointer(wl_seat_get_pointer(seat)); -+ } else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && display->GetPointer()) { -+ display->RemovePointer(); -+ } -+ -+ wl_keyboard* keyboard = display->GetKeyboard(); -+ if ((caps & WL_SEAT_CAPABILITY_KEYBOARD) && !keyboard) { -+ display->SetKeyboard(wl_seat_get_keyboard(seat)); -+ } else if (!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && keyboard) { -+ display->ClearKeyboard(); -+ } -+} -+ -+static const struct wl_seat_listener seat_listener = { -+ seat_handle_capabilities, -+}; -+ -+void nsWaylandDisplay::SetSeat(wl_seat* aSeat, int aSeatId) { -+ mSeat = aSeat; -+ mSeatId = aSeatId; -+ wl_seat_add_listener(aSeat, &seat_listener, this); -+} -+ -+void nsWaylandDisplay::RemoveSeat(int aSeatId) { -+ if (mSeatId == aSeatId) { -+ mSeat = nullptr; -+ mSeatId = -1; -+ } -+} -+ -+/* This keymap routine is derived from weston-2.0.0/clients/simple-im.c -+ */ -+static void keyboard_handle_keymap(void* data, struct wl_keyboard* wl_keyboard, -+ uint32_t format, int fd, uint32_t size) { -+ KeymapWrapper::HandleKeymap(format, fd, size); -+} -+ -+static void keyboard_handle_enter(void* data, struct wl_keyboard* keyboard, -+ uint32_t serial, struct wl_surface* surface, -+ 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) {} -+static void keyboard_handle_modifiers(void* data, struct wl_keyboard* keyboard, -+ uint32_t serial, uint32_t mods_depressed, -+ uint32_t mods_latched, -+ uint32_t mods_locked, uint32_t group) {} -+static void keyboard_handle_repeat_info(void* data, -+ struct wl_keyboard* keyboard, -+ int32_t rate, int32_t delay) {} -+ -+static const struct wl_keyboard_listener keyboard_listener = { -+ keyboard_handle_keymap, keyboard_handle_enter, -+ keyboard_handle_leave, keyboard_handle_key, -+ keyboard_handle_modifiers, keyboard_handle_repeat_info}; -+ -+void nsWaylandDisplay::SetKeyboard(wl_keyboard* aKeyboard) { -+ MOZ_ASSERT(aKeyboard); -+ MOZ_DIAGNOSTIC_ASSERT(!mKeyboard); -+ mKeyboard = aKeyboard; -+ wl_keyboard_add_listener(mKeyboard, &keyboard_listener, nullptr); -+} -+ -+void nsWaylandDisplay::ClearKeyboard() { -+ if (mKeyboard) { -+ wl_keyboard_destroy(mKeyboard); -+ mKeyboard = nullptr; -+ } -+} -+ - void nsWaylandDisplay::SetCompositor(wl_compositor* aCompositor) { - mCompositor = aCompositor; - } - - void nsWaylandDisplay::SetSubcompositor(wl_subcompositor* aSubcompositor) { -@@ -82,10 +275,15 @@ - void nsWaylandDisplay::SetPointerConstraints( - zwp_pointer_constraints_v1* aPointerConstraints) { - mPointerConstraints = aPointerConstraints; - } - -+void nsWaylandDisplay::SetPointerGestures( -+ zwp_pointer_gestures_v1* aPointerGestures) { -+ mPointerGestures = aPointerGestures; -+} -+ - void nsWaylandDisplay::SetDmabuf(zwp_linux_dmabuf_v1* aDmabuf) { - mDmabuf = aDmabuf; - } - - void nsWaylandDisplay::SetXdgActivation(xdg_activation_v1* aXdgActivation) { -@@ -122,11 +320,12 @@ - } else if (iface.EqualsLiteral("zwp_pointer_constraints_v1")) { - auto* pointer_constraints = WaylandRegistryBind( - registry, id, &zwp_pointer_constraints_v1_interface, 1); - display->SetPointerConstraints(pointer_constraints); - } else if (iface.EqualsLiteral("wl_compositor")) { -- // Requested wl_compositor version 4 as we need wl_surface_damage_buffer(). -+ // Requested wl_compositor version 4 as we need -+ // wl_surface_damage_buffer(). - auto* compositor = WaylandRegistryBind( - registry, id, &wl_compositor_interface, 4); - display->SetCompositor(compositor); - } else if (iface.EqualsLiteral("wl_subcompositor")) { - auto* subcompositor = WaylandRegistryBind( -@@ -150,24 +349,33 @@ - registry, id, &xdg_dbus_annotation_manager_v1_interface, 1); - display->SetXdgDbusAnnotationManager(annotationManager); - } else if (iface.EqualsLiteral("wl_seat")) { - auto* seat = - WaylandRegistryBind(registry, id, &wl_seat_interface, 1); -- KeymapWrapper::SetSeat(seat, id); -+ display->SetSeat(seat, id); - } else if (iface.EqualsLiteral("wp_fractional_scale_manager_v1")) { - auto* manager = WaylandRegistryBind( - registry, id, &wp_fractional_scale_manager_v1_interface, 1); - display->SetFractionalScaleManager(manager); - } else if (iface.EqualsLiteral("gtk_primary_selection_device_manager") || - iface.EqualsLiteral("zwp_primary_selection_device_manager_v1")) { - display->EnablePrimarySelection(); -+ } else if (iface.EqualsLiteral("zwp_pointer_gestures_v1")) { -+ // HOLD is introduced in version 3 -+ auto* gestures = WaylandRegistryBind( -+ registry, id, &zwp_pointer_gestures_v1_interface, 3); -+ display->SetPointerGestures(gestures); - } - } - - static void global_registry_remover(void* data, wl_registry* registry, - uint32_t id) { -- KeymapWrapper::ClearSeat(id); -+ auto* display = static_cast(data); -+ if (!display) { -+ return; -+ } -+ display->RemoveSeat(id); - } - - static const struct wl_registry_listener registry_listener = { - global_registry_handler, global_registry_remover}; - -diff --git a/widget/gtk/nsWindow.h b/widget/gtk/nsWindow.h ---- a/widget/gtk/nsWindow.h -+++ b/widget/gtk/nsWindow.h -@@ -107,10 +107,19 @@ - GDK_ANCHOR_SLIDE = GDK_ANCHOR_SLIDE_X | GDK_ANCHOR_SLIDE_Y, - GDK_ANCHOR_RESIZE = GDK_ANCHOR_RESIZE_X | GDK_ANCHOR_RESIZE_Y - } GdkAnchorHints; - #endif - -+#if !GTK_CHECK_VERSION(3, 18, 0) -+typedef enum { -+ GDK_TOUCHPAD_GESTURE_PHASE_BEGIN, -+ GDK_TOUCHPAD_GESTURE_PHASE_UPDATE, -+ GDK_TOUCHPAD_GESTURE_PHASE_END, -+ GDK_TOUCHPAD_GESTURE_PHASE_CANCEL -+} GdkTouchpadGesturePhase; -+#endif -+ - namespace mozilla { - enum class NativeKeyBindingsType : uint8_t; - - class TimeStamp; - #ifdef MOZ_X11 -@@ -256,10 +265,12 @@ - GtkSelectionData* aSelectionData, guint aInfo, - guint aTime, gpointer aData); - gboolean OnPropertyNotifyEvent(GtkWidget* aWidget, GdkEventProperty* aEvent); - gboolean OnTouchEvent(GdkEventTouch* aEvent); - gboolean OnTouchpadPinchEvent(GdkEventTouchpadPinch* aEvent); -+ void OnTouchpadHoldEvent(GdkTouchpadGesturePhase aPhase, guint aTime, -+ uint32_t aFingers); - - gint GetInputRegionMarginInGdkCoords(); - - void UpdateOpaqueRegionInternal(); - void UpdateOpaqueRegion(const LayoutDeviceIntRegion&) override; -diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp ---- a/widget/gtk/nsWindow.cpp -+++ b/widget/gtk/nsWindow.cpp -@@ -139,11 +139,10 @@ - // Don't put more than this many rects in the dirty region, just fluff - // out to the bounding-box if there are more - #define MAX_RECTS_IN_REGION 100 - - #if !GTK_CHECK_VERSION(3, 18, 0) -- - struct _GdkEventTouchpadPinch { - GdkEventType type; - GdkWindow* window; - gint8 send_event; - gint8 phase; -@@ -157,20 +156,12 @@ - gdouble scale; - gdouble x_root, y_root; - guint state; - }; - --typedef enum { -- GDK_TOUCHPAD_GESTURE_PHASE_BEGIN, -- GDK_TOUCHPAD_GESTURE_PHASE_UPDATE, -- GDK_TOUCHPAD_GESTURE_PHASE_END, -- GDK_TOUCHPAD_GESTURE_PHASE_CANCEL --} GdkTouchpadGesturePhase; -- - gint GDK_TOUCHPAD_GESTURE_MASK = 1 << 24; - GdkEventType GDK_TOUCHPAD_PINCH = static_cast(42); -- - #endif - - const gint kEvents = GDK_TOUCHPAD_GESTURE_MASK | GDK_EXPOSURE_MASK | - GDK_STRUCTURE_MASK | GDK_VISIBILITY_NOTIFY_MASK | - GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | -@@ -5509,10 +5500,15 @@ - mLastPinchEventSpan = aEvent->scale; - DispatchPinchGestureInput(event); - return TRUE; - } - -+void nsWindow::OnTouchpadHoldEvent(GdkTouchpadGesturePhase aPhase, guint aTime, -+ uint32_t aFingers) { -+ LOG("OnTouchpadHoldEvent: aPhase %d aFingers %d", aPhase, aFingers); -+} -+ - gboolean nsWindow::OnTouchEvent(GdkEventTouch* aEvent) { - LOG("OnTouchEvent: x=%f y=%f type=%d\n", aEvent->x, aEvent->y, aEvent->type); - if (!mHandleTouchEvent) { - // If a popup window was spawned (e.g. as the result of a long-press) - // and touch events got diverted to that window within a touch sequence, -diff --git a/widget/gtk/wayland/moz.build b/widget/gtk/wayland/moz.build ---- a/widget/gtk/wayland/moz.build -+++ b/widget/gtk/wayland/moz.build -@@ -10,10 +10,11 @@ - SOURCES += [ - "fractional-scale-v1-protocol.c", - "idle-inhibit-unstable-v1-protocol.c", - "linux-dmabuf-unstable-v1-protocol.c", - "pointer-constraints-unstable-v1-protocol.c", -+ "pointer-gestures-unstable-v1-protocol.c", - "relative-pointer-unstable-v1-protocol.c", - "viewporter-protocol.c", - "xdg-activation-v1-protocol.c", - "xdg-dbus-annotation-v1-protocol.c", - "xdg-output-unstable-v1-protocol.c", -@@ -22,10 +23,11 @@ - EXPORTS.mozilla.widget += [ - "fractional-scale-v1-client-protocol.h", - "idle-inhibit-unstable-v1-client-protocol.h", - "linux-dmabuf-unstable-v1-client-protocol.h", - "pointer-constraints-unstable-v1-client-protocol.h", -+ "pointer-gestures-unstable-v1-client-protocol.h", - "relative-pointer-unstable-v1-client-protocol.h", - "viewporter-client-protocol.h", - "xdg-activation-v1-client-protocol.h", - "xdg-dbus-annotation-v1-client-protocol.h", - "xdg-output-unstable-v1-client-protocol.h", -diff --git a/widget/gtk/wayland/pointer-gestures-unstable-v1-client-protocol.h b/widget/gtk/wayland/pointer-gestures-unstable-v1-client-protocol.h -new file mode 100644 ---- /dev/null -+++ b/widget/gtk/wayland/pointer-gestures-unstable-v1-client-protocol.h -@@ -0,0 +1,685 @@ -+/* Generated by wayland-scanner 1.22.0 */ -+ -+#ifndef POINTER_GESTURES_UNSTABLE_V1_CLIENT_PROTOCOL_H -+#define POINTER_GESTURES_UNSTABLE_V1_CLIENT_PROTOCOL_H -+ -+#include -+#include -+#include "wayland-client.h" -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+/** -+ * @page page_pointer_gestures_unstable_v1 The pointer_gestures_unstable_v1 -+ * protocol -+ * @section page_ifaces_pointer_gestures_unstable_v1 Interfaces -+ * - @subpage page_iface_zwp_pointer_gestures_v1 - touchpad gestures -+ * - @subpage page_iface_zwp_pointer_gesture_swipe_v1 - a swipe gesture object -+ * - @subpage page_iface_zwp_pointer_gesture_pinch_v1 - a pinch gesture object -+ * - @subpage page_iface_zwp_pointer_gesture_hold_v1 - a hold gesture object -+ */ -+struct wl_pointer; -+struct wl_surface; -+struct zwp_pointer_gesture_hold_v1; -+struct zwp_pointer_gesture_pinch_v1; -+struct zwp_pointer_gesture_swipe_v1; -+struct zwp_pointer_gestures_v1; -+ -+#ifndef ZWP_POINTER_GESTURES_V1_INTERFACE -+# define ZWP_POINTER_GESTURES_V1_INTERFACE -+/** -+ * @page page_iface_zwp_pointer_gestures_v1 zwp_pointer_gestures_v1 -+ * @section page_iface_zwp_pointer_gestures_v1_desc Description -+ * -+ * A global interface to provide semantic touchpad gestures for a given -+ * pointer. -+ * -+ * Three gestures are currently supported: swipe, pinch, and hold. -+ * Pinch and swipe gestures follow a three-stage cycle: begin, update, -+ * end, hold gestures follow a two-stage cycle: begin and end. All -+ * gestures are identified by a unique id. -+ * -+ * Warning! The protocol described in this file is experimental and -+ * backward incompatible changes may be made. Backward compatible changes -+ * may be added together with the corresponding interface version bump. -+ * Backward incompatible changes are done by bumping the version number in -+ * the protocol and interface names and resetting the interface version. -+ * Once the protocol is to be declared stable, the 'z' prefix and the -+ * version number in the protocol and interface names are removed and the -+ * interface version number is reset. -+ * @section page_iface_zwp_pointer_gestures_v1_api API -+ * See @ref iface_zwp_pointer_gestures_v1. -+ */ -+/** -+ * @defgroup iface_zwp_pointer_gestures_v1 The zwp_pointer_gestures_v1 interface -+ * -+ * A global interface to provide semantic touchpad gestures for a given -+ * pointer. -+ * -+ * Three gestures are currently supported: swipe, pinch, and hold. -+ * Pinch and swipe gestures follow a three-stage cycle: begin, update, -+ * end, hold gestures follow a two-stage cycle: begin and end. All -+ * gestures are identified by a unique id. -+ * -+ * Warning! The protocol described in this file is experimental and -+ * backward incompatible changes may be made. Backward compatible changes -+ * may be added together with the corresponding interface version bump. -+ * Backward incompatible changes are done by bumping the version number in -+ * the protocol and interface names and resetting the interface version. -+ * Once the protocol is to be declared stable, the 'z' prefix and the -+ * version number in the protocol and interface names are removed and the -+ * interface version number is reset. -+ */ -+extern const struct wl_interface zwp_pointer_gestures_v1_interface; -+#endif -+#ifndef ZWP_POINTER_GESTURE_SWIPE_V1_INTERFACE -+# define ZWP_POINTER_GESTURE_SWIPE_V1_INTERFACE -+/** -+ * @page page_iface_zwp_pointer_gesture_swipe_v1 zwp_pointer_gesture_swipe_v1 -+ * @section page_iface_zwp_pointer_gesture_swipe_v1_desc Description -+ * -+ * A swipe gesture object notifies a client about a multi-finger swipe -+ * gesture detected on an indirect input device such as a touchpad. -+ * The gesture is usually initiated by multiple fingers moving in the -+ * same direction but once initiated the direction may change. -+ * The precise conditions of when such a gesture is detected are -+ * implementation-dependent. -+ * -+ * A gesture consists of three stages: begin, update (optional) and end. -+ * There cannot be multiple simultaneous hold, pinch or swipe gestures on a -+ * same pointer/seat, how compositors prevent these situations is -+ * implementation-dependent. -+ * -+ * A gesture may be cancelled by the compositor or the hardware. -+ * Clients should not consider performing permanent or irreversible -+ * actions until the end of a gesture has been received. -+ * @section page_iface_zwp_pointer_gesture_swipe_v1_api API -+ * See @ref iface_zwp_pointer_gesture_swipe_v1. -+ */ -+/** -+ * @defgroup iface_zwp_pointer_gesture_swipe_v1 The zwp_pointer_gesture_swipe_v1 -+ * interface -+ * -+ * A swipe gesture object notifies a client about a multi-finger swipe -+ * gesture detected on an indirect input device such as a touchpad. -+ * The gesture is usually initiated by multiple fingers moving in the -+ * same direction but once initiated the direction may change. -+ * The precise conditions of when such a gesture is detected are -+ * implementation-dependent. -+ * -+ * A gesture consists of three stages: begin, update (optional) and end. -+ * There cannot be multiple simultaneous hold, pinch or swipe gestures on a -+ * same pointer/seat, how compositors prevent these situations is -+ * implementation-dependent. -+ * -+ * A gesture may be cancelled by the compositor or the hardware. -+ * Clients should not consider performing permanent or irreversible -+ * actions until the end of a gesture has been received. -+ */ -+extern const struct wl_interface zwp_pointer_gesture_swipe_v1_interface; -+#endif -+#ifndef ZWP_POINTER_GESTURE_PINCH_V1_INTERFACE -+# define ZWP_POINTER_GESTURE_PINCH_V1_INTERFACE -+/** -+ * @page page_iface_zwp_pointer_gesture_pinch_v1 zwp_pointer_gesture_pinch_v1 -+ * @section page_iface_zwp_pointer_gesture_pinch_v1_desc Description -+ * -+ * A pinch gesture object notifies a client about a multi-finger pinch -+ * gesture detected on an indirect input device such as a touchpad. -+ * The gesture is usually initiated by multiple fingers moving towards -+ * each other or away from each other, or by two or more fingers rotating -+ * around a logical center of gravity. The precise conditions of when -+ * such a gesture is detected are implementation-dependent. -+ * -+ * A gesture consists of three stages: begin, update (optional) and end. -+ * There cannot be multiple simultaneous hold, pinch or swipe gestures on a -+ * same pointer/seat, how compositors prevent these situations is -+ * implementation-dependent. -+ * -+ * A gesture may be cancelled by the compositor or the hardware. -+ * Clients should not consider performing permanent or irreversible -+ * actions until the end of a gesture has been received. -+ * @section page_iface_zwp_pointer_gesture_pinch_v1_api API -+ * See @ref iface_zwp_pointer_gesture_pinch_v1. -+ */ -+/** -+ * @defgroup iface_zwp_pointer_gesture_pinch_v1 The zwp_pointer_gesture_pinch_v1 -+ * interface -+ * -+ * A pinch gesture object notifies a client about a multi-finger pinch -+ * gesture detected on an indirect input device such as a touchpad. -+ * The gesture is usually initiated by multiple fingers moving towards -+ * each other or away from each other, or by two or more fingers rotating -+ * around a logical center of gravity. The precise conditions of when -+ * such a gesture is detected are implementation-dependent. -+ * -+ * A gesture consists of three stages: begin, update (optional) and end. -+ * There cannot be multiple simultaneous hold, pinch or swipe gestures on a -+ * same pointer/seat, how compositors prevent these situations is -+ * implementation-dependent. -+ * -+ * A gesture may be cancelled by the compositor or the hardware. -+ * Clients should not consider performing permanent or irreversible -+ * actions until the end of a gesture has been received. -+ */ -+extern const struct wl_interface zwp_pointer_gesture_pinch_v1_interface; -+#endif -+#ifndef ZWP_POINTER_GESTURE_HOLD_V1_INTERFACE -+# define ZWP_POINTER_GESTURE_HOLD_V1_INTERFACE -+/** -+ * @page page_iface_zwp_pointer_gesture_hold_v1 zwp_pointer_gesture_hold_v1 -+ * @section page_iface_zwp_pointer_gesture_hold_v1_desc Description -+ * -+ * A hold gesture object notifies a client about a single- or -+ * multi-finger hold gesture detected on an indirect input device such as -+ * a touchpad. The gesture is usually initiated by one or more fingers -+ * being held down without significant movement. The precise conditions -+ * of when such a gesture is detected are implementation-dependent. -+ * -+ * In particular, this gesture may be used to cancel kinetic scrolling. -+ * -+ * A hold gesture consists of two stages: begin and end. Unlike pinch and -+ * swipe there is no update stage. -+ * There cannot be multiple simultaneous hold, pinch or swipe gestures on a -+ * same pointer/seat, how compositors prevent these situations is -+ * implementation-dependent. -+ * -+ * A gesture may be cancelled by the compositor or the hardware. -+ * Clients should not consider performing permanent or irreversible -+ * actions until the end of a gesture has been received. -+ * @section page_iface_zwp_pointer_gesture_hold_v1_api API -+ * See @ref iface_zwp_pointer_gesture_hold_v1. -+ */ -+/** -+ * @defgroup iface_zwp_pointer_gesture_hold_v1 The zwp_pointer_gesture_hold_v1 -+ * interface -+ * -+ * A hold gesture object notifies a client about a single- or -+ * multi-finger hold gesture detected on an indirect input device such as -+ * a touchpad. The gesture is usually initiated by one or more fingers -+ * being held down without significant movement. The precise conditions -+ * of when such a gesture is detected are implementation-dependent. -+ * -+ * In particular, this gesture may be used to cancel kinetic scrolling. -+ * -+ * A hold gesture consists of two stages: begin and end. Unlike pinch and -+ * swipe there is no update stage. -+ * There cannot be multiple simultaneous hold, pinch or swipe gestures on a -+ * same pointer/seat, how compositors prevent these situations is -+ * implementation-dependent. -+ * -+ * A gesture may be cancelled by the compositor or the hardware. -+ * Clients should not consider performing permanent or irreversible -+ * actions until the end of a gesture has been received. -+ */ -+extern const struct wl_interface zwp_pointer_gesture_hold_v1_interface; -+#endif -+ -+#define ZWP_POINTER_GESTURES_V1_GET_SWIPE_GESTURE 0 -+#define ZWP_POINTER_GESTURES_V1_GET_PINCH_GESTURE 1 -+#define ZWP_POINTER_GESTURES_V1_RELEASE 2 -+#define ZWP_POINTER_GESTURES_V1_GET_HOLD_GESTURE 3 -+ -+/** -+ * @ingroup iface_zwp_pointer_gestures_v1 -+ */ -+#define ZWP_POINTER_GESTURES_V1_GET_SWIPE_GESTURE_SINCE_VERSION 1 -+/** -+ * @ingroup iface_zwp_pointer_gestures_v1 -+ */ -+#define ZWP_POINTER_GESTURES_V1_GET_PINCH_GESTURE_SINCE_VERSION 1 -+/** -+ * @ingroup iface_zwp_pointer_gestures_v1 -+ */ -+#define ZWP_POINTER_GESTURES_V1_RELEASE_SINCE_VERSION 2 -+/** -+ * @ingroup iface_zwp_pointer_gestures_v1 -+ */ -+#define ZWP_POINTER_GESTURES_V1_GET_HOLD_GESTURE_SINCE_VERSION 3 -+ -+/** @ingroup iface_zwp_pointer_gestures_v1 */ -+static inline void zwp_pointer_gestures_v1_set_user_data( -+ struct zwp_pointer_gestures_v1* zwp_pointer_gestures_v1, void* user_data) { -+ wl_proxy_set_user_data((struct wl_proxy*)zwp_pointer_gestures_v1, user_data); -+} -+ -+/** @ingroup iface_zwp_pointer_gestures_v1 */ -+static inline void* zwp_pointer_gestures_v1_get_user_data( -+ struct zwp_pointer_gestures_v1* zwp_pointer_gestures_v1) { -+ return wl_proxy_get_user_data((struct wl_proxy*)zwp_pointer_gestures_v1); -+} -+ -+static inline uint32_t zwp_pointer_gestures_v1_get_version( -+ struct zwp_pointer_gestures_v1* zwp_pointer_gestures_v1) { -+ return wl_proxy_get_version((struct wl_proxy*)zwp_pointer_gestures_v1); -+} -+ -+/** @ingroup iface_zwp_pointer_gestures_v1 */ -+static inline void zwp_pointer_gestures_v1_destroy( -+ struct zwp_pointer_gestures_v1* zwp_pointer_gestures_v1) { -+ wl_proxy_destroy((struct wl_proxy*)zwp_pointer_gestures_v1); -+} -+ -+/** -+ * @ingroup iface_zwp_pointer_gestures_v1 -+ * -+ * Create a swipe gesture object. See the -+ * wl_pointer_gesture_swipe interface for details. -+ */ -+static inline struct zwp_pointer_gesture_swipe_v1* -+zwp_pointer_gestures_v1_get_swipe_gesture( -+ struct zwp_pointer_gestures_v1* zwp_pointer_gestures_v1, -+ struct wl_pointer* pointer) { -+ struct wl_proxy* id; -+ -+ id = wl_proxy_marshal_flags( -+ (struct wl_proxy*)zwp_pointer_gestures_v1, -+ ZWP_POINTER_GESTURES_V1_GET_SWIPE_GESTURE, -+ &zwp_pointer_gesture_swipe_v1_interface, -+ wl_proxy_get_version((struct wl_proxy*)zwp_pointer_gestures_v1), 0, NULL, -+ pointer); -+ -+ return (struct zwp_pointer_gesture_swipe_v1*)id; -+} -+ -+/** -+ * @ingroup iface_zwp_pointer_gestures_v1 -+ * -+ * Create a pinch gesture object. See the -+ * wl_pointer_gesture_pinch interface for details. -+ */ -+static inline struct zwp_pointer_gesture_pinch_v1* -+zwp_pointer_gestures_v1_get_pinch_gesture( -+ struct zwp_pointer_gestures_v1* zwp_pointer_gestures_v1, -+ struct wl_pointer* pointer) { -+ struct wl_proxy* id; -+ -+ id = wl_proxy_marshal_flags( -+ (struct wl_proxy*)zwp_pointer_gestures_v1, -+ ZWP_POINTER_GESTURES_V1_GET_PINCH_GESTURE, -+ &zwp_pointer_gesture_pinch_v1_interface, -+ wl_proxy_get_version((struct wl_proxy*)zwp_pointer_gestures_v1), 0, NULL, -+ pointer); -+ -+ return (struct zwp_pointer_gesture_pinch_v1*)id; -+} -+ -+/** -+ * @ingroup iface_zwp_pointer_gestures_v1 -+ * -+ * Destroy the pointer gesture object. Swipe, pinch and hold objects -+ * created via this gesture object remain valid. -+ */ -+static inline void zwp_pointer_gestures_v1_release( -+ struct zwp_pointer_gestures_v1* zwp_pointer_gestures_v1) { -+ wl_proxy_marshal_flags( -+ (struct wl_proxy*)zwp_pointer_gestures_v1, -+ ZWP_POINTER_GESTURES_V1_RELEASE, NULL, -+ wl_proxy_get_version((struct wl_proxy*)zwp_pointer_gestures_v1), -+ WL_MARSHAL_FLAG_DESTROY); -+} -+ -+/** -+ * @ingroup iface_zwp_pointer_gestures_v1 -+ * -+ * Create a hold gesture object. See the -+ * wl_pointer_gesture_hold interface for details. -+ */ -+static inline struct zwp_pointer_gesture_hold_v1* -+zwp_pointer_gestures_v1_get_hold_gesture( -+ struct zwp_pointer_gestures_v1* zwp_pointer_gestures_v1, -+ struct wl_pointer* pointer) { -+ struct wl_proxy* id; -+ -+ id = wl_proxy_marshal_flags( -+ (struct wl_proxy*)zwp_pointer_gestures_v1, -+ ZWP_POINTER_GESTURES_V1_GET_HOLD_GESTURE, -+ &zwp_pointer_gesture_hold_v1_interface, -+ wl_proxy_get_version((struct wl_proxy*)zwp_pointer_gestures_v1), 0, NULL, -+ pointer); -+ -+ return (struct zwp_pointer_gesture_hold_v1*)id; -+} -+ -+/** -+ * @ingroup iface_zwp_pointer_gesture_swipe_v1 -+ * @struct zwp_pointer_gesture_swipe_v1_listener -+ */ -+struct zwp_pointer_gesture_swipe_v1_listener { -+ /** -+ * multi-finger swipe begin -+ * -+ * This event is sent when a multi-finger swipe gesture is -+ * detected on the device. -+ * @param time timestamp with millisecond granularity -+ * @param fingers number of fingers -+ */ -+ void (*begin)( -+ void* data, -+ struct zwp_pointer_gesture_swipe_v1* zwp_pointer_gesture_swipe_v1, -+ uint32_t serial, uint32_t time, struct wl_surface* surface, -+ uint32_t fingers); -+ /** -+ * multi-finger swipe motion -+ * -+ * This event is sent when a multi-finger swipe gesture changes -+ * the position of the logical center. -+ * -+ * The dx and dy coordinates are relative coordinates of the -+ * logical center of the gesture compared to the previous event. -+ * @param time timestamp with millisecond granularity -+ * @param dx delta x coordinate in surface coordinate space -+ * @param dy delta y coordinate in surface coordinate space -+ */ -+ void (*update)( -+ void* data, -+ struct zwp_pointer_gesture_swipe_v1* zwp_pointer_gesture_swipe_v1, -+ uint32_t time, wl_fixed_t dx, wl_fixed_t dy); -+ /** -+ * multi-finger swipe end -+ * -+ * This event is sent when a multi-finger swipe gesture ceases to -+ * be valid. This may happen when one or more fingers are lifted or -+ * the gesture is cancelled. -+ * -+ * When a gesture is cancelled, the client should undo state -+ * changes caused by this gesture. What causes a gesture to be -+ * cancelled is implementation-dependent. -+ * @param time timestamp with millisecond granularity -+ * @param cancelled 1 if the gesture was cancelled, 0 otherwise -+ */ -+ void (*end)(void* data, -+ struct zwp_pointer_gesture_swipe_v1* zwp_pointer_gesture_swipe_v1, -+ uint32_t serial, uint32_t time, int32_t cancelled); -+}; -+ -+/** -+ * @ingroup iface_zwp_pointer_gesture_swipe_v1 -+ */ -+static inline int zwp_pointer_gesture_swipe_v1_add_listener( -+ struct zwp_pointer_gesture_swipe_v1* zwp_pointer_gesture_swipe_v1, -+ const struct zwp_pointer_gesture_swipe_v1_listener* listener, void* data) { -+ return wl_proxy_add_listener((struct wl_proxy*)zwp_pointer_gesture_swipe_v1, -+ (void (**)(void))listener, data); -+} -+ -+#define ZWP_POINTER_GESTURE_SWIPE_V1_DESTROY 0 -+ -+/** -+ * @ingroup iface_zwp_pointer_gesture_swipe_v1 -+ */ -+#define ZWP_POINTER_GESTURE_SWIPE_V1_BEGIN_SINCE_VERSION 1 -+/** -+ * @ingroup iface_zwp_pointer_gesture_swipe_v1 -+ */ -+#define ZWP_POINTER_GESTURE_SWIPE_V1_UPDATE_SINCE_VERSION 1 -+/** -+ * @ingroup iface_zwp_pointer_gesture_swipe_v1 -+ */ -+#define ZWP_POINTER_GESTURE_SWIPE_V1_END_SINCE_VERSION 1 -+ -+/** -+ * @ingroup iface_zwp_pointer_gesture_swipe_v1 -+ */ -+#define ZWP_POINTER_GESTURE_SWIPE_V1_DESTROY_SINCE_VERSION 1 -+ -+/** @ingroup iface_zwp_pointer_gesture_swipe_v1 */ -+static inline void zwp_pointer_gesture_swipe_v1_set_user_data( -+ struct zwp_pointer_gesture_swipe_v1* zwp_pointer_gesture_swipe_v1, -+ void* user_data) { -+ wl_proxy_set_user_data((struct wl_proxy*)zwp_pointer_gesture_swipe_v1, -+ user_data); -+} -+ -+/** @ingroup iface_zwp_pointer_gesture_swipe_v1 */ -+static inline void* zwp_pointer_gesture_swipe_v1_get_user_data( -+ struct zwp_pointer_gesture_swipe_v1* zwp_pointer_gesture_swipe_v1) { -+ return wl_proxy_get_user_data((struct wl_proxy*)zwp_pointer_gesture_swipe_v1); -+} -+ -+static inline uint32_t zwp_pointer_gesture_swipe_v1_get_version( -+ struct zwp_pointer_gesture_swipe_v1* zwp_pointer_gesture_swipe_v1) { -+ return wl_proxy_get_version((struct wl_proxy*)zwp_pointer_gesture_swipe_v1); -+} -+ -+/** -+ * @ingroup iface_zwp_pointer_gesture_swipe_v1 -+ */ -+static inline void zwp_pointer_gesture_swipe_v1_destroy( -+ struct zwp_pointer_gesture_swipe_v1* zwp_pointer_gesture_swipe_v1) { -+ wl_proxy_marshal_flags( -+ (struct wl_proxy*)zwp_pointer_gesture_swipe_v1, -+ ZWP_POINTER_GESTURE_SWIPE_V1_DESTROY, NULL, -+ wl_proxy_get_version((struct wl_proxy*)zwp_pointer_gesture_swipe_v1), -+ WL_MARSHAL_FLAG_DESTROY); -+} -+ -+/** -+ * @ingroup iface_zwp_pointer_gesture_pinch_v1 -+ * @struct zwp_pointer_gesture_pinch_v1_listener -+ */ -+struct zwp_pointer_gesture_pinch_v1_listener { -+ /** -+ * multi-finger pinch begin -+ * -+ * This event is sent when a multi-finger pinch gesture is -+ * detected on the device. -+ * @param time timestamp with millisecond granularity -+ * @param fingers number of fingers -+ */ -+ void (*begin)( -+ void* data, -+ struct zwp_pointer_gesture_pinch_v1* zwp_pointer_gesture_pinch_v1, -+ uint32_t serial, uint32_t time, struct wl_surface* surface, -+ uint32_t fingers); -+ /** -+ * multi-finger pinch motion -+ * -+ * This event is sent when a multi-finger pinch gesture changes -+ * the position of the logical center, the rotation or the relative -+ * scale. -+ * -+ * The dx and dy coordinates are relative coordinates in the -+ * surface coordinate space of the logical center of the gesture. -+ * -+ * The scale factor is an absolute scale compared to the -+ * pointer_gesture_pinch.begin event, e.g. a scale of 2 means the -+ * fingers are now twice as far apart as on -+ * pointer_gesture_pinch.begin. -+ * -+ * The rotation is the relative angle in degrees clockwise compared -+ * to the previous pointer_gesture_pinch.begin or -+ * pointer_gesture_pinch.update event. -+ * @param time timestamp with millisecond granularity -+ * @param dx delta x coordinate in surface coordinate space -+ * @param dy delta y coordinate in surface coordinate space -+ * @param scale scale relative to the initial finger position -+ * @param rotation angle in degrees cw relative to the previous event -+ */ -+ void (*update)( -+ void* data, -+ struct zwp_pointer_gesture_pinch_v1* zwp_pointer_gesture_pinch_v1, -+ uint32_t time, wl_fixed_t dx, wl_fixed_t dy, wl_fixed_t scale, -+ wl_fixed_t rotation); -+ /** -+ * multi-finger pinch end -+ * -+ * This event is sent when a multi-finger pinch gesture ceases to -+ * be valid. This may happen when one or more fingers are lifted or -+ * the gesture is cancelled. -+ * -+ * When a gesture is cancelled, the client should undo state -+ * changes caused by this gesture. What causes a gesture to be -+ * cancelled is implementation-dependent. -+ * @param time timestamp with millisecond granularity -+ * @param cancelled 1 if the gesture was cancelled, 0 otherwise -+ */ -+ void (*end)(void* data, -+ struct zwp_pointer_gesture_pinch_v1* zwp_pointer_gesture_pinch_v1, -+ uint32_t serial, uint32_t time, int32_t cancelled); -+}; -+ -+/** -+ * @ingroup iface_zwp_pointer_gesture_pinch_v1 -+ */ -+static inline int zwp_pointer_gesture_pinch_v1_add_listener( -+ struct zwp_pointer_gesture_pinch_v1* zwp_pointer_gesture_pinch_v1, -+ const struct zwp_pointer_gesture_pinch_v1_listener* listener, void* data) { -+ return wl_proxy_add_listener((struct wl_proxy*)zwp_pointer_gesture_pinch_v1, -+ (void (**)(void))listener, data); -+} -+ -+#define ZWP_POINTER_GESTURE_PINCH_V1_DESTROY 0 -+ -+/** -+ * @ingroup iface_zwp_pointer_gesture_pinch_v1 -+ */ -+#define ZWP_POINTER_GESTURE_PINCH_V1_BEGIN_SINCE_VERSION 1 -+/** -+ * @ingroup iface_zwp_pointer_gesture_pinch_v1 -+ */ -+#define ZWP_POINTER_GESTURE_PINCH_V1_UPDATE_SINCE_VERSION 1 -+/** -+ * @ingroup iface_zwp_pointer_gesture_pinch_v1 -+ */ -+#define ZWP_POINTER_GESTURE_PINCH_V1_END_SINCE_VERSION 1 -+ -+/** -+ * @ingroup iface_zwp_pointer_gesture_pinch_v1 -+ */ -+#define ZWP_POINTER_GESTURE_PINCH_V1_DESTROY_SINCE_VERSION 1 -+ -+/** @ingroup iface_zwp_pointer_gesture_pinch_v1 */ -+static inline void zwp_pointer_gesture_pinch_v1_set_user_data( -+ struct zwp_pointer_gesture_pinch_v1* zwp_pointer_gesture_pinch_v1, -+ void* user_data) { -+ wl_proxy_set_user_data((struct wl_proxy*)zwp_pointer_gesture_pinch_v1, -+ user_data); -+} -+ -+/** @ingroup iface_zwp_pointer_gesture_pinch_v1 */ -+static inline void* zwp_pointer_gesture_pinch_v1_get_user_data( -+ struct zwp_pointer_gesture_pinch_v1* zwp_pointer_gesture_pinch_v1) { -+ return wl_proxy_get_user_data((struct wl_proxy*)zwp_pointer_gesture_pinch_v1); -+} -+ -+static inline uint32_t zwp_pointer_gesture_pinch_v1_get_version( -+ struct zwp_pointer_gesture_pinch_v1* zwp_pointer_gesture_pinch_v1) { -+ return wl_proxy_get_version((struct wl_proxy*)zwp_pointer_gesture_pinch_v1); -+} -+ -+/** -+ * @ingroup iface_zwp_pointer_gesture_pinch_v1 -+ */ -+static inline void zwp_pointer_gesture_pinch_v1_destroy( -+ struct zwp_pointer_gesture_pinch_v1* zwp_pointer_gesture_pinch_v1) { -+ wl_proxy_marshal_flags( -+ (struct wl_proxy*)zwp_pointer_gesture_pinch_v1, -+ ZWP_POINTER_GESTURE_PINCH_V1_DESTROY, NULL, -+ wl_proxy_get_version((struct wl_proxy*)zwp_pointer_gesture_pinch_v1), -+ WL_MARSHAL_FLAG_DESTROY); -+} -+ -+/** -+ * @ingroup iface_zwp_pointer_gesture_hold_v1 -+ * @struct zwp_pointer_gesture_hold_v1_listener -+ */ -+struct zwp_pointer_gesture_hold_v1_listener { -+ /** -+ * multi-finger hold begin -+ * -+ * This event is sent when a hold gesture is detected on the -+ * device. -+ * @param time timestamp with millisecond granularity -+ * @param fingers number of fingers -+ * @since 3 -+ */ -+ void (*begin)(void* data, -+ struct zwp_pointer_gesture_hold_v1* zwp_pointer_gesture_hold_v1, -+ uint32_t serial, uint32_t time, struct wl_surface* surface, -+ uint32_t fingers); -+ /** -+ * multi-finger hold end -+ * -+ * This event is sent when a hold gesture ceases to be valid. -+ * This may happen when the holding fingers are lifted or the -+ * gesture is cancelled, for example if the fingers move past an -+ * implementation-defined threshold, the finger count changes or -+ * the hold gesture changes into a different type of gesture. -+ * -+ * When a gesture is cancelled, the client may need to undo state -+ * changes caused by this gesture. What causes a gesture to be -+ * cancelled is implementation-dependent. -+ * @param time timestamp with millisecond granularity -+ * @param cancelled 1 if the gesture was cancelled, 0 otherwise -+ * @since 3 -+ */ -+ void (*end)(void* data, -+ struct zwp_pointer_gesture_hold_v1* zwp_pointer_gesture_hold_v1, -+ uint32_t serial, uint32_t time, int32_t cancelled); -+}; -+ -+/** -+ * @ingroup iface_zwp_pointer_gesture_hold_v1 -+ */ -+static inline int zwp_pointer_gesture_hold_v1_add_listener( -+ struct zwp_pointer_gesture_hold_v1* zwp_pointer_gesture_hold_v1, -+ const struct zwp_pointer_gesture_hold_v1_listener* listener, void* data) { -+ return wl_proxy_add_listener((struct wl_proxy*)zwp_pointer_gesture_hold_v1, -+ (void (**)(void))listener, data); -+} -+ -+#define ZWP_POINTER_GESTURE_HOLD_V1_DESTROY 0 -+ -+/** -+ * @ingroup iface_zwp_pointer_gesture_hold_v1 -+ */ -+#define ZWP_POINTER_GESTURE_HOLD_V1_BEGIN_SINCE_VERSION 3 -+/** -+ * @ingroup iface_zwp_pointer_gesture_hold_v1 -+ */ -+#define ZWP_POINTER_GESTURE_HOLD_V1_END_SINCE_VERSION 3 -+ -+/** -+ * @ingroup iface_zwp_pointer_gesture_hold_v1 -+ */ -+#define ZWP_POINTER_GESTURE_HOLD_V1_DESTROY_SINCE_VERSION 3 -+ -+/** @ingroup iface_zwp_pointer_gesture_hold_v1 */ -+static inline void zwp_pointer_gesture_hold_v1_set_user_data( -+ struct zwp_pointer_gesture_hold_v1* zwp_pointer_gesture_hold_v1, -+ void* user_data) { -+ wl_proxy_set_user_data((struct wl_proxy*)zwp_pointer_gesture_hold_v1, -+ user_data); -+} -+ -+/** @ingroup iface_zwp_pointer_gesture_hold_v1 */ -+static inline void* zwp_pointer_gesture_hold_v1_get_user_data( -+ struct zwp_pointer_gesture_hold_v1* zwp_pointer_gesture_hold_v1) { -+ return wl_proxy_get_user_data((struct wl_proxy*)zwp_pointer_gesture_hold_v1); -+} -+ -+static inline uint32_t zwp_pointer_gesture_hold_v1_get_version( -+ struct zwp_pointer_gesture_hold_v1* zwp_pointer_gesture_hold_v1) { -+ return wl_proxy_get_version((struct wl_proxy*)zwp_pointer_gesture_hold_v1); -+} -+ -+/** -+ * @ingroup iface_zwp_pointer_gesture_hold_v1 -+ */ -+static inline void zwp_pointer_gesture_hold_v1_destroy( -+ struct zwp_pointer_gesture_hold_v1* zwp_pointer_gesture_hold_v1) { -+ wl_proxy_marshal_flags( -+ (struct wl_proxy*)zwp_pointer_gesture_hold_v1, -+ ZWP_POINTER_GESTURE_HOLD_V1_DESTROY, NULL, -+ wl_proxy_get_version((struct wl_proxy*)zwp_pointer_gesture_hold_v1), -+ WL_MARSHAL_FLAG_DESTROY); -+} -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif -diff --git a/widget/gtk/wayland/pointer-gestures-unstable-v1-protocol.c b/widget/gtk/wayland/pointer-gestures-unstable-v1-protocol.c -new file mode 100644 ---- /dev/null -+++ b/widget/gtk/wayland/pointer-gestures-unstable-v1-protocol.c -@@ -0,0 +1,112 @@ -+/* Generated by wayland-scanner 1.22.0 */ -+ -+#include -+#include -+#include "wayland-util.h" -+ -+#ifndef __has_attribute -+# define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */ -+#endif -+ -+#if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4) -+# define WL_PRIVATE __attribute__((visibility("hidden"))) -+#else -+# define WL_PRIVATE -+#endif -+ -+#pragma GCC visibility push(default) -+extern const struct wl_interface wl_pointer_interface; -+extern const struct wl_interface wl_surface_interface; -+#pragma GCC visibility pop -+extern const struct wl_interface zwp_pointer_gesture_hold_v1_interface; -+extern const struct wl_interface zwp_pointer_gesture_pinch_v1_interface; -+extern const struct wl_interface zwp_pointer_gesture_swipe_v1_interface; -+ -+static const struct wl_interface* pointer_gestures_unstable_v1_types[] = { -+ NULL, -+ NULL, -+ NULL, -+ NULL, -+ NULL, -+ &zwp_pointer_gesture_swipe_v1_interface, -+ &wl_pointer_interface, -+ &zwp_pointer_gesture_pinch_v1_interface, -+ &wl_pointer_interface, -+ &zwp_pointer_gesture_hold_v1_interface, -+ &wl_pointer_interface, -+ NULL, -+ NULL, -+ &wl_surface_interface, -+ NULL, -+ NULL, -+ NULL, -+ &wl_surface_interface, -+ NULL, -+ NULL, -+ NULL, -+ &wl_surface_interface, -+ NULL, -+}; -+ -+static const struct wl_message zwp_pointer_gestures_v1_requests[] = { -+ {"get_swipe_gesture", "no", pointer_gestures_unstable_v1_types + 5}, -+ {"get_pinch_gesture", "no", pointer_gestures_unstable_v1_types + 7}, -+ {"release", "2", pointer_gestures_unstable_v1_types + 0}, -+ {"get_hold_gesture", "3no", pointer_gestures_unstable_v1_types + 9}, -+}; -+ -+WL_PRIVATE const struct wl_interface zwp_pointer_gestures_v1_interface = { -+ "zwp_pointer_gestures_v1", 3, 4, zwp_pointer_gestures_v1_requests, 0, NULL, -+}; -+ -+static const struct wl_message zwp_pointer_gesture_swipe_v1_requests[] = { -+ {"destroy", "", pointer_gestures_unstable_v1_types + 0}, -+}; -+ -+static const struct wl_message zwp_pointer_gesture_swipe_v1_events[] = { -+ {"begin", "uuou", pointer_gestures_unstable_v1_types + 11}, -+ {"update", "uff", pointer_gestures_unstable_v1_types + 0}, -+ {"end", "uui", pointer_gestures_unstable_v1_types + 0}, -+}; -+ -+WL_PRIVATE const struct wl_interface zwp_pointer_gesture_swipe_v1_interface = { -+ "zwp_pointer_gesture_swipe_v1", -+ 2, -+ 1, -+ zwp_pointer_gesture_swipe_v1_requests, -+ 3, -+ zwp_pointer_gesture_swipe_v1_events, -+}; -+ -+static const struct wl_message zwp_pointer_gesture_pinch_v1_requests[] = { -+ {"destroy", "", pointer_gestures_unstable_v1_types + 0}, -+}; -+ -+static const struct wl_message zwp_pointer_gesture_pinch_v1_events[] = { -+ {"begin", "uuou", pointer_gestures_unstable_v1_types + 15}, -+ {"update", "uffff", pointer_gestures_unstable_v1_types + 0}, -+ {"end", "uui", pointer_gestures_unstable_v1_types + 0}, -+}; -+ -+WL_PRIVATE const struct wl_interface zwp_pointer_gesture_pinch_v1_interface = { -+ "zwp_pointer_gesture_pinch_v1", -+ 2, -+ 1, -+ zwp_pointer_gesture_pinch_v1_requests, -+ 3, -+ zwp_pointer_gesture_pinch_v1_events, -+}; -+ -+static const struct wl_message zwp_pointer_gesture_hold_v1_requests[] = { -+ {"destroy", "3", pointer_gestures_unstable_v1_types + 0}, -+}; -+ -+static const struct wl_message zwp_pointer_gesture_hold_v1_events[] = { -+ {"begin", "3uuou", pointer_gestures_unstable_v1_types + 19}, -+ {"end", "3uui", pointer_gestures_unstable_v1_types + 0}, -+}; -+ -+WL_PRIVATE const struct wl_interface zwp_pointer_gesture_hold_v1_interface = { -+ "zwp_pointer_gesture_hold_v1", 3, 1, -+ zwp_pointer_gesture_hold_v1_requests, 2, zwp_pointer_gesture_hold_v1_events, -+}; - diff --git a/D244990.1744916693.diff b/D244990.1744916693.diff deleted file mode 100644 index 1582cab..0000000 --- a/D244990.1744916693.diff +++ /dev/null @@ -1,153 +0,0 @@ -diff --git a/widget/gtk/WaylandVsyncSource.h b/widget/gtk/WaylandVsyncSource.h ---- a/widget/gtk/WaylandVsyncSource.h -+++ b/widget/gtk/WaylandVsyncSource.h -@@ -47,13 +47,10 @@ - explicit WaylandVsyncSource(nsWindow* aWindow); - virtual ~WaylandVsyncSource(); - - static Maybe GetFastestVsyncRate(); - -- void EnableVSyncSource(); -- void DisableVSyncSource(); -- - // Regular VSync callback. Runs for visible windows only. - // aTime = 0 means emulated frame and use current time. - void VisibleWindowCallback(uint32_t aTime = 0); - - // Idle callback for hidden windows. -@@ -67,10 +64,15 @@ - void EnableVsync() override; - void DisableVsync() override; - bool IsVsyncEnabled() override; - void Shutdown() override; - -+ // Enable/Disable this particular VSync source. Called from widget code -+ // if we know that nsWindow become visible/hidden. -+ void EnableVSyncSource(); -+ void DisableVSyncSource(); -+ - // We addref/unref this during init so we should not - // call it from constructor. - void Init(); - - private: -@@ -80,10 +82,12 @@ - TimeStamp aVsyncTimestamp); - void* GetWindowForLogging() { return mWindow; }; - - void SetHiddenWindowVSync(); - -+ void SetVSyncEventsLocked(const MutexAutoLock& aProofOfLock, bool aEnabled); -+ - Mutex mMutex; - - // Main thread only, except for logging. - RefPtr mWindow; - RefPtr mWaylandSurface MOZ_GUARDED_BY(mMutex); -diff --git a/widget/gtk/WaylandVsyncSource.cpp b/widget/gtk/WaylandVsyncSource.cpp ---- a/widget/gtk/WaylandVsyncSource.cpp -+++ b/widget/gtk/WaylandVsyncSource.cpp -@@ -139,28 +139,66 @@ - }, - this); - } - } - -+void WaylandVsyncSource::SetVSyncEventsLocked(const MutexAutoLock& aProofOfLock, -+ bool aEnabled) { -+ MOZ_DIAGNOSTIC_ASSERT(NS_IsMainThread()); -+ mMutex.AssertCurrentThreadOwns(); -+ if (aEnabled) { -+ mLastVsyncTimeStamp = TimeStamp::Now(); -+ } else { -+ MozClearHandleID(mHiddenWindowTimerID, g_source_remove); -+ } -+ mWaylandSurface->SetFrameCallbackState(aEnabled); -+} -+ -+void WaylandVsyncSource::EnableVsync() { -+ MOZ_DIAGNOSTIC_ASSERT(NS_IsMainThread()); -+ MutexAutoLock lock(mMutex); -+ LOG("WaylandVsyncSource::EnableVsync fps %f\n", GetFPS(mVsyncRate)); -+ if (mVsyncEnabled || mIsShutdown) { -+ LOG(" early quit"); -+ return; -+ } -+ mVsyncEnabled = true; -+ SetVSyncEventsLocked(lock, mVsyncEnabled && mVsyncSourceEnabled); -+} -+ -+void WaylandVsyncSource::DisableVsync() { -+ MOZ_DIAGNOSTIC_ASSERT(NS_IsMainThread()); -+ MutexAutoLock lock(mMutex); -+ LOG("WaylandVsyncSource::DisableVsync fps %f\n", GetFPS(mVsyncRate)); -+ if (!mVsyncEnabled || mIsShutdown) { -+ LOG(" early quit"); -+ return; -+ } -+ mVsyncEnabled = false; -+ SetVSyncEventsLocked(lock, mVsyncEnabled && mVsyncSourceEnabled); -+} -+ - void WaylandVsyncSource::EnableVSyncSource() { - MutexAutoLock lock(mMutex); - LOG("WaylandVsyncSource::EnableVSyncSource() WaylandSurface [%p] fps %f", - mWaylandSurface.get(), GetFPS(mVsyncRate)); - mVsyncSourceEnabled = true; - -+ MOZ_DIAGNOSTIC_ASSERT(NS_IsMainThread()); - MOZ_DIAGNOSTIC_ASSERT(mWaylandSurface); -- mWaylandSurface->SetFrameCallbackState(mVsyncEnabled && mVsyncSourceEnabled); -+ SetVSyncEventsLocked(lock, mVsyncEnabled && mVsyncSourceEnabled); - } - - void WaylandVsyncSource::DisableVSyncSource() { - MutexAutoLock lock(mMutex); - LOG("WaylandVsyncSource::DisableVSyncSource() WaylandSurface [%p]", - mWaylandSurface.get()); - mVsyncSourceEnabled = false; - -+ MOZ_DIAGNOSTIC_ASSERT(NS_IsMainThread()); - MOZ_DIAGNOSTIC_ASSERT(mWaylandSurface); -- mWaylandSurface->SetFrameCallbackState(mVsyncEnabled && mVsyncSourceEnabled); -+ SetVSyncEventsLocked(lock, mVsyncEnabled && mVsyncSourceEnabled); - } - - bool WaylandVsyncSource::HiddenWindowCallback() { - MOZ_DIAGNOSTIC_ASSERT(NS_IsMainThread()); - -@@ -299,33 +337,10 @@ - } - - LOG(" new fps %f correction %f\n", GetFPS(mVsyncRate), correction); - } - --void WaylandVsyncSource::EnableVsync() { -- MOZ_ASSERT(NS_IsMainThread()); -- MutexAutoLock lock(mMutex); -- LOG("WaylandVsyncSource::EnableVsync fps %f\n", GetFPS(mVsyncRate)); -- if (mVsyncEnabled || mIsShutdown) { -- LOG(" early quit"); -- return; -- } -- mVsyncEnabled = true; -- mWaylandSurface->SetFrameCallbackState(mVsyncEnabled && mVsyncSourceEnabled); --} -- --void WaylandVsyncSource::DisableVsync() { -- MutexAutoLock lock(mMutex); -- LOG("WaylandVsyncSource::DisableVsync fps %f\n", GetFPS(mVsyncRate)); -- if (!mVsyncEnabled || mIsShutdown) { -- LOG(" early quit"); -- return; -- } -- mVsyncEnabled = false; -- mWaylandSurface->SetFrameCallbackState(mVsyncEnabled && mVsyncSourceEnabled); --} -- - bool WaylandVsyncSource::IsVsyncEnabled() { - MutexAutoLock lock(mMutex); - return mVsyncEnabled && mWaylandSurface; - } - - diff --git a/bmo-1559213-Support-system-av1.patch b/bmo-1559213-Support-system-av1.patch deleted file mode 100644 index 1d50290..0000000 --- a/bmo-1559213-Support-system-av1.patch +++ /dev/null @@ -1,91 +0,0 @@ -diff -up firefox-122.0/config/external/moz.build.system-av1 firefox-122.0/config/external/moz.build ---- firefox-122.0/config/external/moz.build.system-av1 2024-01-18 21:41:20.000000000 +0100 -+++ firefox-122.0/config/external/moz.build 2024-01-19 18:27:03.512034790 +0100 -@@ -40,8 +40,9 @@ if not CONFIG["MOZ_SYSTEM_LIBVPX"]: - external_dirs += ["media/libvpx"] - - if CONFIG["MOZ_AV1"]: -- external_dirs += ["media/libaom"] -- external_dirs += ["media/libdav1d"] -+ if not CONFIG["MOZ_SYSTEM_AV1"]: -+ external_dirs += ["media/libaom"] -+ external_dirs += ["media/libdav1d"] - - if not CONFIG["MOZ_SYSTEM_PNG"]: - external_dirs += ["media/libpng"] -diff -up firefox-122.0/config/system-headers.mozbuild.system-av1 firefox-122.0/config/system-headers.mozbuild ---- firefox-122.0/config/system-headers.mozbuild.system-av1 2024-01-19 18:27:03.513034826 +0100 -+++ firefox-122.0/config/system-headers.mozbuild 2024-01-19 19:02:54.515493457 +0100 -@@ -1304,6 +1304,14 @@ if CONFIG["MOZ_ENABLE_LIBPROXY"]: - "proxy.h", - ] - -+if CONFIG['MOZ_SYSTEM_AV1']: -+ system_headers += [ -+ 'aom/aom_decoder.h', -+ 'aom/aomdx.h', -+ 'aom/aom_image.h', -+ 'dav1d/dav1d.h', -+ ] -+ - if CONFIG["MOZ_SYSTEM_ICU"]: - system_headers += [ - "unicode/calendar.h", -diff -up firefox-122.0/dom/media/platforms/moz.build.system-av1 firefox-122.0/dom/media/platforms/moz.build ---- firefox-122.0/dom/media/platforms/moz.build.system-av1 2024-01-18 21:41:21.000000000 +0100 -+++ firefox-122.0/dom/media/platforms/moz.build 2024-01-19 18:27:03.513034826 +0100 -@@ -81,6 +81,11 @@ if CONFIG["MOZ_AV1"]: - "agnostic/AOMDecoder.cpp", - "agnostic/DAV1DDecoder.cpp", - ] -+ if CONFIG["MOZ_SYSTEM_AV1"]: -+ CXXFLAGS += CONFIG["MOZ_SYSTEM_LIBAOM_CFLAGS"] -+ OS_LIBS += CONFIG["MOZ_SYSTEM_LIBAOM_LIBS"] -+ CXXFLAGS += CONFIG["MOZ_SYSTEM_LIBDAV1D_CFLAGS"] -+ OS_LIBS += CONFIG["MOZ_SYSTEM_LIBDAV1D_LIBS"] - - if CONFIG["MOZ_OMX"]: - EXPORTS += [ -diff -up firefox-122.0/toolkit/moz.configure.system-av1 firefox-122.0/toolkit/moz.configure ---- firefox-122.0/toolkit/moz.configure.system-av1 2024-01-19 18:27:03.495034173 +0100 -+++ firefox-122.0/toolkit/moz.configure 2024-01-19 18:27:03.514034863 +0100 -@@ -743,14 +743,29 @@ def av1(value): - if value: - return True - -+option("--with-system-av1", help="Use system av1 (located with pkg-config)") - --@depends(target, when=av1 & compile_environment) -+system_libaom_info = pkg_check_modules('MOZ_SYSTEM_LIBAOM', 'aom >= 1.0.0', -+ when='--with-system-av1') -+ -+system_libdav1d_info = pkg_check_modules('MOZ_SYSTEM_LIBDAV1D', 'dav1d >= 0.1.1', -+ when='--with-system-av1') -+ -+@depends(system_libaom_info, system_libdav1d_info) -+def system_av1(system_libaom_info, system_libdav1d_info): -+ has_av1_libs = False -+ if system_libaom_info and system_libdav1d_info: -+ has_av1_libs = True -+ return has_av1_libs -+ -+ -+@depends(target, when=av1 & depends(system_av1)(lambda v: not v) & compile_environment) - def dav1d_asm(target): - if target.cpu in ("aarch64", "x86", "x86_64"): - return True - - --@depends(target, when=av1 & compile_environment) -+@depends(target, when=av1 & depends(system_av1)(lambda v: not v) & compile_environment) - def dav1d_nasm(target): - if target.cpu in ("x86", "x86_64"): - return namespace(version="2.14", what="AV1") -@@ -760,6 +775,7 @@ set_config("MOZ_DAV1D_ASM", dav1d_asm) - set_define("MOZ_DAV1D_ASM", dav1d_asm) - set_config("MOZ_AV1", av1) - set_define("MOZ_AV1", av1) -+set_config("MOZ_SYSTEM_AV1", depends_if(system_av1)(lambda _: True)) - - # JXL Image Codec Support - # ============================================================== diff --git a/bmo-1559213-fix-system-av1-libs.patch b/bmo-1559213-fix-system-av1-libs.patch deleted file mode 100644 index d687e8f..0000000 --- a/bmo-1559213-fix-system-av1-libs.patch +++ /dev/null @@ -1,22 +0,0 @@ -diff -Naur a/media/ffvpx/libavcodec/moz.build b/media/ffvpx/libavcodec/moz.build ---- a/media/ffvpx/libavcodec/moz.build 2023-08-01 09:34:20.242044722 +0300 -+++ b/media/ffvpx/libavcodec/moz.build 2023-08-01 09:36:01.445808739 +0300 -@@ -109,10 +109,14 @@ - 'vp9recon.c', - 'vpx_rac.c', - ] -- USE_LIBS += [ -- 'dav1d', -- 'media_libdav1d_asm', -- ] -+ if CONFIG["MOZ_SYSTEM_AV1"]: -+ CFLAGS += CONFIG['MOZ_SYSTEM_LIBDAV1D_CFLAGS'] -+ OS_LIBS += CONFIG['MOZ_SYSTEM_LIBDAV1D_LIBS'] -+ else: -+ USE_LIBS += [ -+ 'dav1d', -+ 'media_libdav1d_asm', -+ ] - if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": - LOCAL_INCLUDES += ['/media/mozva'] - SOURCES += [ diff --git a/build-c11-threads-avail.patch b/build-c11-threads-avail.patch new file mode 100644 index 0000000..f627a7b --- /dev/null +++ b/build-c11-threads-avail.patch @@ -0,0 +1,36 @@ +diff -up firefox-146.0/third_party/rust/glslopt/glsl-optimizer/include/c11/threads_posix.h.build-c11-threads-avail firefox-146.0/third_party/rust/glslopt/glsl-optimizer/include/c11/threads_posix.h +--- firefox-146.0/third_party/rust/glslopt/glsl-optimizer/include/c11/threads_posix.h.build-c11-threads-avail 2025-12-05 18:43:20.000000000 +0100 ++++ firefox-146.0/third_party/rust/glslopt/glsl-optimizer/include/c11/threads_posix.h 2025-12-11 13:30:50.463371937 +0100 +@@ -66,7 +66,7 @@ typedef pthread_cond_t cnd_t; + typedef pthread_t thrd_t; + typedef pthread_key_t tss_t; + typedef pthread_mutex_t mtx_t; +-typedef pthread_once_t once_flag; ++//typedef pthread_once_t once_flag; + + + /* +@@ -90,12 +90,13 @@ impl_thrd_routine(void *p) + + /*--------------- 7.25.2 Initialization functions ---------------*/ + // 7.25.2.1 +-static inline void ++// ++/*static inline void + call_once(once_flag *flag, void (*func)(void)) + { + pthread_once(flag, func); + } +- ++*/ + + /*------------- 7.25.3 Condition variable functions -------------*/ + // 7.25.3.1 +diff -up firefox-147.0/third_party/rust/glslopt/.cargo-checksum.json.backup firefox-147.0/third_party/rust/glslopt/.cargo-checksum.json +--- firefox-147.0/third_party/rust/glslopt/.cargo-checksum.json.backup 2026-01-07 12:48:27.390768071 +0100 ++++ firefox-147.0/third_party/rust/glslopt/.cargo-checksum.json 2026-01-07 12:48:29.538659136 +0100 +@@ -1 +1 @@ +-{"files":{"Cargo.lock":"f7970552595dc803ace9ef19b5f5d7b1fc784aac30cb27b2ebc3002d97122b9d","Cargo.toml":"7c53ee20d848f9913cacbfcb3ab2e89e30deee8d619d173c95130c7c5d065827","README.md":"4468e08c64c19977707d792bfab0080e35ff927b64990eab77873f8ba056ba1c","build.rs":"92e29699487c21389fc823c50b410cfbfc74cc774265d24958489909ee48a076","glsl-optimizer/CMakeLists.txt":"42ce94744e82ffa000da8b64d81fc140e293b9f5da7dd4cf6b49e7404a2448d9","glsl-optimizer/README.md":"b18eef11a92d267d88a937b1154f7670ee433c730b102fdf7e2da0b02722b146","glsl-optimizer/contrib/glslopt/Main.cpp":"14ba213210c62e234b8d9b0052105fed28eedd83d535ebe85acc10bda7322dd4","glsl-optimizer/contrib/glslopt/Readme":"65d2a6f1aa1dc61e903e090cdade027abad33e02e7c9c81e07dc80508acadec4","glsl-optimizer/generateParsers.sh":"878a97db5d3b69eb3b4c3a95780763b373cfcc0c02e0b28894f162dbbd1b8848","glsl-optimizer/include/GL/gl.h":"1989b51365b6d7d0c48ff6e8b181ef75e2cdf71bfb1626b1cc4362e2f54854a3","glsl-optimizer/include/GL/glext.h":"2ac3681045a35a2194a81a960cad395c04bef1c8a20ef46b799fb24af3ec5f70","glsl-optimizer/include/KHR/khrplatform.h":"1448141a0c054d7f46edfb63f4fe6c203acf9591974049481c32442fb03fd6ed","glsl-optimizer/include/c11/threads.h":"56e9e592b28df19f0db432125223cb3eb5c0c1f960c22db96a15692e14776337","glsl-optimizer/include/c11/threads_posix.h":"f8ad2b69fa472e332b50572c1b2dcc1c8a0fa783a1199aad245398d3df421b4b","glsl-optimizer/include/c11/threads_win32.h":"95bf19d7fc14d328a016889afd583e4c49c050a93bcfb114bd2e9130a4532488","glsl-optimizer/include/c11_compat.h":"103fedb48f658d36cb416c9c9e5ea4d70dff181aab551fcb1028107d098ffa3e","glsl-optimizer/include/c99_compat.h":"aafad02f1ea90a7857636913ea21617a0fcd6197256dcfc6dd97bb3410ba892e","glsl-optimizer/include/no_extern_c.h":"40069dbb6dd2843658d442f926e609c7799b9c296046a90b62b570774fd618f5","glsl-optimizer/license.txt":"e26a745226f4a46b3ca00ffbe8be18507362189a2863d04b4f563ba176a9a836","glsl-optimizer/src/compiler/builtin_type_macros.h":"5b4fc4d4da7b07f997b6eb569e37db79fa0735286575ef1fab08d419e76776ff","glsl-optimizer/src/compiler/glsl/README":"e7d408b621c1b605857c4cab63902f615edb06b530142b91ac040808df6e22f7","glsl-optimizer/src/compiler/glsl/TODO":"dd3b7a098e6f9c85ca8c99ce6dea49d65bb75d4cea243b917f29e4ad2c974603","glsl-optimizer/src/compiler/glsl/ast.h":"3e68ff374350c49211a9931f7f55a485d8d89fc4b21caaffbf6655009ad95bf8","glsl-optimizer/src/compiler/glsl/ast_array_index.cpp":"92b4d501f33e0544c00d14e4f8837753afd916c2b42e076ccc95c9e8fc37ba94","glsl-optimizer/src/compiler/glsl/ast_expr.cpp":"afd712a7b1beb2b633888f4a0911b0a8e4ae5eb5ab9c1e3f247d518cdaaa56d6","glsl-optimizer/src/compiler/glsl/ast_function.cpp":"74f4fbd490e366b37f4715168bb3465ecd9334d4130942f75dcc8e80e8e7f027","glsl-optimizer/src/compiler/glsl/ast_to_hir.cpp":"d0f798eb09271d41d068b9e7b18220d37f1ed0083300ab51eba30989698fe23d","glsl-optimizer/src/compiler/glsl/ast_type.cpp":"8eb790b24b26dfb72bdc333744b566c26d8464c5d47d20eae659461f5c4899f7","glsl-optimizer/src/compiler/glsl/builtin_functions.cpp":"454189d643c220fcb49116ee5c8a34f7b349aa67564040deb8607f6a41a15e70","glsl-optimizer/src/compiler/glsl/builtin_functions.h":"a37cad7ed09b522c5b8bec7b80115a36846e7ba6e0874a2a858e32f7f202c665","glsl-optimizer/src/compiler/glsl/builtin_int64.h":"619def6f3aebf180da3944ef08f159ab12a58b24767e41d8b985ac37ded54d62","glsl-optimizer/src/compiler/glsl/builtin_types.cpp":"afec060b62d6f3b00bfbf94e9fa5f96341ce096c128d1eef322791e6ed9cea4d","glsl-optimizer/src/compiler/glsl/builtin_variables.cpp":"6563bfb1345cbca4c77e00eef09ad152f3e1dc271d246a08c5ce9e1f4ce4250a","glsl-optimizer/src/compiler/glsl/float64.glsl":"1072fd888be48c2a7a5117cd2d92a65f034965a66375f598bb856bff5d7be766","glsl-optimizer/src/compiler/glsl/generate_ir.cpp":"e5f0175370a0d07f93c48d3f0f1b8233d12c64a7b02de02dcc753ef7b398ef0f","glsl-optimizer/src/compiler/glsl/glcpp/README":"a0332a1b221d047e9cce5181a64d4ac4056046fd878360ec8ae3a7b1e062bcff","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-lex.c":"2d179879b1ffe84f58875eee5b0c19b6bae9c973b0c48e6bcd99978f2f501c80","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-lex.l":"e4c5744c837200dafd7c15a912d13f650308ea552454d4fa67271bc0a5bde118","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-parse.c":"03494f9ce1cb82260506e2559e73a3eeb622c4bd51b65eaa0a2c3351862bd4c8","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-parse.h":"264d9a18421cde255ce34a0a62b3d8e73465359f0d167e64aa3973062aae5bdd","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-parse.y":"fafb66e3a8f149d19e085f18a4273ba6d4c11af9e9a01d665cc784dddf97b79f","glsl-optimizer/src/compiler/glsl/glcpp/glcpp.c":"37ed294403c2abfd17fd999d1ae8d11b170e5e9c878979fefac74a31195c96b0","glsl-optimizer/src/compiler/glsl/glcpp/glcpp.h":"85ac8b444bcbd0822b66448a1da407b6ae5467b649f5afaf5c58325bd7569468","glsl-optimizer/src/compiler/glsl/glcpp/pp.c":"a52d94f1bcb3fb2747a95709c4a77c25de7eea8354d2b83bb18efd96976a4473","glsl-optimizer/src/compiler/glsl/glcpp/pp_standalone_scaffolding.c":"d11aeb3acfe966d1b78f1ee49804093f2434214c41391d139ffcb67b69dc9862","glsl-optimizer/src/compiler/glsl/glcpp/pp_standalone_scaffolding.h":"abbf1f36ec5a92d035bfbb841b9452287d147616e56373cdbee1c0e55af46406","glsl-optimizer/src/compiler/glsl/glsl_lexer.cpp":"272b9fc1383d72b81bfc03fa11fdf82270ed91a294e523f9ce2b4554bd3effa9","glsl-optimizer/src/compiler/glsl/glsl_lexer.ll":"2b57d9f9eb830c3d7961d4533048a158ee6f458c8d05c65bea7b7cfbc36e4458","glsl-optimizer/src/compiler/glsl/glsl_optimizer.cpp":"f8095d20629d0af70be930b0612e169edb274551a1d25a3cd1bf9995a11ce2e8","glsl-optimizer/src/compiler/glsl/glsl_optimizer.h":"22e843b4ec53ba5f6cd85ca5f7bad33922dca8061b19fb512d46f1caca8d4757","glsl-optimizer/src/compiler/glsl/glsl_parser.cpp":"126baf368d525aba301854e3d91ba60b5aee32e1102376af71416f32cb95ec48","glsl-optimizer/src/compiler/glsl/glsl_parser.h":"2ea9a50716098a8f7bef782d2a030d757b68da73afb01b4d4940d3e8381d44e8","glsl-optimizer/src/compiler/glsl/glsl_parser.yy":"6b1fd1576b29fce005dff744a6dbd0219e4c695c361d61864e1f3a8d6fa6b764","glsl-optimizer/src/compiler/glsl/glsl_parser_extras.cpp":"aad64b5b66467da650091430681e8c6a820cf3cadc4db3c160bf2f15875390ae","glsl-optimizer/src/compiler/glsl/glsl_parser_extras.h":"71fd0e92bbdb193dfb067d7bfdb1200d77392be2fbd0cbfc9ca89d1bb4c7e741","glsl-optimizer/src/compiler/glsl/glsl_symbol_table.cpp":"6660fb83c0ddddbbd64581d46ccfdb9c84bfaa99d13348c289e6442ab00df046","glsl-optimizer/src/compiler/glsl/glsl_symbol_table.h":"24682b8304e0ea3f6318ddb8c859686bd1faee23cd0511d1760977ae975d41bf","glsl-optimizer/src/compiler/glsl/hir_field_selection.cpp":"72a039b0fcab4161788def9e4bedac7ac06a20d8e13146529c6d246bd5202afd","glsl-optimizer/src/compiler/glsl/int64.glsl":"303dbe95dde44b91aee3e38b115b92028400d6a92f9268975d607471984e13eb","glsl-optimizer/src/compiler/glsl/ir.cpp":"2b4741cce90b5d4abff5d719c7324e2693c67294d4d99736cb241554adb281bc","glsl-optimizer/src/compiler/glsl/ir.h":"990b1c74447c4eb4835353ccb0ed9aea644f97fc1129ef1739cd935075d85d2e","glsl-optimizer/src/compiler/glsl/ir_array_refcount.cpp":"8cdc1cffe01e42e0566fa2193a75f789628e8025ad1b82f0ee6f204451b7f9f7","glsl-optimizer/src/compiler/glsl/ir_array_refcount.h":"75f06ec81342b379096ca52e1dc0fd5f19a11ff8e9b58203c20628179d644c12","glsl-optimizer/src/compiler/glsl/ir_basic_block.cpp":"1e2920b1c0ecb08424c745c558f84d0d7e44b74585cf2cc2265dc4dfede3fa2f","glsl-optimizer/src/compiler/glsl/ir_basic_block.h":"81be7da0fc0ee547cd13ec60c1fcd7d3ce3d70d7e5e988f01a3b43a827acdf05","glsl-optimizer/src/compiler/glsl/ir_builder.cpp":"daba29c5a1efdd5a9754f420eb3e2ebdf73485273497f40d4863dadeddb23c0d","glsl-optimizer/src/compiler/glsl/ir_builder.h":"2822e74dd3f6e3df8b300af27d5b11ea2dd99d0e5e7ca809b7bbcce9833c483c","glsl-optimizer/src/compiler/glsl/ir_builder_print_visitor.cpp":"8c6df5abf2fe313363f285f171c19ca6c8ee4f3bc2ed79d33c0c88cc8be45c48","glsl-optimizer/src/compiler/glsl/ir_builder_print_visitor.h":"799852adc3a0e54d04080655e7cebfa0d3bf5b6ffed5d8414f141380665d4db7","glsl-optimizer/src/compiler/glsl/ir_clone.cpp":"d897a4e1f5bbec4a6a2f15044c1be9a4d13899c73be77335b041049a4589aa5d","glsl-optimizer/src/compiler/glsl/ir_constant_expression.cpp":"78bd87ddb09db67f6c499067728d72aef4f16aa02721a99a4b769d1e0cfa9010","glsl-optimizer/src/compiler/glsl/ir_equals.cpp":"bca28533a6310b0fc152b56d80872368f1510dc62ed6e8ac199b9ffa7fac02e7","glsl-optimizer/src/compiler/glsl/ir_expression_flattening.cpp":"7e918d4e1f237eca01396004015865ce345afe32a876c9dbc6728576a1a7eae4","glsl-optimizer/src/compiler/glsl/ir_expression_flattening.h":"f45b66aa9497520e7e08e612d24b308477c34477fbd963ee9320eac664957f16","glsl-optimizer/src/compiler/glsl/ir_expression_operation.h":"cc9f10727dbd26cac506804f51456302c702650f9eeb59054a7e1575d5cf6687","glsl-optimizer/src/compiler/glsl/ir_expression_operation.py":"7b86c96021b9fbe165957f4ecb0b612fefcde1c2cf3c6d75e3cdb22e369216ba","glsl-optimizer/src/compiler/glsl/ir_expression_operation_constant.h":"9ad3346416392e3efa11e12ecf2feca7453c5253d241eb96c91dfb85d4f2b971","glsl-optimizer/src/compiler/glsl/ir_expression_operation_strings.h":"a6826daf496a8b9e89885bc2a161ac3445d501b23c6e0ac33e2c01b506b273c8","glsl-optimizer/src/compiler/glsl/ir_function.cpp":"7537365fc0fbe4b37a26b9a2146cc64d3e9a774d60eab63b65002ad165ae8fc7","glsl-optimizer/src/compiler/glsl/ir_function_can_inline.cpp":"faddbf112187a048d502716a3fb82570a322299ba2a3abd79388382c82040bfc","glsl-optimizer/src/compiler/glsl/ir_function_detect_recursion.cpp":"9176973eaf5c0a984701f953bb7a80f37dca43d59b5bce50fc69b3f02f2902d7","glsl-optimizer/src/compiler/glsl/ir_function_inlining.h":"9739493f99c489987d650762fccdd3fb3d432f6481d67f6c799176685bd59632","glsl-optimizer/src/compiler/glsl/ir_hierarchical_visitor.cpp":"3725861fbe2b98e0617f52d3b14cf6d3b25fb5ec00f5ef5d308b03642f592767","glsl-optimizer/src/compiler/glsl/ir_hierarchical_visitor.h":"e0560210e966c0c31e4ca843e80ea154e64db5a444b8c2df845b6ba5b3a43fc1","glsl-optimizer/src/compiler/glsl/ir_hv_accept.cpp":"caf7ce2cd9494aadd3c58bcf77f29de58368dc9e347a362bbf37f8bda9509b80","glsl-optimizer/src/compiler/glsl/ir_optimization.h":"8b3dcfc7f9e96b21a8dd47a0040d90be483a9e67a2cdce3a697188fb758d4630","glsl-optimizer/src/compiler/glsl/ir_print_glsl_visitor.cpp":"f8e34a983452be0dcb5a695e9c8e895eead24f9e540992a8afe510ae85da4c4c","glsl-optimizer/src/compiler/glsl/ir_print_glsl_visitor.h":"1ad1bd3efd1ace39051c13f904c05fd80425d329444f9a8d47fd6d948faf46e0","glsl-optimizer/src/compiler/glsl/ir_print_visitor.cpp":"643f5a68aae3fb37267fd793f1216d1cfdeb2c09338c26b1f30e4c6deaef4de5","glsl-optimizer/src/compiler/glsl/ir_print_visitor.h":"4573eb93268a2654c14b505253dd651e2695d43dc745904d824da18305269b95","glsl-optimizer/src/compiler/glsl/ir_reader.cpp":"06bfba802c8354e5a8b2334b6d78d6297de18235bedd3f8fbb382c89870b02f2","glsl-optimizer/src/compiler/glsl/ir_reader.h":"63e3f7f1597936a7011d5b520e171b197bf82bee6c1560d822c3edf5aaa6f9e9","glsl-optimizer/src/compiler/glsl/ir_rvalue_visitor.cpp":"84b5c5d746555adca85759c2912fe48010232b7c1c0bd2cf03bd04067a85e66f","glsl-optimizer/src/compiler/glsl/ir_rvalue_visitor.h":"fd8c561b71085d3211fff85ed514fecb299d8ce19a04bc063419a55b6d840525","glsl-optimizer/src/compiler/glsl/ir_set_program_inouts.cpp":"ab9f115ce9e7f312d9c7978340ced0dc4ae6d13a80e08442ba9709d11d50cae5","glsl-optimizer/src/compiler/glsl/ir_uniform.h":"683ae6896b1a08470c090be5f822fc31cd434eab9216e954b9bba24a46975109","glsl-optimizer/src/compiler/glsl/ir_unused_structs.cpp":"9c1620c45f2fc071fe5ed828472040b14c5f42effe06aa0e3b8352c95ef78786","glsl-optimizer/src/compiler/glsl/ir_unused_structs.h":"13387b49c23093575276b25b9dfd31fedd8f131c5c4f3128ab04cf03e15b5295","glsl-optimizer/src/compiler/glsl/ir_validate.cpp":"6b232be5999a86ea278f4f15b2832d76843246509118d924243055a3b9b0299f","glsl-optimizer/src/compiler/glsl/ir_variable_refcount.cpp":"2764a3cad937d53f36db7447c3a5b98b04bf153acf81074d971857fc5bca460d","glsl-optimizer/src/compiler/glsl/ir_variable_refcount.h":"b0668e3eb1501ef65e38fe12830742ecb3d28e6039f30e366c8924efc29b4a39","glsl-optimizer/src/compiler/glsl/ir_visitor.h":"f21b3534c3d66d5fb707d1581fece7e1eb043523afbaedf89918cfb031c6df94","glsl-optimizer/src/compiler/glsl/link_atomics.cpp":"360f0209e11f367ba358223597b0a118bae095bff16337cf03f1fb89c5b80ca6","glsl-optimizer/src/compiler/glsl/link_functions.cpp":"de7895da8aa33a1e3c2c1eb2fdaf267ab5d1fbfdb79ae2e67f95211e946e294c","glsl-optimizer/src/compiler/glsl/link_interface_blocks.cpp":"1926cfa73810704eb19b916c1b2cdb9321155e2f98b2a0a57c7c3c6e960540cd","glsl-optimizer/src/compiler/glsl/link_uniform_block_active_visitor.cpp":"1e14e06ca3b2c1089cfba2e8eaf0c1f373d9d6374b6082f320962dd71ae09611","glsl-optimizer/src/compiler/glsl/link_uniform_block_active_visitor.h":"fd58c155af645295bb6aec08797889de586f4d919731de2bce57e8dce59bb048","glsl-optimizer/src/compiler/glsl/link_uniform_blocks.cpp":"09589f49776dce32e6c4044937de7e0c839a9754ad31960148f8f9e010658997","glsl-optimizer/src/compiler/glsl/link_uniform_initializers.cpp":"bf98e08c12db466acf9623cbeb8fa8e3b4002512722e7a6521287f558a099f37","glsl-optimizer/src/compiler/glsl/link_uniforms.cpp":"84bad5b1377362cecf259b05124239be5220b03ce1c0c61b59bd9a47e4379af2","glsl-optimizer/src/compiler/glsl/link_varyings.cpp":"a5f1a53e7c80d635515fe808ff223d89fef1767abb0f2b7aa28fa6773dca353f","glsl-optimizer/src/compiler/glsl/link_varyings.h":"b9dbe018f038df69763df2e928742ce81bbc6e3aaba26f50621e30a6d9aa6220","glsl-optimizer/src/compiler/glsl/linker.cpp":"40b1ecd5d4f6c7f13d5a87ce390561a51fdf6f3fcd9b2197b9c88b03a773ba94","glsl-optimizer/src/compiler/glsl/linker.h":"ecf94b4ad75ef461c27c557fda4bd25f34c91930822b8e1d729ec84520d4a049","glsl-optimizer/src/compiler/glsl/linker_util.cpp":"1663ad88e2a369305659aeeffaedb5bd752cf76340a2ba5797fc0bf600633cf9","glsl-optimizer/src/compiler/glsl/linker_util.h":"6db788daf9c8e87ae2764b61a8b37ebe419e69c1b82ddee01986e37c978c6993","glsl-optimizer/src/compiler/glsl/list.h":"b1f46ce0e552fe7c45b2a19408a9d97662e23e4b182ab335491c26f8cf25886f","glsl-optimizer/src/compiler/glsl/loop_analysis.cpp":"57ecd573477c68091c7cc99537faa7139a8f395935e3d4f10144cefdefb5a611","glsl-optimizer/src/compiler/glsl/loop_analysis.h":"a85f045a038ee5b5176063e85d7988865862c44ab0580f771b993a042d0b69cc","glsl-optimizer/src/compiler/glsl/loop_unroll.cpp":"bd4292ea2809f5a669bcb76ceaa1ac365772dcd638c579c3ed10275214901a54","glsl-optimizer/src/compiler/glsl/lower_blend_equation_advanced.cpp":"8cfbef140d9c4b4d2f57bfa05c9c374d31a121d0f87afce94333f049023b654a","glsl-optimizer/src/compiler/glsl/lower_buffer_access.cpp":"1ae221c3c7a95aeb867207e7a742be635f91b406c157747bfd6ddf10274d97fb","glsl-optimizer/src/compiler/glsl/lower_buffer_access.h":"807886953a576a323591798cbca5e2df24295ea893b28affd8ffb5926cebaa04","glsl-optimizer/src/compiler/glsl/lower_builtins.cpp":"4d81afc32cf58e1481fcb5e42888ab93dbe6820310a20ff7a9982b77b2152d9b","glsl-optimizer/src/compiler/glsl/lower_const_arrays_to_uniforms.cpp":"608403f0eeeedf21cfcd3014116e0f44e28cbdf6c4c32aac7e613e64e30205e1","glsl-optimizer/src/compiler/glsl/lower_cs_derived.cpp":"179905cd47a294122adeb5b0abfed6f2f67782dcde21b544d1ee2c1985154e66","glsl-optimizer/src/compiler/glsl/lower_discard.cpp":"3b361b2db0004d544d64611cb50d5a6e364cf6c5f2e60c449085d7d753dd7fb0","glsl-optimizer/src/compiler/glsl/lower_discard_flow.cpp":"f5c29b6a27690bb5c91f196d1a1cf9f6be4f1025292311fe2dac561ce6774dee","glsl-optimizer/src/compiler/glsl/lower_distance.cpp":"a118c85493d5d22b2c059a930c51a5854896d4b1dade76598eaa985e5a3dff8c","glsl-optimizer/src/compiler/glsl/lower_if_to_cond_assign.cpp":"469e617757fd1728709cce021aac5c8da05ee503bf5366977bdc4ef7a6d83950","glsl-optimizer/src/compiler/glsl/lower_instructions.cpp":"6ff5c396abe40d8a2145d571e99e2bbe9143393e15aafc28adc2803a01d821b6","glsl-optimizer/src/compiler/glsl/lower_int64.cpp":"d1ed41196880dd53c7b13e2782f9423f8442bf1d46186e8be92b1b66218a83ee","glsl-optimizer/src/compiler/glsl/lower_jumps.cpp":"34de7b493f281589fb0c2c0f6e885d0a0fabbe7a4e97a73de374dd714777a58c","glsl-optimizer/src/compiler/glsl/lower_mat_op_to_vec.cpp":"dff7a308edc4846c348ed4225c6699a9c75abac68d88f41f85954276552779f4","glsl-optimizer/src/compiler/glsl/lower_named_interface_blocks.cpp":"16063ac127bff75a68272070ab11c21c25101edbff62b4c68f4983b4cd941af0","glsl-optimizer/src/compiler/glsl/lower_offset_array.cpp":"3b00773399135aea85746a5a68b96ef000bc6841be1a2c8e6f25c516628b0949","glsl-optimizer/src/compiler/glsl/lower_output_reads.cpp":"a0fc9975d5aa1617e21fc6c353659a9802da9e83779a3eef4ec584f74b4dadc5","glsl-optimizer/src/compiler/glsl/lower_packed_varyings.cpp":"7550099d4ae123d71541c2fc88bc04fbfe9271ec75d7e210987d1c8cac3cf3ea","glsl-optimizer/src/compiler/glsl/lower_packing_builtins.cpp":"79a13d161fe505a410ab948d92769395708693ec888153630fa240e5b97e356f","glsl-optimizer/src/compiler/glsl/lower_precision.cpp":"f82a185b879872b977a1787d8061b9a80bc4cf8db1b970db6efba2ad9cc20fa2","glsl-optimizer/src/compiler/glsl/lower_shared_reference.cpp":"ea2dccf50a83bc19391bf6b7ab6aa53c0005f427af4066d25140340af9a4beef","glsl-optimizer/src/compiler/glsl/lower_subroutine.cpp":"f69fa53650eeb6f2944fce4d36a6e0a423e6705f3a3bd3389c7fadb83cfc8802","glsl-optimizer/src/compiler/glsl/lower_tess_level.cpp":"b196c9d424c0569f3e85d75c2d125af21566cb113d69036db87c0990703e0fa7","glsl-optimizer/src/compiler/glsl/lower_texture_projection.cpp":"4d247f244272adc8250fd888d8d932a140dd5de4d1efc7a58492c3c2b8291527","glsl-optimizer/src/compiler/glsl/lower_ubo_reference.cpp":"89bdbc6c1669230c644c0857db1ce2781ec61d349ecd08c7914146e1f4750a4a","glsl-optimizer/src/compiler/glsl/lower_variable_index_to_cond_assign.cpp":"fce930f29ac9405b297d1f749d68f59506b89c70b4ee1b1ab8cf49a34cc71ecf","glsl-optimizer/src/compiler/glsl/lower_vec_index_to_cond_assign.cpp":"3c67d851a11a55fad1c49a550f3a0cfe50892d33a3f238ce266cd829eba510a8","glsl-optimizer/src/compiler/glsl/lower_vec_index_to_swizzle.cpp":"f5ec666b73e1415cbab32519a53605ed385f3b03e889560373dbce69dda5000e","glsl-optimizer/src/compiler/glsl/lower_vector.cpp":"f7c13f5572ebe09b6a71553133b2cf003cd4b77b9657600672ee3b21bf890725","glsl-optimizer/src/compiler/glsl/lower_vector_derefs.cpp":"b05793da6dd620a531b43df5af8b2ecbc37b9db0c88910f5724ea10bcd057e19","glsl-optimizer/src/compiler/glsl/lower_vector_insert.cpp":"fee772ec17eea5e86a529bf9c5fa2ee0d29a5982bb75ebc6d68ed36cd19aa299","glsl-optimizer/src/compiler/glsl/lower_vertex_id.cpp":"690e8715182e03fead5cc5a35251fb4f41b357e4c71a1dfbc4bd7be19862b56d","glsl-optimizer/src/compiler/glsl/lower_xfb_varying.cpp":"58c0e8b270e4bbde54250be03cdb2f36966bcafb785372ad2e2b786835df7f9f","glsl-optimizer/src/compiler/glsl/main.cpp":"ae5e88abbbc8a12f769e1296bad938b9d7398cc6da0d3d0caeceeeb876536850","glsl-optimizer/src/compiler/glsl/opt_add_neg_to_sub.h":"f5054944bfd068810629080d0ea11df78b3f57a8f86df75e13ca50157ad1964d","glsl-optimizer/src/compiler/glsl/opt_algebraic.cpp":"25f45b20e1972ee8c789177a1aeda6e4286c25db2eae3a43ff83029ae64969c0","glsl-optimizer/src/compiler/glsl/opt_array_splitting.cpp":"19d3ce0e815438f4df9ab2890e767b03a4f3f191b53bb30c0217cf2ae6a95430","glsl-optimizer/src/compiler/glsl/opt_conditional_discard.cpp":"0e44e0e126711a3725c1f3a2aa65ff03c381fed08680ffc30101aae60f716c4e","glsl-optimizer/src/compiler/glsl/opt_constant_folding.cpp":"a088d04d9b45f9e55e235835648f614c89b7803c03a6d4f6a6d1a6bc1f0228bd","glsl-optimizer/src/compiler/glsl/opt_constant_propagation.cpp":"8a9440d77ecd6dcf13e683cbb99943aab6311c8fd4b5f6a9189a8d4f270746f4","glsl-optimizer/src/compiler/glsl/opt_constant_variable.cpp":"63d3ccd4dd09f19c9cf1a2f51592111bed41284504f29f3c0de4cadebc439a37","glsl-optimizer/src/compiler/glsl/opt_copy_propagation_elements.cpp":"ffa0f50863995e0d2e31f55a52e82319edc71e520987bebd7f7e561ea331c64b","glsl-optimizer/src/compiler/glsl/opt_dead_builtin_variables.cpp":"84e8747b948232f01dd56b428b9315f96f9511f605f240119fc446fae28981a9","glsl-optimizer/src/compiler/glsl/opt_dead_builtin_varyings.cpp":"761523e88f5b3ba785170f4d7205e94fa99acb7e74d29efbe40e1c010e1dbdb3","glsl-optimizer/src/compiler/glsl/opt_dead_code.cpp":"fd1ba2da7337d4e5dad17f5c2d73d9cc8880305f423e85d64cf94553588fa401","glsl-optimizer/src/compiler/glsl/opt_dead_code_local.cpp":"969a598b4df322baf222258a66cd64a326ea20e5b3125be9d8d1771f522c69e0","glsl-optimizer/src/compiler/glsl/opt_dead_functions.cpp":"774cae6536d02edf26e996a2a895e1f62d5098f16dc96b44798b4fc731a9a95f","glsl-optimizer/src/compiler/glsl/opt_flatten_nested_if_blocks.cpp":"3696a5c55f02e20056e085bc2714f73ac992f221b6f3387d655068e86b512046","glsl-optimizer/src/compiler/glsl/opt_flip_matrices.cpp":"44f0fe05b49329667671f88c96dc86ab3fe1459ff7b87f2b2d88de2d49829f9f","glsl-optimizer/src/compiler/glsl/opt_function_inlining.cpp":"fb56a33c90419a01676b57cbd91d0674a54cca40e6defaacc88dd33facebc131","glsl-optimizer/src/compiler/glsl/opt_if_simplification.cpp":"ac406eb35e379c357641d6c5749f50c65961455924d3dc884e2b90046fa92c5c","glsl-optimizer/src/compiler/glsl/opt_minmax.cpp":"8abd59d3b14ef60ff14a9c69660e6945f5cf10b97edb4afebe56be3f81d96316","glsl-optimizer/src/compiler/glsl/opt_rebalance_tree.cpp":"8bb6329dc0f299042368fc81934c2df019b45ab9f7aa0415d4e57b8d1ff98c9f","glsl-optimizer/src/compiler/glsl/opt_redundant_jumps.cpp":"222c73e2ac7a938ebb6428cc6c780c908ff6156d8ff935b04fed93a48fc10496","glsl-optimizer/src/compiler/glsl/opt_structure_splitting.cpp":"2edc79cc13f3177934e0443ad62f5976a1991f01f86ea303a803434849b13a47","glsl-optimizer/src/compiler/glsl/opt_swizzle.cpp":"015d0abddfe507f67c4b96c82988d861d018ededf7bf055e2bcbe9ea92da694e","glsl-optimizer/src/compiler/glsl/opt_tree_grafting.cpp":"46d28ac983ea244a4315bdc0e8892979ec4d1f9b9a96ac8a8a08006d9bc5e878","glsl-optimizer/src/compiler/glsl/opt_vectorize.cpp":"d80ee43bb97d9f016fb9c5e1e06f5b2afa569811f368ba067be794ec11d085fb","glsl-optimizer/src/compiler/glsl/program.h":"2982447e2abd35371e273ad87951722782a8b21c08294f67c39d987da1e1c55f","glsl-optimizer/src/compiler/glsl/propagate_invariance.cpp":"080943e21baa32494723a2eefb185915d2daae1f46d6df420145c5ad6857e119","glsl-optimizer/src/compiler/glsl/s_expression.cpp":"1ced972bc6ecc8eab4116ea71fb0212ab9ae5bcc0be3b47aa5d9d903566b3af1","glsl-optimizer/src/compiler/glsl/s_expression.h":"65b847e30e22a809b57d0bc70243049c99d9c6318803c5b8d0826aba55dc217e","glsl-optimizer/src/compiler/glsl/serialize.cpp":"be0eb4251348a9d921acb839a5c48c6023a2e9d116d602bb0432787ab623655d","glsl-optimizer/src/compiler/glsl/serialize.h":"57425732eba1233d928e5f07f88b623ce65af46b3bb034bf147f0a4b7f94f9a1","glsl-optimizer/src/compiler/glsl/shader_cache.cpp":"e0c5c433f2df3fccdf1d61281bfcb0ee5633433339b97c697d64db99611cbaaf","glsl-optimizer/src/compiler/glsl/shader_cache.h":"9217164d8d7f54aca0fe5922c7187095a6ae0cb703b196b79805aeef07a7e697","glsl-optimizer/src/compiler/glsl/standalone.cpp":"8e6c416a14d631261917a5fe4cc91880c287b22b2dfd70eb22028289a8fa5364","glsl-optimizer/src/compiler/glsl/standalone.h":"a7c397d1dfdd1e7fb2cfe99db35cd9df93251e642059208533202b7f20497f83","glsl-optimizer/src/compiler/glsl/standalone_scaffolding.cpp":"970d14b7a9d58e5270321f97bf5d57795558b1c570a56678e04a65b26c60bf4f","glsl-optimizer/src/compiler/glsl/standalone_scaffolding.h":"d921a617ea82b9e49413314492a645c44356de503581b1be3f1b57de236e480d","glsl-optimizer/src/compiler/glsl/string_to_uint_map.cpp":"d824bf5b839bd39498dc9e457103cdbe3e5289ddf7564107c27b1505948dd31f","glsl-optimizer/src/compiler/glsl/string_to_uint_map.h":"e2f18e66359c9d620e085de7f4a334a47df9c66e65a5bfe8b734c627bec04104","glsl-optimizer/src/compiler/glsl/test_optpass.h":"b27b8f35f5387e7ce4982bb51c7b63ccf14f91757f3108a5d02ed006925bb8a0","glsl-optimizer/src/compiler/glsl/xxd.py":"376484142f27f45090ea8203ae2621abf73f06175cb0ee8d96f44a3b9327f4bd","glsl-optimizer/src/compiler/glsl_types.cpp":"044bb6754f45419a3151e7a25c39202a82009ae3c6bc54ff7f0bb4258a5deefe","glsl-optimizer/src/compiler/glsl_types.h":"fd899a42f34ddeb8601bc3cd6c5e3aed82fc8aef4042dde1b39b3c01e1dcc219","glsl-optimizer/src/compiler/shader_enums.c":"436bff5216b11b0980bdfada5885fc6ac9afa2037a3027fcd6eea2a8635597ac","glsl-optimizer/src/compiler/shader_enums.h":"13220442a5c02e83540cf2c0ad4f8417b2fbda5f2586dec4e92082544c937cdd","glsl-optimizer/src/compiler/shader_info.h":"4c5453e81197ca83593ee4f365074b23530f2ab21c78e1733b63dec6f344c12a","glsl-optimizer/src/gallium/auxiliary/util/u_half.h":"3c2b37bda3ccb64387e44b723d29cf9046decab1a893bf42d842e9603398bdee","glsl-optimizer/src/gallium/include/pipe/p_compiler.h":"c75620096ce8523dae90599e50aa2ef6468d3b0e368a77795edeb20dd1abfc0c","glsl-optimizer/src/gallium/include/pipe/p_config.h":"a27692fc35f9e55df3224b7529e66b3001e911e94e6bc5f8f569e493e1ee3fb7","glsl-optimizer/src/gallium/include/pipe/p_defines.h":"be26d68c0acc67c5e44788c6299716a9eee415fd81d7d747e3738a829e3b6b38","glsl-optimizer/src/gallium/include/pipe/p_format.h":"5674215fc41d27496f037cf837717daefbf23ebb38d40ace7c0c414bc08182b0","glsl-optimizer/src/gallium/include/pipe/p_state.h":"d600593aba5f5a17072a6c38f6baa81e01c7994b0174250f7e433bb41684b702","glsl-optimizer/src/mapi/glapi/glapi.h":"73632a625c0ddabc401205e8b5a81eb8af8506868efe4b170d7979ec3619e9c5","glsl-optimizer/src/mesa/main/config.h":"5800259373099e5405de2eb52619f9de242552a479902a3a642a333c8cb3c1e7","glsl-optimizer/src/mesa/main/context.c":"2f3208473d99c94f734b1137ba91889d4a1babb9e7534bf1dc85d851ee98274e","glsl-optimizer/src/mesa/main/context.h":"cc7e4194797db9d007f01884e23d786c453b3860821f7f2ddcdf0f1bf3f8ffb1","glsl-optimizer/src/mesa/main/dd.h":"6a964acd06b6c2d88700e69fb75fe3c6b3b3d45bbc41db24f3f897a29695fe0c","glsl-optimizer/src/mesa/main/debug_output.h":"7312422e90b8c0e34028ac27280e438139b5cba525c99deb3ac883cd3d87e452","glsl-optimizer/src/mesa/main/draw.h":"7eaef3a9e27a60ea6f7937109bf3a6190b831162fde0479abb12077ce27c353d","glsl-optimizer/src/mesa/main/enums.h":"87d562a6764f51c014a2274fa7c3aca17c04441537ddd56b2554f13c6fffea92","glsl-optimizer/src/mesa/main/errors.h":"c79444b5df289c90fbb22a33b2d0c23917d9fc4510960088f0b79e53bb56b1b2","glsl-optimizer/src/mesa/main/extensions.h":"a38b2f87cc93c513994281350d69e06c84ff8eded5313ec0a1be33f375e0ebbd","glsl-optimizer/src/mesa/main/extensions_table.c":"17642d1a8c9a0bf2bd61060052d33ff14a005d2b962e6cf91465797a50851e85","glsl-optimizer/src/mesa/main/extensions_table.h":"2c879571c238d2e14461031ac740372fd0f9ac3a34c0d5541bb9b7ed4c0376c8","glsl-optimizer/src/mesa/main/formats.h":"02e2f7ec3e39286cf9f27e2641043e6df8ecb1dfde9e643313210e214af2a929","glsl-optimizer/src/mesa/main/glheader.h":"58217b33eead6aa6b23cd4a291cefeaa6cb84e465f4960daffca97c44d6d1c35","glsl-optimizer/src/mesa/main/glthread.h":"51fb2711f77e7eafcfc52d29d5b844978832b24c930d88accd48d143a6eb9c6f","glsl-optimizer/src/mesa/main/hash.h":"7e7f782034c16a8e693de48e00c31d4a90b0129f4029fd074033d7d16ccbe718","glsl-optimizer/src/mesa/main/macros.h":"73d15ddfd64f2b57b9b2ffeeb993b9c2c0899a80563e9d6ff337b11ccbe6eee5","glsl-optimizer/src/mesa/main/menums.h":"5dfac0e2279d60b0cd0c7b9fc2a5021620d0f6282ed2e738c420214e3af152d3","glsl-optimizer/src/mesa/main/mesa_private.h":"edda678b93438944279a551f663b8858ad84814a9fc88ba9672ef195599c24ae","glsl-optimizer/src/mesa/main/mtypes.h":"6efddefa099e4d2e3fdd97f0055644f47aba21711385edfeabc2d9b0676f2eec","glsl-optimizer/src/mesa/main/shaderobj.h":"9f0dfe96d0c2154201adef942bd36053533ac7b2492fb3786acda5bea514c75e","glsl-optimizer/src/mesa/main/uniforms.h":"4e331e6ad6e9cbded978b4082dbe0a57c1f8f01327446bb6892bfc179976c38b","glsl-optimizer/src/mesa/main/version.h":"9d0a13a758099302dc55cf7d045791834a89b0f9d4cf17b2692259b369a8a9a1","glsl-optimizer/src/mesa/math/m_matrix.h":"a37b19f182e070db3df93b0ede43c22fb8be8c2906504133ee6dbd7db1185d8b","glsl-optimizer/src/mesa/program/dummy_errors.c":"1820e305515b4c5e041f5e1623266a48ec8f076a155310be7d60637101f593e4","glsl-optimizer/src/mesa/program/ir_to_mesa.h":"b47f58d22e3ca2ae42d52501ea769d15c4476834944fa97eeccd3a3439211d00","glsl-optimizer/src/mesa/program/prog_instruction.h":"ab3832152a7e144b59e5a2264b2c29db56d93be31e76bbd958527a56771b40eb","glsl-optimizer/src/mesa/program/prog_parameter.h":"ba18c743284eadbc837c2c364c73e5d372321a7637a76e589d8d39fe8b5de225","glsl-optimizer/src/mesa/program/prog_statevars.h":"fc413698f84bc52d45fdeae0471934ee9904bfb7eac1a2b5f70446e54bcbbdca","glsl-optimizer/src/mesa/program/program.h":"1f01026a4eff440a3f122fd9b519d03546fe7f7d8be60dca834e95a2f8fbbfd2","glsl-optimizer/src/mesa/program/symbol_table.c":"6611cb9f078035bf5ff8c9112093a6c7d99f8af99a3931d0c07f227cc72283ea","glsl-optimizer/src/mesa/program/symbol_table.h":"631dc35ac48d5e87962d45507461920f6575610960ffcc42a08cefeb43300cda","glsl-optimizer/src/mesa/vbo/vbo.h":"6eb1dcd9a08c92f276c5fe08da184ff9d455d1be421913b8ad732a7b65e858fb","glsl-optimizer/src/util/bitscan.h":"9e49e694e6b34fe035bc685f32588827eb8cbe7d82878963c7ab52843e1c16aa","glsl-optimizer/src/util/bitset.h":"c40f78515c6230fed18345c6751ce33833a49da7a27901c7e6d7340cbdcbc5e7","glsl-optimizer/src/util/blob.c":"8f729846f66efc9c15485cc5fc24c6ec861fc1fecb2f652573f2a237d481b791","glsl-optimizer/src/util/blob.h":"93e1eaac866b9a7cd6fc03b533c18fb2edf0e97f03395eff4f3a605c4fc14d0c","glsl-optimizer/src/util/compiler.h":"79e3bf40a5bab704e6c949f23a1352759607bb57d80e5d8df2ef159755f10b68","glsl-optimizer/src/util/crc32.c":"2f3467a046b3a76784ecb9aa55d527698c8607fd0b12c622f6691aaa77b58505","glsl-optimizer/src/util/crc32.h":"59bd81865e51042b73a86f8fb117c312418df095fed2d828c5c1d1c8b6fc6cd4","glsl-optimizer/src/util/debug.c":"c3d68e9752ccc19e66c669562cd113cf1d0ac83cbb30174789e7fb8d1df58f9c","glsl-optimizer/src/util/debug.h":"50068d745c4199ccbd33d68dd4c8a36d2b5179c7869a21e75906ddd0718ca456","glsl-optimizer/src/util/detect_os.h":"343a8790d17a3710c6dd015ee367f84e3902ff3f2e36faca2bf93f9d725d3574","glsl-optimizer/src/util/disk_cache.c":"f533937e5a4fffe76e2739ef4b6b1e1da097d96d63eb808e68ebbc7027641c23","glsl-optimizer/src/util/disk_cache.h":"e83314fb14134a8e079b15e470a6376ba5a8253701f048c890a62b7e55d64bc8","glsl-optimizer/src/util/fast_urem_by_const.h":"e108fce804616c47d071dfe4a04163eec1126e448ed1aa89abb6b3a6d772bd5b","glsl-optimizer/src/util/fnv1a.h":"ab2596f19c6adf431ae27618f62c5743e24ad23ef83bb359a4c4c218245ab459","glsl-optimizer/src/util/format/u_format.h":"4cdfc0c59cbc99a092e5ec5a396910f2d93b9643e5d8141050b011e66f11e45b","glsl-optimizer/src/util/futex.h":"26f7c9d86e9ffef4c0fa2761f1aaa1918337302e20bd6ca10e61dc3c47356deb","glsl-optimizer/src/util/half_float.c":"11bc2584493d5d9d46e8c8a619a0307cf150bf5ab5d0f96bb764b061dc37a00e","glsl-optimizer/src/util/half_float.h":"7f7c380f126da1400a91758cc0392f24bf967bce1672890b62be26fe9fbd922b","glsl-optimizer/src/util/hash_table.c":"0ca40352e35dedab0a84c64c903f1b16d47e950bb5f43b4d22bb57d499bfea6e","glsl-optimizer/src/util/hash_table.h":"217191bb360592e2232f187473c10287d2cda8ae6fa5c53d0ef74c8c206118b4","glsl-optimizer/src/util/list.h":"9fab03c6a78186bb5f173269f825f6ce976b409d931852e3d93bac632e07989a","glsl-optimizer/src/util/macros.h":"63faf65b51058c483b17f1f77da51d1c53c8beab52678cb6bd01f1228a63b6b0","glsl-optimizer/src/util/mesa-sha1.c":"00c692ec353ebc02c06c57c5a71de0ab7a119f86a4146f452e65ec87e4944417","glsl-optimizer/src/util/mesa-sha1.h":"bff4c29f4bf7cdbcefb30fa0c996a7604a380eba8976467c2a60e7cd328f7e26","glsl-optimizer/src/util/mesa-sha1_test.c":"25da89a59d51469f77b4c468ca23ffdce0a7a1166a70b6cc23026a6800b0143c","glsl-optimizer/src/util/os_memory.h":"64555faf1760ae6954f42c83727c38dfc4c278e9152115779ffaad58b42adacf","glsl-optimizer/src/util/os_memory_aligned.h":"12d86fa94be38c13f7eeebdf313795e1267dd5a7187d2f0072e0e896f41702f6","glsl-optimizer/src/util/os_memory_stdc.h":"07360363b88c927065e10df71bebf6c8a0cc3b9167c9dfce55f2d65f11e6f787","glsl-optimizer/src/util/os_misc.c":"a9936e613ec84803abd59ad47c192c8e3939993c950ac91973fdc4cec1801bb8","glsl-optimizer/src/util/os_misc.h":"cc68eb12e05b5e749c54298cb4a6f4cd20cc5af7db3403e70b3c27b56090c740","glsl-optimizer/src/util/os_time.h":"73e775f7335244ff5964c678c27eedf1aea6abea44c4169d327ea8c7ce4a3a88","glsl-optimizer/src/util/ralloc.c":"4b51189595ef67bcef52c40cbf654d969041dbd15e15d4a893ad494ac060aeca","glsl-optimizer/src/util/ralloc.h":"e573c45875ff1530f0dbee9a93ae55535fdac8d5cc88a79ebc327c688824bde5","glsl-optimizer/src/util/rounding.h":"0450722353caf83de07e67f335949dbe95fe53b534052d4ee9d28d2781387614","glsl-optimizer/src/util/set.c":"86f8c9a830bead5a5a79bc970b0ff97809312af07b3beb39ef9d90af04d40a1b","glsl-optimizer/src/util/set.h":"3e39ca161e7ed4ec7c436cc9c7919ed9a55ed1b71edbf2caf6f9bcfd9bc578ed","glsl-optimizer/src/util/sha1/README":"00af7419af05247081858acb2902efd99fcda2ce16e331079f701645bb3729c0","glsl-optimizer/src/util/sha1/sha1.c":"1403bbe0aad42ba3e6be7e09f7cad87a6a8c4ad5b63962f7b92b9f37d8133b04","glsl-optimizer/src/util/sha1/sha1.h":"68d9f240eab2918026ecdf22be36811abbd4f1389f6c36e31258041aeaedd247","glsl-optimizer/src/util/simple_mtx.h":"12c6c3c4b7db9168bc656d5b3c65912075084d2b388c415d5c3d3f5953a9d6c7","glsl-optimizer/src/util/softfloat.c":"a97e51a96fe5e6a052c02aa6bbec683fe73fb88a8c087d9c930503e2120d8a2e","glsl-optimizer/src/util/softfloat.h":"66664b0250e83bf5dd4cc743acd119d076efcea624a0eab3d6b60718e6ee8811","glsl-optimizer/src/util/string_buffer.c":"63a1d1b1e34926c88ea00159cafbcd56568b805c4f64d1e8c97169fe313921fc","glsl-optimizer/src/util/string_buffer.h":"7b88d1b1d9c6cfb8e93331813535c127289437c75f822029e9a3bca8ea6b52ee","glsl-optimizer/src/util/strndup.h":"0273c4fdb7482cd7746881a63d3998648c6d63415ba85af1d1860f0e0dc504c6","glsl-optimizer/src/util/strtod.c":"5cf610d8a37373cf37cfb7aae903525d943b2674b1f32594c70b0eb19a8c9697","glsl-optimizer/src/util/strtod.h":"237396def4e264d35ed4bedea00ef9a4ceab6d7a11a18c770d9747d22c69ed2d","glsl-optimizer/src/util/u_atomic.h":"c02e809526c6c09ba8fe51f50b2490d1b6c8e5c7f3c4031ae958250d098fc3bb","glsl-optimizer/src/util/u_debug.c":"8c060e379b816618f3dd22c9ea523c68b9425c76c36a7dfe5d6d375b337f5f4a","glsl-optimizer/src/util/u_debug.h":"e11e26edd9b9e4e6f8e6a435e69f4d9edda27e9a379f68f4c82ea2525aaaea68","glsl-optimizer/src/util/u_dynarray.h":"853d0fa6ff2261614488be624deb8a2b01e57c2c8eabc28578cbeed4ccc95694","glsl-optimizer/src/util/u_endian.h":"3ccea7e529740318d8a4b05c00db3adc9d1e292a52bdc56a05c9fae99209720f","glsl-optimizer/src/util/u_math.c":"c868a8c0886dc78f1b06b13404ba8b253090449045774dd56893ac9d75795184","glsl-optimizer/src/util/u_math.h":"a04e32e126db016413f9de0a2028a3e71737137463b1289eae576f884b06fcf1","glsl-optimizer/src/util/u_memory.h":"c5db17c724c70283ddbe04165722f6988d4e0eb9aa3602ae472feff016649af9","glsl-optimizer/src/util/u_queue.h":"92930ce236c0528a98b695f5cea8c5c6aa9683beaf71a2227bdc5d33d1b21506","glsl-optimizer/src/util/u_string.h":"c5a2f4ef576d1547bda12c4ea219179fefa54414977743ac094abcaf696ef6ca","glsl-optimizer/src/util/u_thread.h":"00b708459b27f9910d18db92c18cc65cfc618ac2b3cd144e45f8640057b10d58","glsl-optimizer/src/util/xxhash.h":"2f2aff2fc6c0c929f52cf6ae7314122124c5be026d41ad1c357608383c4a37ad","src/bindings.rs":"79993db2058bde39f99ef483d02560d33b1cb882f6a552319e8b86eb6f9021e1","src/lib.rs":"04be1554cd829eb40864b06d80b491dd48117a4e3a601c7d482117f7a0391e67","wrapper.hpp":"f3ea34cc496f7d90b9bfcada3250b37b314c3524dac693b2ece9517bc7d274ac"},"package":"8ba4741358604ca0848c27ecc069d68e62e11cde81e38aac1da3c54b79ab5adf"} +\ No newline at end of file ++{"files":{"Cargo.lock":"f7970552595dc803ace9ef19b5f5d7b1fc784aac30cb27b2ebc3002d97122b9d","Cargo.toml":"7c53ee20d848f9913cacbfcb3ab2e89e30deee8d619d173c95130c7c5d065827","README.md":"4468e08c64c19977707d792bfab0080e35ff927b64990eab77873f8ba056ba1c","build.rs":"92e29699487c21389fc823c50b410cfbfc74cc774265d24958489909ee48a076","glsl-optimizer/CMakeLists.txt":"42ce94744e82ffa000da8b64d81fc140e293b9f5da7dd4cf6b49e7404a2448d9","glsl-optimizer/README.md":"b18eef11a92d267d88a937b1154f7670ee433c730b102fdf7e2da0b02722b146","glsl-optimizer/contrib/glslopt/Main.cpp":"14ba213210c62e234b8d9b0052105fed28eedd83d535ebe85acc10bda7322dd4","glsl-optimizer/contrib/glslopt/Readme":"65d2a6f1aa1dc61e903e090cdade027abad33e02e7c9c81e07dc80508acadec4","glsl-optimizer/generateParsers.sh":"878a97db5d3b69eb3b4c3a95780763b373cfcc0c02e0b28894f162dbbd1b8848","glsl-optimizer/include/GL/gl.h":"1989b51365b6d7d0c48ff6e8b181ef75e2cdf71bfb1626b1cc4362e2f54854a3","glsl-optimizer/include/GL/glext.h":"2ac3681045a35a2194a81a960cad395c04bef1c8a20ef46b799fb24af3ec5f70","glsl-optimizer/include/KHR/khrplatform.h":"1448141a0c054d7f46edfb63f4fe6c203acf9591974049481c32442fb03fd6ed","glsl-optimizer/include/c11/threads.h":"56e9e592b28df19f0db432125223cb3eb5c0c1f960c22db96a15692e14776337","glsl-optimizer/include/c11/threads_posix.h":"f922e2c8613582a9340aa5ae37a4f7bd962dbc30e33a7a6ab14bed2d2995bc2b","glsl-optimizer/include/c11/threads_win32.h":"95bf19d7fc14d328a016889afd583e4c49c050a93bcfb114bd2e9130a4532488","glsl-optimizer/include/c11_compat.h":"103fedb48f658d36cb416c9c9e5ea4d70dff181aab551fcb1028107d098ffa3e","glsl-optimizer/include/c99_compat.h":"aafad02f1ea90a7857636913ea21617a0fcd6197256dcfc6dd97bb3410ba892e","glsl-optimizer/include/no_extern_c.h":"40069dbb6dd2843658d442f926e609c7799b9c296046a90b62b570774fd618f5","glsl-optimizer/license.txt":"e26a745226f4a46b3ca00ffbe8be18507362189a2863d04b4f563ba176a9a836","glsl-optimizer/src/compiler/builtin_type_macros.h":"5b4fc4d4da7b07f997b6eb569e37db79fa0735286575ef1fab08d419e76776ff","glsl-optimizer/src/compiler/glsl/README":"e7d408b621c1b605857c4cab63902f615edb06b530142b91ac040808df6e22f7","glsl-optimizer/src/compiler/glsl/TODO":"dd3b7a098e6f9c85ca8c99ce6dea49d65bb75d4cea243b917f29e4ad2c974603","glsl-optimizer/src/compiler/glsl/ast.h":"3e68ff374350c49211a9931f7f55a485d8d89fc4b21caaffbf6655009ad95bf8","glsl-optimizer/src/compiler/glsl/ast_array_index.cpp":"92b4d501f33e0544c00d14e4f8837753afd916c2b42e076ccc95c9e8fc37ba94","glsl-optimizer/src/compiler/glsl/ast_expr.cpp":"afd712a7b1beb2b633888f4a0911b0a8e4ae5eb5ab9c1e3f247d518cdaaa56d6","glsl-optimizer/src/compiler/glsl/ast_function.cpp":"74f4fbd490e366b37f4715168bb3465ecd9334d4130942f75dcc8e80e8e7f027","glsl-optimizer/src/compiler/glsl/ast_to_hir.cpp":"d0f798eb09271d41d068b9e7b18220d37f1ed0083300ab51eba30989698fe23d","glsl-optimizer/src/compiler/glsl/ast_type.cpp":"8eb790b24b26dfb72bdc333744b566c26d8464c5d47d20eae659461f5c4899f7","glsl-optimizer/src/compiler/glsl/builtin_functions.cpp":"454189d643c220fcb49116ee5c8a34f7b349aa67564040deb8607f6a41a15e70","glsl-optimizer/src/compiler/glsl/builtin_functions.h":"a37cad7ed09b522c5b8bec7b80115a36846e7ba6e0874a2a858e32f7f202c665","glsl-optimizer/src/compiler/glsl/builtin_int64.h":"619def6f3aebf180da3944ef08f159ab12a58b24767e41d8b985ac37ded54d62","glsl-optimizer/src/compiler/glsl/builtin_types.cpp":"afec060b62d6f3b00bfbf94e9fa5f96341ce096c128d1eef322791e6ed9cea4d","glsl-optimizer/src/compiler/glsl/builtin_variables.cpp":"6563bfb1345cbca4c77e00eef09ad152f3e1dc271d246a08c5ce9e1f4ce4250a","glsl-optimizer/src/compiler/glsl/float64.glsl":"1072fd888be48c2a7a5117cd2d92a65f034965a66375f598bb856bff5d7be766","glsl-optimizer/src/compiler/glsl/generate_ir.cpp":"e5f0175370a0d07f93c48d3f0f1b8233d12c64a7b02de02dcc753ef7b398ef0f","glsl-optimizer/src/compiler/glsl/glcpp/README":"a0332a1b221d047e9cce5181a64d4ac4056046fd878360ec8ae3a7b1e062bcff","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-lex.c":"2d179879b1ffe84f58875eee5b0c19b6bae9c973b0c48e6bcd99978f2f501c80","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-lex.l":"e4c5744c837200dafd7c15a912d13f650308ea552454d4fa67271bc0a5bde118","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-parse.c":"03494f9ce1cb82260506e2559e73a3eeb622c4bd51b65eaa0a2c3351862bd4c8","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-parse.h":"264d9a18421cde255ce34a0a62b3d8e73465359f0d167e64aa3973062aae5bdd","glsl-optimizer/src/compiler/glsl/glcpp/glcpp-parse.y":"fafb66e3a8f149d19e085f18a4273ba6d4c11af9e9a01d665cc784dddf97b79f","glsl-optimizer/src/compiler/glsl/glcpp/glcpp.c":"37ed294403c2abfd17fd999d1ae8d11b170e5e9c878979fefac74a31195c96b0","glsl-optimizer/src/compiler/glsl/glcpp/glcpp.h":"85ac8b444bcbd0822b66448a1da407b6ae5467b649f5afaf5c58325bd7569468","glsl-optimizer/src/compiler/glsl/glcpp/pp.c":"a52d94f1bcb3fb2747a95709c4a77c25de7eea8354d2b83bb18efd96976a4473","glsl-optimizer/src/compiler/glsl/glcpp/pp_standalone_scaffolding.c":"d11aeb3acfe966d1b78f1ee49804093f2434214c41391d139ffcb67b69dc9862","glsl-optimizer/src/compiler/glsl/glcpp/pp_standalone_scaffolding.h":"abbf1f36ec5a92d035bfbb841b9452287d147616e56373cdbee1c0e55af46406","glsl-optimizer/src/compiler/glsl/glsl_lexer.cpp":"272b9fc1383d72b81bfc03fa11fdf82270ed91a294e523f9ce2b4554bd3effa9","glsl-optimizer/src/compiler/glsl/glsl_lexer.ll":"2b57d9f9eb830c3d7961d4533048a158ee6f458c8d05c65bea7b7cfbc36e4458","glsl-optimizer/src/compiler/glsl/glsl_optimizer.cpp":"f8095d20629d0af70be930b0612e169edb274551a1d25a3cd1bf9995a11ce2e8","glsl-optimizer/src/compiler/glsl/glsl_optimizer.h":"22e843b4ec53ba5f6cd85ca5f7bad33922dca8061b19fb512d46f1caca8d4757","glsl-optimizer/src/compiler/glsl/glsl_parser.cpp":"126baf368d525aba301854e3d91ba60b5aee32e1102376af71416f32cb95ec48","glsl-optimizer/src/compiler/glsl/glsl_parser.h":"2ea9a50716098a8f7bef782d2a030d757b68da73afb01b4d4940d3e8381d44e8","glsl-optimizer/src/compiler/glsl/glsl_parser.yy":"6b1fd1576b29fce005dff744a6dbd0219e4c695c361d61864e1f3a8d6fa6b764","glsl-optimizer/src/compiler/glsl/glsl_parser_extras.cpp":"aad64b5b66467da650091430681e8c6a820cf3cadc4db3c160bf2f15875390ae","glsl-optimizer/src/compiler/glsl/glsl_parser_extras.h":"71fd0e92bbdb193dfb067d7bfdb1200d77392be2fbd0cbfc9ca89d1bb4c7e741","glsl-optimizer/src/compiler/glsl/glsl_symbol_table.cpp":"6660fb83c0ddddbbd64581d46ccfdb9c84bfaa99d13348c289e6442ab00df046","glsl-optimizer/src/compiler/glsl/glsl_symbol_table.h":"24682b8304e0ea3f6318ddb8c859686bd1faee23cd0511d1760977ae975d41bf","glsl-optimizer/src/compiler/glsl/hir_field_selection.cpp":"72a039b0fcab4161788def9e4bedac7ac06a20d8e13146529c6d246bd5202afd","glsl-optimizer/src/compiler/glsl/int64.glsl":"303dbe95dde44b91aee3e38b115b92028400d6a92f9268975d607471984e13eb","glsl-optimizer/src/compiler/glsl/ir.cpp":"2b4741cce90b5d4abff5d719c7324e2693c67294d4d99736cb241554adb281bc","glsl-optimizer/src/compiler/glsl/ir.h":"990b1c74447c4eb4835353ccb0ed9aea644f97fc1129ef1739cd935075d85d2e","glsl-optimizer/src/compiler/glsl/ir_array_refcount.cpp":"8cdc1cffe01e42e0566fa2193a75f789628e8025ad1b82f0ee6f204451b7f9f7","glsl-optimizer/src/compiler/glsl/ir_array_refcount.h":"75f06ec81342b379096ca52e1dc0fd5f19a11ff8e9b58203c20628179d644c12","glsl-optimizer/src/compiler/glsl/ir_basic_block.cpp":"1e2920b1c0ecb08424c745c558f84d0d7e44b74585cf2cc2265dc4dfede3fa2f","glsl-optimizer/src/compiler/glsl/ir_basic_block.h":"81be7da0fc0ee547cd13ec60c1fcd7d3ce3d70d7e5e988f01a3b43a827acdf05","glsl-optimizer/src/compiler/glsl/ir_builder.cpp":"daba29c5a1efdd5a9754f420eb3e2ebdf73485273497f40d4863dadeddb23c0d","glsl-optimizer/src/compiler/glsl/ir_builder.h":"2822e74dd3f6e3df8b300af27d5b11ea2dd99d0e5e7ca809b7bbcce9833c483c","glsl-optimizer/src/compiler/glsl/ir_builder_print_visitor.cpp":"8c6df5abf2fe313363f285f171c19ca6c8ee4f3bc2ed79d33c0c88cc8be45c48","glsl-optimizer/src/compiler/glsl/ir_builder_print_visitor.h":"799852adc3a0e54d04080655e7cebfa0d3bf5b6ffed5d8414f141380665d4db7","glsl-optimizer/src/compiler/glsl/ir_clone.cpp":"d897a4e1f5bbec4a6a2f15044c1be9a4d13899c73be77335b041049a4589aa5d","glsl-optimizer/src/compiler/glsl/ir_constant_expression.cpp":"78bd87ddb09db67f6c499067728d72aef4f16aa02721a99a4b769d1e0cfa9010","glsl-optimizer/src/compiler/glsl/ir_equals.cpp":"bca28533a6310b0fc152b56d80872368f1510dc62ed6e8ac199b9ffa7fac02e7","glsl-optimizer/src/compiler/glsl/ir_expression_flattening.cpp":"7e918d4e1f237eca01396004015865ce345afe32a876c9dbc6728576a1a7eae4","glsl-optimizer/src/compiler/glsl/ir_expression_flattening.h":"f45b66aa9497520e7e08e612d24b308477c34477fbd963ee9320eac664957f16","glsl-optimizer/src/compiler/glsl/ir_expression_operation.h":"cc9f10727dbd26cac506804f51456302c702650f9eeb59054a7e1575d5cf6687","glsl-optimizer/src/compiler/glsl/ir_expression_operation.py":"7b86c96021b9fbe165957f4ecb0b612fefcde1c2cf3c6d75e3cdb22e369216ba","glsl-optimizer/src/compiler/glsl/ir_expression_operation_constant.h":"9ad3346416392e3efa11e12ecf2feca7453c5253d241eb96c91dfb85d4f2b971","glsl-optimizer/src/compiler/glsl/ir_expression_operation_strings.h":"a6826daf496a8b9e89885bc2a161ac3445d501b23c6e0ac33e2c01b506b273c8","glsl-optimizer/src/compiler/glsl/ir_function.cpp":"7537365fc0fbe4b37a26b9a2146cc64d3e9a774d60eab63b65002ad165ae8fc7","glsl-optimizer/src/compiler/glsl/ir_function_can_inline.cpp":"faddbf112187a048d502716a3fb82570a322299ba2a3abd79388382c82040bfc","glsl-optimizer/src/compiler/glsl/ir_function_detect_recursion.cpp":"9176973eaf5c0a984701f953bb7a80f37dca43d59b5bce50fc69b3f02f2902d7","glsl-optimizer/src/compiler/glsl/ir_function_inlining.h":"9739493f99c489987d650762fccdd3fb3d432f6481d67f6c799176685bd59632","glsl-optimizer/src/compiler/glsl/ir_hierarchical_visitor.cpp":"3725861fbe2b98e0617f52d3b14cf6d3b25fb5ec00f5ef5d308b03642f592767","glsl-optimizer/src/compiler/glsl/ir_hierarchical_visitor.h":"e0560210e966c0c31e4ca843e80ea154e64db5a444b8c2df845b6ba5b3a43fc1","glsl-optimizer/src/compiler/glsl/ir_hv_accept.cpp":"caf7ce2cd9494aadd3c58bcf77f29de58368dc9e347a362bbf37f8bda9509b80","glsl-optimizer/src/compiler/glsl/ir_optimization.h":"8b3dcfc7f9e96b21a8dd47a0040d90be483a9e67a2cdce3a697188fb758d4630","glsl-optimizer/src/compiler/glsl/ir_print_glsl_visitor.cpp":"f8e34a983452be0dcb5a695e9c8e895eead24f9e540992a8afe510ae85da4c4c","glsl-optimizer/src/compiler/glsl/ir_print_glsl_visitor.h":"1ad1bd3efd1ace39051c13f904c05fd80425d329444f9a8d47fd6d948faf46e0","glsl-optimizer/src/compiler/glsl/ir_print_visitor.cpp":"643f5a68aae3fb37267fd793f1216d1cfdeb2c09338c26b1f30e4c6deaef4de5","glsl-optimizer/src/compiler/glsl/ir_print_visitor.h":"4573eb93268a2654c14b505253dd651e2695d43dc745904d824da18305269b95","glsl-optimizer/src/compiler/glsl/ir_reader.cpp":"06bfba802c8354e5a8b2334b6d78d6297de18235bedd3f8fbb382c89870b02f2","glsl-optimizer/src/compiler/glsl/ir_reader.h":"63e3f7f1597936a7011d5b520e171b197bf82bee6c1560d822c3edf5aaa6f9e9","glsl-optimizer/src/compiler/glsl/ir_rvalue_visitor.cpp":"84b5c5d746555adca85759c2912fe48010232b7c1c0bd2cf03bd04067a85e66f","glsl-optimizer/src/compiler/glsl/ir_rvalue_visitor.h":"fd8c561b71085d3211fff85ed514fecb299d8ce19a04bc063419a55b6d840525","glsl-optimizer/src/compiler/glsl/ir_set_program_inouts.cpp":"ab9f115ce9e7f312d9c7978340ced0dc4ae6d13a80e08442ba9709d11d50cae5","glsl-optimizer/src/compiler/glsl/ir_uniform.h":"683ae6896b1a08470c090be5f822fc31cd434eab9216e954b9bba24a46975109","glsl-optimizer/src/compiler/glsl/ir_unused_structs.cpp":"9c1620c45f2fc071fe5ed828472040b14c5f42effe06aa0e3b8352c95ef78786","glsl-optimizer/src/compiler/glsl/ir_unused_structs.h":"13387b49c23093575276b25b9dfd31fedd8f131c5c4f3128ab04cf03e15b5295","glsl-optimizer/src/compiler/glsl/ir_validate.cpp":"6b232be5999a86ea278f4f15b2832d76843246509118d924243055a3b9b0299f","glsl-optimizer/src/compiler/glsl/ir_variable_refcount.cpp":"2764a3cad937d53f36db7447c3a5b98b04bf153acf81074d971857fc5bca460d","glsl-optimizer/src/compiler/glsl/ir_variable_refcount.h":"b0668e3eb1501ef65e38fe12830742ecb3d28e6039f30e366c8924efc29b4a39","glsl-optimizer/src/compiler/glsl/ir_visitor.h":"f21b3534c3d66d5fb707d1581fece7e1eb043523afbaedf89918cfb031c6df94","glsl-optimizer/src/compiler/glsl/link_atomics.cpp":"360f0209e11f367ba358223597b0a118bae095bff16337cf03f1fb89c5b80ca6","glsl-optimizer/src/compiler/glsl/link_functions.cpp":"de7895da8aa33a1e3c2c1eb2fdaf267ab5d1fbfdb79ae2e67f95211e946e294c","glsl-optimizer/src/compiler/glsl/link_interface_blocks.cpp":"1926cfa73810704eb19b916c1b2cdb9321155e2f98b2a0a57c7c3c6e960540cd","glsl-optimizer/src/compiler/glsl/link_uniform_block_active_visitor.cpp":"1e14e06ca3b2c1089cfba2e8eaf0c1f373d9d6374b6082f320962dd71ae09611","glsl-optimizer/src/compiler/glsl/link_uniform_block_active_visitor.h":"fd58c155af645295bb6aec08797889de586f4d919731de2bce57e8dce59bb048","glsl-optimizer/src/compiler/glsl/link_uniform_blocks.cpp":"09589f49776dce32e6c4044937de7e0c839a9754ad31960148f8f9e010658997","glsl-optimizer/src/compiler/glsl/link_uniform_initializers.cpp":"bf98e08c12db466acf9623cbeb8fa8e3b4002512722e7a6521287f558a099f37","glsl-optimizer/src/compiler/glsl/link_uniforms.cpp":"84bad5b1377362cecf259b05124239be5220b03ce1c0c61b59bd9a47e4379af2","glsl-optimizer/src/compiler/glsl/link_varyings.cpp":"a5f1a53e7c80d635515fe808ff223d89fef1767abb0f2b7aa28fa6773dca353f","glsl-optimizer/src/compiler/glsl/link_varyings.h":"b9dbe018f038df69763df2e928742ce81bbc6e3aaba26f50621e30a6d9aa6220","glsl-optimizer/src/compiler/glsl/linker.cpp":"40b1ecd5d4f6c7f13d5a87ce390561a51fdf6f3fcd9b2197b9c88b03a773ba94","glsl-optimizer/src/compiler/glsl/linker.h":"ecf94b4ad75ef461c27c557fda4bd25f34c91930822b8e1d729ec84520d4a049","glsl-optimizer/src/compiler/glsl/linker_util.cpp":"1663ad88e2a369305659aeeffaedb5bd752cf76340a2ba5797fc0bf600633cf9","glsl-optimizer/src/compiler/glsl/linker_util.h":"6db788daf9c8e87ae2764b61a8b37ebe419e69c1b82ddee01986e37c978c6993","glsl-optimizer/src/compiler/glsl/list.h":"b1f46ce0e552fe7c45b2a19408a9d97662e23e4b182ab335491c26f8cf25886f","glsl-optimizer/src/compiler/glsl/loop_analysis.cpp":"57ecd573477c68091c7cc99537faa7139a8f395935e3d4f10144cefdefb5a611","glsl-optimizer/src/compiler/glsl/loop_analysis.h":"a85f045a038ee5b5176063e85d7988865862c44ab0580f771b993a042d0b69cc","glsl-optimizer/src/compiler/glsl/loop_unroll.cpp":"bd4292ea2809f5a669bcb76ceaa1ac365772dcd638c579c3ed10275214901a54","glsl-optimizer/src/compiler/glsl/lower_blend_equation_advanced.cpp":"8cfbef140d9c4b4d2f57bfa05c9c374d31a121d0f87afce94333f049023b654a","glsl-optimizer/src/compiler/glsl/lower_buffer_access.cpp":"1ae221c3c7a95aeb867207e7a742be635f91b406c157747bfd6ddf10274d97fb","glsl-optimizer/src/compiler/glsl/lower_buffer_access.h":"807886953a576a323591798cbca5e2df24295ea893b28affd8ffb5926cebaa04","glsl-optimizer/src/compiler/glsl/lower_builtins.cpp":"4d81afc32cf58e1481fcb5e42888ab93dbe6820310a20ff7a9982b77b2152d9b","glsl-optimizer/src/compiler/glsl/lower_const_arrays_to_uniforms.cpp":"608403f0eeeedf21cfcd3014116e0f44e28cbdf6c4c32aac7e613e64e30205e1","glsl-optimizer/src/compiler/glsl/lower_cs_derived.cpp":"179905cd47a294122adeb5b0abfed6f2f67782dcde21b544d1ee2c1985154e66","glsl-optimizer/src/compiler/glsl/lower_discard.cpp":"3b361b2db0004d544d64611cb50d5a6e364cf6c5f2e60c449085d7d753dd7fb0","glsl-optimizer/src/compiler/glsl/lower_discard_flow.cpp":"f5c29b6a27690bb5c91f196d1a1cf9f6be4f1025292311fe2dac561ce6774dee","glsl-optimizer/src/compiler/glsl/lower_distance.cpp":"a118c85493d5d22b2c059a930c51a5854896d4b1dade76598eaa985e5a3dff8c","glsl-optimizer/src/compiler/glsl/lower_if_to_cond_assign.cpp":"469e617757fd1728709cce021aac5c8da05ee503bf5366977bdc4ef7a6d83950","glsl-optimizer/src/compiler/glsl/lower_instructions.cpp":"6ff5c396abe40d8a2145d571e99e2bbe9143393e15aafc28adc2803a01d821b6","glsl-optimizer/src/compiler/glsl/lower_int64.cpp":"d1ed41196880dd53c7b13e2782f9423f8442bf1d46186e8be92b1b66218a83ee","glsl-optimizer/src/compiler/glsl/lower_jumps.cpp":"34de7b493f281589fb0c2c0f6e885d0a0fabbe7a4e97a73de374dd714777a58c","glsl-optimizer/src/compiler/glsl/lower_mat_op_to_vec.cpp":"dff7a308edc4846c348ed4225c6699a9c75abac68d88f41f85954276552779f4","glsl-optimizer/src/compiler/glsl/lower_named_interface_blocks.cpp":"16063ac127bff75a68272070ab11c21c25101edbff62b4c68f4983b4cd941af0","glsl-optimizer/src/compiler/glsl/lower_offset_array.cpp":"3b00773399135aea85746a5a68b96ef000bc6841be1a2c8e6f25c516628b0949","glsl-optimizer/src/compiler/glsl/lower_output_reads.cpp":"a0fc9975d5aa1617e21fc6c353659a9802da9e83779a3eef4ec584f74b4dadc5","glsl-optimizer/src/compiler/glsl/lower_packed_varyings.cpp":"7550099d4ae123d71541c2fc88bc04fbfe9271ec75d7e210987d1c8cac3cf3ea","glsl-optimizer/src/compiler/glsl/lower_packing_builtins.cpp":"79a13d161fe505a410ab948d92769395708693ec888153630fa240e5b97e356f","glsl-optimizer/src/compiler/glsl/lower_precision.cpp":"f82a185b879872b977a1787d8061b9a80bc4cf8db1b970db6efba2ad9cc20fa2","glsl-optimizer/src/compiler/glsl/lower_shared_reference.cpp":"ea2dccf50a83bc19391bf6b7ab6aa53c0005f427af4066d25140340af9a4beef","glsl-optimizer/src/compiler/glsl/lower_subroutine.cpp":"f69fa53650eeb6f2944fce4d36a6e0a423e6705f3a3bd3389c7fadb83cfc8802","glsl-optimizer/src/compiler/glsl/lower_tess_level.cpp":"b196c9d424c0569f3e85d75c2d125af21566cb113d69036db87c0990703e0fa7","glsl-optimizer/src/compiler/glsl/lower_texture_projection.cpp":"4d247f244272adc8250fd888d8d932a140dd5de4d1efc7a58492c3c2b8291527","glsl-optimizer/src/compiler/glsl/lower_ubo_reference.cpp":"89bdbc6c1669230c644c0857db1ce2781ec61d349ecd08c7914146e1f4750a4a","glsl-optimizer/src/compiler/glsl/lower_variable_index_to_cond_assign.cpp":"fce930f29ac9405b297d1f749d68f59506b89c70b4ee1b1ab8cf49a34cc71ecf","glsl-optimizer/src/compiler/glsl/lower_vec_index_to_cond_assign.cpp":"3c67d851a11a55fad1c49a550f3a0cfe50892d33a3f238ce266cd829eba510a8","glsl-optimizer/src/compiler/glsl/lower_vec_index_to_swizzle.cpp":"f5ec666b73e1415cbab32519a53605ed385f3b03e889560373dbce69dda5000e","glsl-optimizer/src/compiler/glsl/lower_vector.cpp":"f7c13f5572ebe09b6a71553133b2cf003cd4b77b9657600672ee3b21bf890725","glsl-optimizer/src/compiler/glsl/lower_vector_derefs.cpp":"b05793da6dd620a531b43df5af8b2ecbc37b9db0c88910f5724ea10bcd057e19","glsl-optimizer/src/compiler/glsl/lower_vector_insert.cpp":"fee772ec17eea5e86a529bf9c5fa2ee0d29a5982bb75ebc6d68ed36cd19aa299","glsl-optimizer/src/compiler/glsl/lower_vertex_id.cpp":"690e8715182e03fead5cc5a35251fb4f41b357e4c71a1dfbc4bd7be19862b56d","glsl-optimizer/src/compiler/glsl/lower_xfb_varying.cpp":"58c0e8b270e4bbde54250be03cdb2f36966bcafb785372ad2e2b786835df7f9f","glsl-optimizer/src/compiler/glsl/main.cpp":"ae5e88abbbc8a12f769e1296bad938b9d7398cc6da0d3d0caeceeeb876536850","glsl-optimizer/src/compiler/glsl/opt_add_neg_to_sub.h":"f5054944bfd068810629080d0ea11df78b3f57a8f86df75e13ca50157ad1964d","glsl-optimizer/src/compiler/glsl/opt_algebraic.cpp":"25f45b20e1972ee8c789177a1aeda6e4286c25db2eae3a43ff83029ae64969c0","glsl-optimizer/src/compiler/glsl/opt_array_splitting.cpp":"19d3ce0e815438f4df9ab2890e767b03a4f3f191b53bb30c0217cf2ae6a95430","glsl-optimizer/src/compiler/glsl/opt_conditional_discard.cpp":"0e44e0e126711a3725c1f3a2aa65ff03c381fed08680ffc30101aae60f716c4e","glsl-optimizer/src/compiler/glsl/opt_constant_folding.cpp":"a088d04d9b45f9e55e235835648f614c89b7803c03a6d4f6a6d1a6bc1f0228bd","glsl-optimizer/src/compiler/glsl/opt_constant_propagation.cpp":"8a9440d77ecd6dcf13e683cbb99943aab6311c8fd4b5f6a9189a8d4f270746f4","glsl-optimizer/src/compiler/glsl/opt_constant_variable.cpp":"63d3ccd4dd09f19c9cf1a2f51592111bed41284504f29f3c0de4cadebc439a37","glsl-optimizer/src/compiler/glsl/opt_copy_propagation_elements.cpp":"ffa0f50863995e0d2e31f55a52e82319edc71e520987bebd7f7e561ea331c64b","glsl-optimizer/src/compiler/glsl/opt_dead_builtin_variables.cpp":"84e8747b948232f01dd56b428b9315f96f9511f605f240119fc446fae28981a9","glsl-optimizer/src/compiler/glsl/opt_dead_builtin_varyings.cpp":"761523e88f5b3ba785170f4d7205e94fa99acb7e74d29efbe40e1c010e1dbdb3","glsl-optimizer/src/compiler/glsl/opt_dead_code.cpp":"fd1ba2da7337d4e5dad17f5c2d73d9cc8880305f423e85d64cf94553588fa401","glsl-optimizer/src/compiler/glsl/opt_dead_code_local.cpp":"969a598b4df322baf222258a66cd64a326ea20e5b3125be9d8d1771f522c69e0","glsl-optimizer/src/compiler/glsl/opt_dead_functions.cpp":"774cae6536d02edf26e996a2a895e1f62d5098f16dc96b44798b4fc731a9a95f","glsl-optimizer/src/compiler/glsl/opt_flatten_nested_if_blocks.cpp":"3696a5c55f02e20056e085bc2714f73ac992f221b6f3387d655068e86b512046","glsl-optimizer/src/compiler/glsl/opt_flip_matrices.cpp":"44f0fe05b49329667671f88c96dc86ab3fe1459ff7b87f2b2d88de2d49829f9f","glsl-optimizer/src/compiler/glsl/opt_function_inlining.cpp":"fb56a33c90419a01676b57cbd91d0674a54cca40e6defaacc88dd33facebc131","glsl-optimizer/src/compiler/glsl/opt_if_simplification.cpp":"ac406eb35e379c357641d6c5749f50c65961455924d3dc884e2b90046fa92c5c","glsl-optimizer/src/compiler/glsl/opt_minmax.cpp":"8abd59d3b14ef60ff14a9c69660e6945f5cf10b97edb4afebe56be3f81d96316","glsl-optimizer/src/compiler/glsl/opt_rebalance_tree.cpp":"8bb6329dc0f299042368fc81934c2df019b45ab9f7aa0415d4e57b8d1ff98c9f","glsl-optimizer/src/compiler/glsl/opt_redundant_jumps.cpp":"222c73e2ac7a938ebb6428cc6c780c908ff6156d8ff935b04fed93a48fc10496","glsl-optimizer/src/compiler/glsl/opt_structure_splitting.cpp":"2edc79cc13f3177934e0443ad62f5976a1991f01f86ea303a803434849b13a47","glsl-optimizer/src/compiler/glsl/opt_swizzle.cpp":"015d0abddfe507f67c4b96c82988d861d018ededf7bf055e2bcbe9ea92da694e","glsl-optimizer/src/compiler/glsl/opt_tree_grafting.cpp":"46d28ac983ea244a4315bdc0e8892979ec4d1f9b9a96ac8a8a08006d9bc5e878","glsl-optimizer/src/compiler/glsl/opt_vectorize.cpp":"d80ee43bb97d9f016fb9c5e1e06f5b2afa569811f368ba067be794ec11d085fb","glsl-optimizer/src/compiler/glsl/program.h":"2982447e2abd35371e273ad87951722782a8b21c08294f67c39d987da1e1c55f","glsl-optimizer/src/compiler/glsl/propagate_invariance.cpp":"080943e21baa32494723a2eefb185915d2daae1f46d6df420145c5ad6857e119","glsl-optimizer/src/compiler/glsl/s_expression.cpp":"1ced972bc6ecc8eab4116ea71fb0212ab9ae5bcc0be3b47aa5d9d903566b3af1","glsl-optimizer/src/compiler/glsl/s_expression.h":"65b847e30e22a809b57d0bc70243049c99d9c6318803c5b8d0826aba55dc217e","glsl-optimizer/src/compiler/glsl/serialize.cpp":"be0eb4251348a9d921acb839a5c48c6023a2e9d116d602bb0432787ab623655d","glsl-optimizer/src/compiler/glsl/serialize.h":"57425732eba1233d928e5f07f88b623ce65af46b3bb034bf147f0a4b7f94f9a1","glsl-optimizer/src/compiler/glsl/shader_cache.cpp":"e0c5c433f2df3fccdf1d61281bfcb0ee5633433339b97c697d64db99611cbaaf","glsl-optimizer/src/compiler/glsl/shader_cache.h":"9217164d8d7f54aca0fe5922c7187095a6ae0cb703b196b79805aeef07a7e697","glsl-optimizer/src/compiler/glsl/standalone.cpp":"8e6c416a14d631261917a5fe4cc91880c287b22b2dfd70eb22028289a8fa5364","glsl-optimizer/src/compiler/glsl/standalone.h":"a7c397d1dfdd1e7fb2cfe99db35cd9df93251e642059208533202b7f20497f83","glsl-optimizer/src/compiler/glsl/standalone_scaffolding.cpp":"970d14b7a9d58e5270321f97bf5d57795558b1c570a56678e04a65b26c60bf4f","glsl-optimizer/src/compiler/glsl/standalone_scaffolding.h":"d921a617ea82b9e49413314492a645c44356de503581b1be3f1b57de236e480d","glsl-optimizer/src/compiler/glsl/string_to_uint_map.cpp":"d824bf5b839bd39498dc9e457103cdbe3e5289ddf7564107c27b1505948dd31f","glsl-optimizer/src/compiler/glsl/string_to_uint_map.h":"e2f18e66359c9d620e085de7f4a334a47df9c66e65a5bfe8b734c627bec04104","glsl-optimizer/src/compiler/glsl/test_optpass.h":"b27b8f35f5387e7ce4982bb51c7b63ccf14f91757f3108a5d02ed006925bb8a0","glsl-optimizer/src/compiler/glsl/xxd.py":"376484142f27f45090ea8203ae2621abf73f06175cb0ee8d96f44a3b9327f4bd","glsl-optimizer/src/compiler/glsl_types.cpp":"044bb6754f45419a3151e7a25c39202a82009ae3c6bc54ff7f0bb4258a5deefe","glsl-optimizer/src/compiler/glsl_types.h":"fd899a42f34ddeb8601bc3cd6c5e3aed82fc8aef4042dde1b39b3c01e1dcc219","glsl-optimizer/src/compiler/shader_enums.c":"436bff5216b11b0980bdfada5885fc6ac9afa2037a3027fcd6eea2a8635597ac","glsl-optimizer/src/compiler/shader_enums.h":"13220442a5c02e83540cf2c0ad4f8417b2fbda5f2586dec4e92082544c937cdd","glsl-optimizer/src/compiler/shader_info.h":"4c5453e81197ca83593ee4f365074b23530f2ab21c78e1733b63dec6f344c12a","glsl-optimizer/src/gallium/auxiliary/util/u_half.h":"3c2b37bda3ccb64387e44b723d29cf9046decab1a893bf42d842e9603398bdee","glsl-optimizer/src/gallium/include/pipe/p_compiler.h":"c75620096ce8523dae90599e50aa2ef6468d3b0e368a77795edeb20dd1abfc0c","glsl-optimizer/src/gallium/include/pipe/p_config.h":"a27692fc35f9e55df3224b7529e66b3001e911e94e6bc5f8f569e493e1ee3fb7","glsl-optimizer/src/gallium/include/pipe/p_defines.h":"be26d68c0acc67c5e44788c6299716a9eee415fd81d7d747e3738a829e3b6b38","glsl-optimizer/src/gallium/include/pipe/p_format.h":"5674215fc41d27496f037cf837717daefbf23ebb38d40ace7c0c414bc08182b0","glsl-optimizer/src/gallium/include/pipe/p_state.h":"d600593aba5f5a17072a6c38f6baa81e01c7994b0174250f7e433bb41684b702","glsl-optimizer/src/mapi/glapi/glapi.h":"73632a625c0ddabc401205e8b5a81eb8af8506868efe4b170d7979ec3619e9c5","glsl-optimizer/src/mesa/main/config.h":"5800259373099e5405de2eb52619f9de242552a479902a3a642a333c8cb3c1e7","glsl-optimizer/src/mesa/main/context.c":"2f3208473d99c94f734b1137ba91889d4a1babb9e7534bf1dc85d851ee98274e","glsl-optimizer/src/mesa/main/context.h":"cc7e4194797db9d007f01884e23d786c453b3860821f7f2ddcdf0f1bf3f8ffb1","glsl-optimizer/src/mesa/main/dd.h":"6a964acd06b6c2d88700e69fb75fe3c6b3b3d45bbc41db24f3f897a29695fe0c","glsl-optimizer/src/mesa/main/debug_output.h":"7312422e90b8c0e34028ac27280e438139b5cba525c99deb3ac883cd3d87e452","glsl-optimizer/src/mesa/main/draw.h":"7eaef3a9e27a60ea6f7937109bf3a6190b831162fde0479abb12077ce27c353d","glsl-optimizer/src/mesa/main/enums.h":"87d562a6764f51c014a2274fa7c3aca17c04441537ddd56b2554f13c6fffea92","glsl-optimizer/src/mesa/main/errors.h":"c79444b5df289c90fbb22a33b2d0c23917d9fc4510960088f0b79e53bb56b1b2","glsl-optimizer/src/mesa/main/extensions.h":"a38b2f87cc93c513994281350d69e06c84ff8eded5313ec0a1be33f375e0ebbd","glsl-optimizer/src/mesa/main/extensions_table.c":"17642d1a8c9a0bf2bd61060052d33ff14a005d2b962e6cf91465797a50851e85","glsl-optimizer/src/mesa/main/extensions_table.h":"2c879571c238d2e14461031ac740372fd0f9ac3a34c0d5541bb9b7ed4c0376c8","glsl-optimizer/src/mesa/main/formats.h":"02e2f7ec3e39286cf9f27e2641043e6df8ecb1dfde9e643313210e214af2a929","glsl-optimizer/src/mesa/main/glheader.h":"58217b33eead6aa6b23cd4a291cefeaa6cb84e465f4960daffca97c44d6d1c35","glsl-optimizer/src/mesa/main/glthread.h":"51fb2711f77e7eafcfc52d29d5b844978832b24c930d88accd48d143a6eb9c6f","glsl-optimizer/src/mesa/main/hash.h":"7e7f782034c16a8e693de48e00c31d4a90b0129f4029fd074033d7d16ccbe718","glsl-optimizer/src/mesa/main/macros.h":"73d15ddfd64f2b57b9b2ffeeb993b9c2c0899a80563e9d6ff337b11ccbe6eee5","glsl-optimizer/src/mesa/main/menums.h":"5dfac0e2279d60b0cd0c7b9fc2a5021620d0f6282ed2e738c420214e3af152d3","glsl-optimizer/src/mesa/main/mesa_private.h":"edda678b93438944279a551f663b8858ad84814a9fc88ba9672ef195599c24ae","glsl-optimizer/src/mesa/main/mtypes.h":"6efddefa099e4d2e3fdd97f0055644f47aba21711385edfeabc2d9b0676f2eec","glsl-optimizer/src/mesa/main/shaderobj.h":"9f0dfe96d0c2154201adef942bd36053533ac7b2492fb3786acda5bea514c75e","glsl-optimizer/src/mesa/main/uniforms.h":"4e331e6ad6e9cbded978b4082dbe0a57c1f8f01327446bb6892bfc179976c38b","glsl-optimizer/src/mesa/main/version.h":"9d0a13a758099302dc55cf7d045791834a89b0f9d4cf17b2692259b369a8a9a1","glsl-optimizer/src/mesa/math/m_matrix.h":"a37b19f182e070db3df93b0ede43c22fb8be8c2906504133ee6dbd7db1185d8b","glsl-optimizer/src/mesa/program/dummy_errors.c":"1820e305515b4c5e041f5e1623266a48ec8f076a155310be7d60637101f593e4","glsl-optimizer/src/mesa/program/ir_to_mesa.h":"b47f58d22e3ca2ae42d52501ea769d15c4476834944fa97eeccd3a3439211d00","glsl-optimizer/src/mesa/program/prog_instruction.h":"ab3832152a7e144b59e5a2264b2c29db56d93be31e76bbd958527a56771b40eb","glsl-optimizer/src/mesa/program/prog_parameter.h":"ba18c743284eadbc837c2c364c73e5d372321a7637a76e589d8d39fe8b5de225","glsl-optimizer/src/mesa/program/prog_statevars.h":"fc413698f84bc52d45fdeae0471934ee9904bfb7eac1a2b5f70446e54bcbbdca","glsl-optimizer/src/mesa/program/program.h":"1f01026a4eff440a3f122fd9b519d03546fe7f7d8be60dca834e95a2f8fbbfd2","glsl-optimizer/src/mesa/program/symbol_table.c":"6611cb9f078035bf5ff8c9112093a6c7d99f8af99a3931d0c07f227cc72283ea","glsl-optimizer/src/mesa/program/symbol_table.h":"631dc35ac48d5e87962d45507461920f6575610960ffcc42a08cefeb43300cda","glsl-optimizer/src/mesa/vbo/vbo.h":"6eb1dcd9a08c92f276c5fe08da184ff9d455d1be421913b8ad732a7b65e858fb","glsl-optimizer/src/util/bitscan.h":"9e49e694e6b34fe035bc685f32588827eb8cbe7d82878963c7ab52843e1c16aa","glsl-optimizer/src/util/bitset.h":"c40f78515c6230fed18345c6751ce33833a49da7a27901c7e6d7340cbdcbc5e7","glsl-optimizer/src/util/blob.c":"8f729846f66efc9c15485cc5fc24c6ec861fc1fecb2f652573f2a237d481b791","glsl-optimizer/src/util/blob.h":"93e1eaac866b9a7cd6fc03b533c18fb2edf0e97f03395eff4f3a605c4fc14d0c","glsl-optimizer/src/util/compiler.h":"79e3bf40a5bab704e6c949f23a1352759607bb57d80e5d8df2ef159755f10b68","glsl-optimizer/src/util/crc32.c":"2f3467a046b3a76784ecb9aa55d527698c8607fd0b12c622f6691aaa77b58505","glsl-optimizer/src/util/crc32.h":"59bd81865e51042b73a86f8fb117c312418df095fed2d828c5c1d1c8b6fc6cd4","glsl-optimizer/src/util/debug.c":"c3d68e9752ccc19e66c669562cd113cf1d0ac83cbb30174789e7fb8d1df58f9c","glsl-optimizer/src/util/debug.h":"50068d745c4199ccbd33d68dd4c8a36d2b5179c7869a21e75906ddd0718ca456","glsl-optimizer/src/util/detect_os.h":"343a8790d17a3710c6dd015ee367f84e3902ff3f2e36faca2bf93f9d725d3574","glsl-optimizer/src/util/disk_cache.c":"f533937e5a4fffe76e2739ef4b6b1e1da097d96d63eb808e68ebbc7027641c23","glsl-optimizer/src/util/disk_cache.h":"e83314fb14134a8e079b15e470a6376ba5a8253701f048c890a62b7e55d64bc8","glsl-optimizer/src/util/fast_urem_by_const.h":"e108fce804616c47d071dfe4a04163eec1126e448ed1aa89abb6b3a6d772bd5b","glsl-optimizer/src/util/fnv1a.h":"ab2596f19c6adf431ae27618f62c5743e24ad23ef83bb359a4c4c218245ab459","glsl-optimizer/src/util/format/u_format.h":"4cdfc0c59cbc99a092e5ec5a396910f2d93b9643e5d8141050b011e66f11e45b","glsl-optimizer/src/util/futex.h":"26f7c9d86e9ffef4c0fa2761f1aaa1918337302e20bd6ca10e61dc3c47356deb","glsl-optimizer/src/util/half_float.c":"11bc2584493d5d9d46e8c8a619a0307cf150bf5ab5d0f96bb764b061dc37a00e","glsl-optimizer/src/util/half_float.h":"7f7c380f126da1400a91758cc0392f24bf967bce1672890b62be26fe9fbd922b","glsl-optimizer/src/util/hash_table.c":"0ca40352e35dedab0a84c64c903f1b16d47e950bb5f43b4d22bb57d499bfea6e","glsl-optimizer/src/util/hash_table.h":"217191bb360592e2232f187473c10287d2cda8ae6fa5c53d0ef74c8c206118b4","glsl-optimizer/src/util/list.h":"9fab03c6a78186bb5f173269f825f6ce976b409d931852e3d93bac632e07989a","glsl-optimizer/src/util/macros.h":"63faf65b51058c483b17f1f77da51d1c53c8beab52678cb6bd01f1228a63b6b0","glsl-optimizer/src/util/mesa-sha1.c":"00c692ec353ebc02c06c57c5a71de0ab7a119f86a4146f452e65ec87e4944417","glsl-optimizer/src/util/mesa-sha1.h":"bff4c29f4bf7cdbcefb30fa0c996a7604a380eba8976467c2a60e7cd328f7e26","glsl-optimizer/src/util/mesa-sha1_test.c":"25da89a59d51469f77b4c468ca23ffdce0a7a1166a70b6cc23026a6800b0143c","glsl-optimizer/src/util/os_memory.h":"64555faf1760ae6954f42c83727c38dfc4c278e9152115779ffaad58b42adacf","glsl-optimizer/src/util/os_memory_aligned.h":"12d86fa94be38c13f7eeebdf313795e1267dd5a7187d2f0072e0e896f41702f6","glsl-optimizer/src/util/os_memory_stdc.h":"07360363b88c927065e10df71bebf6c8a0cc3b9167c9dfce55f2d65f11e6f787","glsl-optimizer/src/util/os_misc.c":"a9936e613ec84803abd59ad47c192c8e3939993c950ac91973fdc4cec1801bb8","glsl-optimizer/src/util/os_misc.h":"cc68eb12e05b5e749c54298cb4a6f4cd20cc5af7db3403e70b3c27b56090c740","glsl-optimizer/src/util/os_time.h":"73e775f7335244ff5964c678c27eedf1aea6abea44c4169d327ea8c7ce4a3a88","glsl-optimizer/src/util/ralloc.c":"4b51189595ef67bcef52c40cbf654d969041dbd15e15d4a893ad494ac060aeca","glsl-optimizer/src/util/ralloc.h":"e573c45875ff1530f0dbee9a93ae55535fdac8d5cc88a79ebc327c688824bde5","glsl-optimizer/src/util/rounding.h":"0450722353caf83de07e67f335949dbe95fe53b534052d4ee9d28d2781387614","glsl-optimizer/src/util/set.c":"86f8c9a830bead5a5a79bc970b0ff97809312af07b3beb39ef9d90af04d40a1b","glsl-optimizer/src/util/set.h":"3e39ca161e7ed4ec7c436cc9c7919ed9a55ed1b71edbf2caf6f9bcfd9bc578ed","glsl-optimizer/src/util/sha1/README":"00af7419af05247081858acb2902efd99fcda2ce16e331079f701645bb3729c0","glsl-optimizer/src/util/sha1/sha1.c":"1403bbe0aad42ba3e6be7e09f7cad87a6a8c4ad5b63962f7b92b9f37d8133b04","glsl-optimizer/src/util/sha1/sha1.h":"68d9f240eab2918026ecdf22be36811abbd4f1389f6c36e31258041aeaedd247","glsl-optimizer/src/util/simple_mtx.h":"12c6c3c4b7db9168bc656d5b3c65912075084d2b388c415d5c3d3f5953a9d6c7","glsl-optimizer/src/util/softfloat.c":"a97e51a96fe5e6a052c02aa6bbec683fe73fb88a8c087d9c930503e2120d8a2e","glsl-optimizer/src/util/softfloat.h":"66664b0250e83bf5dd4cc743acd119d076efcea624a0eab3d6b60718e6ee8811","glsl-optimizer/src/util/string_buffer.c":"63a1d1b1e34926c88ea00159cafbcd56568b805c4f64d1e8c97169fe313921fc","glsl-optimizer/src/util/string_buffer.h":"7b88d1b1d9c6cfb8e93331813535c127289437c75f822029e9a3bca8ea6b52ee","glsl-optimizer/src/util/strndup.h":"0273c4fdb7482cd7746881a63d3998648c6d63415ba85af1d1860f0e0dc504c6","glsl-optimizer/src/util/strtod.c":"5cf610d8a37373cf37cfb7aae903525d943b2674b1f32594c70b0eb19a8c9697","glsl-optimizer/src/util/strtod.h":"237396def4e264d35ed4bedea00ef9a4ceab6d7a11a18c770d9747d22c69ed2d","glsl-optimizer/src/util/u_atomic.h":"c02e809526c6c09ba8fe51f50b2490d1b6c8e5c7f3c4031ae958250d098fc3bb","glsl-optimizer/src/util/u_debug.c":"8c060e379b816618f3dd22c9ea523c68b9425c76c36a7dfe5d6d375b337f5f4a","glsl-optimizer/src/util/u_debug.h":"e11e26edd9b9e4e6f8e6a435e69f4d9edda27e9a379f68f4c82ea2525aaaea68","glsl-optimizer/src/util/u_dynarray.h":"853d0fa6ff2261614488be624deb8a2b01e57c2c8eabc28578cbeed4ccc95694","glsl-optimizer/src/util/u_endian.h":"3ccea7e529740318d8a4b05c00db3adc9d1e292a52bdc56a05c9fae99209720f","glsl-optimizer/src/util/u_math.c":"c868a8c0886dc78f1b06b13404ba8b253090449045774dd56893ac9d75795184","glsl-optimizer/src/util/u_math.h":"a04e32e126db016413f9de0a2028a3e71737137463b1289eae576f884b06fcf1","glsl-optimizer/src/util/u_memory.h":"c5db17c724c70283ddbe04165722f6988d4e0eb9aa3602ae472feff016649af9","glsl-optimizer/src/util/u_queue.h":"92930ce236c0528a98b695f5cea8c5c6aa9683beaf71a2227bdc5d33d1b21506","glsl-optimizer/src/util/u_string.h":"c5a2f4ef576d1547bda12c4ea219179fefa54414977743ac094abcaf696ef6ca","glsl-optimizer/src/util/u_thread.h":"00b708459b27f9910d18db92c18cc65cfc618ac2b3cd144e45f8640057b10d58","glsl-optimizer/src/util/xxhash.h":"2f2aff2fc6c0c929f52cf6ae7314122124c5be026d41ad1c357608383c4a37ad","src/bindings.rs":"79993db2058bde39f99ef483d02560d33b1cb882f6a552319e8b86eb6f9021e1","src/lib.rs":"04be1554cd829eb40864b06d80b491dd48117a4e3a601c7d482117f7a0391e67","wrapper.hpp":"f3ea34cc496f7d90b9bfcada3250b37b314c3524dac693b2ece9517bc7d274ac"},"package":"8ba4741358604ca0848c27ecc069d68e62e11cde81e38aac1da3c54b79ab5adf"} +\ No newline at end of file diff --git a/build-cacheFlush-missing.patch b/build-cacheFlush-missing.patch deleted file mode 100644 index 51c368c..0000000 --- a/build-cacheFlush-missing.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff -up firefox-55.0.3/js/src/jit/ExecutableAllocator.h.wasm firefox-55.0.3/js/src/jit/ExecutableAllocator.h ---- firefox-55.0.3/js/src/jit/ExecutableAllocator.h.wasm 2017-09-05 11:32:12.235909468 +0200 -+++ firefox-55.0.3/js/src/jit/ExecutableAllocator.h 2017-09-05 11:32:46.157916575 +0200 -@@ -219,7 +219,7 @@ class ExecutableAllocator - - static void poisonCode(JSRuntime* rt, JitPoisonRangeVector& ranges); - --#if defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_X64) || defined(JS_SIMULATOR_ARM64) -+#if defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_X64) || defined(JS_SIMULATOR_ARM64) || defined(JS_CODEGEN_NONE) - static void cacheFlush(void*, size_t) - { - } -diff -up firefox-55.0.3/js/src/jit-test/tests/wasm/bench/wasm_box2d.wasm firefox-55.0.3/js/src/jit-test/tests/wasm/bench/wasm_box2d diff --git a/build-ppc-jit.patch b/build-ppc-jit.patch deleted file mode 100644 index a9dc6d1..0000000 --- a/build-ppc-jit.patch +++ /dev/null @@ -1,51 +0,0 @@ -diff -up firefox-55.0/js/src/jit/MIR.h.old firefox-55.0/js/src/jit/MIR.h ---- firefox-55.0/js/src/jit/MIR.h.old 2017-08-08 14:04:44.528460099 +0200 -+++ firefox-55.0/js/src/jit/MIR.h 2017-08-08 14:05:11.045364831 +0200 -@@ -12434,7 +12434,7 @@ class MNearbyInt - TRIVIAL_NEW_WRAPPERS - - static bool HasAssemblerSupport(RoundingMode mode) { -- return Assembler::HasRoundInstruction(mode); -+ return false; - } - - RoundingMode roundingMode() const { return roundingMode_; } -diff -up firefox-55.0/js/src/jit/ExecutableAllocator.h.old firefox-55.0/js/src/jit/ExecutableAllocator.h ---- firefox-55.0/js/src/jit/ExecutableAllocator.h.old 2017-08-09 09:24:18.784983505 +0200 -+++ firefox-55.0/js/src/jit/ExecutableAllocator.h 2017-08-09 09:28:01.471100075 +0200 -@@ -307,6 +307,10 @@ class ExecutableAllocator - { - sync_instruction_memory((caddr_t)code, size); - } -+#else -+ static void cacheFlush(void*, size_t) -+ { -+ } - #endif - - private: -diff -up firefox-55.0/js/src/wasm/WasmBuiltins.cpp.old firefox-55.0/js/src/wasm/WasmBuiltins.cpp ---- firefox-55.0/js/src/wasm/WasmBuiltins.cpp.old 2017-08-09 12:50:46.877450765 +0200 -+++ firefox-55.0/js/src/wasm/WasmBuiltins.cpp 2017-08-09 12:50:59.725406974 +0200 -@@ -881,7 +881,6 @@ wasm::EnsureBuiltinThunksInitialized() - MOZ_ASSERT(!masm.numSymbolicAccesses()); - #endif - -- ExecutableAllocator::cacheFlush(thunks->codeBase, thunks->codeSize); - if (!ExecutableAllocator::makeExecutable(thunks->codeBase, thunks->codeSize)) - return false; - -diff -up firefox-55.0/js/src/wasm/WasmCode.cpp.old firefox-55.0/js/src/wasm/WasmCode.cpp ---- firefox-55.0/js/src/wasm/WasmCode.cpp.old 2017-08-09 12:50:37.205483731 +0200 -+++ firefox-55.0/js/src/wasm/WasmCode.cpp 2017-08-09 12:51:10.365370708 +0200 -@@ -287,8 +287,6 @@ CodeSegment::initialize(Tier tier, - if (!StaticallyLink(*this, linkData)) - return false; - -- ExecutableAllocator::cacheFlush(bytes_.get(), RoundupCodeLength(codeLength)); -- - // Reprotect the whole region to avoid having separate RW and RX mappings. - if (!ExecutableAllocator::makeExecutable(bytes_.get(), RoundupCodeLength(codeLength))) - return false; -diff -up firefox-55.0/media/libyuv/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.old firefox-55.0/media/libyuv/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium -diff -up firefox-55.0/media/webrtc/trunk/Makefile.old firefox-55.0/media/webrtc/trunk/Makefile diff --git a/build-rust-ppc64le.patch b/build-rust-ppc64le.patch deleted file mode 100644 index 2474c35..0000000 --- a/build-rust-ppc64le.patch +++ /dev/null @@ -1,25 +0,0 @@ -diff -up firefox-55.0/build/moz.configure/rust.configure.rust-ppc64le firefox-55.0/build/moz.configure/rust.configure ---- firefox-55.0/build/moz.configure/rust.configure.rust-ppc64le 2017-07-31 18:20:49.000000000 +0200 -+++ firefox-55.0/build/moz.configure/rust.configure 2017-08-02 10:19:03.254220003 +0200 -@@ -151,6 +151,9 @@ def rust_triple_alias(host_or_target): - ('sparc64', 'Linux'): 'sparc64-unknown-linux-gnu', - ('x86', 'Linux'): 'i686-unknown-linux-gnu', - ('x86_64', 'Linux'): 'x86_64-unknown-linux-gnu', -+ ('ppc64le', 'Linux'): 'powerpc64le-unknown-linux-gnu', -+ ('ppc64', 'Linux'): 'powerpc64-unknown-linux-gnu', -+ ('s390x', 'Linux'): 's390x-unknown-linux-gnu', - # OS X - ('x86', 'OSX'): 'i686-apple-darwin', - ('x86_64', 'OSX'): 'x86_64-apple-darwin', -@@ -174,8 +177,10 @@ def rust_triple_alias(host_or_target): - ('sparc64', 'SunOS'): 'sparcv9-sun-solaris', - }.get((host_or_target.cpu, os_or_kernel), None) - -+ if (rustc_target == 'powerpc64-unknown-linux-gnu' and host_or_target.endianness == 'little'): -+ rustc_target = 'powerpc64le-unknown-linux-gnu' - if rustc_target is None: -- die("Don't know how to translate {} for rustc".format(host_or_target.alias)) -+ die("Don't know how to translate {} for rustc, cpu: {}, os: {}".format(target.alias, target.cpu, os_or_kernel)) - - # Check to see whether our rustc has a reasonably functional stdlib - # for our chosen target. diff --git a/build-seccomp.patch b/build-seccomp.patch new file mode 100644 index 0000000..b57f65a --- /dev/null +++ b/build-seccomp.patch @@ -0,0 +1,11 @@ +diff -up thunderbird-145.0/security/sandbox/chromium/sandbox/linux/system_headers/linux_seccomp.h.seccomp thunderbird-145.0/security/sandbox/chromium/sandbox/linux/system_headers/linux_seccomp.h +--- thunderbird-145.0/security/sandbox/chromium/sandbox/linux/system_headers/linux_seccomp.h.seccomp 2025-12-09 13:42:31.378958842 +0100 ++++ thunderbird-145.0/security/sandbox/chromium/sandbox/linux/system_headers/linux_seccomp.h 2025-12-09 13:42:37.886937626 +0100 +@@ -6,6 +6,7 @@ + #define SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_SECCOMP_H_ + + #include ++#include + #include + + #include "build/build_config.h" diff --git a/fedora-shebang-build.patch b/fedora-shebang-build.patch deleted file mode 100644 index 9ade86c..0000000 --- a/fedora-shebang-build.patch +++ /dev/null @@ -1,9 +0,0 @@ -diff -up firefox-73.0/build/unix/run-mozilla.sh.old firefox-73.0/build/unix/run-mozilla.sh ---- firefox-73.0/build/unix/run-mozilla.sh.old 2020-02-12 09:58:00.150895904 +0100 -+++ firefox-73.0/build/unix/run-mozilla.sh 2020-02-12 09:58:06.505860696 +0100 -@@ -1,4 +1,4 @@ --#!/bin/sh -+#!/usr/bin/sh - # - # 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 diff --git a/firefox-glibc-dynstack.patch b/firefox-glibc-dynstack.patch deleted file mode 100644 index b0487d7..0000000 --- a/firefox-glibc-dynstack.patch +++ /dev/null @@ -1,64 +0,0 @@ -diff -ur firefox-90.0.orig/js/xpconnect/src/XPCJSContext.cpp firefox-90.0/js/xpconnect/src/XPCJSContext.cpp ---- firefox-90.0.orig/js/xpconnect/src/XPCJSContext.cpp 2021-07-05 21:16:02.000000000 +0200 -+++ firefox-90.0/js/xpconnect/src/XPCJSContext.cpp 2021-07-19 15:01:24.083460460 +0200 -@@ -85,14 +85,6 @@ - using namespace xpc; - using namespace JS; - --// The watchdog thread loop is pretty trivial, and should not require much stack --// space to do its job. So only give it 32KiB or the platform minimum. --#if !defined(PTHREAD_STACK_MIN) --# define PTHREAD_STACK_MIN 0 --#endif --static constexpr size_t kWatchdogStackSize = -- PTHREAD_STACK_MIN < 32 * 1024 ? 32 * 1024 : PTHREAD_STACK_MIN; -- - static void WatchdogMain(void* arg); - class Watchdog; - class WatchdogManager; -@@ -163,7 +155,7 @@ - // watchdog, we need to join it on shutdown. - mThread = PR_CreateThread(PR_USER_THREAD, WatchdogMain, this, - PR_PRIORITY_NORMAL, PR_GLOBAL_THREAD, -- PR_JOINABLE_THREAD, kWatchdogStackSize); -+ PR_JOINABLE_THREAD, 0); - if (!mThread) { - MOZ_CRASH("PR_CreateThread failed!"); - } -Only in firefox-90.0/js/xpconnect/src: XPCJSContext.cpp.firefox-glibc-dynstack -diff -ur firefox-90.0.orig/security/sandbox/linux/launch/SandboxLaunch.cpp firefox-90.0/security/sandbox/linux/launch/SandboxLaunch.cpp ---- firefox-90.0.orig/security/sandbox/linux/launch/SandboxLaunch.cpp 2021-07-05 18:20:36.000000000 +0200 -+++ firefox-90.0/security/sandbox/linux/launch/SandboxLaunch.cpp 2021-07-20 08:39:17.272136982 +0200 -@@ -501,8 +501,7 @@ - MOZ_NEVER_INLINE MOZ_ASAN_BLACKLIST static pid_t DoClone(int aFlags, - jmp_buf* aCtx) { - static constexpr size_t kStackAlignment = 16; -- uint8_t miniStack[PTHREAD_STACK_MIN] -- __attribute__((aligned(kStackAlignment))); -+ uint8_t miniStack[4096] __attribute__((aligned(kStackAlignment))); - #ifdef __hppa__ - void* stackPtr = miniStack; - #else -@@ -523,13 +522,19 @@ - CLONE_CHILD_CLEARTID; - MOZ_RELEASE_ASSERT((aFlags & kBadFlags) == 0); - -+ // Block signals due to small stack in DoClone. -+ sigset_t oldSigs; -+ BlockAllSignals(&oldSigs); -+ -+ int ret = 0; - jmp_buf ctx; - if (setjmp(ctx) == 0) { - // In the parent and just called setjmp: -- return DoClone(aFlags | SIGCHLD, &ctx); -+ ret = DoClone(aFlags | SIGCHLD, &ctx); - } -+ RestoreSignals(&oldSigs); - // In the child and have longjmp'ed: -- return 0; -+ return ret; - } - - static bool WriteStringToFile(const char* aPath, const char* aStr, -Only in firefox-90.0/security/sandbox/linux/launch: SandboxLaunch.cpp~ diff --git a/firefox-mach-D1957628.diff b/firefox-mach-D1957628.diff deleted file mode 100644 index 9c8be57..0000000 --- a/firefox-mach-D1957628.diff +++ /dev/null @@ -1,89 +0,0 @@ - -# HG changeset patch -# User ahochheiden -# Date 1743556649 0 -# Node ID c0faed343035719b07164a465d6f03de5cc6e25b -# Parent 656945d1a18403ec3800cf3d75f7f266a72798eb -Bug 1957628 - Fix 'optional pip install' breakage while maintaining enhanced error output for 'non-optional pip install' r=firefox-build-system-reviewers,sergesanspaille - -Differential Revision: https://phabricator.services.mozilla.com/D243902 - -diff --git a/python/mach/mach/site.py b/python/mach/mach/site.py ---- a/python/mach/mach/site.py -+++ b/python/mach/mach/site.py -@@ -715,19 +715,19 @@ class CommandSiteManager: - if not os.path.isabs(path): - path = os.path.join(self._topsrcdir, path) - - args = ["--requirement", path] - - if require_hashes: - args.append("--require-hashes") - -- install_result = self._virtualenv.pip_install(args) -- -- if install_result.returncode: -+ try: -+ install_result = self._virtualenv.pip_install(args) -+ except subprocess.CalledProcessError: - raise InstallPipRequirementsException( - f'Failed to install "{path}" into the "{self._site_name}" site.' - ) - - check_result = subprocess.run( - pip_command(python_executable=self.python_path, subcommand="check"), - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, -@@ -1042,36 +1042,42 @@ class PythonVirtualenv: - install_result = subprocess.run( - pip_command( - python_executable=self.python_path, - subcommand="install", - args=pip_install_args, - ), - **kwargs, - ) -- return install_result - except subprocess.CalledProcessError as cpe: - if not self._quiet: -+ # We print the stdout/stderr on a failed install here so that we don't -+ # need to do it for every code path. We still raise the CalledProcessError -+ # afterward so that the different paths can do their own handling. - if cpe.stdout: - print(cpe.stdout) - if cpe.stderr: - print(cpe.stderr, file=sys.stderr) -- sys.exit(1) -+ raise cpe -+ -+ # On one code path we do a 'pip check', and if that fails, having the stdout -+ # of the 'pip install' is helpful for debugging, so we pass it along here so -+ # that we can print later if we hit that scenario. -+ return install_result - - def install_optional_packages(self, optional_requirements): - for requirement in optional_requirements: - try: - self.pip_install_with_constraints([str(requirement.requirement)]) -- except subprocess.CalledProcessError as error: -- print( -- f"{error.output if error.output else ''}" -- f"{error.stderr if error.stderr else ''}" -- f"Could not install {requirement.requirement.name}, so " -- f"{requirement.repercussion}. Continuing." -- ) -+ except subprocess.CalledProcessError: -+ if not self._quiet: -+ print( -+ f"Could not install {requirement.requirement.name}, so " -+ f"{requirement.repercussion}. Continuing." -+ ) - - def _resolve_installed_packages(self): - return _resolve_installed_packages(self.python_path) - - - class RequirementsValidationResult: - def __init__(self): - self._package_discrepancies = [] - diff --git a/firefox-nss-version.patch b/firefox-nss-version.patch deleted file mode 100644 index 21985d1..0000000 --- a/firefox-nss-version.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up firefox-84.0.1/build/moz.configure/nss.configure.nss-version firefox-84.0.1/build/moz.configure/nss.configure ---- firefox-84.0.1/build/moz.configure/nss.configure.nss-version 2020-12-21 20:07:33.000000000 +0100 -+++ firefox-84.0.1/build/moz.configure/nss.configure 2020-12-22 10:23:02.156625919 +0100 -@@ -9,7 +9,7 @@ option("--with-system-nss", help="Use sy - imply_option("--with-system-nspr", True, when="--with-system-nss") - - nss_pkg = pkg_check_modules( -- "NSS", "nss >= 3.59.1", when="--with-system-nss", config=False -+ "NSS", "nss >= 3.59", when="--with-system-nss", config=False - ) - - set_config("MOZ_SYSTEM_NSS", True, when="--with-system-nss") diff --git a/firefox-testing.patch b/firefox-testing.patch deleted file mode 100644 index d380b48..0000000 --- a/firefox-testing.patch +++ /dev/null @@ -1,69 +0,0 @@ -diff -up firefox-96.0.1/docshell/base/crashtests/crashtests.list.testing firefox-96.0.1/docshell/base/crashtests/crashtests.list ---- firefox-96.0.1/docshell/base/crashtests/crashtests.list.testing 2022-01-13 20:26:02.000000000 +0100 -+++ firefox-96.0.1/docshell/base/crashtests/crashtests.list 2022-01-18 10:42:02.642971427 +0100 -@@ -13,7 +13,6 @@ load 614499-1.html - load 678872-1.html - skip-if(Android) pref(dom.disable_open_during_load,false) load 914521.html # Android bug 1584562 - pref(browser.send_pings,true) asserts(0-2) load 1257730-1.html # bug 566159 --load 1331295.html - load 1341657.html - load 1584467.html - load 1614211-1.html -diff -up firefox-96.0.1/dom/media/tests/crashtests/crashtests.list.testing firefox-96.0.1/dom/media/tests/crashtests/crashtests.list ---- firefox-96.0.1/dom/media/tests/crashtests/crashtests.list.testing 2022-01-13 20:26:03.000000000 +0100 -+++ firefox-96.0.1/dom/media/tests/crashtests/crashtests.list 2022-01-18 10:42:02.642971427 +0100 -@@ -25,7 +25,6 @@ asserts-if(Android,0-1) pref(browser.lin - load 1443212.html - asserts-if(Android,0-2) load 1453030.html - load 1468451.html --skip-if(Android) load 1490700.html # No screenshare on Android - load 1505957.html - load 1509442.html - load 1511130.html -diff -up firefox-96.0.1/testing/marionette/harness/marionette_harness/tests/unit/test_marionette.py.testing firefox-96.0.1/testing/marionette/harness/marionette_harness/tests/unit/test_marionette.py ---- firefox-96.0.1/testing/marionette/harness/marionette_harness/tests/unit/test_marionette.py.testing 2022-01-13 20:26:09.000000000 +0100 -+++ firefox-96.0.1/testing/marionette/harness/marionette_harness/tests/unit/test_marionette.py 2022-01-18 10:42:02.642971427 +0100 -@@ -98,15 +98,7 @@ class TestMarionette(MarionetteTestCase) - - def test_application_update_disabled(self): - # Updates of the application should always be disabled by default -- with self.marionette.using_context("chrome"): -- update_allowed = self.marionette.execute_script( -- """ -- let aus = Cc['@mozilla.org/updates/update-service;1'] -- .getService(Ci.nsIApplicationUpdateService); -- return aus.canCheckForUpdates; -- """ -- ) -- -+ update_allowed = False - self.assertFalse(update_allowed) - - -diff -up firefox-96.0.1/testing/tools/websocketprocessbridge/websocketprocessbridge_requirements_3.txt.testing firefox-96.0.1/testing/tools/websocketprocessbridge/websocketprocessbridge_requirements_3.txt ---- firefox-96.0.1/testing/tools/websocketprocessbridge/websocketprocessbridge_requirements_3.txt.testing 2022-01-13 23:26:17.000000000 +0100 -+++ firefox-96.0.1/testing/tools/websocketprocessbridge/websocketprocessbridge_requirements_3.txt 2022-01-18 10:42:02.642971427 +0100 -@@ -1,6 +1,7 @@ - # This file is the websocketprocess requirements.txt used with python 3. - - six -+pyrsistent - vcversioner==2.16.0.0 - twisted>=18.7.0 - -diff -up firefox-96.0.1/toolkit/crashreporter/test/unit/xpcshell.ini.testing firefox-96.0.1/toolkit/crashreporter/test/unit/xpcshell.ini ---- firefox-96.0.1/toolkit/crashreporter/test/unit/xpcshell.ini.testing 2022-01-13 23:26:17.000000000 +0100 -+++ firefox-96.0.1/toolkit/crashreporter/test/unit/xpcshell.ini 2022-01-18 10:58:40.574277255 +0100 -@@ -37,7 +37,6 @@ skip-if = (os != 'win' && os != 'linux') - - [test_crash_AsyncShutdown.js] - [test_event_files.js] --[test_crash_terminator.js] - - [test_crash_backgroundtask_moz_crash.js] - skip-if = os == 'win' -@@ -123,4 +122,3 @@ head = head_crashreporter.js head_win64c - skip-if = !(os == 'win' && bits == 64 && processor == 'x86_64') - reason = Windows test specific to the x86-64 architecture - support-files = test_crash_win64cfi_not_a_pe.exe -- diff --git a/firefox-tests-reftest.patch b/firefox-tests-reftest.patch deleted file mode 100644 index 6800721..0000000 --- a/firefox-tests-reftest.patch +++ /dev/null @@ -1,514 +0,0 @@ -diff -U0 firefox-92.0/dom/canvas/test/reftest/filters/reftest.list.firefox-tests-reftest firefox-92.0/dom/canvas/test/reftest/filters/reftest.list ---- firefox-92.0/dom/canvas/test/reftest/filters/reftest.list.firefox-tests-reftest 2021-09-01 19:14:40.000000000 +0200 -+++ firefox-92.0/dom/canvas/test/reftest/filters/reftest.list 2021-09-03 18:44:02.933897050 +0200 -@@ -21 +21 @@ --== units-ex.html ref.html -+fuzzy-if(gtkWidget,0-255,0-100) == units-ex.html ref.html -diff -U0 firefox-92.0/dom/html/reftests/autofocus/reftest.list.firefox-tests-reftest firefox-92.0/dom/html/reftests/autofocus/reftest.list ---- firefox-92.0/dom/html/reftests/autofocus/reftest.list.firefox-tests-reftest 2021-09-01 19:14:40.000000000 +0200 -+++ firefox-92.0/dom/html/reftests/autofocus/reftest.list 2021-09-03 18:44:02.933897050 +0200 -@@ -7 +7 @@ --fuzzy-if(gtkWidget,0-18,0-1) needs-focus == textarea-load.html textarea-ref.html # One anti-aliased corner. -+fuzzy-if(gtkWidget,0-56,0-2) needs-focus == textarea-load.html textarea-ref.html # One anti-aliased corner. -diff -U0 firefox-92.0/dom/html/reftests/reftest.list.firefox-tests-reftest firefox-92.0/dom/html/reftests/reftest.list ---- firefox-92.0/dom/html/reftests/reftest.list.firefox-tests-reftest 2021-09-01 19:14:40.000000000 +0200 -+++ firefox-92.0/dom/html/reftests/reftest.list 2021-09-03 18:44:02.933897050 +0200 -@@ -46 +45,0 @@ --skip-if(isCoverageBuild) fuzzy(0-2,0-830) random-if(useDrawSnapshot) == bug917595-iframe-1.html bug917595-1-ref.html -diff -U0 firefox-92.0/dom/media/test/reftest/reftest.list.firefox-tests-reftest firefox-92.0/dom/media/test/reftest/reftest.list ---- firefox-92.0/dom/media/test/reftest/reftest.list.firefox-tests-reftest 2021-09-01 19:14:40.000000000 +0200 -+++ firefox-92.0/dom/media/test/reftest/reftest.list 2021-09-03 18:50:43.693907440 +0200 -@@ -0,0 +1,9 @@ -+skip-if(Android) fuzzy-if(OSX,0-80,0-76800) fuzzy-if(appleSilicon,92-92,76799-76799) fuzzy-if(winWidget,0-62,0-76799) fuzzy-if(gtkWidget&&layersGPUAccelerated,0-70,0-2032) fuzzy-if(swgl,62-69,588-76737) HTTP(..) == short.mp4.firstframe.html short.mp4.firstframe-ref.html -+skip-if(Android) fuzzy-if(OSX,0-87,0-76797) fuzzy-if(appleSilicon,83-83,76797-76797) fuzzy-if(winWidget,0-60,0-76797) fuzzy-if(gtkWidget&&layersGPUAccelerated,0-60,0-6070) fuzzy-if(swgl,52-76,1698-76545) HTTP(..) == short.mp4.lastframe.html short.mp4.lastframe-ref.html -+skip-if(Android) skip-if(cocoaWidget) skip-if(winWidget) fuzzy-if(gtkWidget&&layersGPUAccelerated,0-57,0-4282) fuzzy-if(OSX,55-80,4173-4417) fuzzy-if(swgl,54-54,3653-3653) HTTP(..) == bipbop_300_215kbps.mp4.lastframe.html bipbop_300_215kbps.mp4.lastframe-ref.html -+skip-if(Android) fuzzy-if(OSX,0-25,0-175921) fuzzy-if(appleSilicon,49-49,176063-176063) fuzzy-if(winWidget,0-71,0-179198) fuzzy-if((/^Windows\x20NT\x2010\.0/.test(http.oscpu))&&(/^aarch64-msvc/.test(xulRuntime.XPCOMABI)),0-255,0-179500) HTTP(..) == gizmo.mp4.seek.html gizmo.mp4.55thframe-ref.html -+skip-if(Android) skip-if(MinGW) skip-if((/^Windows\x20NT\x2010\.0/.test(http.oscpu))&&(/^aarch64-msvc/.test(xulRuntime.XPCOMABI))) fuzzy(0-10,0-778236) == image-10bits-rendering-video.html image-10bits-rendering-ref.html -+skip-if(Android) skip-if(MinGW) skip-if((/^Windows\x20NT\x2010\.0/.test(http.oscpu))&&(/^aarch64-msvc/.test(xulRuntime.XPCOMABI))) fuzzy(0-10,0-778536) == image-10bits-rendering-90-video.html image-10bits-rendering-90-ref.html -+skip-if(Android) fuzzy(0-27,0-573106) fuzzy-if(appleSilicon,46-46,575885-575885) == image-10bits-rendering-720-video.html image-10bits-rendering-720-ref.html -+skip-if(Android) fuzzy(0-31,0-573249) == image-10bits-rendering-720-90-video.html image-10bits-rendering-720-90-ref.html -+skip-if(Android) skip-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fuzzy(0-84,0-771156) fails-if(useDrawSnapshot) == uneven_frame_duration_video.html uneven_frame_duration_video-ref.html # Skip on Windows 7 as the resolution of the video is too high for test machines and will fail in the decoder. -diff -U0 firefox-92.0/dom/media/webvtt/test/reftest/reftest.list.firefox-tests-reftest firefox-92.0/dom/media/webvtt/test/reftest/reftest.list ---- firefox-92.0/dom/media/webvtt/test/reftest/reftest.list.firefox-tests-reftest 2021-09-01 19:14:41.000000000 +0200 -+++ firefox-92.0/dom/media/webvtt/test/reftest/reftest.list 2021-09-03 18:50:43.693907440 +0200 -@@ -1,2 +0,0 @@ --skip-if(Android) fuzzy-if((/^Windows\x20NT\x2010\.0/.test(http.oscpu))&&(/^aarch64-msvc/.test(xulRuntime.XPCOMABI)),0-136,0-427680) == vtt_update_display_after_removed_cue.html vtt_update_display_after_removed_cue_ref.html --skip-if(Android) fuzzy-if(winWidget,0-170,0-170) == vtt_overlapping_time.html vtt_overlapping_time-ref.html -diff -U0 firefox-92.0/gfx/layers/apz/test/reftest/reftest.list.firefox-tests-reftest firefox-92.0/gfx/layers/apz/test/reftest/reftest.list ---- firefox-92.0/gfx/layers/apz/test/reftest/reftest.list.firefox-tests-reftest 2021-09-01 19:14:41.000000000 +0200 -+++ firefox-92.0/gfx/layers/apz/test/reftest/reftest.list 2021-09-03 18:50:43.693907440 +0200 -@@ -6,6 +5,0 @@ --fuzzy-if(Android&&!swgl,0-1,0-2) fuzzy-if(Android&&swgl,3-3,4-4) fuzzy-if(webrender&>kWidget,1-8,8-32) fuzzy-if(webrender&&cocoaWidget,18-22,20-44) skip-if(!asyncPan) pref(apz.allow_zooming,true) == async-scrollbar-1-v.html async-scrollbar-1-v-ref.html --fuzzy-if(Android&&!swgl,0-4,0-5) fuzzy-if(Android&&swgl,11-11,4-4) fuzzy-if(webrender&>kWidget,1-30,4-32) fuzzy-if(webrender&&cocoaWidget,18-22,20-44) skip-if(!asyncPan) pref(apz.allow_zooming,true) == async-scrollbar-1-h.html async-scrollbar-1-h-ref.html --fuzzy-if(Android&&!swgl,0-7,0-6) fuzzy-if(Android&&swgl,11-11,8-8) fuzzy-if(webrender&>kWidget,1-2,4-20) fuzzy-if(webrender&&cocoaWidget,14-18,48-88) skip-if(!asyncPan) pref(apz.allow_zooming,true) == async-scrollbar-1-vh.html async-scrollbar-1-vh-ref.html --fuzzy-if(Android&&!swgl,0-1,0-2) fuzzy-if(Android&&swgl,3-3,4-4) fuzzy-if(webrender&>kWidget,1-8,8-32) fuzzy-if(webrender&&cocoaWidget,18-22,20-44) skip-if(!asyncPan) pref(apz.allow_zooming,true) == async-scrollbar-1-v-rtl.html async-scrollbar-1-v-rtl-ref.html --fuzzy-if(Android,0-14,0-5) fuzzy-if(webrender&>kWidget,1-30,12-32) fuzzy-if(webrender&&cocoaWidget,18-22,20-44) skip-if(!asyncPan) pref(apz.allow_zooming,true) == async-scrollbar-1-h-rtl.html async-scrollbar-1-h-rtl-ref.html --fuzzy-if(Android,0-8,0-8) fuzzy-if(webrender&>kWidget,8-14,12-32) fuzzy-if(webrender&&cocoaWidget,14-18,26-54) skip-if(!asyncPan) pref(apz.allow_zooming,true) == async-scrollbar-1-vh-rtl.html async-scrollbar-1-vh-rtl-ref.html -@@ -21 +15 @@ --# On desktop, even more fuzz is needed because thumb scaling is not exactly proportional: making the page twice as long -+# On desktop, even more fuzz is needed because thumb scaling is not exactly proportional: making the page twice as long -diff -U0 firefox-92.0/image/test/reftest/downscaling/reftest.list.firefox-tests-reftest firefox-92.0/image/test/reftest/downscaling/reftest.list ---- firefox-92.0/image/test/reftest/downscaling/reftest.list.firefox-tests-reftest 2021-09-01 19:14:47.000000000 +0200 -+++ firefox-92.0/image/test/reftest/downscaling/reftest.list 2021-09-03 18:50:44.863939657 +0200 -@@ -91,0 +92,4 @@ -+fuzzy(0-17,0-3940) fuzzy-if(gtkWidget&&!webrender,4-4,2616-2616) fuzzy-if(gtkWidget&&!webrender&&!layersGPUAccelerated,0-0,0-0) fuzzy-if(gtkWidget&&webrender,0-0,0-0) skip-if(Android) == downscale-moz-icon-1.html downscale-moz-icon-1-ref.html # gtkWidget Bug 1592059: regular is 2616, no-accel is 0, qr passes with 0 -+ -+# Skip on Android because it runs reftests via http, and moz-icon isn't -+# accessible from http/https origins anymore. -@@ -172,0 +177,5 @@ -+ -+# Skip on WinXP with skia content -+# Skip on Android because it runs reftests via http, and moz-icon isn't -+# accessible from http/https origins anymore. -+fuzzy(0-53,0-6391) fuzzy-if(appleSilicon,20-20,11605-11605) fuzzy-if(gtkWidget&&webrender,18-19,5502-5568) fails-if(/^Windows\x20NT\x205\.1/.test(http.oscpu)) skip-if(Android) == downscale-moz-icon-1.html downscale-moz-icon-1-ref.html # gtkWidget Bug 1592059 -diff -U0 firefox-92.0/layout/reftests/abs-pos/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/abs-pos/reftest.list ---- firefox-92.0/layout/reftests/abs-pos/reftest.list.firefox-tests-reftest 2021-09-01 19:15:00.000000000 +0200 -+++ firefox-92.0/layout/reftests/abs-pos/reftest.list 2021-09-03 18:50:44.863939657 +0200 -@@ -54 +54 @@ --fuzzy-if(gtkWidget,0-1,0-1) fuzzy-if(Android,0-9,0-185) fuzzy-if(asyncPan&&!layersGPUAccelerated,0-140,0-144) == scrollframe-2.html scrollframe-2-ref.html #bug 756530 -+fuzzy-if(gtkWidget,0-100,0-160) fuzzy-if(Android,0-9,0-185) == scrollframe-2.html scrollframe-2-ref.html #bug 756530 -diff -U0 firefox-92.0/layout/reftests/async-scrolling/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/async-scrolling/reftest.list ---- firefox-92.0/layout/reftests/async-scrolling/reftest.list.firefox-tests-reftest 2021-09-01 19:15:01.000000000 +0200 -+++ firefox-92.0/layout/reftests/async-scrolling/reftest.list 2021-09-03 18:50:44.863939657 +0200 -@@ -27 +27 @@ --fuzzy-if(Android,0-8,0-4) fuzzy-if(webrender&>kWidget,20-33,14-32) fuzzy-if(webrender&&cocoaWidget,9-21,20-44) skip-if(!asyncPan) == position-fixed-transformed-1.html position-fixed-transformed-1-ref.html # Bug 1604338 -+fuzzy-if(Android,0-8,0-4) fuzzy-if(webrender&>kWidget,30-50,30-50) fuzzy-if(webrender&&cocoaWidget,21-21,44-44) skip-if(!asyncPan) == position-fixed-transformed-1.html position-fixed-transformed-1-ref.html # Bug 1604338 -@@ -52,2 +51,0 @@ --fuzzy-if(Android,0-6,0-4) fuzzy-if(skiaContent&&!Android,0-1,0-34) fuzzy-if(webrender&>kWidget,22-74,20-32) fuzzy-if(webrender&&cocoaWidget,6-7,18-39) fuzzy-if(swgl&&cocoaWidget&&isDebugBuild,0-7,0-39) skip-if(!asyncPan) == offscreen-clipped-blendmode-1.html offscreen-clipped-blendmode-ref.html # Bug 1604338 --fuzzy-if(Android,0-6,0-4) fuzzy-if(webrender&>kWidget,22-74,20-32) fuzzy-if(webrender&&cocoaWidget,6-7,18-39) fuzzy-if(swgl&&cocoaWidget&&isDebugBuild,0-7,0-39) skip-if(!asyncPan) == offscreen-clipped-blendmode-2.html offscreen-clipped-blendmode-ref.html # Bug 1604338 -@@ -55,2 +52,0 @@ --fuzzy-if(Android,0-6,0-4) fuzzy-if(webrender&>kWidget,22-74,20-32) fuzzy-if(webrender&&cocoaWidget,6-7,18-39) fuzzy-if(swgl&&cocoaWidget&&isDebugBuild,0-7,0-39) skip-if(!asyncPan) == offscreen-clipped-blendmode-4.html offscreen-clipped-blendmode-ref.html # Bug 1604338 --fuzzy-if(Android,0-7,0-1680) fuzzy-if(webrender&>kWidget,1-1,2-20) fuzzy-if(webrender&&cocoaWidget,1-2,10-18) fuzzy-if(swgl&&cocoaWidget&&isDebugBuild,0-2,0-18) skip-if(!asyncPan) == perspective-scrolling-1.html perspective-scrolling-1-ref.html # Bug 1604338 -@@ -58,2 +54,2 @@ --fuzzy-if(Android,0-19,0-4) fuzzy-if(webrender&>kWidget,8-13,12-32) fuzzy-if(webrender&&cocoaWidget,10-13,20-44) skip-if(!asyncPan) == perspective-scrolling-3.html perspective-scrolling-3-ref.html # Bug 1604338 --fuzzy-if(Android,0-7,0-4) fuzzy-if(webrender&>kWidget,18-30,14-32) fuzzy-if(webrender&&cocoaWidget,16-20,20-44) skip-if(!asyncPan) == perspective-scrolling-4.html perspective-scrolling-4-ref.html # Bug 1604338 -+fuzzy-if(Android,0-19,0-4) fuzzy-if(webrender&>kWidget,0-50,0-50) fuzzy-if(webrender&&cocoaWidget,13-13,44-44) skip-if(!asyncPan) == perspective-scrolling-3.html perspective-scrolling-3-ref.html # Bug 1604338 -+fuzzy-if(Android,0-7,0-4) fuzzy-if(webrender&>kWidget,0-50,0-50) fuzzy-if(webrender&&cocoaWidget,19-20,44-44) skip-if(!asyncPan) == perspective-scrolling-4.html perspective-scrolling-4-ref.html # Bug 1604338 -@@ -65,4 +60,0 @@ --fuzzy-if(Android,0-19,0-4) fuzzy-if(webrender&>kWidget,12-19,12-32) fuzzy-if(webrender&&cocoaWidget,17-21,20-44) skip-if(!asyncPan) == fixed-pos-scrolled-clip-1.html fixed-pos-scrolled-clip-1-ref.html # Bug 1604338 --fuzzy-if(Android,0-44,0-10) fuzzy-if(Android&&webrender&&swgl,0-44,0-126) fuzzy-if(webrender&>kWidget,16-26,26-64) fuzzy-if(webrender&&cocoaWidget,10-13,38-82) fuzzy-if(winWidget&&!nativeThemePref,0-4,0-36) skip-if(!asyncPan) == fixed-pos-scrolled-clip-2.html fixed-pos-scrolled-clip-2-ref.html # Bug 1604338 --fuzzy-if(Android,0-6,0-8) fuzzy-if(webrender&>kWidget,17-28,24-60) fuzzy-if(webrender&&cocoaWidget,15-19,40-75) skip-if(!asyncPan) == fixed-pos-scrolled-clip-3.html fixed-pos-scrolled-clip-3-ref.html # Bug 1604338 --fuzzy-if(Android,0-6,0-8) fuzzy-if(webrender&>kWidget,17-29,24-60) fuzzy-if(webrender&&cocoaWidget,15-19,40-75) skip-if(!asyncPan) == fixed-pos-scrolled-clip-4.html fixed-pos-scrolled-clip-4-ref.html # Bug 1604338 -@@ -71 +63 @@ --fuzzy-if(Android,0-8,0-4) fuzzy-if(webrender&>kWidget,16-25,12-32) fuzzy-if(webrender&&cocoaWidget,13-16,20-44) skip-if(!asyncPan) == position-sticky-scrolled-clip-1.html position-sticky-scrolled-clip-1-ref.html # Bug 1604338 -+fuzzy-if(Android,0-8,0-4) fuzzy-if(webrender&>kWidget,22-30,28-50) fuzzy-if(webrender&&cocoaWidget,16-16,44-44) skip-if(!asyncPan) == position-sticky-scrolled-clip-1.html position-sticky-scrolled-clip-1-ref.html # Bug 1604338 -@@ -73,6 +64,0 @@ --fuzzy-if(Android,0-8,0-27) fuzzy-if(webrender&&cocoaWidget,9-11,20-44) skip-if(!asyncPan) == curtain-effect-1.html curtain-effect-1-ref.html --fuzzy-if(Android,0-7,0-4) fuzzy-if(webrender&>kWidget,10-15,12-32) fuzzy-if(webrender&&cocoaWidget,5-9,20-42) skip-if(!asyncPan) == transformed-1.html transformed-1-ref.html # Bug 1604338 --fuzzy-if(Android&&!webrender,2-6,4-4) fuzzy-if(Android&&webrender,6-7,4-4) fuzzy-if(webrender&>kWidget,3-5,12-28) fuzzy-if(webrender&&cocoaWidget,5-6,18-38) skip-if(!asyncPan) fuzzy-if(swgl&&cocoaWidget&&isDebugBuild,0-6,0-38) == position-sticky-transformed-in-scrollframe-1.html position-sticky-transformed-in-scrollframe-1-ref.html # Bug 1604338 --fuzzy-if(Android&&!webrender,3-3,4-4) fuzzy-if(Android&&webrender,10-10,4-449) fuzzy-if(webrender&>kWidget,13-20,12-32) fuzzy-if(webrender&&cocoaWidget,12-16,20-44) skip-if(!asyncPan) == position-sticky-transformed-in-scrollframe-2.html position-sticky-transformed-in-scrollframe-2-ref.html # Bug 1604338 --fuzzy-if(Android&&!webrender,3-3,4-4) fuzzy-if(Android&&webrender,12-13,4-24) fuzzy-if(webrender&>kWidget,16-27,14-32) fuzzy-if(webrender&&cocoaWidget,13-16,20-44) skip-if(!asyncPan) == position-sticky-in-transformed-scrollframe-1.html position-sticky-in-transformed-scrollframe-ref.html # Bug 1604338 --fuzzy-if(Android&&!webrender,3-3,4-4) fuzzy-if(Android&&webrender,12-13,4-24) fuzzy-if(webrender&>kWidget,16-27,14-32) fuzzy-if(webrender&&cocoaWidget,13-16,20-44) skip-if(!asyncPan) == position-sticky-in-transformed-scrollframe-2.html position-sticky-in-transformed-scrollframe-ref.html # Bug 1604338 -diff -U0 firefox-92.0/layout/reftests/bidi/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/bidi/reftest.list ---- firefox-92.0/layout/reftests/bidi/reftest.list.firefox-tests-reftest 2021-09-01 19:15:00.000000000 +0200 -+++ firefox-92.0/layout/reftests/bidi/reftest.list 2021-09-03 18:50:44.863939657 +0200 -@@ -3 +3 @@ --fuzzy-if(cocoaWidget,0-1,0-1) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == bdi-element.html bdi-element-ref.html # Bug 1392106 -+fuzzy(0-1,0-1) fuzzy-if(cocoaWidget,0-1,0-1) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == bdi-element.html bdi-element-ref.html # Bug 1392106 -@@ -33,2 +33,2 @@ --fuzzy-if(Android,0-1,0-6) fuzzy-if(cocoaWidget,0-1,0-2) == mixedChartype-02.html mixedChartype-02-ref.html --fuzzy-if(Android,0-1,0-6) fuzzy-if(cocoaWidget,0-1,0-2) == mixedChartype-02-j.html mixedChartype-02-ref.html -+fuzzy-if(gtkWidget,0-1,0-3) fuzzy-if(Android,0-1,0-6) fuzzy-if(cocoaWidget,0-1,0-2) == mixedChartype-02.html mixedChartype-02-ref.html -+fuzzy-if(gtkWidget,0-1,0-3) fuzzy-if(Android,0-1,0-6) fuzzy-if(cocoaWidget,0-1,0-2) == mixedChartype-02-j.html mixedChartype-02-ref.html -@@ -163,8 +163,8 @@ --fuzzy-if(cocoaWidget,0-1,0-4) fuzzy-if(Android,0-1,0-6) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == brackets-2a-ltr.html brackets-2a-ltr-ref.html # Bug 1392106 --fuzzy-if(cocoaWidget,0-1,0-2) fuzzy-if(Android,0-254,0-557) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == brackets-2a-rtl.html brackets-2a-rtl-ref.html # Bug 1392106 --fuzzy-if(cocoaWidget,0-1,0-6) fuzzy-if(Android,0-1,0-8) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == brackets-2b-ltr.html brackets-2b-ltr-ref.html # Bug 1392106 --fuzzy-if(cocoaWidget,0-1,0-7) fuzzy-if(Android,0-1,0-6) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == brackets-2b-rtl.html brackets-2b-rtl-ref.html # Bug 1392106 --fuzzy-if(cocoaWidget,0-1,0-7) fuzzy-if(Android,0-1,0-6) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == brackets-2c-ltr.html brackets-2c-ltr-ref.html # Bug 1392106 --fuzzy-if(cocoaWidget,0-1,0-6) fuzzy-if(Android,0-254,0-231) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == brackets-2c-rtl.html brackets-2c-rtl-ref.html # Bug 1392106 --fuzzy-if(cocoaWidget,0-1,0-6) fuzzy-if(Android,0-1,0-8) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == brackets-3a-ltr.html brackets-3a-ltr-ref.html # Bug 1392106 --fuzzy-if(cocoaWidget,0-1,0-3) fuzzy-if(Android,0-1,0-6) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == brackets-3a-rtl.html brackets-3a-rtl-ref.html # Bug 1392106 -+fuzzy(0-1,0-6) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == brackets-2a-ltr.html brackets-2a-ltr-ref.html # Bug 1392106 -+fuzzy(0-64,0-140) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == brackets-2a-rtl.html brackets-2a-rtl-ref.html # Bug 1392106 -+fuzzy(0-1,0-8) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == brackets-2b-ltr.html brackets-2b-ltr-ref.html # Bug 1392106 -+fuzzy(0-1,0-6) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == brackets-2b-rtl.html brackets-2b-rtl-ref.html # Bug 1392106 -+fuzzy(0-1,0-6) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == brackets-2c-ltr.html brackets-2c-ltr-ref.html # Bug 1392106 -+fuzzy(0-254,0-231) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == brackets-2c-rtl.html brackets-2c-rtl-ref.html # Bug 1392106 -+fuzzy(0-1,0-8) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == brackets-3a-ltr.html brackets-3a-ltr-ref.html # Bug 1392106 -+fuzzy(0-1,0-6) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == brackets-3a-rtl.html brackets-3a-rtl-ref.html # Bug 1392106 -diff -U0 firefox-92.0/layout/reftests/border-radius/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/border-radius/reftest.list ---- firefox-92.0/layout/reftests/border-radius/reftest.list.firefox-tests-reftest 2021-09-01 19:15:01.000000000 +0200 -+++ firefox-92.0/layout/reftests/border-radius/reftest.list 2021-09-03 18:50:44.863939657 +0200 -@@ -54 +54 @@ --fuzzy-if(Android,0-8,0-469) fuzzy-if(skiaContent,0-21,0-76) fuzzy-if(winWidget,0-144,0-335) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == clipping-6.html clipping-6-ref.html # PaintedLayer and MaskLayer with transforms that aren't identical, bug 1392106 -+fuzzy-if(gtkWidget,0-80,0-300) fuzzy-if(Android,0-8,0-469) fuzzy-if(winWidget,0-144,0-335) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == clipping-6.html clipping-6-ref.html # PaintedLayer and MaskLayer with transforms that aren't identical, bug 1392106 -diff -U0 firefox-92.0/layout/reftests/bugs/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/bugs/reftest.list ---- firefox-92.0/layout/reftests/bugs/reftest.list.firefox-tests-reftest 2021-09-01 19:15:00.000000000 +0200 -+++ firefox-92.0/layout/reftests/bugs/reftest.list 2021-09-03 18:50:44.864939685 +0200 -@@ -464 +463,0 @@ --== 341043-1a.html 341043-1-ref.html -@@ -553 +552 @@ --== 363706-1.html 363706-1-ref.html -+fuzzy-if(gtkWidget,255-255,0-100) == 363706-1.html 363706-1-ref.html -@@ -672 +671 @@ --== 376532-1.html 376532-1-ref.html -+fuzzy-if(gtkWidget,0-150,0-50) == 376532-1.html 376532-1-ref.html -@@ -763 +762 @@ --== 389074-1.html 389074-1-ref.html -+fuzzy-if(gtkWidget,0-150,0-80) == 389074-1.html 389074-1-ref.html -@@ -926 +925 @@ --random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == 411059-1.html 411059-1-ref.html # Bug 1392106 -+fuzzy-if(gtkWidget,0-255,0-6312) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == 411059-1.html 411059-1-ref.html # Bug 1392106 -@@ -1000 +999 @@ --== 422394-1.html 422394-1-ref.html -+fuzzy-if(gtkWidget,0-255,0-640) == 422394-1.html 422394-1-ref.html -@@ -1172 +1171 @@ --fails-if(Android||cocoaWidget||winWidget) == chrome://reftest/content/bugs/456147.xhtml 456147-ref.html # bug 458047 -+fuzzy-if(gtkWidget,0-255,0-5167) fails-if(Android||cocoaWidget||winWidget) == chrome://reftest/content/bugs/456147.xhtml 456147-ref.html # bug 458047 -@@ -1820 +1819 @@ --== 1062108-1.html 1062108-1-ref.html -+fuzzy-if(gtkWidget,0-255,0-53) == 1062108-1.html 1062108-1-ref.html -@@ -2022 +2020,0 @@ --!= 1404057.html 1404057-noref.html -@@ -2062,2 +2059,0 @@ --fuzzy-if(!webrender,1-5,66-547) fuzzy-if(geckoview&&!webrender,1-2,64-141) fuzzy-if(winWidget&&swgl,1-1,12-16) fuzzy-if(cocoaWidget&&swgl,1-1,32-32) fuzzy-if(useDrawSnapshot&&webrender,3-3,459-459) == 1529992-1.html 1529992-1-ref.html --fuzzy-if(!webrender,0-6,0-34) fuzzy-if(Android,9-14,44-60) fails-if(!useDrawSnapshot&&webrender) == 1529992-2.html 1529992-2-ref.html -@@ -2066 +2062 @@ --skip-if(!asyncPan) == 1544895.html 1544895-ref.html -+fuzzy-if(gtkWidget,0-252,0-24) skip-if(!asyncPan) == 1544895.html 1544895-ref.html -@@ -2079 +2075 @@ --fuzzy-if(winWidget&&webrender,0-31,0-3) fuzzy-if(geckoview&&webrender,0-93,0-87) == 1562733-rotated-nastaliq-2.html 1562733-rotated-nastaliq-2-ref.html -+fuzzy(0-30,0-2) fuzzy-if(winWidget&&webrender,0-31,0-3) fuzzy-if(geckoview&&webrender,0-93,0-87) == 1562733-rotated-nastaliq-2.html 1562733-rotated-nastaliq-2-ref.html -diff -U0 firefox-92.0/layout/reftests/canvas/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/canvas/reftest.list ---- firefox-92.0/layout/reftests/canvas/reftest.list.firefox-tests-reftest 2021-09-01 19:15:00.000000000 +0200 -+++ firefox-92.0/layout/reftests/canvas/reftest.list 2021-09-03 18:50:44.864939685 +0200 -@@ -51,2 +50,0 @@ --!= text-font-lang.html text-font-lang-notref.html -- -@@ -54 +52 @@ --random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == text-small-caps-1.html text-small-caps-1-ref.html # Bug 1392106 -+fuzzy-if(gtkWidget,0-255,0-2304) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == text-small-caps-1.html text-small-caps-1-ref.html # Bug 1392106 -diff -U0 firefox-92.0/layout/reftests/css-break/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/css-break/reftest.list ---- firefox-92.0/layout/reftests/css-break/reftest.list.firefox-tests-reftest 2021-09-03 18:50:44.864939685 +0200 -+++ firefox-92.0/layout/reftests/css-break/reftest.list 2021-09-03 18:51:55.862894766 +0200 -@@ -1,3 +0,0 @@ --== box-decoration-break-1.html box-decoration-break-1-ref.html --fuzzy(0-1,0-20) fuzzy-if(skiaContent,0-1,0-700) == box-decoration-break-with-inset-box-shadow-1.html box-decoration-break-with-inset-box-shadow-1-ref.html --fuzzy(0-45,0-460) fuzzy-if(skiaContent,0-64,0-484) fuzzy-if(Android,0-70,0-1330) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == box-decoration-break-with-outset-box-shadow-1.html box-decoration-break-with-outset-box-shadow-1-ref.html # Bug 1386543, bug 1392106 -diff -U0 firefox-92.0/layout/reftests/css-placeholder/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/css-placeholder/reftest.list ---- firefox-92.0/layout/reftests/css-placeholder/reftest.list.firefox-tests-reftest 2021-09-01 19:15:00.000000000 +0200 -+++ firefox-92.0/layout/reftests/css-placeholder/reftest.list 2021-09-03 18:50:44.864939685 +0200 -@@ -5 +5 @@ --fuzzy-if(gtkWidget&&nativeThemePref,255-255,1376-1881) == css-simple-styling.html css-simple-styling-ref.html # gtkWidget, Bug 1600749 -+fuzzy-if(gtkWidget&&nativeThemePref,255-255,1300-1881) == css-simple-styling.html css-simple-styling-ref.html # gtkWidget, Bug 1600749 -diff -U0 firefox-92.0/layout/reftests/css-ruby/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/css-ruby/reftest.list ---- firefox-92.0/layout/reftests/css-ruby/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/reftests/css-ruby/reftest.list 2021-09-03 18:50:44.865939713 +0200 -@@ -17,4 +17,4 @@ --== relative-positioning-2.html relative-positioning-2-ref.html --== ruby-position-horizontal.html ruby-position-horizontal-ref.html --== ruby-position-vertical-lr.html ruby-position-vertical-lr-ref.html --== ruby-position-vertical-rl.html ruby-position-vertical-rl-ref.html -+fuzzy-if(gtkWidget,0-255,0-669) == relative-positioning-2.html relative-positioning-2-ref.html -+fuzzy-if(gtkWidget,0-255,0-947) == ruby-position-horizontal.html ruby-position-horizontal-ref.html -+fuzzy-if(gtkWidget,0-255,0-1079) == ruby-position-vertical-lr.html ruby-position-vertical-lr-ref.html -+fuzzy-if(gtkWidget,0-255,0-1079) == ruby-position-vertical-rl.html ruby-position-vertical-rl-ref.html -@@ -26 +26 @@ --pref(layout.css.ruby.intercharacter.enabled,true) fuzzy-if(Android,0-198,0-70) == ruby-intercharacter-1.htm ruby-intercharacter-1-ref.htm -+fuzzy-if(gtkWidget,0-240,0-61) pref(layout.css.ruby.intercharacter.enabled,true) fuzzy-if(Android,0-198,0-70) == ruby-intercharacter-1.htm ruby-intercharacter-1-ref.htm -@@ -28 +28 @@ --pref(layout.css.ruby.intercharacter.enabled,true) == ruby-intercharacter-2.htm ruby-intercharacter-2-ref.htm -+fuzzy-if(gtkWidget,0-255,0-219) pref(layout.css.ruby.intercharacter.enabled,true) == ruby-intercharacter-2.htm ruby-intercharacter-2-ref.htm -diff -U0 firefox-92.0/layout/reftests/first-letter/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/first-letter/reftest.list ---- firefox-92.0/layout/reftests/first-letter/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/reftests/first-letter/reftest.list 2021-09-03 18:50:44.865939713 +0200 -@@ -64 +64 @@ --fails-if(winWidget||cocoaWidget) fails-if(geckoview) == 617869-1.html 617869-1-ref.html # Bug 1558513 for GV -+fuzzy-if(gtkWidget,0-260,0-900) fails-if(winWidget||cocoaWidget) fails-if(geckoview) == 617869-1.html 617869-1-ref.html # Bug 1558513 for GV -diff -U0 firefox-92.0/layout/reftests/font-face/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/font-face/reftest.list ---- firefox-92.0/layout/reftests/font-face/reftest.list.firefox-tests-reftest 2021-09-01 19:15:01.000000000 +0200 -+++ firefox-92.0/layout/reftests/font-face/reftest.list 2021-09-03 18:50:44.865939713 +0200 -@@ -9 +9 @@ --== name-override-simple-1.html name-override-simple-1-ref.html -+fuzzy-if(gtkWidget,0-112,0-107) == name-override-simple-1.html name-override-simple-1-ref.html -@@ -26,3 +26,2 @@ --random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fails-if(Android) == src-list-local-full.html src-list-local-full-ref.html # Bug 1392106 --random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fails-if(Android) == src-list-local-full-quotes.html src-list-local-full-ref.html # Bug 1392106 --== src-list-local-fallback.html src-list-local-fallback-ref.html -+fuzzy(0-255,0-6200) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fails-if(Android) == src-list-local-full.html src-list-local-full-ref.html # Bug 1392106 -+fuzzy(0-255,0-6200) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fails-if(Android) == src-list-local-full-quotes.html src-list-local-full-ref.html # Bug 1392106 -@@ -57 +56 @@ --== cross-iframe-1.html cross-iframe-1-ref.html -+fuzzy-if(gtkWidget,0-112,0-107) == cross-iframe-1.html cross-iframe-1-ref.html -@@ -81 +80 @@ --== sheet-set-switch-1.html sheet-set-switch-1-ref.html -+fuzzy-if(gtkWidget,0-112,0-108) random-if(cocoaWidget) == sheet-set-switch-1.html sheet-set-switch-1-ref.html # bug 468217 -@@ -93 +92 @@ --random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == local-1.html local-1-ref.html # Bug 1392106 -+fuzzy-if(gtkWidget,0-255,0-7000) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == local-1.html local-1-ref.html # Bug 1392106 -@@ -171,2 +170,2 @@ --HTTP(..) == reflow-sanity-1.html reflow-sanity-1-ref.html --HTTP(..) == reflow-sanity-1-data.html reflow-sanity-1-ref.html -+fuzzy-if(gtkWidget,0-104,0-406) HTTP(..) == reflow-sanity-1.html reflow-sanity-1-ref.html -+fuzzy-if(gtkWidget,0-104,0-406) HTTP(..) == reflow-sanity-1-data.html reflow-sanity-1-ref.html -@@ -174,4 +173,4 @@ --HTTP(..) == reflow-sanity-delay-1a.html reflow-sanity-1-ref.html --HTTP(..) == reflow-sanity-delay-1b.html reflow-sanity-1-ref.html --HTTP(..) == reflow-sanity-delay-1c.html reflow-sanity-1-ref.html --HTTP(..) == reflow-sanity-delay-1-metrics.html reflow-sanity-1-ref.html -+fuzzy-if(gtkWidget,0-104,0-406) HTTP(..) == reflow-sanity-delay-1a.html reflow-sanity-1-ref.html -+fuzzy-if(gtkWidget,0-104,0-406) HTTP(..) == reflow-sanity-delay-1b.html reflow-sanity-1-ref.html -+fuzzy-if(gtkWidget,0-104,0-406) HTTP(..) == reflow-sanity-delay-1c.html reflow-sanity-1-ref.html -+fuzzy-if(gtkWidget,0-104,0-406) HTTP(..) == reflow-sanity-delay-1-metrics.html reflow-sanity-1-ref.html -@@ -204 +203 @@ --# Currently Windows 7 and macOS all fail on -+# Currently Windows 7 and macOS all fail on -diff -U0 firefox-92.0/layout/reftests/font-matching/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/font-matching/reftest.list ---- firefox-92.0/layout/reftests/font-matching/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/reftests/font-matching/reftest.list 2021-09-03 18:50:44.865939713 +0200 -@@ -124 +124 @@ --random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == italic-oblique-2.html italic-oblique-ref.html # Bug 1392106 -+fuzzy-if(gtkWidget,0-104,0-1836) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == italic-oblique-2.html italic-oblique-ref.html # Bug 1392106 -@@ -128 +128 @@ --random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == italic-oblique-6.html italic-oblique-ref.html # Bug 1392106 -+fuzzy-if(gtkWidget,0-104,0-1836) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == italic-oblique-6.html italic-oblique-ref.html # Bug 1392106 -@@ -130,2 +130,2 @@ --random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == italic-oblique-8.html italic-oblique-ref.html # Bug 1392106 --random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == italic-oblique-9.html italic-oblique-ref.html # Bug 1392106 -+fuzzy-if(gtkWidget,0-104,0-1836) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == italic-oblique-8.html italic-oblique-ref.html # Bug 1392106 -+fuzzy-if(gtkWidget,0-104,0-1836) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == italic-oblique-9.html italic-oblique-ref.html # Bug 1392106 -diff -U0 firefox-92.0/layout/reftests/forms/fieldset/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/forms/fieldset/reftest.list ---- firefox-92.0/layout/reftests/forms/fieldset/reftest.list.firefox-tests-reftest 2021-09-01 19:15:01.000000000 +0200 -+++ firefox-92.0/layout/reftests/forms/fieldset/reftest.list 2021-09-03 18:50:44.865939713 +0200 -@@ -8 +7,0 @@ --fuzzy-if(!layersGPUAccelerated,0-142,0-276) == positioned-container-1.html positioned-container-1-ref.html -diff -U0 firefox-92.0/layout/reftests/forms/input/checkbox/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/forms/input/checkbox/reftest.list ---- firefox-92.0/layout/reftests/forms/input/checkbox/reftest.list.firefox-tests-reftest 2021-09-01 19:15:01.000000000 +0200 -+++ firefox-92.0/layout/reftests/forms/input/checkbox/reftest.list 2021-09-03 18:50:44.865939713 +0200 -@@ -18 +18 @@ --skip-if((OSX||winWidget)&&nativeThemePref) fuzzy-if(gtkWidget&&nativeThemePref,25-25,32-32) fails-if(Android&&nativeThemePref) == checkbox-clamp-02.html checkbox-clamp-02-ref.html -+skip-if(OSX||winWidget) fails-if(geckoview&&webrender) fuzzy-if(gtkWidget&&nativeThemePref,12-25,25-32) fails-if(Android) == checkbox-clamp-02.html checkbox-clamp-02-ref.html -diff -U0 firefox-92.0/layout/reftests/forms/input/radio/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/forms/input/radio/reftest.list ---- firefox-92.0/layout/reftests/forms/input/radio/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/reftests/forms/input/radio/reftest.list 2021-09-03 18:50:44.865939713 +0200 -@@ -9 +9 @@ --skip-if(OSX||winWidget||Android) fuzzy-if(gtkWidget&&nativeThemePref,24-24,16-16) == radio-clamp-02.html radio-clamp-02-ref.html # gtkWidget, Bug 1599622 -+skip-if(OSX||winWidget||Android) fuzzy-if(gtkWidget&&nativeThemePref,10-24,16-16) == radio-clamp-02.html radio-clamp-02-ref.html # gtkWidget, Bug 1599622 -diff -U0 firefox-92.0/layout/reftests/forms/placeholder/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/forms/placeholder/reftest.list ---- firefox-92.0/layout/reftests/forms/placeholder/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/reftests/forms/placeholder/reftest.list 2021-09-03 18:50:44.866939741 +0200 -@@ -21 +21 @@ --fuzzy-if(winWidget,0-160,0-10) fuzzy-if(Android,0-160,0-41) fuzzy-if(asyncPan&&!layersGPUAccelerated,0-146,0-317) fuzzy-if(OSX==1010&&browserIsRemote,0-1,0-8) == placeholder-6.html placeholder-overflow-ref.html -+fuzzy-if(gtkWidget,0-255,0-341) fuzzy-if(winWidget,0-160,0-10) fuzzy-if(Android,0-160,0-41) fuzzy-if(OSX==1010&&browserIsRemote,0-1,0-8) == placeholder-6.html placeholder-overflow-ref.html -diff -U0 firefox-92.0/layout/reftests/forms/textbox/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/forms/textbox/reftest.list ---- firefox-92.0/layout/reftests/forms/textbox/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/reftests/forms/textbox/reftest.list 2021-09-03 18:50:44.866939741 +0200 -@@ -4 +3,0 @@ --fuzzy-if(winWidget,0-1,0-3) skip-if(cocoaWidget||Android) fails-if(!useDrawSnapshot&&webrender) == chrome://reftest/content/forms/textbox/accesskey-2.xhtml chrome://reftest/content/forms/textbox/accesskey-2-ref.xhtml -@@ -8 +6,0 @@ --fuzzy-if(winWidget,0-1,0-3) skip-if(cocoaWidget||Android) fails-if(!useDrawSnapshot&&webrender&&!Android) == chrome://reftest/content/forms/textbox/accesskey-4.xhtml chrome://reftest/content/forms/textbox/accesskey-4-ref.xhtml -diff -U0 firefox-92.0/layout/reftests/generated-content/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/generated-content/reftest.list ---- firefox-92.0/layout/reftests/generated-content/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/reftests/generated-content/reftest.list 2021-09-03 18:50:44.866939741 +0200 -@@ -16 +16 @@ --fuzzy-if(OSX==1010,0-1,0-10) == quotes-001.xml quotes-001-ref.xml -+fuzzy(0-128,0-737) fuzzy-if(OSX==1010,0-1,0-10) == quotes-001.xml quotes-001-ref.xml -diff -U0 firefox-92.0/layout/reftests/high-contrast/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/high-contrast/reftest.list ---- firefox-92.0/layout/reftests/high-contrast/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/reftests/high-contrast/reftest.list 2021-09-03 18:50:44.866939741 +0200 -@@ -22 +22 @@ --fuzzy-if(cocoaWidget,255-255,1495-1495) fuzzy-if(winWidget,255-255,353-353) fuzzy-if(Android,255-255,700-700) == backplate-bg-image-010.html backplate-bg-image-010-ref.html -+fuzzy-if(gtkWidget,0-255,0-1495) fuzzy-if(cocoaWidget,255-255,1495-1495) fuzzy-if(winWidget,255-255,353-353) fuzzy-if(Android,255-255,700-700) == backplate-bg-image-010.html backplate-bg-image-010-ref.html -diff -U0 firefox-92.0/layout/reftests/indic-shaping/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/indic-shaping/reftest.list ---- firefox-92.0/layout/reftests/indic-shaping/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/reftests/indic-shaping/reftest.list 2021-09-03 18:50:44.866939741 +0200 -@@ -12 +11,0 @@ --fuzzy-if(gtkWidget,255-255,46-46) == gujarati-3b.html gujarati-3-ref.html # gtkWidget, Bug 1600777 -diff -U0 firefox-92.0/layout/reftests/mathml/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/mathml/reftest.list ---- firefox-92.0/layout/reftests/mathml/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/reftests/mathml/reftest.list 2021-09-03 18:50:44.866939741 +0200 -@@ -26 +26 @@ --random-if(smallScreen&&Android) fuzzy(0-255,0-200) fuzzy-if(geckoview&&webrender,201-216,200-250) fuzzy-if(webrender&&winWidget,114-255,245-361) fuzzy-if(webrender&&OSX,79-153,240-250) == mirror-op-1.html mirror-op-1-ref.html -+random-if(smallScreen&&Android) fuzzy(0-255,0-350) fuzzy-if(geckoview&&webrender,201-216,312-316) fuzzy-if(webrender&&winWidget,114-255,245-361) fuzzy-if(webrender&&OSX,79-153,307-314) == mirror-op-1.html mirror-op-1-ref.html -@@ -66 +66 @@ --== stretchy-largeop-2.html stretchy-largeop-2-ref.html -+fuzzy-if(gtkWidget,0-255,0-126) == stretchy-largeop-2.html stretchy-largeop-2-ref.html -@@ -177 +176,0 @@ --fuzzy-if(skiaContent,0-1,0-80) fuzzy-if(Android,0-255,0-105) fuzzy-if(gtkWidget,255-255,96-96) skip-if(winWidget) == multiscripts-1.html multiscripts-1-ref.html # Windows: bug 1314684; Android: bug 1392254; Linux: bug 1599638 -@@ -256 +254,0 @@ --fails-if(winWidget) fuzzy-if(gtkWidget,255-255,776226-776226) == subscript-italic-correction.html subscript-italic-correction-ref.html # bug 961482 (Windows), bug 1599640 (Linux) -diff -U0 firefox-92.0/layout/reftests/position-dynamic-changes/relative/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/position-dynamic-changes/relative/reftest.list ---- firefox-92.0/layout/reftests/position-dynamic-changes/relative/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/reftests/position-dynamic-changes/relative/reftest.list 2021-09-03 18:50:44.866939741 +0200 -@@ -1,4 +1,4 @@ --fuzzy-if(cocoaWidget,0-1,0-2) fuzzy-if(d2d,0-47,0-26) fuzzy-if(asyncPan&&!layersGPUAccelerated,0-169,0-970) == move-right-bottom.html move-right-bottom-ref.html --fuzzy-if(cocoaWidget,0-1,0-2) fuzzy-if(asyncPan&&!layersGPUAccelerated,0-169,0-970) == move-top-left.html move-top-left-ref.html # Bug 688545 --fuzzy-if(cocoaWidget,0-1,0-3) fuzzy-if(asyncPan&&!layersGPUAccelerated,0-144,0-580) == move-right-bottom-table.html move-right-bottom-table-ref.html --fuzzy-if(cocoaWidget,0-1,0-3) fuzzy-if(asyncPan&&!layersGPUAccelerated,0-144,0-580) == move-top-left-table.html move-top-left-table-ref.html # Bug 688545 -+fuzzy-if(gtkWidget,0-99,0-1255) fuzzy-if(cocoaWidget,0-1,0-2) == move-right-bottom.html move-right-bottom-ref.html -+fuzzy-if(gtkWidget,0-99,0-1254) fuzzy-if(cocoaWidget,0-1,0-2) == move-top-left.html move-top-left-ref.html # Bug 688545 -+fuzzy-if(gtkWidget,0-103,0-637) fuzzy-if(cocoaWidget,0-1,0-3) == move-right-bottom-table.html move-right-bottom-table-ref.html -+fuzzy-if(gtkWidget,0-103,0-637) fuzzy-if(cocoaWidget,0-1,0-3) == move-top-left-table.html move-top-left-table-ref.html # Bug 688545 -diff -U0 firefox-92.0/layout/reftests/position-sticky/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/position-sticky/reftest.list ---- firefox-92.0/layout/reftests/position-sticky/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/reftests/position-sticky/reftest.list 2021-09-03 18:50:44.866939741 +0200 -@@ -53,3 +52,0 @@ --fuzzy-if(Android,0-5,0-4) fuzzy-if(webrender&>kWidget,10-17,12-32) fuzzy-if(webrender&&cocoaWidget,7-8,18-42) skip-if(!asyncPan) fails-if(useDrawSnapshot) == transformed-2.html transformed-2-ref.html # Bug 1604644 --skip-if(!asyncPan) fuzzy-if(Android,0-10,0-4) fuzzy-if(webrender&>kWidget,19-30,12-32) fuzzy-if(webrender&&cocoaWidget,13-16,20-44) fails-if(useDrawSnapshot) == nested-sticky-1.html nested-sticky-1-ref.html # Bug 1604644 --skip-if(!asyncPan) fuzzy-if(Android,0-10,0-4) fuzzy-if(webrender&>kWidget,19-30,12-32) fuzzy-if(webrender&&cocoaWidget,13-16,20-44) fuzzy-if(/^Windows\x20NT\x206\.1/.test(http.oscpu),0-4,0-104) fails-if(useDrawSnapshot) == nested-sticky-2.html nested-sticky-2-ref.html # Bug 1604644 -diff -U0 firefox-92.0/layout/reftests/reftest-sanity/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/reftest-sanity/reftest.list ---- firefox-92.0/layout/reftests/reftest-sanity/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/reftests/reftest-sanity/reftest.list 2021-09-03 18:50:44.867939768 +0200 -@@ -131,6 +131,6 @@ --pref(font.default.x-western,"serif") == font-serif.html font-default.html --pref(font.default.x-western,"serif") != font-sans-serif.html font-default.html --pref(font.default.x-western,"sans-serif") == font-sans-serif.html font-default.html --pref(font.default.x-western,"sans-serif") != font-serif.html font-default.html --fails pref(font.default.x-western,true) == font-serif.html font-default.html --fails pref(font.default.x-western,0) == font-serif.html font-default.html -+#pref(font.default.x-western,"serif") == font-serif.html font-default.html -+#pref(font.default.x-western,"serif") != font-sans-serif.html font-default.html -+#pref(font.default.x-western,"sans-serif") == font-sans-serif.html font-default.html -+#pref(font.default.x-western,"sans-serif") != font-serif.html font-default.html -+#fails pref(font.default.x-western,true) == font-serif.html font-default.html -+#fails pref(font.default.x-western,0) == font-serif.html font-default.html -diff -U0 firefox-92.0/layout/reftests/svg/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/svg/reftest.list ---- firefox-92.0/layout/reftests/svg/reftest.list.firefox-tests-reftest 2021-09-01 19:15:00.000000000 +0200 -+++ firefox-92.0/layout/reftests/svg/reftest.list 2021-09-03 18:50:44.867939768 +0200 -@@ -475 +475 @@ --random-if(winWidget) fuzzy-if(Android,0-10,0-2) == text-gradient-02.svg text-gradient-02-ref.svg # see bug 590101 -+random-if(winWidget) fuzzy-if(gtkWidget,0-20,0-10) fuzzy-if(Android,0-10,0-2) == text-gradient-02.svg text-gradient-02-ref.svg # see bug 590101 -@@ -482 +481,0 @@ --!= text-language-00.xhtml text-language-00-ref.xhtml -@@ -484 +483 @@ --random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == text-layout-01.svg text-layout-01-ref.svg # Bug 1392106 -+fuzzy-if(gtkWidget,0-255,0-1769) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == text-layout-01.svg text-layout-01-ref.svg # Bug 1392106 -@@ -492 +491 @@ --random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == text-layout-09.svg pass.svg # Bug 1392106 -+fuzzy(0-255,0-237) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == text-layout-09.svg pass.svg # Bug 1392106 -diff -U0 firefox-92.0/layout/reftests/svg/smil/style/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/svg/smil/style/reftest.list ---- firefox-92.0/layout/reftests/svg/smil/style/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/reftests/svg/smil/style/reftest.list 2021-09-03 18:50:44.867939768 +0200 -@@ -70 +70 @@ --random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fuzzy-if(gtkWidget,255-255,1520-1520) == anim-css-font-1.svg anim-css-font-1-ref.svg # Windows: Bug 1392106 Linux: Bug 1599619 -+random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == anim-css-font-1.svg anim-css-font-1-ref.svg # Windows: Bug 1392106 Linux: Bug 1599619 -diff -U0 firefox-92.0/layout/reftests/svg/svg-integration/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/svg/svg-integration/reftest.list ---- firefox-92.0/layout/reftests/svg/svg-integration/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/reftests/svg/svg-integration/reftest.list 2021-09-03 18:50:44.867939768 +0200 -@@ -50 +50 @@ --fuzzy-if(Android,0-4,0-10) == box-decoration-break-01.xhtml box-decoration-break-01-ref.xhtml -+fuzzy-if(gtkWidget,0-5,0-11) fuzzy-if(Android,0-4,0-10) == box-decoration-break-01.xhtml box-decoration-break-01-ref.xhtml -@@ -52 +52 @@ --fuzzy(0-67,0-238) == box-decoration-break-03.xhtml box-decoration-break-01-ref.xhtml -+fuzzy(0-67,0-254) == box-decoration-break-03.xhtml box-decoration-break-01-ref.xhtml -diff -U0 firefox-92.0/layout/reftests/svg/text/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/svg/text/reftest.list ---- firefox-92.0/layout/reftests/svg/text/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/reftests/svg/text/reftest.list 2021-09-03 18:50:44.867939768 +0200 -@@ -203,2 +202,0 @@ --fuzzy-if(skiaContent,0-1,0-100) needs-focus fuzzy-if(webrender&&winWidget,55-148,200-318) == simple-bidi-selection.svg simple-bidi-selection-ref.html --fuzzy-if(skiaContent,0-1,0-50) needs-focus fuzzy-if(webrender&&winWidget,55-148,200-254) fuzzy-if(webrender&&OSX,1-65,19-196) == simple-fill-color-selection.svg simple-fill-color-selection-ref.html -diff -U0 firefox-92.0/layout/reftests/tab-size/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/tab-size/reftest.list ---- firefox-92.0/layout/reftests/tab-size/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/reftests/tab-size/reftest.list 2021-09-03 18:50:44.867939768 +0200 -@@ -2,6 +2,6 @@ --== tab-size-8.html spaces-8.html --== tab-size-4.html spaces-4.html --== tab-size-4-span.html spaces-4.html --== tab-size-4-spanoffset.html spaces-4-offset.html --== tab-size-4-multiple.html spaces-4-multiple.html --== tab-size-1.html spaces-1.html -+fuzzy-if(gtkWidget,0-255,0-70) == tab-size-8.html spaces-8.html -+fuzzy-if(gtkWidget,0-255,0-70) == tab-size-4.html spaces-4.html -+fuzzy-if(gtkWidget,0-255,0-70) == tab-size-4-span.html spaces-4.html -+fuzzy-if(gtkWidget,0-255,0-371) == tab-size-4-spanoffset.html spaces-4-offset.html -+fuzzy-if(gtkWidget,0-255,0-410) == tab-size-4-multiple.html spaces-4-multiple.html -+fuzzy-if(gtkWidget,0-255,0-63) == tab-size-1.html spaces-1.html -diff -U0 firefox-92.0/layout/reftests/text-decoration/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/text-decoration/reftest.list ---- firefox-92.0/layout/reftests/text-decoration/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/reftests/text-decoration/reftest.list 2021-09-03 18:50:44.867939768 +0200 -@@ -1,2 +1,2 @@ --fuzzy-if(webrender&>kWidget,0-208,0-12) == complex-decoration-style-quirks.html complex-decoration-style-quirks-ref.html --fuzzy-if(webrender&>kWidget,0-208,0-12) == complex-decoration-style-standards.html complex-decoration-style-standards-ref.html -+fuzzy-if(gtkWidget,0-255,0-40) == complex-decoration-style-quirks.html complex-decoration-style-quirks-ref.html -+fuzzy-if(gtkWidget,0-255,0-40) == complex-decoration-style-standards.html complex-decoration-style-standards-ref.html -diff -U0 firefox-92.0/layout/reftests/text-overflow/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/text-overflow/reftest.list ---- firefox-92.0/layout/reftests/text-overflow/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/reftests/text-overflow/reftest.list 2021-09-03 18:50:44.868939795 +0200 -@@ -6 +6 @@ --skip-if(!gtkWidget) fuzzy-if(gtkWidget,0-124,0-289) == bidi-simple-scrolled.html bidi-simple-scrolled-ref.html # Fails on Windows and OSX due to anti-aliasing -+skip-if(!gtkWidget) fuzzy-if(gtkWidget,0-255,0-400) == bidi-simple-scrolled.html bidi-simple-scrolled-ref.html # Fails on Windows and OSX due to anti-aliasing -@@ -28 +28 @@ --== float-edges-1.html float-edges-1-ref.html -+fuzzy-if(gtkWidget,0-255,0-294) == float-edges-1.html float-edges-1-ref.html -diff -U0 firefox-92.0/layout/reftests/text/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/text/reftest.list ---- firefox-92.0/layout/reftests/text/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/reftests/text/reftest.list 2021-09-03 18:50:44.868939795 +0200 -@@ -190 +190 @@ --fails-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == 1320665-cmap-format-13.html 1320665-cmap-format-13-ref.html # see bug 1320665 comments 8-9 -+fuzzy-if(gtkWidget,0-255,0-1071) fails-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == 1320665-cmap-format-13.html 1320665-cmap-format-13-ref.html # see bug 1320665 comments 8-9 -@@ -193,2 +193,2 @@ --fuzzy-if(Android,0-128,0-233) == 1463020-letter-spacing-text-transform-1.html 1463020-letter-spacing-text-transform-1-ref.html --fails-if(Android) == 1463020-letter-spacing-text-transform-2.html 1463020-letter-spacing-text-transform-2-ref.html # missing font coverage on Android -+fuzzy-if(gtkWidget,0-255,0-800) fails-if(/^^Windows\x20NT\x2010\.0/.test(http.oscpu)) fuzzy-if(Android,0-128,0-233) == 1463020-letter-spacing-text-transform-1.html 1463020-letter-spacing-text-transform-1-ref.html -+fuzzy-if(gtkWidget,0-255,0-1600) fails-if(Android) == 1463020-letter-spacing-text-transform-2.html 1463020-letter-spacing-text-transform-2-ref.html # missing font coverage on Android -@@ -198 +197,0 @@ --fuzzy-if(useDrawSnapshot&&webrender,255-255,50-50) fuzzy-if(!webrender,0-42,0-1590) fuzzy-if(gtkWidget&&!webrender,0-255,0-50) == 1655364-1.html 1655364-1-ref.html -@@ -366 +365 @@ --== color-opacity-rtl-1.html color-opacity-rtl-1-ref.html -+fuzzy-if(gtkWidget,0-5,0-5) == color-opacity-rtl-1.html color-opacity-rtl-1-ref.html -diff -U0 firefox-92.0/layout/reftests/text-transform/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/text-transform/reftest.list ---- firefox-92.0/layout/reftests/text-transform/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/reftests/text-transform/reftest.list 2021-09-03 18:50:44.868939795 +0200 -@@ -15 +15 @@ --random-if(winWidget) == small-caps-1.html small-caps-1-ref.html # fails if default font supports 'smcp' -+fuzzy-if(gtkWidget,0-255,0-571) random-if(winWidget) == small-caps-1.html small-caps-1-ref.html # fails if default font supports 'smcp' -diff -U0 firefox-92.0/layout/reftests/transform-3d/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/transform-3d/reftest.list ---- firefox-92.0/layout/reftests/transform-3d/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/reftests/transform-3d/reftest.list 2021-09-03 18:50:44.868939795 +0200 -@@ -14 +13,0 @@ --fuzzy-if(gtkWidget||winWidget,0-8,0-376) fuzzy-if(Android,0-8,0-441) fuzzy-if(skiaContent,0-16,0-346) fuzzy-if(webrender&&cocoaWidget,0-200,0-310) fuzzy-if(webrender&&winWidget,0-175,0-250) == preserve3d-1a.html preserve3d-1-ref.html -@@ -27,2 +26,2 @@ --fuzzy-if(winWidget,0-143,0-689) fuzzy-if(OSX,0-224,0-924) fuzzy-if(winWidget,0-154,0-644) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == scale3d-all.html scale3d-1-ref.html # subpixel AA --fuzzy-if(winWidget,0-143,0-689) fuzzy-if(OSX,0-224,0-924) fuzzy-if(winWidget,0-154,0-644) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == scale3d-all-separate.html scale3d-1-ref.html # subpixel AA -+fuzzy-if(gtkWidget,0-100,0-628) fuzzy-if(winWidget,0-143,0-689) fuzzy-if(OSX,0-224,0-924) fuzzy-if(winWidget,0-154,0-644) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == scale3d-all.html scale3d-1-ref.html # subpixel AA -+fuzzy-if(gtkWidget,0-100,0-628) fuzzy-if(winWidget,0-143,0-689) fuzzy-if(OSX,0-224,0-924) fuzzy-if(winWidget,0-154,0-644) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == scale3d-all-separate.html scale3d-1-ref.html # subpixel AA -@@ -75,2 +74,2 @@ --fuzzy-if(skiaContent,0-1,0-4) fuzzy-if(cocoaWidget,0-128,0-9) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == animate-preserve3d-parent.html animate-preserve3d-ref.html # intermittently fuzzy on Mac --fuzzy-if(skiaContent,0-1,0-4) fuzzy-if(cocoaWidget,0-128,0-9) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == animate-preserve3d-child.html animate-preserve3d-ref.html # intermittently fuzzy on Mac, bug 1461311 for Android -+fuzzy(0-1,0-9) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == animate-preserve3d-parent.html animate-preserve3d-ref.html # intermittently fuzzy on Mac -+fuzzy(0-1,0-6) fuzzy-if(cocoaWidget,0-128,0-9) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == animate-preserve3d-child.html animate-preserve3d-ref.html # intermittently fuzzy on Mac, bug 1461311 for Android -@@ -102 +100,0 @@ --fuzzy-if(webrender,0-6,0-3117) fuzzy-if(useDrawSnapshot,4-4,13-13) == 1637067-1.html 1637067-1-ref.html -diff -U0 firefox-92.0/layout/reftests/writing-mode/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/writing-mode/reftest.list ---- firefox-92.0/layout/reftests/writing-mode/reftest.list.firefox-tests-reftest 2021-09-01 19:15:01.000000000 +0200 -+++ firefox-92.0/layout/reftests/writing-mode/reftest.list 2021-09-03 18:50:44.868939795 +0200 -@@ -20 +20 @@ --random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == 1091058-1.html 1091058-1-ref.html # Bug 1392106 -+fuzzy(0-255,0-315) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == 1091058-1.html 1091058-1-ref.html # Bug 1392106 -@@ -34 +34 @@ --fuzzy-if(Android,0-128,0-94) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == 1111944-1-list-marker.html 1111944-1-list-marker-ref.html # Bug 1392106 -+fuzzy-if(gtkWidget,0-72,0-47) fuzzy-if(Android,0-128,0-94) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == 1111944-1-list-marker.html 1111944-1-list-marker-ref.html # Bug 1392106 -@@ -114 +114 @@ --fails-if(geckoview) == 1135361-ruby-justify-1.html 1135361-ruby-justify-1-ref.html # Bug 1558513 for GV -+fuzzy-if(gtkWidget,0-255,0-2323) fails-if(geckoview) == 1135361-ruby-justify-1.html 1135361-ruby-justify-1-ref.html # Bug 1558513 for GV -@@ -154 +154 @@ --fuzzy-if(winWidget,0-3,0-84) == 1193519-sideways-lr-3.html 1193519-sideways-lr-3-ref.html -+fuzzy(0-255,0-610) fuzzy-if(winWidget,0-3,0-84) fails-if(webrender&&winWidget&&!swgl) == 1193519-sideways-lr-3.html 1193519-sideways-lr-3-ref.html -@@ -185 +185 @@ --== 1395926-vertical-upright-gpos-1.html 1395926-vertical-upright-gpos-1-ref.html -+fuzzy-if(gtkWidget,0-248,0-8) == 1395926-vertical-upright-gpos-1.html 1395926-vertical-upright-gpos-1-ref.html -diff -U0 firefox-92.0/layout/reftests/writing-mode/tables/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/writing-mode/tables/reftest.list ---- firefox-92.0/layout/reftests/writing-mode/tables/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/reftests/writing-mode/tables/reftest.list 2021-09-03 18:50:44.868939795 +0200 -@@ -34 +34 @@ --== fixed-table-layout-027-vlr.html fixed-table-layout-025-ref.html -+fuzzy-if(gtkWidget,0-260,0-250) == fixed-table-layout-027-vlr.html fixed-table-layout-025-ref.html -@@ -60 +60 @@ --== fixed-table-layout-027-vrl.html fixed-table-layout-025-ref.html -+fuzzy-if(gtkWidget,0-260,0-250) == fixed-table-layout-027-vrl.html fixed-table-layout-025-ref.html -@@ -77,2 +76,0 @@ --fuzzy-if(Android,0-255,0-38) == table-caption-top-1.html table-caption-top-1-ref.html --fuzzy-if(Android,0-255,0-38) pref(layout.css.caption-side-non-standard.enabled,true) == table-caption-bottom-1.html table-caption-bottom-1-ref.html -diff -U0 firefox-92.0/layout/reftests/xul/reftest.list.firefox-tests-reftest firefox-92.0/layout/reftests/xul/reftest.list ---- firefox-92.0/layout/reftests/xul/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/reftests/xul/reftest.list 2021-09-03 18:50:44.869939823 +0200 -@@ -15 +15 @@ --random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == chrome://reftest/content/xul/text-small-caps-1.xhtml chrome://reftest/content/xul/text-small-caps-1-ref.xhtml -+fuzzy-if(gtkWidget,0-255,0-5159) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) == chrome://reftest/content/xul/text-small-caps-1.xhtml chrome://reftest/content/xul/text-small-caps-1-ref.xhtml -diff -U0 firefox-92.0/layout/xul/reftest/reftest.list.firefox-tests-reftest firefox-92.0/layout/xul/reftest/reftest.list ---- firefox-92.0/layout/xul/reftest/reftest.list.firefox-tests-reftest 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/xul/reftest/reftest.list 2021-09-03 18:50:44.869939823 +0200 -@@ -13,2 +12,0 @@ --# This test is fuzzy as the marks cannot be positioned exactly as the real ones are measured in dev pixels. --fuzzy(0-10,0-102) fuzzy-if(winWidget&&isDebugBuild&&layersGPUAccelerated&&!is64Bit,1-1,102-102) == chrome://reftest/content/xul/reftest/scrollbar-marks-overlay.html chrome://reftest/content/xul/reftest/scrollbar-marks-overlay-ref.html diff --git a/firefox-tests-xpcshell-freeze.patch b/firefox-tests-xpcshell-freeze.patch deleted file mode 100644 index 1115417..0000000 --- a/firefox-tests-xpcshell-freeze.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff -up firefox-88.0/testing/xpcshell/runxpcshelltests.py.old firefox-88.0/testing/xpcshell/runxpcshelltests.py ---- firefox-88.0/testing/xpcshell/runxpcshelltests.py.old 2021-04-30 10:45:14.466616224 +0200 -+++ firefox-88.0/testing/xpcshell/runxpcshelltests.py 2021-04-30 10:45:21.339525085 +0200 -@@ -1382,8 +1382,8 @@ class XPCShellTests(object): - self.log.info("Process %s" % label) - self.log.info(msg) - -- dumpOutput(proc.stdout, "stdout") -- dumpOutput(proc.stderr, "stderr") -+ #dumpOutput(proc.stdout, "stdout") -+ #dumpOutput(proc.stderr, "stderr") - self.nodeProc = {} - - def startHttp3Server(self): diff --git a/firefox-tests-xpcshell.patch b/firefox-tests-xpcshell.patch deleted file mode 100644 index a342668..0000000 --- a/firefox-tests-xpcshell.patch +++ /dev/null @@ -1,147 +0,0 @@ -diff -U0 firefox-92.0/browser/components/enterprisepolicies/tests/xpcshell/xpcshell.ini.firefox-tests-xpcshell firefox-92.0/browser/components/enterprisepolicies/tests/xpcshell/xpcshell.ini ---- firefox-92.0/browser/components/enterprisepolicies/tests/xpcshell/xpcshell.ini.firefox-tests-xpcshell 2021-09-01 19:14:33.000000000 +0200 -+++ firefox-92.0/browser/components/enterprisepolicies/tests/xpcshell/xpcshell.ini 2021-09-03 18:39:17.386058157 +0200 -@@ -9 +8,0 @@ --[test_appupdateurl.js] -@@ -27 +25,0 @@ --[test_sorted_alphabetically.js] -diff -U0 firefox-92.0/netwerk/test/unit_ipc/xpcshell.ini.firefox-tests-xpcshell firefox-92.0/netwerk/test/unit_ipc/xpcshell.ini ---- firefox-92.0/netwerk/test/unit_ipc/xpcshell.ini.firefox-tests-xpcshell 2021-09-01 19:15:11.000000000 +0200 -+++ firefox-92.0/netwerk/test/unit_ipc/xpcshell.ini 2021-09-03 18:41:07.754088004 +0200 -@@ -73 +72,0 @@ --[test_dns_service_wrap.js] -@@ -114 +112,0 @@ --[test_trr_httpssvc_wrap.js] -diff -U0 firefox-92.0/netwerk/test/unit/xpcshell.ini.firefox-tests-xpcshell firefox-92.0/netwerk/test/unit/xpcshell.ini ---- firefox-92.0/netwerk/test/unit/xpcshell.ini.firefox-tests-xpcshell 2021-09-01 19:15:11.000000000 +0200 -+++ firefox-92.0/netwerk/test/unit/xpcshell.ini 2021-09-03 18:41:58.545482327 +0200 -@@ -205 +204,0 @@ --[test_dns_service.js] -@@ -221 +219,0 @@ --[test_file_protocol.js] -@@ -328 +325,0 @@ --[test_unix_domain.js] -@@ -340 +336,0 @@ --[test_udp_multicast.js] -@@ -390,2 +385,0 @@ --[test_tls_flags.js] --skip-if = (os == "android" && processor == "x86_64") -@@ -406 +399,0 @@ --[test_network_connectivity_service.js] -@@ -503 +495,0 @@ --[test_httpssvc_retry_with_ech.js] -@@ -513 +504,0 @@ --[test_odoh.js] -diff -U0 firefox-92.0/security/manager/ssl/tests/unit/xpcshell.ini.firefox-tests-xpcshell firefox-92.0/security/manager/ssl/tests/unit/xpcshell.ini ---- firefox-92.0/security/manager/ssl/tests/unit/xpcshell.ini.firefox-tests-xpcshell 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/security/manager/ssl/tests/unit/xpcshell.ini 2021-09-03 18:41:07.755088031 +0200 -@@ -115,4 +114,0 @@ --[test_encrypted_client_hello.js] --run-sequentially = hardcoded ports --[test_encrypted_client_hello_client_only.js] --run-sequentially = hardcoded ports -@@ -180 +175,0 @@ --[test_oskeystore.js] -diff -U0 firefox-92.0/security/manager/ssl/tests/unit/xpcshell-smartcards.ini.firefox-tests-xpcshell firefox-92.0/security/manager/ssl/tests/unit/xpcshell-smartcards.ini ---- firefox-92.0/security/manager/ssl/tests/unit/xpcshell-smartcards.ini.firefox-tests-xpcshell 2021-09-01 19:15:18.000000000 +0200 -+++ firefox-92.0/security/manager/ssl/tests/unit/xpcshell-smartcards.ini 2021-09-03 18:41:07.755088031 +0200 -@@ -10 +9,0 @@ --[test_pkcs11_module.js] -diff -U0 firefox-92.0/toolkit/components/antitracking/test/xpcshell/xpcshell.ini.firefox-tests-xpcshell firefox-92.0/toolkit/components/antitracking/test/xpcshell/xpcshell.ini ---- firefox-92.0/toolkit/components/antitracking/test/xpcshell/xpcshell.ini.firefox-tests-xpcshell 2021-09-01 19:15:34.000000000 +0200 -+++ firefox-92.0/toolkit/components/antitracking/test/xpcshell/xpcshell.ini 2021-09-03 18:41:07.755088031 +0200 -@@ -11 +10,0 @@ --[test_staticPartition_font.js] -diff -U0 firefox-92.0/toolkit/components/commandlines/test/unit/xpcshell.ini.firefox-tests-xpcshell firefox-92.0/toolkit/components/commandlines/test/unit/xpcshell.ini ---- firefox-92.0/toolkit/components/commandlines/test/unit/xpcshell.ini.firefox-tests-xpcshell 2021-09-01 19:16:05.000000000 +0200 -+++ firefox-92.0/toolkit/components/commandlines/test/unit/xpcshell.ini 2021-09-03 18:41:07.755088031 +0200 -@@ -10 +9,0 @@ --[test_resolvefile.js] -diff -U0 firefox-92.0/toolkit/components/corroborator/test/xpcshell/test_verify_jar.js.firefox-tests-xpcshell firefox-92.0/toolkit/components/corroborator/test/xpcshell/test_verify_jar.js ---- firefox-92.0/toolkit/components/corroborator/test/xpcshell/test_verify_jar.js.firefox-tests-xpcshell 2021-09-01 19:16:00.000000000 +0200 -+++ firefox-92.0/toolkit/components/corroborator/test/xpcshell/test_verify_jar.js 2021-09-03 18:41:07.755088031 +0200 -@@ -30,5 +29,0 @@ -- -- result = await Corroborate.verifyJar( -- do_get_file("data/signed-components.xpi") -- ); -- equal(result, true, "Components signed files do verify"); -diff -U0 firefox-92.0/toolkit/components/extensions/test/xpcshell/xpcshell-common.ini.firefox-tests-xpcshell firefox-92.0/toolkit/components/extensions/test/xpcshell/xpcshell-common.ini ---- firefox-92.0/toolkit/components/extensions/test/xpcshell/xpcshell-common.ini.firefox-tests-xpcshell 2021-09-01 19:16:05.000000000 +0200 -+++ firefox-92.0/toolkit/components/extensions/test/xpcshell/xpcshell-common.ini 2021-09-03 18:41:07.755088031 +0200 -@@ -97,10 +96,0 @@ --skip-if = appname == "thunderbird" || os == "android" || tsan # tsan: bug 1612707 --[test_ext_downloads_misc.js] --skip-if = -- os == "android" -- os == 'linux' && bits == 32 # bug 1324870 -- tsan # bug 1612707 -- os == "win" && bits == 32 # bug 1559476 --[test_ext_downloads_partitionKey.js] --skip-if = os == "android" --[test_ext_downloads_private.js] -@@ -288,2 +277,0 @@ --[test_proxy_listener.js] --skip-if = appname == "thunderbird" -diff -U0 firefox-92.0/toolkit/components/search/tests/xpcshell/xpcshell.ini.firefox-tests-xpcshell firefox-92.0/toolkit/components/search/tests/xpcshell/xpcshell.ini ---- firefox-92.0/toolkit/components/search/tests/xpcshell/xpcshell.ini.firefox-tests-xpcshell 2021-09-01 19:16:05.000000000 +0200 -+++ firefox-92.0/toolkit/components/search/tests/xpcshell/xpcshell.ini 2021-09-03 18:41:07.755088031 +0200 -@@ -124 +123,0 @@ --[test_reload_engines.js] -@@ -131 +129,0 @@ --[test_searchSuggest.js] -@@ -142,2 +139,0 @@ --[test_settings.js] --[test_sort_orders-no-hints.js] -diff -U0 firefox-92.0/toolkit/components/telemetry/tests/unit/test_TelemetrySession.js.firefox-tests-xpcshell firefox-92.0/toolkit/components/telemetry/tests/unit/test_TelemetrySession.js ---- firefox-92.0/toolkit/components/telemetry/tests/unit/test_TelemetrySession.js.firefox-tests-xpcshell 2021-09-01 19:16:00.000000000 +0200 -+++ firefox-92.0/toolkit/components/telemetry/tests/unit/test_TelemetrySession.js 2021-09-03 18:41:07.755088031 +0200 -@@ -594,20 +593,0 @@ -- Assert.ok( -- withSuspend - withoutSuspend <= max_delta_ms, -- "In test condition, the two uptimes should be close to each other" -- ); -- -- // This however should always hold, except on Windows < 10, where the two -- // clocks are from different system calls, and it can fail in test condition -- // because the machine has not been suspended. -- if ( -- AppConstants.platform != "win" || -- AppConstants.isPlatformAndVersionAtLeast("win", "10.0") -- ) { -- Assert.greaterOrEqual( -- withSuspend, -- withoutSuspend, -- `The uptime with suspend must always been greater or equal to the uptime -- without suspend` -- ); -- } -- -diff -U0 firefox-92.0/toolkit/mozapps/downloads/tests/unit/xpcshell.ini.firefox-tests-xpcshell firefox-92.0/toolkit/mozapps/downloads/tests/unit/xpcshell.ini ---- firefox-92.0/toolkit/mozapps/downloads/tests/unit/xpcshell.ini.firefox-tests-xpcshell 2021-09-01 19:16:01.000000000 +0200 -+++ firefox-92.0/toolkit/mozapps/downloads/tests/unit/xpcshell.ini 2021-09-03 18:41:07.755088031 +0200 -@@ -4 +3,0 @@ --[test_DownloadUtils.js] -diff -U0 firefox-92.0/toolkit/mozapps/extensions/test/xpcshell/xpcshell.ini.firefox-tests-xpcshell firefox-92.0/toolkit/mozapps/extensions/test/xpcshell/xpcshell.ini ---- firefox-92.0/toolkit/mozapps/extensions/test/xpcshell/xpcshell.ini.firefox-tests-xpcshell 2021-09-01 19:16:01.000000000 +0200 -+++ firefox-92.0/toolkit/mozapps/extensions/test/xpcshell/xpcshell.ini 2021-09-03 18:41:07.756088058 +0200 -@@ -91 +90,0 @@ --[test_sideloads_after_rebuild.js] -@@ -106 +104,0 @@ --[test_startup_scan.js] -@@ -187,2 +184,0 @@ --tags = webextensions --[test_webextension_theme.js] -diff -U0 firefox-92.0/toolkit/profile/xpcshell/xpcshell.ini.firefox-tests-xpcshell firefox-92.0/toolkit/profile/xpcshell/xpcshell.ini ---- firefox-92.0/toolkit/profile/xpcshell/xpcshell.ini.firefox-tests-xpcshell 2021-09-01 19:15:35.000000000 +0200 -+++ firefox-92.0/toolkit/profile/xpcshell/xpcshell.ini 2021-09-03 18:41:07.756088058 +0200 -@@ -32,3 +31,0 @@ --[test_snatch_environment.js] --[test_skip_locked_environment.js] --[test_snatch_environment_default.js] -diff -U0 firefox-92.0/uriloader/exthandler/tests/unit/test_handlerService.js.firefox-tests-xpcshell firefox-92.0/uriloader/exthandler/tests/unit/test_handlerService.js ---- firefox-92.0/uriloader/exthandler/tests/unit/test_handlerService.js.firefox-tests-xpcshell 2021-09-01 19:16:05.000000000 +0200 -+++ firefox-92.0/uriloader/exthandler/tests/unit/test_handlerService.js 2021-09-03 18:41:07.756088058 +0200 -@@ -145 +145 @@ -- Assert.ok(!protoInfo.alwaysAskBeforeHandling); -+ //Assert.ok(!protoInfo.alwaysAskBeforeHandling); diff --git a/firefox.1 b/firefox.1 index 9228231..318f2af 100644 --- a/firefox.1 +++ b/firefox.1 @@ -6,17 +6,10 @@ firefox \- a Web browser for X11 derived from the Mozilla browser .B firefox [\fIOPTIONS\fR ...] [\fIURL\fR] -.B firefox-bin -[\fIOPTIONS\fR] [\fIURL\fR] - .SH DESCRIPTION \fBMozilla Firefox\fR is an open-source web browser, designed for standards compliance, performance and portability. -.SH USAGE -\fBfirefox\fR is a simple shell script that will set up the -environment for the actual executable, \fBfirefox-bin\fR. - .SH OPTIONS A summary of the options supported by \fBfirefox\fR is included below. @@ -132,7 +125,7 @@ Specify destination file for a drawing recording. \fI/usr/bin/firefox\fR - shell script wrapping \fBfirefox\fR .br -\fI/usr/lib64/firefox/firefox-bin\fR - \fBfirefox\fR +\fI/usr/lib64/firefox/firefox\fR - \fBfirefox\fR executable .SH VERSION diff --git a/firefox.desktop b/firefox.desktop index 566c8d9..bd09aa8 100644 --- a/firefox.desktop +++ b/firefox.desktop @@ -1,47 +1,520 @@ [Desktop Entry] Version=1.0 Name=Firefox -GenericName=Web Browser -GenericName[ca]=Navegador web -GenericName[cs]=Webový prohlížeč -GenericName[es]=Navegador web -GenericName[fa]=مرورگر اینترنتی -GenericName[fi]=WWW-selain -GenericName[fr]=Navigateur Web -GenericName[hu]=Webböngésző -GenericName[it]=Browser Web -GenericName[ja]=ウェブ・ブラウザ -GenericName[ko]=웹 브라우저 -GenericName[nb]=Nettleser -GenericName[nl]=Webbrowser -GenericName[nn]=Nettlesar -GenericName[no]=Nettleser -GenericName[pl]=Przeglądarka WWW -GenericName[pt]=Navegador Web -GenericName[pt_BR]=Navegador Web -GenericName[sk]=Internetový prehliadač -GenericName[sv]=Webbläsare -Comment=Browse the Web -Comment[ca]=Navegueu per el web +Name[ach]=Firefox +Name[af]=Firefox +Name[an]=Firefox +Name[ar]=Firefox +Name[ast]=Firefox +Name[az]=Firefox +Name[be]=Firefox +Name[bg]=Firefox +Name[bn]=Firefox +Name[br]=Firefox +Name[bs]=Firefox +Name[ca]=Firefox +Name[ca_valencia]=Firefox +Name[cak]=Firefox +Name[cs]=Firefox +Name[cy]=Firefox +Name[da]=Firefox +Name[de]=Firefox +Name[dsb]=Firefox +Name[el]=Firefox +Name[en_CA]=Firefox +Name[en_GB]=Firefox +Name[eo]=Firefox +Name[es_AR]=Firefox +Name[es_CL]=Firefox +Name[es_ES]=Firefox +Name[es_MX]=Firefox +Name[et]=Firefox +Name[eu]=Firefox +Name[fa]=Firefox +Name[ff]=Firefox +Name[fi]=Firefox +Name[fr]=Firefox +Name[fur]=Firefox +Name[fy_NL]=Firefox +Name[ga_IE]=Firefox +Name[gd]=Firefox +Name[gl]=Firefox +Name[gn]=Firefox +Name[gu_IN]=Firefox +Name[he]=Firefox +Name[hi_IN]=Firefox +Name[hr]=Firefox +Name[hsb]=Firefox +Name[hu]=Firefox +Name[hy_AM]=Firefox +Name[ia]=Firefox +Name[id]=Firefox +Name[is]=Firefox +Name[it]=Firefox +Name[ja]=Firefox +Name[ka]=Firefox +Name[kab]=Firefox +Name[kk]=Firefox +Name[km]=Firefox +Name[kn]=Firefox +Name[ko]=Firefox +Name[lij]=Firefox +Name[lt]=Firefox +Name[lv]=Firefox +Name[mk]=Firefox +Name[mr]=Firefox +Name[ms]=Firefox +Name[my]=Firefox +Name[nb_NO]=Firefox +Name[ne_NP]=Firefox +Name[nl]=Firefox +Name[nn_NO]=Firefox +Name[oc]=Firefox +Name[pa_IN]=Firefox +Name[pl]=Firefox +Name[pt_BR]=Firefox +Name[pt_PT]=Firefox +Name[rm]=Firefox +Name[ro]=Firefox +Name[ru]=Firefox +Name[sat]=Firefox +Name[sc]=Firefox +Name[sco]=Firefox +Name[si]=Firefox +Name[sk]=Firefox +Name[skr]=Firefox +Name[sl]=Firefox +Name[son]=Firefox +Name[sq]=Firefox +Name[sr]=Firefox +Name[sv_SE]=Firefox +Name[szl]=Firefox +Name[ta]=Firefox +Name[te]=Firefox +Name[tg]=Firefox +Name[th]=Firefox +Name[tl]=Firefox +Name[tr]=Firefox +Name[trs]=Firefox +Name[uk]=Firefox +Name[ur]=Firefox +Name[uz]=Firefox +Name[vi]=Firefox +Name[xh]=Firefox +Name[zh_CN]=Firefox +Name[zh_TW]=Firefox +Comment=Browse the World Wide Web +Comment[ach]=Browse the World Wide Web +Comment[af]=Browse the World Wide Web +Comment[an]=Browse the World Wide Web +Comment[ar]=تصفح شبكة الوِب العالمية +Comment[ast]=Browse the World Wide Web +Comment[az]=Browse the World Wide Web +Comment[be]=Аглядайце Сеціва +Comment[bg]=Разгледайте световната мрежа +Comment[bn]=ওয়ার্ল্ড ওয়াইড ওয়েব ব্রাউজ করুন +Comment[br]=Ergerzhout ar World Wide Web +Comment[bs]=Pretražujte World Wide Web +Comment[ca]=Navegeu pel Web +Comment[ca_valencia]=Browse the World Wide Web +Comment[cak]=Tok chupam Word Wide Web Comment[cs]=Prohlížení stránek World Wide Webu +Comment[cy]=Pori'r We Fyd Eang +Comment[da]=Brug internettet Comment[de]=Im Internet surfen -Comment[es]=Navegue por la web -Comment[fa]=صفحات شبکه جهانی اینترنت را مرور نمایید -Comment[fi]=Selaa Internetin WWW-sivuja -Comment[fr]=Navigue sur Internet -Comment[hu]=A világháló böngészése -Comment[it]=Esplora il web -Comment[ja]=ウェブを閲覧します -Comment[ko]=웹을 돌아 다닙니다 -Comment[nb]=Surf på nettet -Comment[nl]=Verken het internet -Comment[nn]=Surf på nettet -Comment[no]=Surf på nettet -Comment[pl]=Przeglądanie stron WWW -Comment[pt]=Navegue na Internet -Comment[pt_BR]=Navegue na Internet -Comment[sk]=Prehliadanie internetu -Comment[sv]=Surfa på webben +Comment[dsb]=Pśeglědajśo World Wide Web +Comment[el]=Περιηγηθείτε στον παγκόσμιο ιστό +Comment[en_CA]=Browse the World Wide Web +Comment[en_GB]=Browse the World Wide Web +Comment[eo]=Retumi en la reto +Comment[es_AR]=Navegar la World Wide Web +Comment[es_CL]=Navegar por la World Wide Web +Comment[es_ES]=Navegar por la web +Comment[es_MX]=Navegar por la web +Comment[et]=Browse the World Wide Web +Comment[eu]=Arakatu World Wide Web-a +Comment[fa]=Browse the World Wide Web +Comment[ff]=Browse the World Wide Web +Comment[fi]=Selaa Internetiä +Comment[fr]=Naviguer sur le Web +Comment[fur]=Navighe sul Web +Comment[fy_NL]=Navigearje op it wrâldwide web +Comment[ga_IE]=Browse the World Wide Web +Comment[gd]=Rùraich lìon na cruinne +Comment[gl]=Navegar pola World Wide Web +Comment[gn]=Eikundaha World Wide Web rupi +Comment[gu_IN]=Browse the World Wide Web +Comment[he]=גלישה באינטרנט +Comment[hi_IN]=Browse the World Wide Web +Comment[hr]=Pregledaj World Wide Web +Comment[hsb]=Přehladajće World Wide Web +Comment[hu]=Böngésszen a világhálón +Comment[hy_AM]=Զննի՛ր համաշխարհային սարդոստայնը +Comment[ia]=Navigar sur le Web +Comment[id]=Jelajahi World Wide Web +Comment[is]=Vafraðu um veraldarvefinn +Comment[it]=Naviga sul Web +Comment[ja]=World Wide Web をブラウジング +Comment[ka]=მსოფლიო ქსელთან წვდომა +Comment[kab]=Inig deg Web +Comment[kk]=Ғаламторды шолу +Comment[km]=Browse the World Wide Web +Comment[kn]=Browse the World Wide Web +Comment[ko]=월드 와이드 웹 탐색 +Comment[lij]=Browse the World Wide Web +Comment[lt]=Browse the World Wide Web +Comment[lv]=Pārlūkojiet globālo tīmekli +Comment[mk]=Browse the World Wide Web +Comment[mr]=Browse the World Wide Web +Comment[ms]=Browse the World Wide Web +Comment[my]=Browse the World Wide Web +Comment[nb_NO]=Surf på nettet +Comment[ne_NP]=वर्ल्ड वाइड वेब ब्राउज गर्नुहोस् +Comment[nl]=Navigeren op het wereldwijde web +Comment[nn_NO]=Surf på nettet +Comment[oc]=Navegar pel Web +Comment[pa_IN]=ਵਰਲਡ ਵਾਈਡ ਵੈੱਬ ਬਰਾਊਜ਼ਰ ਕਰੋ +Comment[pl]=Przeglądaj Internet +Comment[pt_BR]=Navegue na World Wide Web +Comment[pt_PT]=Navegar na Internet +Comment[rm]=Navigar en il web +Comment[ro]=Browse the World Wide Web +Comment[ru]=Доступ в Интернет +Comment[sat]=World Wide Web ᱠᱷᱩᱞᱟᱹᱭ ᱢᱮ +Comment[sc]=Nàviga su Web +Comment[sco]=Browse the World Wide Web +Comment[si]=ලෝක ව්‍යාප්ත වියමන පිරික්සන්න +Comment[sk]=Prehľadávať web (www) +Comment[skr]=ورلڈ وائیڈ ویب براؤز کرو +Comment[sl]=Brskanje po svetovnem spletu +Comment[son]=Browse the World Wide Web +Comment[sq]=Shfletoni në World Wide Web +Comment[sr]=Истражите интернет +Comment[sv_SE]=Surfa på webben +Comment[szl]=Browse the World Wide Web +Comment[ta]=Browse the World Wide Web +Comment[te]=ప్రపంచ వ్యాప్త జాలంలో విహరించండి +Comment[tg]=Ба шабакаи ҷаҳонии Интернет дастрасӣ пайдо намоед +Comment[th]=เรียกดูเวิลด์ไวด์เว็บ +Comment[tl]=Browse the World Wide Web +Comment[tr]=Web’de gezin +Comment[trs]=Gāchē nu ngà World Wide Web +Comment[uk]=Переглядайте всесвітню мережу +Comment[ur]=Browse the World Wide Web +Comment[uz]=Browse the World Wide Web +Comment[vi]=Duyệt web trên toàn thế giới +Comment[xh]=Browse the World Wide Web +Comment[zh_CN]=浏览万维网 +Comment[zh_TW]=瀏覽全球資訊網 +GenericName=Web Browser +GenericName[ach]=Web Browser +GenericName[af]=Web Browser +GenericName[an]=Web Browser +GenericName[ar]=متصفح الإنترنت +GenericName[ast]=Web Browser +GenericName[az]=Web Browser +GenericName[be]=Вэб-браўзер +GenericName[bg]=Уеб браузър +GenericName[bn]=ওয়েব ব্রাউজার +GenericName[br]=Merdeer Web +GenericName[bs]=Web pretraživač +GenericName[ca]=Navegador web +GenericName[ca_valencia]=Web Browser +GenericName[cak]=Web Okik'amaya'l +GenericName[cs]=Webový prohlížeč +GenericName[cy]=Porwr Gwe +GenericName[da]=Webbrowser +GenericName[de]=Internet-Browser +GenericName[dsb]=Webwobglědowak +GenericName[el]=Πρόγραμμα περιήγησης +GenericName[en_CA]=Web Browser +GenericName[en_GB]=Web Browser +GenericName[eo]=Retumilo +GenericName[es_AR]=Navegador web +GenericName[es_CL]=Navegador Web +GenericName[es_ES]=Navegador web +GenericName[es_MX]=Navegador Web +GenericName[et]=Web Browser +GenericName[eu]=Web nabigatzailea +GenericName[fa]=Web Browser +GenericName[ff]=Web Browser +GenericName[fi]=Verkkoselain +GenericName[fr]=Navigateur web +GenericName[fur]=Navigadôr Web +GenericName[fy_NL]=Webbrowser +GenericName[ga_IE]=Web Browser +GenericName[gd]=Brabhsair-lìn +GenericName[gl]=Navegador web +GenericName[gn]=Ñanduti Kundahára +GenericName[gu_IN]=Web Browser +GenericName[he]=דפדפן אינטרנט +GenericName[hi_IN]=Web Browser +GenericName[hr]=Web preglednik +GenericName[hsb]=Webwobhladowak +GenericName[hu]=Webböngésző +GenericName[hy_AM]=Վեբ դիտարկիչ +GenericName[ia]=Navigator web +GenericName[id]=Peramban Web +GenericName[is]=Vafri +GenericName[it]=Browser web +GenericName[ja]=ウェブブラウザー +GenericName[ka]=ბრაუზერი +GenericName[kab]=Iminig web +GenericName[kk]=Веб-браузері +GenericName[km]=Web Browser +GenericName[kn]=Web Browser +GenericName[ko]=웹 브라우저 +GenericName[lij]=Navegatô Web +GenericName[lt]=Web Browser +GenericName[lv]=Tīmekļa pārlūks +GenericName[mk]=Web Browser +GenericName[mr]=Web Browser +GenericName[ms]=Web Browser +GenericName[my]=Web Browser +GenericName[nb_NO]=Nettleser +GenericName[ne_NP]=वेब ब्राउजर +GenericName[nl]=Webbrowser +GenericName[nn_NO]=Nettlesar +GenericName[oc]=Navegador Web +GenericName[pa_IN]=ਵੈੱਬ ਬਰਾਊਜ਼ਰ +GenericName[pl]=Przeglądarka internetowa +GenericName[pt_BR]=Navegador web +GenericName[pt_PT]=Navegador Web +GenericName[rm]=Navigatur web +GenericName[ro]=Web Browser +GenericName[ru]=Веб-браузер +GenericName[sat]=ᱣᱮᱵᱽ ᱵᱽᱨᱟᱣᱡᱚᱨ +GenericName[sc]=Navigadore web +GenericName[sco]=Web Browser +GenericName[si]=වියමන අතිරික්සුව +GenericName[sk]=Webový prehliadač +GenericName[skr]=ویب براؤزر +GenericName[sl]=Spletni brskalnik +GenericName[son]=Web Browser +GenericName[sq]=Shfletues +GenericName[sr]=Веб прегледач +GenericName[sv_SE]=Webbläsare +GenericName[szl]=Web Browser +GenericName[ta]=Web Browser +GenericName[te]=జాల విహారిణి +GenericName[tg]=Браузери веб +GenericName[th]=เว็บเบราว์เซอร์ +GenericName[tl]=Web Browser +GenericName[tr]=Web Tarayıcısı +GenericName[trs]=Web riña gāchē nu’ +GenericName[uk]=Браузер +GenericName[ur]=Web Browser +GenericName[uz]=Web Browser +GenericName[vi]=Trình duyệt web +GenericName[xh]=Web Browser +GenericName[zh_CN]=Web 浏览器 +GenericName[zh_TW]=網頁瀏覽器 +Keywords=Internet;WWW;Browser;Web;Explorer; +Keywords[ach]=Internet;WWW;Browser;Web;Explorer; +Keywords[af]=Internet;WWW;Browser;Web;Explorer; +Keywords[an]=Internet;WWW;Browser;Web;Explorer; +Keywords[ar]=إنترنت;WWW;متصفح;ويب;مستكشف; +Keywords[ast]=Internet;WWW;Browser;Web;Explorer; +Keywords[az]=Internet;WWW;Browser;Web;Explorer; +Keywords[be]=Internet;WWW;Browser;Web;Explorer; +Keywords[bg]=Internet;WWW;Browser;Web;Explorer; +Keywords[bn]=ইন্টারনেট;WWW;ব্রাউজার;ওয়েব;এক্সপ্লোরার; +Keywords[br]=Internet;WWW;Merdeer;Web;Ergerzhout; +Keywords[bs]=Internet;WWW;Pretraživač;Web;Istraživač; +Keywords[ca]=Internet;WWW;Browser;Web;Explorador;Navegador; +Keywords[ca_valencia]=Internet;WWW;Browser;Web;Explorer; +Keywords[cak]=K'amaya'l;WWW;Okik'amaya'l;Kanob'äl; +Keywords[cs]=internet;WWW;prohlížeč;web; +Keywords[cy]=Rhyngrwyd;WWW;Porwr;Gwe;Archwiliwr; +Keywords[da]=Internet;WWW;Browser;Nettet;Explorer; +Keywords[de]=Internet;WWW;Browser;Web;Explorer; +Keywords[dsb]=Internet;WWW;wobglědowak;Web;Explorer; +Keywords[el]=Internet;WWW;Browser;Web;Explorer;Διαδίκτυο;Ιστός;Ίντερνετ; +Keywords[en_CA]=Internet;WWW;Browser;Web;Explorer; +Keywords[en_GB]=Internet;WWW;Browser;Web;Explorer; +Keywords[eo]=Interreto;Retumilo;TTT;Teksaĵo;Reto;Internet;WWW;Browser;Web;Explorer; +Keywords[es_AR]=Internet;WWW;Navegador;Web;Explorador; +Keywords[es_CL]=Internet;WWW;Navegador;Web;Explorador; +Keywords[es_ES]=Internet;WWW;Navegador;Web;Explorador; +Keywords[es_MX]=Internet;WWW;Navegador;Web;Explorador; +Keywords[et]=Internet;WWW;Browser;Web;Explorer; +Keywords[eu]=Internet;WWW;Nabigatzailea;Web;Arakatzailea; +Keywords[fa]=Internet;WWW;Browser;Web;Explorer; +Keywords[ff]=Internet;WWW;Browser;Web;Explorer; +Keywords[fi]=Internet;WWW;Browser;Web;Explorer;netti;webbi;selain; +Keywords[fr]=Internet;WWW;Navigateur;Web;Explorer; +Keywords[fur]=Internet;WWW;Browser;Navigadôr;Web;Esploradôr;Explorer; +Keywords[fy_NL]=Ynternet;WWW;Browser;Web;Ferkenner; +Keywords[ga_IE]=Internet;WWW;Browser;Web;Explorer; +Keywords[gd]=Internet;WWW;Browser;Web;Explorer;eadar-lìon;brabhsair;brobhsair;lìon;taisgealaiche; +Keywords[gl]=Internet;WWW;Navegador;Web;Explorador; +Keywords[gn]=Internet;WWW;Browser;Web;Explorer; +Keywords[gu_IN]=Internet;WWW;Browser;Web;Explorer; +Keywords[he]=אינטרנט;WWW;דפדפן;רשת;סייר;מרשתת; +Keywords[hi_IN]=Internet;WWW;Browser;Web;Explorer; +Keywords[hr]=Internet;WWW;Preglednik;Web;Istraživač; +Keywords[hsb]=Internet;WWW;wobhladowak;Web;Explorer; +Keywords[hu]=Internet;WWW;Böngésző;Web;Világháló; +Keywords[hy_AM]=Համացանց,WWW,Զննիչ,Վեբ,Ցանցախույզ: +Keywords[ia]=Internet;WWW;Navigator;Web;Explorator; +Keywords[id]=Internet;WWW;Browser;Web;Explorer; +Keywords[is]=Internet;WWW; Vafri; Vefur; Explorer; +Keywords[it]=Internet;WWW;Browser;Web;Explorer;Navigatore; +Keywords[ja]=Internet;WWW;Browser;Web;Explorer;インターネット;ブラウザー;ウェブ; +Keywords[ka]=ინტერნეტი;WWW;ბრაუზერი;ქსელი;ქსელთან წვდომა; +Keywords[kab]=Internet;WWW;Browser;Web;Explorer; +Keywords[kk]=Internet;WWW;Browser;Web;Explorer;Интернет;Ғаламтор;Браузер;Желі;Шолғыш; +Keywords[km]=Internet;WWW;Browser;Web;Explorer; +Keywords[kn]=Internet;WWW;Browser;Web;Explorer; +Keywords[ko]=인터넷;브라우저;웹;탐색기;Internet;WWW;Browser;Web;Explorer; +Keywords[lij]=Internet;WWW;Browser;Web;Explorer;Navegatô; +Keywords[lt]=Internet;WWW;Browser;Web;Explorer; +Keywords[lv]=Internets;WWW;Pārlūkprogramma;Tīmeklis; +Keywords[mk]=Internet;WWW;Browser;Web;Explorer; +Keywords[mr]=Internet;WWW;Browser;Web;Explorer; +Keywords[ms]=Internet;WWW;Browser;Web;Explorer; +Keywords[my]=Internet;WWW;Browser;Web;Explorer; +Keywords[nb_NO]=Internett;WWW;Nettleser;Web;Utforsker; +Keywords[ne_NP]=Internet;WWW;Browser;Web;Explorer; +Keywords[nl]=Internet;WWW;Browser;Web;Verkenner; +Keywords[nn_NO]=Internett;WWW;Nettlesar;Web;Utforskar; +Keywords[oc]=Internet;WWW;Navegador;Navigador;Navegator;Navigator;Web;Explorer; +Keywords[pa_IN]=ਇੰਟਰਨੈੱਟ;WWW;ਬਰਾਊਜ਼ਰ;ਵੈੱਬ;ਐਕਸਪਲਰੋਰ;ਵੈਬ;ਇੰਟਰਨੈਟ; +Keywords[pl]=Internet;WWW;Przeglądarka;Browser;Wyszukiwarka;Web;Sieć;Explorer;Eksplorer;Strony;Witryny;internetowe; +Keywords[pt_BR]=Internet;WWW;Browser;Web;Explorer;Navegador; +Keywords[pt_PT]=Internet;WWW;Navegador;Web;Explorador; +Keywords[rm]=Internet;WWW;Browser;Web;Explorer;navigatur; +Keywords[ro]=Internet;WWW;Browser;Web;Explorer; +Keywords[ru]=Сеть;Интернет;Браузер;Доступ в Интернет; +Keywords[sat]=Internet;WWW;Browser;Web;Explorer; +Keywords[sc]=Internet;WWW;Navigadore;Web;Explorer; +Keywords[sco]=Internet;WWW;Browser;Web;Explorer; +Keywords[si]=අන්තර්ජාලය;අතිරික්සුව;පිරික්සන්න;ගවේශකය;Internet;WWW;Browser;Web;Explorer; +Keywords[sk]=Internet;WWW;Prehliadač;Web;Prieskumník; +Keywords[skr]=Internet;WWW;Browser;Web;Explorer; +Keywords[sl]=internet;www;brskalnik;splet; +Keywords[son]=Internet;WWW;Browser;Web;Explorer; +Keywords[sq]=Internet;WWW;Shfletues;Web;Eksplorues; +Keywords[sr]=Internet;WWW;Browser;Web;Explorer;интернет;прегледач;веб;мрежа;прегледач; +Keywords[sv_SE]=Internet;WWW;Webbläsare;Webb;Utforskare; +Keywords[szl]=Internet;WWW;Browser;Web;Explorer; +Keywords[ta]=Internet;WWW;Browser;Web;Explorer; +Keywords[te]=Internet;WWW;Browser;Web;Explorer; +Keywords[tg]=Интернет;WWW;Браузер;Сомона;Ҷустуҷӯгар; +Keywords[th]=อินเทอร์เน็ต;เบราว์เซอร์;เว็บ;Internet;WWW;Browser;Web;Explorer; +Keywords[tl]=Internet;WWW;Browser;Web;Explorer; +Keywords[tr]=Internet;WWW;Browser;Web;Explorer;İnternet;Tarayıcı; +Keywords[trs]=Internet;WWW;Browser;Web;Explorer; +Keywords[uk]=Інтернет;WWW;Браузер;Веб;Переглядач; +Keywords[ur]=Internet;WWW;Browser;Web;Explorer; +Keywords[uz]=Internet;WWW;Browser;Web;Explorer; +Keywords[vi]=Internet;WWW;Trình duyệt;Web;Duyệt web; +Keywords[xh]=Internet;WWW;Browser;Web;Explorer; +Keywords[zh_CN]=Internet;WWW;Browser;Web;Explorer; +Keywords[zh_TW]=網際網路;網路;瀏覽器;網頁;上網;Internet;WWW;Browser;Web;Explorer; +X-GNOME-FullName=Firefox Web Browser +X-GNOME-FullName[ach]=Firefox Web Browser +X-GNOME-FullName[af]=Firefox Web Browser +X-GNOME-FullName[an]=Firefox Web Browser +X-GNOME-FullName[ar]=متصفح Firefox +X-GNOME-FullName[ast]=Firefox Web Browser +X-GNOME-FullName[az]=Firefox Web Browser +X-GNOME-FullName[be]=Вэб-браўзер Firefox +X-GNOME-FullName[bg]=Firefox Уеб браузър +X-GNOME-FullName[bn]=Firefox Web Browser +X-GNOME-FullName[br]=Merdeer Web Firefox +X-GNOME-FullName[bs]=Firefox web pretraživač +X-GNOME-FullName[ca]=Navegador web Firefox +X-GNOME-FullName[ca_valencia]=Firefox Web Browser +X-GNOME-FullName[cak]=Firefox Web Browser +X-GNOME-FullName[cs]=Webový prohlížeč Firefox +X-GNOME-FullName[cy]=Porwr Gwe Firefox +X-GNOME-FullName[da]=Firefox-browser +X-GNOME-FullName[de]=Firefox-Web-Browser +X-GNOME-FullName[dsb]=Webwobglědowak Firefox +X-GNOME-FullName[el]=Πρόγραμμα περιήγησης Firefox +X-GNOME-FullName[en_CA]=Firefox Web Browser +X-GNOME-FullName[en_GB]=Firefox Web Browser +X-GNOME-FullName[eo]=Retumilo Firefox +X-GNOME-FullName[es_AR]=Navegador web Firefox +X-GNOME-FullName[es_CL]=Navegador web Firefox +X-GNOME-FullName[es_ES]=Navegador web Firefox +X-GNOME-FullName[es_MX]=Navegador web Firefox +X-GNOME-FullName[et]=Firefox Web Browser +X-GNOME-FullName[eu]=Firefox web nabigatzailea +X-GNOME-FullName[fa]=Firefox Web Browser +X-GNOME-FullName[ff]=Firefox Web Browser +X-GNOME-FullName[fi]=Firefox-verkkoselain +X-GNOME-FullName[fr]=Navigateur web Firefox +X-GNOME-FullName[fur]=Navigadôr web Firefox +X-GNOME-FullName[fy_NL]=Firefox-webbrowser +X-GNOME-FullName[ga_IE]=Firefox Web Browser +X-GNOME-FullName[gd]=Brabhsair-lìn Firefox +X-GNOME-FullName[gl]=Navegador web Firefox +X-GNOME-FullName[gn]=Firefox Ñanduti Kundahára +X-GNOME-FullName[gu_IN]=Firefox Web Browser +X-GNOME-FullName[he]=דפדפן אינטרנט Firefox +X-GNOME-FullName[hi_IN]=Firefox वेब ब्राउज़र +X-GNOME-FullName[hr]=Firefox web preglednik +X-GNOME-FullName[hsb]=Webwobhladowak Firefox +X-GNOME-FullName[hu]=Firefox webböngésző +X-GNOME-FullName[hy_AM]=Firefox վեբ դիտարկիչ +X-GNOME-FullName[ia]=Navigator web Firefox +X-GNOME-FullName[id]=Firefox Peramban Web +X-GNOME-FullName[is]=Firefox-vafri +X-GNOME-FullName[it]=Browser web Firefox +X-GNOME-FullName[ja]=Firefox ウェブブラウザー +X-GNOME-FullName[ka]=Firefox-ბრაუზერი +X-GNOME-FullName[kab]=Iminig web Firefox +X-GNOME-FullName[kk]=Firefox веб-браузері +X-GNOME-FullName[km]=Firefox Web Browser +X-GNOME-FullName[kn]=Firefox Web Browser +X-GNOME-FullName[ko]=Firefox 웹 브라우저 +X-GNOME-FullName[lij]=Firefox Navegatô Web +X-GNOME-FullName[lt]=Firefox Web Browser +X-GNOME-FullName[lv]=Firefox tīmekļa pārlūks +X-GNOME-FullName[mk]=Firefox Web Browser +X-GNOME-FullName[mr]=Firefox Web Browser +X-GNOME-FullName[ms]=Firefox Web Browser +X-GNOME-FullName[my]=Firefox Web Browser +X-GNOME-FullName[nb_NO]=Firefox-nettleser +X-GNOME-FullName[ne_NP]=Firefox वेब ब्राउजर +X-GNOME-FullName[nl]=Firefox-webbrowser +X-GNOME-FullName[nn_NO]=Firefox-nettlesar +X-GNOME-FullName[oc]=Navegador web Firefox +X-GNOME-FullName[pa_IN]=Firefox ਵੈੱਬ ਬਰਾਊਜ਼ਰ +X-GNOME-FullName[pl]=Przeglądarka Firefox +X-GNOME-FullName[pt_BR]=Navegador web Firefox +X-GNOME-FullName[pt_PT]=Navegador Web Firefox +X-GNOME-FullName[rm]=Navigatur-web Firefox +X-GNOME-FullName[ro]=Firefox Web Browser +X-GNOME-FullName[ru]=Веб-браузер Firefox +X-GNOME-FullName[sat]=Firefox ᱣᱮᱵᱽ ᱵᱽᱨᱟᱣᱡᱚᱨ +X-GNOME-FullName[sc]=Navigadore web Firefox +X-GNOME-FullName[sco]=Firefox Web Browser +X-GNOME-FullName[si]=Firefox අතිරික්සුව +X-GNOME-FullName[sk]=Webový prehliadač Firefox +X-GNOME-FullName[skr]=Firefox ویب براؤزر +X-GNOME-FullName[sl]=Spletni brskalnik Firefox +X-GNOME-FullName[son]=Firefox Web Browser +X-GNOME-FullName[sq]=Shfletuesi Firefox +X-GNOME-FullName[sr]=Firefox веб прегледач +X-GNOME-FullName[sv_SE]=Firefox webbläsare +X-GNOME-FullName[szl]=Firefox Web Browser +X-GNOME-FullName[ta]=Firefox Web Browser +X-GNOME-FullName[te]=Firefox Web Browser +X-GNOME-FullName[tg]=Браузери интернетии «Firefox» +X-GNOME-FullName[th]=เว็บเบราว์เซอร์ Firefox +X-GNOME-FullName[tl]=Firefox Web Browser +X-GNOME-FullName[tr]=Firefox Web Tarayıcısı +X-GNOME-FullName[trs]=Firefox Web riña gāchē nu’ +X-GNOME-FullName[uk]=Браузер Firefox +X-GNOME-FullName[ur]=Firefox Web Browser +X-GNOME-FullName[uz]=Firefox Web Browser +X-GNOME-FullName[vi]=Trình duyệt Web Firefox +X-GNOME-FullName[xh]=Firefox Web Browser +X-GNOME-FullName[zh_CN]=Firefox 浏览器 +X-GNOME-FullName[zh_TW]=Firefox 網頁瀏覽器 Exec=firefox %u Icon=firefox Terminal=false @@ -49,230 +522,324 @@ Type=Application MimeType=text/html;text/xml;application/xhtml+xml;application/vnd.mozilla.xul+xml;text/mml;x-scheme-handler/http;x-scheme-handler/https; StartupNotify=true Categories=Network;WebBrowser; -Keywords=web;browser;internet; Actions=new-window;new-private-window;profile-manager-window; # Activable desktop file crashes KDE so remove it for now # DBusActivatable=true [Desktop Action new-window] -Name=Open a New Window -Name[ach]=Dirica manyen -Name[af]=Nuwe venster -Name[an]=Nueva finestra +Name=New Window +Name[ach]=New Window +Name[af]=New Window +Name[an]=New Window Name[ar]=نافذة جديدة -Name[as]=নতুন উইন্ডো -Name[ast]=Ventana nueva -Name[az]=Yeni Pəncərə +Name[ast]=New Window +Name[az]=New Window Name[be]=Новае акно Name[bg]=Нов прозорец -Name[bn_BD]=নতুন উইন্ডো (N) -Name[bn_IN]=নতুন উইন্ডো +Name[bn]=নতুন উইন্ডো Name[br]=Prenestr nevez -Name[brx]=गोदान उइन्ड'(N) Name[bs]=Novi prozor Name[ca]=Finestra nova -Name[cak]=K'ak'a' tzuwäch +Name[ca_valencia]=New Window +Name[cak]=K'ak'a' Tzuwäch Name[cs]=Nové okno Name[cy]=Ffenestr Newydd Name[da]=Nyt vindue Name[de]=Neues Fenster Name[dsb]=Nowe wokno Name[el]=Νέο παράθυρο +Name[en_CA]=New Window Name[en_GB]=New Window -Name[en_US]=New Window -Name[en_ZA]=New Window Name[eo]=Nova fenestro Name[es_AR]=Nueva ventana Name[es_CL]=Nueva ventana Name[es_ES]=Nueva ventana Name[es_MX]=Nueva ventana -Name[et]=Uus aken +Name[et]=New Window Name[eu]=Leiho berria Name[fa]=پنجره جدید‌ -Name[ff]=Henorde Hesere +Name[ff]=New Window Name[fi]=Uusi ikkuna Name[fr]=Nouvelle fenêtre +Name[fur]=Gnûf barcon Name[fy_NL]=Nij finster -Name[ga_IE]=Fuinneog Nua +Name[ga_IE]=New Window Name[gd]=Uinneag ùr Name[gl]=Nova xanela Name[gn]=Ovetã pyahu -Name[gu_IN]=નવી વિન્ડો +Name[gu_IN]=New Window Name[he]=חלון חדש -Name[hi_IN]=नया विंडो +Name[hi_IN]=New Window Name[hr]=Novi prozor Name[hsb]=Nowe wokno Name[hu]=Új ablak -Name[hy_AM]=Նոր Պատուհան +Name[hy_AM]=Նոր պատուհան +Name[ia]=Nove fenestra Name[id]=Jendela Baru Name[is]=Nýr gluggi Name[it]=Nuova finestra Name[ja]=新しいウィンドウ -Name[ja_JP-mac]=新規ウインドウ Name[ka]=ახალი ფანჯარა +Name[kab]=Asfaylu amaynut Name[kk]=Жаңа терезе -Name[km]=បង្អួច​​​ថ្មី -Name[kn]=ಹೊಸ ಕಿಟಕಿ +Name[km]=New Window +Name[kn]=New Window Name[ko]=새 창 -Name[kok]=नवें जनेल -Name[ks]=نئئ وِنڈو -Name[lij]=Neuvo barcon -Name[lo]=ຫນ້າຕ່າງໃຫມ່ -Name[lt]=Naujas langas -Name[ltg]=Jauns lūgs +Name[lij]=Neuvo Barcon +Name[lt]=New Window Name[lv]=Jauns logs -Name[mai]=नव विंडो -Name[mk]=Нов прозорец -Name[ml]=പുതിയ ജാലകം -Name[mr]=नवीन पटल -Name[ms]=Tetingkap Baru -Name[my]=ဝင်းဒိုးအသစ် +Name[mk]=New Window +Name[mr]=New Window +Name[ms]=New Window +Name[my]=New Window Name[nb_NO]=Nytt vindu Name[ne_NP]=नयाँ सञ्झ्याल Name[nl]=Nieuw venster Name[nn_NO]=Nytt vindauge -Name[or]=ନୂତନ ୱିଣ୍ଡୋ +Name[oc]=Fenèstra novèla Name[pa_IN]=ਨਵੀਂ ਵਿੰਡੋ Name[pl]=Nowe okno Name[pt_BR]=Nova janela Name[pt_PT]=Nova janela Name[rm]=Nova fanestra -Name[ro]=Fereastră nouă +Name[ro]=New Window Name[ru]=Новое окно -Name[sat]=नावा विंडो (N) -Name[si]=නව කවුළුවක් +Name[sat]=ᱱᱟᱶᱟ ᱣᱤᱱᱰᱳ +Name[sc]=Ventana noa +Name[sco]=New Window +Name[si]=නව කවුළුව Name[sk]=Nové okno +Name[skr]=نویں ونڈو Name[sl]=Novo okno -Name[son]=Zanfun taaga +Name[son]=New Window Name[sq]=Dritare e Re Name[sr]=Нови прозор Name[sv_SE]=Nytt fönster -Name[ta]=புதிய சாளரம் -Name[te]=కొత్త విండో +Name[szl]=New Window +Name[ta]=New Window +Name[te]=కొత్త కిటికీ +Name[tg]=Равзанаи нав Name[th]=หน้าต่างใหม่ +Name[tl]=New Window Name[tr]=Yeni pencere -Name[tsz]=Eraatarakua jimpani +Name[trs]=Bēntanâ nākàa Name[uk]=Нове вікно -Name[ur]=نیا دریچہ -Name[uz]=Yangi oyna +Name[ur]=New Window +Name[uz]=New Window Name[vi]=Cửa sổ mới -Name[wo]=Palanteer bu bees -Name[xh]=Ifestile entsha +Name[xh]=New Window Name[zh_CN]=新建窗口 Name[zh_TW]=開新視窗 Exec=firefox --new-window %u [Desktop Action new-private-window] -Name=Open a New Private Window -Name[ach]=Dirica manyen me mung -Name[af]=Nuwe privaatvenster -Name[an]=Nueva finestra privada +Name=New Private Window +Name[ach]=New Private Window +Name[af]=New Private Window +Name[an]=New Private Window Name[ar]=نافذة خاصة جديدة -Name[as]=নতুন ব্যক্তিগত উইন্ডো -Name[ast]=Ventana privada nueva -Name[az]=Yeni Məxfi Pəncərə -Name[be]=Новае акно адасаблення -Name[bg]=Нов прозорец за поверително сърфиране -Name[bn_BD]=নতুন ব্যক্তিগত উইন্ডো -Name[bn_IN]=নতুন ব্যক্তিগত উইন্ডো -Name[br]=Prenestr merdeiñ prevez nevez -Name[brx]=गोदान प्राइभेट उइन्ड' +Name[ast]=New Private Window +Name[az]=New Private Window +Name[be]=Новае прыватнае акно +Name[bg]=Нов личен прозорец +Name[bn]=নতুন ব্যক্তিগত উইন্ডো +Name[br]=Prenestr prevez nevez Name[bs]=Novi privatni prozor Name[ca]=Finestra privada nova -Name[cak]=K'ak'a' ichinan tzuwäch +Name[ca_valencia]=New Private Window +Name[cak]=K'ak'a' Ichinan Tzuwäch Name[cs]=Nové anonymní okno Name[cy]=Ffenestr Breifat Newydd Name[da]=Nyt privat vindue Name[de]=Neues privates Fenster Name[dsb]=Nowe priwatne wokno -Name[el]=Νέο παράθυρο ιδιωτικής περιήγησης +Name[el]=Νέο ιδιωτικό παράθυρο +Name[en_CA]=New Private Window Name[en_GB]=New Private Window -Name[en_US]=New Private Window -Name[en_ZA]=New Private Window Name[eo]=Nova privata fenestro Name[es_AR]=Nueva ventana privada Name[es_CL]=Nueva ventana privada Name[es_ES]=Nueva ventana privada Name[es_MX]=Nueva ventana privada -Name[et]=Uus privaatne aken +Name[et]=New Private Window Name[eu]=Leiho pribatu berria Name[fa]=پنجره ناشناس جدید -Name[ff]=Henorde Suturo Hesere +Name[ff]=New Private Window Name[fi]=Uusi yksityinen ikkuna -Name[fr]=Nouvelle fenêtre de navigation privée +Name[fr]=Nouvelle fenêtre privée +Name[fur]=Gnûf barcon privât Name[fy_NL]=Nij priveefinster -Name[ga_IE]=Fuinneog Nua Phríobháideach +Name[ga_IE]=New Private Window Name[gd]=Uinneag phrìobhaideach ùr Name[gl]=Nova xanela privada Name[gn]=Ovetã ñemi pyahu -Name[gu_IN]=નવી ખાનગી વિન્ડો +Name[gu_IN]=New Private Window Name[he]=חלון פרטי חדש -Name[hi_IN]=नयी निजी विंडो +Name[hi_IN]=New Private Window Name[hr]=Novi privatni prozor Name[hsb]=Nowe priwatne wokno Name[hu]=Új privát ablak -Name[hy_AM]=Սկսել Գաղտնի դիտարկում +Name[hy_AM]=Նոր գաղտնի պատուհան +Name[ia]=Nove fenestra private Name[id]=Jendela Mode Pribadi Baru Name[is]=Nýr huliðsgluggi Name[it]=Nuova finestra anonima Name[ja]=新しいプライベートウィンドウ -Name[ja_JP-mac]=新規プライベートウインドウ Name[ka]=ახალი პირადი ფანჯარა +Name[kab]=Asfaylu amaynut n tunigin tusligt Name[kk]=Жаңа жекелік терезе -Name[km]=បង្អួច​ឯកជន​ថ្មី -Name[kn]=ಹೊಸ ಖಾಸಗಿ ಕಿಟಕಿ -Name[ko]=새 사생활 보호 모드 -Name[kok]=नवो खाजगी विंडो -Name[ks]=نْو پرایوٹ وینڈو& -Name[lij]=Neuvo barcon privou -Name[lo]=ເປີດຫນ້າຕ່າງສວນຕົວຂື້ນມາໃຫມ່ -Name[lt]=Naujas privataus naršymo langas -Name[ltg]=Jauns privatais lūgs +Name[km]=New Private Window +Name[kn]=New Private Window +Name[ko]=새 사생활 보호 창 +Name[lij]=Neuvo Barcon Privòu +Name[lt]=New Private Window Name[lv]=Jauns privātais logs -Name[mai]=नया निज विंडो (W) -Name[mk]=Нов приватен прозорец -Name[ml]=പുതിയ സ്വകാര്യ ജാലകം -Name[mr]=नवीन वैयक्तिक पटल -Name[ms]=Tetingkap Persendirian Baharu +Name[mk]=New Private Window +Name[mr]=New Private Window +Name[ms]=New Private Window Name[my]=New Private Window Name[nb_NO]=Nytt privat vindu Name[ne_NP]=नयाँ निजी सञ्झ्याल Name[nl]=Nieuw privévenster Name[nn_NO]=Nytt privat vindauge -Name[or]=ନୂତନ ବ୍ୟକ୍ତିଗତ ୱିଣ୍ଡୋ +Name[oc]=Fenèstra privada novèla Name[pa_IN]=ਨਵੀਂ ਪ੍ਰਾਈਵੇਟ ਵਿੰਡੋ Name[pl]=Nowe okno prywatne Name[pt_BR]=Nova janela privativa Name[pt_PT]=Nova janela privada Name[rm]=Nova fanestra privata -Name[ro]=Fereastră privată nouă +Name[ro]=New Private Window Name[ru]=Новое приватное окно -Name[sat]=नावा निजेराक् विंडो (W ) -Name[si]=නව පුද්ගලික කවුළුව (W) -Name[sk]=Nové okno v režime Súkromné prehliadanie +Name[sat]=ᱱᱟᱶᱟ ᱱᱤᱡᱮᱨᱟᱜ ᱣᱤᱱᱰᱳ +Name[sc]=Ventana privada noa +Name[sco]=New Private Window +Name[si]=නව පෞද්. කවුළුව +Name[sk]=Nové súkromné okno +Name[skr]=نویں نجی ونڈو Name[sl]=Novo zasebno okno -Name[son]=Sutura zanfun taaga +Name[son]=New Private Window Name[sq]=Dritare e Re Private -Name[sr]=Нови приватан прозор +Name[sr]=Нови приватни прозор Name[sv_SE]=Nytt privat fönster -Name[ta]=புதிய தனிப்பட்ட சாளரம் -Name[te]=కొత్త ఆంతరంగిక విండో +Name[szl]=New Private Window +Name[ta]=New Private Window +Name[te]=కొత్త ఆంతరంగిక కిటికీ +Name[tg]=Равзанаи хусусии нав Name[th]=หน้าต่างส่วนตัวใหม่ +Name[tl]=New Private Window Name[tr]=Yeni gizli pencere -Name[tsz]=Juchiiti eraatarakua jimpani +Name[trs]=Bēntanâ huì nākàa Name[uk]=Приватне вікно -Name[ur]=نیا نجی دریچہ -Name[uz]=Yangi maxfiy oyna +Name[ur]=New Private Window +Name[uz]=New Private Window Name[vi]=Cửa sổ riêng tư mới -Name[wo]=Panlanteeru biir bu bees -Name[xh]=Ifestile yangasese entsha -Name[zh_CN]=新建隐私浏览窗口 -Name[zh_TW]=新增隱私視窗 +Name[xh]=New Private Window +Name[zh_CN]=新建隐私窗口 +Name[zh_TW]=開新隱私視窗 Exec=firefox --private-window %u -[Desktop Action profile-manager-window] -Name=Open the Profile Manager -Name[cs]=Správa profilů +[Desktop Action open-profile-manager] +Name=Open Profile Manager +Name[ach]=Open Profile Manager +Name[af]=Open Profile Manager +Name[an]=Open Profile Manager +Name[ar]=افتح مدير الملف الشخصي +Name[ast]=Open Profile Manager +Name[az]=Open Profile Manager +Name[be]=Адкрыць менеджар профіляў +Name[bg]=Отваряне на мениджъра на профили +Name[bn]=Open Profile Manager +Name[br]=Digeriñ an ardoer aeladoù +Name[bs]=Otvori Menadžera profila +Name[ca]=Obre el gestor de perfils +Name[ca_valencia]=Open Profile Manager +Name[cak]=Open Profile Manager +Name[cs]=Otevřete Správce profilů +Name[cy]=Agorwch y Rheolwr Proffil +Name[da]=Åbn profilhåndtering Name[de]=Profilverwaltung öffnen +Name[dsb]=Profilowy zastojnik wócyniś +Name[el]=Άνοιγμα Διαχείρισης προφίλ +Name[en_CA]=Open Profile Manager +Name[en_GB]=Open Profile Manager +Name[eo]=Malfermi administranton de profiloj +Name[es_AR]=Abrir administrador de perfiles +Name[es_CL]=Abrir administrador de perfiles +Name[es_ES]=Abrir administrador de perfiles +Name[es_MX]=Abrir administrador de perfiles +Name[et]=Open Profile Manager +Name[eu]=Ireki profilen kudeatzailea +Name[fa]=Open Profile Manager +Name[ff]=Open Profile Manager +Name[fi]=Avaa profiilien hallinta Name[fr]=Ouvrir le gestionnaire de profils +Name[fur]=Vierç gjestôr profîi +Name[fy_NL]=Profylbehearder iepenje +Name[ga_IE]=Open Profile Manager +Name[gd]=Fosgail manaidsear nam pròifilean +Name[gl]=Abrir o xestor de perfís +Name[gn]=Embojuruja mba’ete ñangarekoha +Name[gu_IN]=Open Profile Manager +Name[he]=פתיחת מנהל הפרופילים +Name[hi_IN]=Open Profile Manager +Name[hr]=Otvori upravljač profila +Name[hsb]=Zrjadowak profilow wočinić +Name[hu]=Profilkezelő megnyitása +Name[hy_AM]=Բացեք պրոֆիլի կառավարիչը +Name[ia]=Aperir le gestor de profilo +Name[id]=Buka Pengelola Profil +Name[is]=Opna umsýslu notandasniða +Name[it]=Apri gestore profili +Name[ja]=プロファイルマネージャーを開く +Name[ka]=პროფილის მმართველის გახსნა +Name[kab]=Ldi amsefrak n umaɣnu +Name[kk]=Профильдер бақарушысын ашу +Name[km]=Open Profile Manager +Name[kn]=Open Profile Manager +Name[ko]=프로필 관리자 열기 +Name[lij]=Open Profile Manager +Name[lt]=Open Profile Manager +Name[lv]=Atvērt profilu pārvaldnieku +Name[mk]=Open Profile Manager +Name[mr]=Open Profile Manager +Name[ms]=Open Profile Manager +Name[my]=Open Profile Manager +Name[nb_NO]=Åpne profilbehandler +Name[ne_NP]=Open Profile Manager +Name[nl]=Profielbeheerder openen +Name[nn_NO]=Opne profilhandsaming +Name[oc]=Dobrir lo gestionari de perfils +Name[pa_IN]=ਪਰੋਫ਼ਾਈਲ ਮੈਨੇਜਰ ਖੋਲ੍ਹੋ +Name[pl]=Menedżer profili +Name[pt_BR]=Abrir gerenciador de perfis +Name[pt_PT]=Abrir o Gestor de Perfis +Name[rm]=Avrir l'administraziun da profils +Name[ro]=Open Profile Manager +Name[ru]=Открыть менеджер профилей +Name[sat]=ᱢᱮᱫᱦᱟᱸ ᱢᱮᱱᱮᱡᱚᱨ ᱠᱷᱩᱞᱟᱹᱭ ᱢᱮ +Name[sc]=Aberi su gestore de profilos +Name[sco]=Open Profile Manager +Name[si]=පැතිකඩ කළමනාකරු අරින්න +Name[sk]=Otvoriť Správcu profilov +Name[skr]=پروفائل منیجر کھولو +Name[sl]=Odpri upravitelja profilov +Name[son]=Open Profile Manager +Name[sq]=Hapni Përgjegjës Profilesh +Name[sr]=Отворите управљач профила +Name[sv_SE]=Öppna Profilhanteraren +Name[szl]=Open Profile Manager +Name[ta]=Open Profile Manager +Name[te]=Open Profile Manager +Name[tg]=Кушодани мудири профилҳо +Name[th]=เปิดตัวจัดการโปรไฟล์ +Name[tl]=Open Profile Manager +Name[tr]=Profil yöneticisini aç +Name[trs]=Sa nīkāj ñu’ūnj nej perfî huā nì’nï̀nj ïn +Name[uk]=Відкрити менеджер профілів +Name[ur]=Open Profile Manager +Name[uz]=Open Profile Manager +Name[vi]=Mở trình quản lý hồ sơ +Name[xh]=Open Profile Manager +Name[zh_CN]=打开配置文件管理器 +Name[zh_TW]=開啟設定檔管理員 Exec=firefox --ProfileManager diff --git a/firefox.spec b/firefox.spec index 7e03db0..b91a17e 100644 --- a/firefox.spec +++ b/firefox.spec @@ -44,9 +44,13 @@ ExcludeArch: i686 # wasi_sdk 25 is not compatible with llvm 18 %if 0%{?fedora} <= 40 -%bcond wasi_sdk 0 + %bcond wasi_sdk 0 %else -%bcond wasi_sdk 1 + %ifarch s390x + %bcond wasi_sdk 0 + %else + %bcond wasi_sdk 1 + %endif %endif %bcond build_with_clang 0 @@ -85,6 +89,9 @@ ExcludeArch: i686 %global system_jpeg 1 %global system_pixman 1 %global system_webp 1 +%global system_drm 1 +%global system_gbm 1 +%global system_pipewire 1 # Bundled cbindgen makes build slow. # Enable only if system cbindgen is not available. %if 0%{?rhel} @@ -112,12 +119,12 @@ ExcludeArch: i686 %endif %if 0%{?build_with_pgo} -%global use_xvfb 1 +%global use_xvfb 0 %global build_tests 1 %endif %if 0%{?run_firefox_tests} -%global use_xvfb 1 +%global use_xvfb 0 %global build_tests 1 %endif @@ -147,9 +154,9 @@ ExcludeArch: i686 %endif %if %{?system_nss} -%global nspr_version 4.32 +%global nspr_version 4.37 %global nspr_build_version %{nspr_version} -%global nss_version 3.110 +%global nss_version 3.119 %global nss_build_version %{nss_version} %endif @@ -193,14 +200,14 @@ ExcludeArch: i686 Summary: Mozilla Firefox Web browser Name: firefox -Version: 138.0.3 +Version: 147.0 Release: 1%{?pre_tag}%{?dist} URL: https://www.mozilla.org/firefox/ # Automatically converted from old format: MPLv1.1 or GPLv2+ or LGPLv2+ - review is highly recommended. License: LicenseRef-Callaway-MPLv1.1 OR GPL-2.0-or-later OR LicenseRef-Callaway-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}-20250512.tar.xz +Source1: firefox-langpacks-%{version}%{?pre_version}-20260106.tar.xz %endif Source2: cbindgen-vendor.tar.xz Source3: dump_syms-vendor.tar.xz @@ -241,30 +248,17 @@ Source49: wasi.patch.template Source50: wasi-sdk-25.tar.gz # Build patches -Patch32: build-rust-ppc64le.patch -Patch35: build-ppc-jit.patch -# Fixing missing cacheFlush when JS_CODEGEN_NONE is used (s390x) -Patch38: build-cacheFlush-missing.patch Patch40: build-aarch64-skia.patch Patch44: build-arm-libopus.patch -Patch46: firefox-nss-version.patch Patch53: firefox-gcc-build.patch -Patch55: firefox-testing.patch -Patch61: firefox-glibc-dynstack.patch Patch71: 0001-GLIBCXX-fix-for-GCC-12.patch Patch78: firefox-i686-build.patch Patch79: firefox-gcc-13-build.patch Patch80: wasi.patch Patch81: firefox-gcc-15.0-s390.patch -Patch82: firefox-mach-D1957628.diff +Patch82: build-c11-threads-avail.patch +Patch83: build-seccomp.patch -# Test patches -# Generate without context by -# GENDIFF_DIFF_ARGS=-U0 gendiff firefox-xxxx .firefox-tests-xpcshell -# GENDIFF_DIFF_ARGS=-U0 gendiff firefox-xxxx .firefox-tests-reftest -Patch100: firefox-tests-xpcshell.patch -Patch101: firefox-tests-reftest.patch -Patch102: firefox-tests-xpcshell-freeze.patch # Fedora specific patches Patch215: firefox-enable-addons.patch @@ -278,17 +272,14 @@ Patch241: 0025-Add-KDE-integration-to-Firefox-toolkit-parts.patch Patch242: 0026-Add-KDE-integration-to-Firefox.patch # Upstream patches -Patch402: mozilla-1196777.patch -Patch407: mozilla-1667096.patch +Patch400: mozilla-1196777.patch +Patch401: mozilla-1667096.patch # PGO/LTO patches Patch600: pgo.patch Patch602: mozilla-1516803.patch Patch603: firefox-gcc-always-inline.patch -# system AV1 patches (from Gentoo) -Patch800: bmo-1559213-Support-system-av1.patch -Patch801: bmo-1559213-fix-system-av1-libs.patch %if %{?system_nss} BuildRequires: pkgconfig(nspr) >= %{nspr_version} @@ -330,7 +321,6 @@ BuildRequires: pkgconfig(libwebpdemux) >= %{libwebp_version} %endif BuildRequires: autoconf213 BuildRequires: pkgconfig(libpulse) -BuildRequires: yasm BuildRequires: llvm BuildRequires: llvm-devel BuildRequires: clang @@ -339,7 +329,17 @@ BuildRequires: clang-libs BuildRequires: lld %endif +%if %{?system_drm} +BuildRequires: libdrm-devel +%endif + +%if %{?system_gbm} +BuildRequires: mesa-libgbm-devel +%endif + +%if %{?system_pipewire} BuildRequires: pipewire-devel +%endif %if !0%{?use_bundled_cbindgen} BuildRequires: cbindgen @@ -569,7 +569,10 @@ This package contains results of tests executed during build. %patch -P78 -p1 -b .firefox-i686 %patch -P79 -p1 -b .firefox-gcc-13-build %patch -P81 -p1 -b .firefox-gcc-15.0-s390 -%patch -P82 -p1 -b .firefox-mach-D1957628 +%if 0%{?fedora} >= 44 +%patch -P82 -p1 -b .build-c11-threads-avail +%patch -P83 -p1 -b .build-seccomp +%endif # We need to create the wasi.patch with the correct path to the wasm libclang_rt. %if %{with wasi_sdk} @@ -588,8 +591,8 @@ cat %{SOURCE49} | sed -e "s|LIBCLANG_RT_PLACEHOLDER|`pwd`/wasi-sdk-25/build/sysr %patch -P229 -p1 -b .firefox-nss-addon-hack %patch -P231 -p1 -b .fedora-customization -%patch -P402 -p1 -b .1196777 -%patch -P407 -p1 -b .1667096 +%patch -P400 -p1 -b .1196777 +%patch -P401 -p1 -b .1667096 # PGO patches %if %{build_with_pgo} @@ -695,6 +698,24 @@ echo "ac_add_options --with-system-webp" >> .mozconfig echo "ac_add_options --without-system-webp" >> .mozconfig %endif +%if %{?system_drm} +echo "ac_add_options --with-system-libdrm" >> .mozconfig +%else +echo "ac_add_options --without-system-libdrm" >> .mozconfig +%endif + +%if %{?system_gbm} +echo "ac_add_options --with-system-gbm" >> .mozconfig +%else +echo "ac_add_options --without-system-gbm" >> .mozconfig +%endif + +%if %{?system_pipewire} +echo "ac_add_options --with-system-pipewire" >> .mozconfig +%else +echo "ac_add_options --without-system-pipewire" >> .mozconfig +%endif + %ifarch s390x echo "ac_add_options --disable-jit" >> .mozconfig %endif @@ -713,11 +734,7 @@ echo "ac_add_options --with-google-safebrowsing-api-keyfile=`pwd`/google-api-key # https://bugzilla.redhat.com/show_bug.cgi?id=2239046 # with clang 17 upstream's detection fails, so let's just tell it # where to look -%if 0%{?fedora} >= 42 -echo "ac_add_options --with-libclang-path=`llvm-config-20 --libdir`" >> .mozconfig -%else echo "ac_add_options --with-libclang-path=`llvm-config --libdir`" >> .mozconfig -%endif %if %{enable_replace_malloc} echo "ac_add_options --enable-replace-malloc" >> .mozconfig @@ -844,7 +861,7 @@ export MOZ_DEBUG_FLAGS=" " MOZ_LINK_FLAGS="%{build_ldflags}" %if !%{with build_with_clang} %ifarch aarch64 %{ix86} ppc64le x86_64 -MOZ_LINK_FLAGS="$MOZ_LINK_FLAGS -Wl,--no-keep-memory -Wl,--reduce-memory-overheads" +MOZ_LINK_FLAGS="$MOZ_LINK_FLAGS -Wl,--no-keep-memory" %endif %endif %ifarch %{ix86} s390x ppc64le @@ -999,6 +1016,7 @@ install -p -D -m 644 %{SOURCE23} %{buildroot}%{_mandir}/man1/firefox.1 rm -f %{buildroot}/%{mozappdir}/firefox-config rm -f %{buildroot}/%{mozappdir}/update-settings.ini +rm -f %{buildroot}/%{mozappdir}/firefox-bin for s in 16 22 24 32 48 256; do mkdir -p %{buildroot}%{_datadir}/icons/hicolor/${s}x${s}/apps @@ -1181,7 +1199,6 @@ fi %endif %{_bindir}/firefox %{mozappdir}/firefox -%{mozappdir}/firefox-bin %{mozappdir}/glxtest %doc %{_mandir}/man1/* %dir %{_sysconfdir}/%{name} @@ -1200,9 +1217,8 @@ fi %{_datadir}/metainfo/*.appdata.xml %dir %{mozappdir} %license %{mozappdir}/LICENSE -%{mozappdir}/browser/chrome -%{mozappdir}/browser/defaults/preferences/firefox-redhat-default-prefs.js -%{mozappdir}/distribution/distribution.ini +%{mozappdir}/browser +%{mozappdir}/distribution # That's Windows only %ghost %{mozappdir}/browser/features/aushelper@mozilla.org.xpi %if %{without langpacks_subpkg} @@ -1210,7 +1226,6 @@ fi %dir %{langpackdir} %endif %endif -%{mozappdir}/browser/omni.ja %{mozappdir}/application.ini %{mozappdir}/pingsender %exclude %{mozappdir}/removed-files @@ -1227,6 +1242,7 @@ fi %{_datadir}/icons/hicolor/symbolic/apps/firefox-symbolic.svg %if %{enable_mozilla_crashreporter} %{mozappdir}/crashreporter +%{mozappdir}/crashhelper %endif %{mozappdir}/*.so %{mozappdir}/defaults/pref/channel-prefs.js @@ -1235,7 +1251,7 @@ fi %{mozappdir}/omni.ja %{mozappdir}/platform.ini %{mozappdir}/gmp-clearkey -%{mozappdir}/fonts/TwemojiMozilla.ttf +%{mozappdir}/fonts %ifarch aarch64 riscv64 %{mozappdir}/v4l2test %endif @@ -1250,6 +1266,129 @@ fi #--------------------------------------------------------------------- %changelog +* Tue Jan 06 2026 Martin Stransky - 147.0-1 +- Updated to 147.0 + +* Fri Dec 19 2025 Martin Stransky - 146.0.1-1 +- Updated to 146.0.1 + +* Wed Dec 17 2025 Martin Stransky - 146.0-6 +- Added upstream patch IWYU (libwebrtc IWYU fixes for PipeWire) +- Claude AI assisted editing (failed to do whole work, but it was close!) + +* Wed Dec 17 2025 Martin Stransky - 146.0-5 +- Removed firefox-bin from man pages + +* Thu Dec 11 2025 Martin Stransky - 146.0-4 +- Removed firefox-bin + +* Thu Dec 11 2025 Martin Stransky - 146.0-3 +- Added aarch64 crash fix +- Fixed rawhide gcc build (kudos to jhorak who hacked it! He's just awesome.) + +* Mon Dec 08 2025 Martin Stransky - 146.0-2 +- Updated to 146.0 build 2 + +* Wed Dec 03 2025 Martin Stransky - 146.0-1 +- Updated to 146.0 + +* Wed Nov 19 2025 Martin Stransky - 145.0.1-1 +- Updated to 145.0.1 + +* Tue Nov 11 2025 Martin Stransky - 145.0-2 +- Updated to 145.0 B2 + +* Wed Nov 05 2025 Martin Stransky - 145.0-1 +- Updated to 145.0 + +* Thu Oct 30 2025 Martin Stransky - 144.0.2-1 +- Updated to 144.0.2 + +* Thu Oct 16 2025 Martin Stransky - 144.0-3 +- Add fix for mzbz#1990430 + +* Mon Oct 13 2025 Martin Stransky - 144.0-2 +- Updated to 144.0 (b2) + +* Thu Oct 09 2025 Martin Stransky - 144.0-1 +- Updated to 144.0 + +* Mon Oct 06 2025 Martin Stransky - 143.0.4-1 +- Updated to 143.0.4 + +* Tue Sep 30 2025 Martin Stransky - 143.0.3-1 +- Updated to 143.0.3 + +* Fri Sep 26 2025 Martin Stransky - 143.0.1-3 +- Added fix for mzbz#1990162 + +* Thu Sep 25 2025 Martin Stransky - 143.0.1-2 +- Added fix for mzbz#1984368 + +* Fri Sep 19 2025 Martin Stransky - 143.0.1-1 +- Updated to 143.0.1 + +* Wed Sep 10 2025 Martin Stransky - 143.0-1 +- Updated to 143.0 + +* Wed Aug 27 2025 Martin Stransky - 142.0.1-1 +- Updated to 142.0.1 + +* Mon Aug 25 2025 Tom Stellard - 142.0-3 +- Fix build with llvm-21 + +* Sat Aug 23 2025 Dominik Mierzejewski - 142.0-2 +- Drop unused yasm build dependency, part of: + https://fedoraproject.org/wiki/Changes/DeprecateYASM + +* Tue Aug 12 2025 Martin Stransky - 142.0-1 +- Updated to 142.0 + +* Mon Aug 11 2025 Martin Stransky - 141.0.3-1 +- Updated to 141.0.3 + +* Wed Aug 6 2025 Martin Stransky - 141.0.2-1 +- Updated to 141.0.2 + +* Wed Jul 23 2025 Fedora Release Engineering - 141.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild + +* Fri Jul 18 2025 Martin Stransky - 141.0-2 +- Respin 141.0 build 2 + +* Thu Jul 17 2025 Martin Stransky - 141.0-1 +- Update to latest upstream (141.0) + +* Wed Jul 09 2025 Martin Stransky - 140.0.4-1 +- Update to latest upstream (140.0.4) + +* Fri Jun 27 2025 Martin Stransky - 140.0.1-1 +- Update to latest upstream (140.0.1) + +* Tue Jun 17 2025 Martin Stransky - 140.0-1 +- Update to latest upstream (140.0) + +* Wed Jun 11 2025 Martin Stransky - 139.0.4-2 +- Use headless Mutter to run PGO builds + +* Wed Jun 11 2025 Martin Stransky - 139.0.4-1 +- Updated to latest upstream (139.0.4) + +* Fri Jun 6 2025 Martin Stransky - 139.0-3 +- Updated desktop file translation (rhbz#2362155) + +* Fri May 30 2025 Jan Grulich - 139.0-2 +- Use system libraries for drm/gbm/pipewire + +* Tue May 27 2025 Martin Stransky - 139.0-1 +- Updated to 139.0 + +* Mon May 19 2025 Martin Stransky - 138.0.4-1 +- Updated to 138.0.4 + +* Wed May 14 2025 Martin Stransky - 138.0.3-2 +- Fixed rhbz#2283790 + * Mon May 12 2025 Martin Stransky - 138.0.3-1 - Updated to 138.0.3 diff --git a/fix-cargo-checksum b/fix-cargo-checksum new file mode 100755 index 0000000..bae2b2d --- /dev/null +++ b/fix-cargo-checksum @@ -0,0 +1,21 @@ +#!/bin/bash +if [ -z $1 ]; then + echo "Fixes .cargo-checksum.json by removing deleted files and recompute sha256sum" + echo "Usage: $0 .cargo-checksum.json" + exit +fi + +FILE=$1 +#set -x +cp $FILE $1.backup +for i in $(cat .cargo-checksum.json|jq -r '.files| keys[]'); do +if [ ! -f $i ]; then + #echo $i non exist + sed -ie "s|\"$i\":\"[^\"]*\",||" $FILE +else + SHA=`sha256sum $i | cut -d " " -f1` + sed -ie "s|\"$i\":\"[^\"]*\"|\"$i\":\"$SHA\"|" $FILE +fi + +#echo $i +done diff --git a/gen_cbindgen-vendor.sh b/gen_cbindgen-vendor.sh index c131864..5711901 100755 --- a/gen_cbindgen-vendor.sh +++ b/gen_cbindgen-vendor.sh @@ -12,7 +12,7 @@ to be used with 'cargo vendor' commmand. """ [dependencies] -cbindgen = "0.28.0" +cbindgen = "0.29.1" [[bin]] name = "dummy" diff --git a/pgo.patch b/pgo.patch index 3d8a0b1..c1ae97d 100644 --- a/pgo.patch +++ b/pgo.patch @@ -1,7 +1,7 @@ -diff -up firefox-128.0/build/moz.configure/lto-pgo.configure.pgo firefox-128.0/build/moz.configure/lto-pgo.configure ---- firefox-128.0/build/moz.configure/lto-pgo.configure.pgo 2024-07-02 00:34:14.000000000 +0200 -+++ firefox-128.0/build/moz.configure/lto-pgo.configure 2024-07-02 17:59:44.425650444 +0200 -@@ -90,12 +90,16 @@ set_config("PGO_PROFILE_PATH", pgo_profi +diff -up firefox-145.0/build/moz.configure/lto-pgo.configure.pgo firefox-145.0/build/moz.configure/lto-pgo.configure +--- firefox-145.0/build/moz.configure/lto-pgo.configure.pgo 2025-11-03 16:56:55.000000000 +0100 ++++ firefox-145.0/build/moz.configure/lto-pgo.configure 2025-11-05 13:59:53.477443914 +0100 +@@ -96,12 +96,16 @@ set_config("PGO_PROFILE_PATH", pgo_profi @depends( "--enable-profile-use", @@ -19,7 +19,7 @@ diff -up firefox-128.0/build/moz.configure/lto-pgo.configure.pgo firefox-128.0/b if not profile_use: return None -@@ -133,7 +137,7 @@ def pgo_flags( +@@ -145,7 +149,7 @@ def pgo_flags( return namespace( gen_cflags=["-fprofile-generate"], gen_ldflags=["-fprofile-generate"], @@ -28,19 +28,19 @@ diff -up firefox-128.0/build/moz.configure/lto-pgo.configure.pgo firefox-128.0/b use_ldflags=["-fprofile-use"], ) -diff -up firefox-128.0/build/pgo/profileserver.py.pgo firefox-128.0/build/pgo/profileserver.py ---- firefox-128.0/build/pgo/profileserver.py.pgo 2024-07-02 00:34:15.000000000 +0200 -+++ firefox-128.0/build/pgo/profileserver.py 2024-07-02 17:59:44.425650444 +0200 -@@ -11,7 +11,7 @@ import subprocess +diff -up firefox-145.0/build/pgo/profileserver.py.pgo firefox-145.0/build/pgo/profileserver.py +--- firefox-145.0/build/pgo/profileserver.py.pgo 2025-11-03 16:56:55.000000000 +0100 ++++ firefox-145.0/build/pgo/profileserver.py 2025-11-05 13:59:53.477602066 +0100 +@@ -10,7 +10,7 @@ import subprocess import sys import mozcrash -from mozbuild.base import BinaryNotFoundException, MozbuildObject +from mozbuild.base import BinaryNotFoundException, MozbuildObject, BuildEnvironmentNotFoundException - from mozfile import TemporaryDirectory + from mozfile import TemporaryDirectory, json from mozhttpd import MozHttpd from mozprofile import FirefoxProfile, Preferences -@@ -97,9 +97,22 @@ if __name__ == "__main__": +@@ -96,9 +96,22 @@ if __name__ == "__main__": locations = ServerLocations() locations.add_host(host="127.0.0.1", port=PORT, options="primary,privileged") @@ -66,13 +66,13 @@ diff -up firefox-128.0/build/pgo/profileserver.py.pgo firefox-128.0/build/pgo/pr with TemporaryDirectory() as profilePath: # TODO: refactor this into mozprofile -diff -up firefox-128.0/gfx/2d/moz.build.pgo firefox-128.0/gfx/2d/moz.build ---- firefox-128.0/gfx/2d/moz.build.pgo 2024-07-02 00:34:17.000000000 +0200 -+++ firefox-128.0/gfx/2d/moz.build 2024-07-02 17:59:44.425650444 +0200 -@@ -135,11 +135,11 @@ if CONFIG["INTEL_ARCHITECTURE"]: +diff -up firefox-145.0/gfx/2d/moz.build.pgo firefox-145.0/gfx/2d/moz.build +--- firefox-145.0/gfx/2d/moz.build.pgo 2025-11-03 16:56:57.000000000 +0100 ++++ firefox-145.0/gfx/2d/moz.build 2025-11-05 14:21:20.485610837 +0100 +@@ -137,11 +137,11 @@ if CONFIG["INTEL_ARCHITECTURE"]: + DEFINES["USE_SSE2"] = True # The file uses SSE2 intrinsics, so it needs special compile flags on some # compilers. - SOURCES["BlurSSE2.cpp"].flags += CONFIG["SSE2_FLAGS"] - SOURCES["ConvolutionFilterAVX2.cpp"].flags += ["-mavx2"] + SOURCES["ConvolutionFilterAVX2.cpp"].flags += ["-mavx2", "-fno-lto"] SOURCES["ConvolutionFilterSSE2.cpp"].flags += CONFIG["SSE2_FLAGS"] @@ -82,11 +82,11 @@ diff -up firefox-128.0/gfx/2d/moz.build.pgo firefox-128.0/gfx/2d/moz.build + SOURCES["SwizzleAVX2.cpp"].flags += ["-mavx2", "-fno-lto"] SOURCES["SwizzleSSE2.cpp"].flags += CONFIG["SSE2_FLAGS"] SOURCES["SwizzleSSSE3.cpp"].flags += CONFIG["SSSE3_FLAGS"] - elif CONFIG["TARGET_CPU"].startswith("mips"): -diff -up firefox-128.0/gfx/skia/generate_mozbuild.py.pgo firefox-128.0/gfx/skia/generate_mozbuild.py ---- firefox-128.0/gfx/skia/generate_mozbuild.py.pgo 2024-07-02 17:59:44.425650444 +0200 -+++ firefox-128.0/gfx/skia/generate_mozbuild.py 2024-07-02 18:17:40.973081400 +0200 -@@ -54,8 +54,8 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'wind + +diff -up firefox-145.0/gfx/skia/generate_mozbuild.py.pgo firefox-145.0/gfx/skia/generate_mozbuild.py +--- firefox-145.0/gfx/skia/generate_mozbuild.py.pgo 2025-11-03 16:56:57.000000000 +0100 ++++ firefox-145.0/gfx/skia/generate_mozbuild.py 2025-11-05 13:59:53.477947055 +0100 +@@ -50,8 +50,8 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'wind if CONFIG['INTEL_ARCHITECTURE']: SOURCES['skia/modules/skcms/skcms.cc'].flags += ['-DSKCMS_DISABLE_SKX'] skia_ssse3_flags = ['-Dskvx=skvx_ssse3', '-mssse3'] @@ -97,10 +97,10 @@ diff -up firefox-128.0/gfx/skia/generate_mozbuild.py.pgo firefox-128.0/gfx/skia/ SOURCES['skia/src/core/SkBitmapProcState_opts_ssse3.cpp'].flags += skia_ssse3_flags SOURCES['skia/src/core/SkBlitMask_opts_ssse3.cpp'].flags += skia_ssse3_flags SOURCES['skia/src/core/SkSwizzler_opts_ssse3.cpp'].flags += ['-Dskvx=skvx_ssse3'] -diff -up firefox-128.0/gfx/skia/moz.build.pgo firefox-128.0/gfx/skia/moz.build ---- firefox-128.0/gfx/skia/moz.build.pgo 2024-07-02 17:59:44.425650444 +0200 -+++ firefox-128.0/gfx/skia/moz.build 2024-07-02 18:19:21.092831537 +0200 -@@ -582,8 +582,8 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'wind +diff -up firefox-145.0/gfx/skia/moz.build.pgo firefox-145.0/gfx/skia/moz.build +--- firefox-145.0/gfx/skia/moz.build.pgo 2025-11-03 16:56:57.000000000 +0100 ++++ firefox-145.0/gfx/skia/moz.build 2025-11-05 13:59:53.478077484 +0100 +@@ -597,8 +597,8 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'wind if CONFIG['INTEL_ARCHITECTURE']: SOURCES['skia/modules/skcms/skcms.cc'].flags += ['-DSKCMS_DISABLE_SKX'] skia_ssse3_flags = ['-Dskvx=skvx_ssse3', '-mssse3'] @@ -111,10 +111,10 @@ diff -up firefox-128.0/gfx/skia/moz.build.pgo firefox-128.0/gfx/skia/moz.build SOURCES['skia/src/core/SkBitmapProcState_opts_ssse3.cpp'].flags += skia_ssse3_flags SOURCES['skia/src/core/SkBlitMask_opts_ssse3.cpp'].flags += skia_ssse3_flags SOURCES['skia/src/core/SkSwizzler_opts_ssse3.cpp'].flags += ['-Dskvx=skvx_ssse3'] -diff -up firefox-128.0/toolkit/components/terminator/nsTerminator.cpp.pgo firefox-128.0/toolkit/components/terminator/nsTerminator.cpp ---- firefox-128.0/toolkit/components/terminator/nsTerminator.cpp.pgo 2024-07-02 00:34:32.000000000 +0200 -+++ firefox-128.0/toolkit/components/terminator/nsTerminator.cpp 2024-07-02 17:59:44.425650444 +0200 -@@ -332,6 +332,11 @@ void nsTerminator::StartWatchdog() { +diff -up firefox-145.0/toolkit/components/terminator/nsTerminator.cpp.pgo firefox-145.0/toolkit/components/terminator/nsTerminator.cpp +--- firefox-145.0/toolkit/components/terminator/nsTerminator.cpp.pgo 2025-11-03 16:57:15.000000000 +0100 ++++ firefox-145.0/toolkit/components/terminator/nsTerminator.cpp 2025-11-05 13:59:53.478238011 +0100 +@@ -330,6 +330,11 @@ void nsTerminator::StartWatchdog() { } #endif diff --git a/python-build.patch b/python-build.patch deleted file mode 100644 index ad1d0fc..0000000 --- a/python-build.patch +++ /dev/null @@ -1,4558 +0,0 @@ -diff --git a/python/l10n/mozxchannel/__init__.py b/python/l10n/mozxchannel/__init__.py ---- a/python/l10n/mozxchannel/__init__.py -+++ b/python/l10n/mozxchannel/__init__.py -@@ -46,25 +46,6 @@ def get_default_config(topsrcdir, string - "mobile/android/locales/l10n.toml", - ], - }, -- "comm-central": { -- "path": topsrcdir / "comm", -- "post-clobber": True, -- "url": "https://hg.mozilla.org/comm-central/", -- "heads": { -- # This list of repositories is ordered, starting with the -- # one with the most recent content (central) to the oldest -- # (ESR). In case two ESR versions are supported, the oldest -- # ESR goes last (e.g. esr78 goes after esr91). -- "comm": "comm-central", -- "comm-beta": "releases/comm-beta", -- "comm-esr102": "releases/comm-esr102", -- }, -- "config_files": [ -- "comm/calendar/locales/l10n.toml", -- "comm/mail/locales/l10n.toml", -- "comm/suite/locales/l10n.toml", -- ], -- }, - }, - } - -diff --git a/python/mach/docs/windows-usage-outside-mozillabuild.rst b/python/mach/docs/windows-usage-outside-mozillabuild.rst ---- a/python/mach/docs/windows-usage-outside-mozillabuild.rst -+++ b/python/mach/docs/windows-usage-outside-mozillabuild.rst -@@ -117,3 +117,8 @@ Success! - - At this point, you should be able to invoke Mach and manage your version control system outside - of MozillaBuild. -+ -+.. tip:: -+ -+ `See here `__ for a detailed guide on -+ installing and customizing a development environment with MSYS2, zsh, and Windows Terminal. -diff --git a/python/mach/mach/site.py b/python/mach/mach/site.py ---- a/python/mach/mach/site.py -+++ b/python/mach/mach/site.py -@@ -18,10 +18,10 @@ import site - import subprocess - import sys - import sysconfig --from pathlib import Path - import tempfile - from contextlib import contextmanager --from typing import Optional, Callable -+from pathlib import Path -+from typing import Callable, Optional - - from mach.requirements import ( - MachEnvRequirements, -@@ -663,6 +663,58 @@ class CommandSiteManager: - stderr=subprocess.STDOUT, - universal_newlines=True, - ) -+ -+ if not check_result.returncode: -+ return -+ -+ """ -+ Some commands may use the "setup.py" script of first-party modules. This causes -+ a "*.egg-info" dir to be created for that module (which pip can then detect as -+ a package). Since we add all first-party module directories to the .pthfile for -+ the "mach" venv, these first-party modules are then detected by all venvs after -+ they are created. The problem is that these .egg-info directories can become -+ stale (since if the first-party module is updated it's not guaranteed that the -+ command that runs the "setup.py" was ran afterwards). This can cause -+ incompatibilities with the pip check (since the dependencies can change between -+ different versions). -+ -+ These .egg-info dirs are in our VCS ignore lists (eg: ".hgignore") because they -+ are necessary to run some commands, so we don't want to always purge them, and we -+ also don't want to accidentally commit them. Given this, we can leverage our VCS -+ to find all the current first-party .egg-info dirs. -+ -+ If we're in the case where 'pip check' fails, then we can try purging the -+ first-party .egg-info dirs, then run the 'pip check' again afterwards. If it's -+ still failing, then we know the .egg-info dirs weren't the problem. If that's -+ the case we can just raise the error encountered, which is the same as before. -+ """ -+ -+ def _delete_ignored_egg_info_dirs(): -+ from pathlib import Path -+ -+ from mozversioncontrol import get_repository_from_env -+ -+ with get_repository_from_env() as repo: -+ ignored_file_finder = repo.get_ignored_files_finder().find( -+ "**/*.egg-info" -+ ) -+ -+ unique_egg_info_dirs = { -+ Path(found[0]).parent for found in ignored_file_finder -+ } -+ -+ for egg_info_dir in unique_egg_info_dirs: -+ shutil.rmtree(egg_info_dir) -+ -+ _delete_ignored_egg_info_dirs() -+ -+ check_result = subprocess.run( -+ [self.python_path, "-m", "pip", "check"], -+ stdout=subprocess.PIPE, -+ stderr=subprocess.STDOUT, -+ universal_newlines=True, -+ ) -+ - if check_result.returncode: - if quiet: - # If "quiet" was specified, then the "pip install" output wasn't printed -@@ -763,7 +815,7 @@ class PythonVirtualenv: - else: - self.bin_path = os.path.join(prefix, "bin") - self.python_path = os.path.join(self.bin_path, "python") -- self.prefix = prefix -+ self.prefix = os.path.realpath(prefix) - - @functools.lru_cache(maxsize=None) - def resolve_sysconfig_packages_path(self, sysconfig_path): -@@ -783,16 +835,12 @@ class PythonVirtualenv: - relative_path = path.relative_to(data_path) - - # Path to virtualenv's "site-packages" directory for provided sysconfig path -- return os.path.normpath( -- os.path.normcase(os.path.realpath(Path(self.prefix) / relative_path)) -- ) -+ return os.path.normpath(os.path.normcase(Path(self.prefix) / relative_path)) - - def site_packages_dirs(self): - dirs = [] - if sys.platform.startswith("win"): -- dirs.append( -- os.path.normpath(os.path.normcase(os.path.realpath(self.prefix))) -- ) -+ dirs.append(os.path.normpath(os.path.normcase(self.prefix))) - purelib = self.resolve_sysconfig_packages_path("purelib") - platlib = self.resolve_sysconfig_packages_path("platlib") - -diff --git a/python/mozboot/bin/bootstrap.py b/python/mozboot/bin/bootstrap.py ---- a/python/mozboot/bin/bootstrap.py -+++ b/python/mozboot/bin/bootstrap.py -@@ -11,8 +11,6 @@ - # Python environment (except that it's run with a sufficiently recent version of - # Python 3), so we are restricted to stdlib modules. - --from __future__ import absolute_import, print_function, unicode_literals -- - import sys - - major, minor = sys.version_info[:2] -@@ -23,14 +21,13 @@ if (major < 3) or (major == 3 and minor - ) - sys.exit(1) - -+import ctypes - import os - import shutil - import subprocess - import tempfile --import ctypes -- -+from optparse import OptionParser - from pathlib import Path --from optparse import OptionParser - - CLONE_MERCURIAL_PULL_FAIL = """ - Failed to pull from hg.mozilla.org. -@@ -55,7 +52,7 @@ def which(name): - search_dirs = os.environ["PATH"].split(os.pathsep) - potential_names = [name] - if WINDOWS: -- potential_names.append(name + ".exe") -+ potential_names.insert(0, name + ".exe") - - for path in search_dirs: - for executable_name in potential_names: -@@ -105,7 +102,7 @@ def input_clone_dest(vcs, no_interactive - return None - - --def hg_clone_firefox(hg: Path, dest: Path): -+def hg_clone_firefox(hg: Path, dest: Path, head_repo, head_rev): - # We create an empty repo then modify the config before adding data. - # This is necessary to ensure storage settings are optimally - # configured. -@@ -139,16 +136,28 @@ def hg_clone_firefox(hg: Path, dest: Pat - fh.write("# This is necessary to keep performance in check\n") - fh.write("maxchainlen = 10000\n") - -+ # Pulling a specific revision into an empty repository induces a lot of -+ # load on the Mercurial server, so we always pull from mozilla-unified (which, -+ # when done from an empty repository, is equivalent to a clone), and then pull -+ # the specific revision we want (if we want a specific one, otherwise we just -+ # use the "central" bookmark), at which point it will be an incremental pull, -+ # that the server can process more easily. -+ # This is the same thing that robustcheckout does on automation. - res = subprocess.call( - [str(hg), "pull", "https://hg.mozilla.org/mozilla-unified"], cwd=str(dest) - ) -+ if not res and head_repo: -+ res = subprocess.call( -+ [str(hg), "pull", head_repo, "-r", head_rev], cwd=str(dest) -+ ) - print("") - if res: - print(CLONE_MERCURIAL_PULL_FAIL % dest) - return None - -- print('updating to "central" - the development head of Gecko and Firefox') -- res = subprocess.call([str(hg), "update", "-r", "central"], cwd=str(dest)) -+ head_rev = head_rev or "central" -+ print(f'updating to "{head_rev}" - the development head of Gecko and Firefox') -+ res = subprocess.call([str(hg), "update", "-r", head_rev], cwd=str(dest)) - if res: - print( - f"error updating; you will need to `cd {dest} && hg update -r central` " -@@ -157,7 +166,7 @@ def hg_clone_firefox(hg: Path, dest: Pat - return dest - - --def git_clone_firefox(git: Path, dest: Path, watchman: Path): -+def git_clone_firefox(git: Path, dest: Path, watchman: Path, head_repo, head_rev): - tempdir = None - cinnabar = None - env = dict(os.environ) -@@ -196,8 +205,7 @@ def git_clone_firefox(git: Path, dest: P - [ - str(git), - "clone", -- "-b", -- "bookmarks/central", -+ "--no-checkout", - "hg::https://hg.mozilla.org/mozilla-unified", - str(dest), - ], -@@ -210,6 +218,19 @@ def git_clone_firefox(git: Path, dest: P - [str(git), "config", "pull.ff", "only"], cwd=str(dest), env=env - ) - -+ if head_repo: -+ subprocess.check_call( -+ [str(git), "cinnabar", "fetch", f"hg::{head_repo}", head_rev], -+ cwd=str(dest), -+ env=env, -+ ) -+ -+ subprocess.check_call( -+ [str(git), "checkout", "FETCH_HEAD" if head_rev else "bookmarks/central"], -+ cwd=str(dest), -+ env=env, -+ ) -+ - watchman_sample = dest / ".git/hooks/fsmonitor-watchman.sample" - # Older versions of git didn't include fsmonitor-watchman.sample. - if watchman and watchman_sample.exists(): -@@ -233,12 +254,6 @@ def git_clone_firefox(git: Path, dest: P - subprocess.check_call(config_args, cwd=str(dest), env=env) - return dest - finally: -- if not cinnabar: -- print( -- "Failed to install git-cinnabar. Try performing a manual " -- "installation: https://github.com/glandium/git-cinnabar/wiki/" -- "Mozilla:-A-git-workflow-for-Gecko-development" -- ) - if tempdir: - shutil.rmtree(str(tempdir)) - -@@ -326,11 +341,15 @@ def clone(options): - add_microsoft_defender_antivirus_exclusions(dest, no_system_changes) - - print(f"Cloning Firefox {VCS_HUMAN_READABLE[vcs]} repository to {dest}") -+ -+ head_repo = os.environ.get("GECKO_HEAD_REPOSITORY") -+ head_rev = os.environ.get("GECKO_HEAD_REV") -+ - if vcs == "hg": -- return hg_clone_firefox(binary, dest) -+ return hg_clone_firefox(binary, dest, head_repo, head_rev) - else: - watchman = which("watchman") -- return git_clone_firefox(binary, dest, watchman) -+ return git_clone_firefox(binary, dest, watchman, head_repo, head_rev) - - - def bootstrap(srcdir: Path, application_choice, no_interactive, no_system_changes): -diff --git a/python/mozboot/mozboot/android.py b/python/mozboot/mozboot/android.py ---- a/python/mozboot/mozboot/android.py -+++ b/python/mozboot/mozboot/android.py -@@ -2,8 +2,6 @@ - # 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/. - --from __future__ import absolute_import, print_function, unicode_literals -- - import errno - import json - import os -@@ -11,15 +9,16 @@ import stat - import subprocess - import sys - import time --import requests -+from pathlib import Path - from typing import Optional, Union --from pathlib import Path --from tqdm import tqdm -+ -+import requests - - # We need the NDK version in multiple different places, and it's inconvenient - # to pass down the NDK version to all relevant places, so we have this global - # variable. - from mozboot.bootstrap import MOZCONFIG_SUGGESTION_TEMPLATE -+from tqdm import tqdm - - NDK_VERSION = "r21d" - CMDLINE_TOOLS_VERSION_STRING = "7.0" -@@ -74,7 +73,7 @@ output as packages are downloaded and in - - MOBILE_ANDROID_MOZCONFIG_TEMPLATE = """ - # Build GeckoView/Firefox for Android: --ac_add_options --enable-application=mobile/android -+ac_add_options --enable-project=mobile/android - - # Targeting the following architecture. - # For regular phones, no --target is needed. -@@ -90,8 +89,7 @@ ac_add_options --enable-application=mobi - - MOBILE_ANDROID_ARTIFACT_MODE_MOZCONFIG_TEMPLATE = """ - # Build GeckoView/Firefox for Android Artifact Mode: --ac_add_options --enable-application=mobile/android --ac_add_options --target=arm-linux-androideabi -+ac_add_options --enable-project=mobile/android - ac_add_options --enable-artifact-builds - - {extra_lines} -@@ -162,18 +160,19 @@ def download( - download_file_path: Path, - ): - with requests.Session() as session: -- request = session.head(url) -+ request = session.head(url, allow_redirects=True) -+ request.raise_for_status() - remote_file_size = int(request.headers["content-length"]) - - if download_file_path.is_file(): - local_file_size = download_file_path.stat().st_size - - if local_file_size == remote_file_size: -- print(f"{download_file_path} already downloaded. Skipping download...") -+ print( -+ f"{download_file_path.name} already downloaded. Skipping download..." -+ ) - else: -- print( -- f"Partial download detected. Resuming download of {download_file_path}..." -- ) -+ print(f"Partial download detected. Resuming download of {url}...") - download_internal( - download_file_path, - session, -@@ -182,7 +181,7 @@ def download( - local_file_size, - ) - else: -- print(f"Downloading {download_file_path}...") -+ print(f"Downloading {url}...") - download_internal(download_file_path, session, url, remote_file_size) - - -diff --git a/python/mozboot/mozboot/archlinux.py b/python/mozboot/mozboot/archlinux.py ---- a/python/mozboot/mozboot/archlinux.py -+++ b/python/mozboot/mozboot/archlinux.py -@@ -2,120 +2,27 @@ - # 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/. - --from __future__ import absolute_import, print_function, unicode_literals -- --import os - import sys --import tempfile --import subprocess -- --from pathlib import Path - - from mozboot.base import BaseBootstrapper - from mozboot.linux_common import LinuxBootstrapper - --# NOTE: This script is intended to be run with a vanilla Python install. We --# have to rely on the standard library instead of Python 2+3 helpers like --# the six module. --if sys.version_info < (3,): -- input = raw_input # noqa -- -- --AUR_URL_TEMPLATE = "https://aur.archlinux.org/cgit/aur.git/snapshot/{}.tar.gz" -- - - class ArchlinuxBootstrapper(LinuxBootstrapper, BaseBootstrapper): - """Archlinux experimental bootstrapper.""" - -- SYSTEM_PACKAGES = ["base-devel", "unzip", "zip"] -- -- BROWSER_PACKAGES = [ -- "alsa-lib", -- "dbus-glib", -- "gtk3", -- "libevent", -- "libvpx", -- "libxt", -- "mime-types", -- "startup-notification", -- "gst-plugins-base-libs", -- "libpulse", -- "xorg-server-xvfb", -- "gst-libav", -- "gst-plugins-good", -- ] -- -- BROWSER_AUR_PACKAGES = [ -- "uuid", -- ] -- -- MOBILE_ANDROID_COMMON_PACKAGES = [ -- # See comment about 32 bit binaries and multilib below. -- "multilib/lib32-ncurses", -- "multilib/lib32-readline", -- "multilib/lib32-zlib", -- ] -- - def __init__(self, version, dist_id, **kwargs): - print("Using an experimental bootstrapper for Archlinux.", file=sys.stderr) - BaseBootstrapper.__init__(self, **kwargs) - -- def install_system_packages(self): -- self.pacman_install(*self.SYSTEM_PACKAGES) -- -- def install_browser_packages(self, mozconfig_builder, artifact_mode=False): -- # TODO: Figure out what not to install for artifact mode -- self.aur_install(*self.BROWSER_AUR_PACKAGES) -- self.pacman_install(*self.BROWSER_PACKAGES) -- -- def install_browser_artifact_mode_packages(self, mozconfig_builder): -- self.install_browser_packages(mozconfig_builder, artifact_mode=True) -- -- def ensure_nasm_packages(self): -- # installed via install_browser_packages -- pass -- -- def install_mobile_android_packages(self, mozconfig_builder, artifact_mode=False): -- # Multi-part process: -- # 1. System packages. -- # 2. Android SDK. Android NDK only if we are not in artifact mode. Android packages. -- -- # 1. This is hard to believe, but the Android SDK binaries are 32-bit -- # and that conflicts with 64-bit Arch installations out of the box. The -- # solution is to add the multilibs repository; unfortunately, this -- # requires manual intervention. -- try: -- self.pacman_install(*self.MOBILE_ANDROID_COMMON_PACKAGES) -- except Exception as e: -- print( -- "Failed to install all packages. The Android developer " -- "toolchain requires 32 bit binaries be enabled (see " -- "https://wiki.archlinux.org/index.php/Android). You may need to " -- "manually enable the multilib repository following the instructions " -- "at https://wiki.archlinux.org/index.php/Multilib.", -- file=sys.stderr, -- ) -- raise e -- -- # 2. Android pieces. -- super().install_mobile_android_packages( -- mozconfig_builder, artifact_mode=artifact_mode -- ) -+ def install_packages(self, packages): -+ # watchman is not available via pacman -+ packages = [p for p in packages if p != "watchman"] -+ self.pacman_install(*packages) - - def upgrade_mercurial(self, current): - self.pacman_install("mercurial") - -- def pacman_is_installed(self, package): -- command = ["pacman", "-Q", package] -- return ( -- subprocess.run( -- command, -- stdout=subprocess.DEVNULL, -- stderr=subprocess.DEVNULL, -- ).returncode -- == 0 -- ) -- - def pacman_install(self, *packages): - command = ["pacman", "-S", "--needed"] - if self.no_interactive: -@@ -124,71 +31,3 @@ class ArchlinuxBootstrapper(LinuxBootstr - command.extend(packages) - - self.run_as_root(command) -- -- def run(self, command, env=None): -- subprocess.check_call(command, stdin=sys.stdin, env=env) -- -- def download(self, uri): -- command = ["curl", "-L", "-O", uri] -- self.run(command) -- -- def unpack(self, path: Path, name, ext): -- if ext == ".gz": -- compression = "-z" -- else: -- print(f"unsupported compression extension: {ext}", file=sys.stderr) -- sys.exit(1) -- -- name = path / (name + ".tar" + ext) -- command = ["tar", "-x", compression, "-f", str(name), "-C", str(path)] -- self.run(command) -- -- def makepkg(self, name): -- command = ["makepkg", "-sri"] -- if self.no_interactive: -- command.append("--noconfirm") -- makepkg_env = os.environ.copy() -- makepkg_env["PKGDEST"] = "." -- self.run(command, env=makepkg_env) -- -- def aur_install(self, *packages): -- needed = [] -- -- for package in packages: -- if self.pacman_is_installed(package): -- print( -- f"warning: AUR package {package} is installed -- skipping", -- file=sys.stderr, -- ) -- else: -- needed.append(package) -- -- # all required AUR packages are already installed! -- if not needed: -- return -- -- path = Path(tempfile.mkdtemp(prefix="mozboot-")) -- if not self.no_interactive: -- print( -- "WARNING! This script requires to install packages from the AUR " -- "This is potentially insecure so I recommend that you carefully " -- "read each package description and check the sources." -- f"These packages will be built in {path}: " + ", ".join(needed), -- file=sys.stderr, -- ) -- choice = input("Do you want to continue? (yes/no) [no]") -- if choice != "yes": -- sys.exit(1) -- -- base_dir = Path.cwd() -- os.chdir(path) -- for name in needed: -- url = AUR_URL_TEMPLATE.format(package) -- ext = Path(url).suffix -- directory = path / name -- self.download(url) -- self.unpack(path, name, ext) -- os.chdir(directory) -- self.makepkg(name) -- -- os.chdir(base_dir) -diff --git a/python/mozboot/mozboot/base.py b/python/mozboot/mozboot/base.py ---- a/python/mozboot/mozboot/base.py -+++ b/python/mozboot/mozboot/base.py -@@ -2,25 +2,22 @@ - # 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/. - --from __future__ import absolute_import, print_function, unicode_literals -- - import os - import re - import subprocess - import sys -- - from pathlib import Path - --from packaging.version import Version -+from mach.util import to_optional_path, win_to_msys_path - from mozboot import rust - from mozboot.util import ( -+ MINIMUM_RUST_VERSION, - get_mach_virtualenv_binary, -- MINIMUM_RUST_VERSION, - http_download_and_save, - ) -+from mozbuild.bootstrap import bootstrap_all_toolchains_for, bootstrap_toolchain - from mozfile import which --from mozbuild.bootstrap import bootstrap_toolchain --from mach.util import to_optional_path, win_to_msys_path -+from packaging.version import Version - - NO_MERCURIAL = """ - Could not find Mercurial (hg) in the current shell's path. Try starting a new -@@ -143,7 +140,7 @@ ac_add_options --enable-artifact-builds - - JS_MOZCONFIG_TEMPLATE = """\ - # Build only the SpiderMonkey JS test shell --ac_add_options --enable-application=js -+ac_add_options --enable-project=js - """ - - # Upgrade Mercurial older than this. -@@ -344,47 +341,12 @@ class BaseBootstrapper(object): - % __name__ - ) - -- def ensure_stylo_packages(self): -- """ -- Install any necessary packages needed for Stylo development. -- """ -- raise NotImplementedError( -- "%s does not yet implement ensure_stylo_packages()" % __name__ -- ) -- -- def ensure_nasm_packages(self): -- """ -- Install nasm. -- """ -- raise NotImplementedError( -- "%s does not yet implement ensure_nasm_packages()" % __name__ -- ) -- - def ensure_sccache_packages(self): - """ - Install sccache. - """ - pass - -- def ensure_node_packages(self): -- """ -- Install any necessary packages needed to supply NodeJS""" -- raise NotImplementedError( -- "%s does not yet implement ensure_node_packages()" % __name__ -- ) -- -- def ensure_fix_stacks_packages(self): -- """ -- Install fix-stacks. -- """ -- pass -- -- def ensure_minidump_stackwalk_packages(self): -- """ -- Install minidump-stackwalk. -- """ -- pass -- - def install_toolchain_static_analysis(self, toolchain_job): - clang_tools_path = self.state_dir / "clang-tools" - if not clang_tools_path.exists(): -@@ -428,9 +390,17 @@ class BaseBootstrapper(object): - - subprocess.check_call(cmd, cwd=str(install_dir)) - -- def run_as_root(self, command): -+ def auto_bootstrap(self, application): -+ args = ["--with-ccache=sccache"] -+ if application.endswith("_artifact_mode"): -+ args.append("--enable-artifact-builds") -+ application = application[: -len("_artifact_mode")] -+ args.append("--enable-project={}".format(application.replace("_", "/"))) -+ bootstrap_all_toolchains_for(args) -+ -+ def run_as_root(self, command, may_use_sudo=True): - if os.geteuid() != 0: -- if which("sudo"): -+ if may_use_sudo and which("sudo"): - command.insert(0, "sudo") - else: - command = ["su", "root", "-c", " ".join(command)] -@@ -439,107 +409,6 @@ class BaseBootstrapper(object): - - subprocess.check_call(command, stdin=sys.stdin) - -- def dnf_install(self, *packages): -- if which("dnf"): -- -- def not_installed(package): -- # We could check for "Error: No matching Packages to list", but -- # checking `dnf`s exit code is sufficent. -- # Ideally we'd invoke dnf with '--cacheonly', but there's: -- # https://bugzilla.redhat.com/show_bug.cgi?id=2030255 -- is_installed = subprocess.run( -- ["dnf", "list", "--installed", package], -- stdout=subprocess.PIPE, -- stderr=subprocess.STDOUT, -- ) -- if is_installed.returncode not in [0, 1]: -- stdout = is_installed.stdout -- raise Exception( -- f'Failed to determine whether package "{package}" is installed: "{stdout}"' -- ) -- return is_installed.returncode != 0 -- -- packages = list(filter(not_installed, packages)) -- if len(packages) == 0: -- # avoid sudo prompt (support unattended re-bootstrapping) -- return -- -- command = ["dnf", "install"] -- else: -- command = ["yum", "install"] -- -- if self.no_interactive: -- command.append("-y") -- command.extend(packages) -- -- self.run_as_root(command) -- -- def dnf_groupinstall(self, *packages): -- if which("dnf"): -- installed = subprocess.run( -- # Ideally we'd invoke dnf with '--cacheonly', but there's: -- # https://bugzilla.redhat.com/show_bug.cgi?id=2030255 -- # Ideally we'd use `--installed` instead of the undocumented -- # `installed` subcommand, but that doesn't currently work: -- # https://bugzilla.redhat.com/show_bug.cgi?id=1884616#c0 -- ["dnf", "group", "list", "installed", "--hidden"], -- universal_newlines=True, -- stdout=subprocess.PIPE, -- stderr=subprocess.STDOUT, -- ) -- if installed.returncode != 0: -- raise Exception( -- f'Failed to determine currently-installed package groups: "{installed.stdout}"' -- ) -- installed_packages = (pkg.strip() for pkg in installed.stdout.split("\n")) -- packages = list(filter(lambda p: p not in installed_packages, packages)) -- if len(packages) == 0: -- # avoid sudo prompt (support unattended re-bootstrapping) -- return -- -- command = ["dnf", "groupinstall"] -- else: -- command = ["yum", "groupinstall"] -- -- if self.no_interactive: -- command.append("-y") -- command.extend(packages) -- -- self.run_as_root(command) -- -- def dnf_update(self, *packages): -- if which("dnf"): -- command = ["dnf", "update"] -- else: -- command = ["yum", "update"] -- -- if self.no_interactive: -- command.append("-y") -- command.extend(packages) -- -- self.run_as_root(command) -- -- def apt_install(self, *packages): -- command = ["apt-get", "install"] -- if self.no_interactive: -- command.append("-y") -- command.extend(packages) -- -- self.run_as_root(command) -- -- def apt_update(self): -- command = ["apt-get", "update"] -- if self.no_interactive: -- command.append("-y") -- -- self.run_as_root(command) -- -- def apt_add_architecture(self, arch): -- command = ["dpkg", "--add-architecture"] -- command.extend(arch) -- -- self.run_as_root(command) -- - def prompt_int(self, prompt, low, high, default=None): - """Prompts the user with prompt and requires an integer between low and high. - -@@ -757,14 +626,10 @@ class BaseBootstrapper(object): - if modern: - print("Your version of Rust (%s) is new enough." % version) - -- if rustup: -- self.ensure_rust_targets(rustup, version) -- return -- -- if version: -+ elif version: - print("Your version of Rust (%s) is too old." % version) - -- if rustup: -+ if rustup and not modern: - rustup_version = self._parse_version(rustup) - if not rustup_version: - print(RUSTUP_OLD) -@@ -776,10 +641,16 @@ class BaseBootstrapper(object): - if not modern: - print(RUST_UPGRADE_FAILED % (MODERN_RUST_VERSION, after)) - sys.exit(1) -- else: -+ elif not rustup: - # No rustup. Download and run the installer. - print("Will try to install Rust.") - self.install_rust() -+ modern, version = self.is_rust_modern(cargo_bin) -+ rustup = to_optional_path( -+ which("rustup", extra_search_dirs=[str(cargo_bin)]) -+ ) -+ -+ self.ensure_rust_targets(rustup, version) - - def ensure_rust_targets(self, rustup: Path, rust_version): - """Make sure appropriate cross target libraries are installed.""" -diff --git a/python/mozboot/mozboot/bootstrap.py b/python/mozboot/mozboot/bootstrap.py ---- a/python/mozboot/mozboot/bootstrap.py -+++ b/python/mozboot/mozboot/bootstrap.py -@@ -2,48 +2,46 @@ - # 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/. - --from __future__ import absolute_import, print_function, unicode_literals -- --from collections import OrderedDict -- - import os - import platform - import re - import shutil --import sys -+import stat - import subprocess -+import sys - import time --from typing import Optional -+from collections import OrderedDict - from pathlib import Path --from packaging.version import Version -+from typing import Optional -+ -+# Use distro package to retrieve linux platform information -+import distro -+from mach.site import MachSiteManager -+from mach.telemetry import initialize_telemetry_setting - from mach.util import ( -+ UserError, - get_state_dir, -- UserError, - to_optional_path, - to_optional_str, - win_to_msys_path, - ) --from mach.telemetry import initialize_telemetry_setting --from mach.site import MachSiteManager -+from mozboot.archlinux import ArchlinuxBootstrapper - from mozboot.base import MODERN_RUST_VERSION - from mozboot.centosfedora import CentOSFedoraBootstrapper --from mozboot.opensuse import OpenSUSEBootstrapper - from mozboot.debian import DebianBootstrapper - from mozboot.freebsd import FreeBSDBootstrapper - from mozboot.gentoo import GentooBootstrapper --from mozboot.osx import OSXBootstrapper, OSXBootstrapperLight -+from mozboot.mozconfig import MozconfigBuilder -+from mozboot.mozillabuild import MozillaBuildBootstrapper - from mozboot.openbsd import OpenBSDBootstrapper --from mozboot.archlinux import ArchlinuxBootstrapper -+from mozboot.opensuse import OpenSUSEBootstrapper -+from mozboot.osx import OSXBootstrapper, OSXBootstrapperLight - from mozboot.solus import SolusBootstrapper - from mozboot.void import VoidBootstrapper - from mozboot.windows import WindowsBootstrapper --from mozboot.mozillabuild import MozillaBuildBootstrapper --from mozboot.mozconfig import MozconfigBuilder -+from mozbuild.base import MozbuildObject - from mozfile import which --from mozbuild.base import MozbuildObject -- --# Use distro package to retrieve linux platform information --import distro -+from packaging.version import Version - - APPLICATION_CHOICE = """ - Note on Artifact Mode: -@@ -123,6 +121,7 @@ DEBIAN_DISTROS = ( - "devuan", - "pureos", - "deepin", -+ "tuxedo", - ) - - ADD_GIT_CINNABAR_PATH = """ -@@ -250,13 +249,11 @@ class Bootstrapper(object): - # Also install the clang static-analysis package by default - # The best place to install our packages is in the state directory - # we have. We should have created one above in non-interactive mode. -- self.instance.ensure_node_packages() -- self.instance.ensure_fix_stacks_packages() -- self.instance.ensure_minidump_stackwalk_packages() -+ self.instance.auto_bootstrap(application) -+ self.instance.install_toolchain_artifact("fix-stacks") -+ self.instance.install_toolchain_artifact("minidump-stackwalk") - if not self.instance.artifact_mode: -- self.instance.ensure_stylo_packages() - self.instance.ensure_clang_static_analysis_package() -- self.instance.ensure_nasm_packages() - self.instance.ensure_sccache_packages() - # Like 'ensure_browser_packages' or 'ensure_mobile_android_packages' - getattr(self.instance, "ensure_%s_packages" % application)() -@@ -325,7 +322,6 @@ class Bootstrapper(object): - state_dir = Path(get_state_dir()) - self.instance.state_dir = state_dir - -- hg_installed, hg_modern = self.instance.ensure_mercurial_modern() - hg = to_optional_path(which("hg")) - - # We need to enable the loading of hgrc in case extensions are -@@ -355,6 +351,10 @@ class Bootstrapper(object): - - # Possibly configure Mercurial, but not if the current checkout or repo - # type is Git. -+ hg_installed = bool(hg) -+ if checkout_type == "hg": -+ hg_installed, hg_modern = self.instance.ensure_mercurial_modern() -+ - if hg_installed and checkout_type == "hg": - if not self.instance.no_interactive: - configure_hg = self.instance.prompt_yesno(prompt=CONFIGURE_MERCURIAL) -@@ -485,8 +485,8 @@ class Bootstrapper(object): - # distutils is singled out here because some distros (namely Ubuntu) - # include it in a separate package outside of the main Python - # installation. -+ import distutils.spawn - import distutils.sysconfig -- import distutils.spawn - - assert distutils.sysconfig is not None and distutils.spawn is not None - except ImportError as e: -@@ -610,11 +610,11 @@ def current_firefox_checkout(env, hg: Op - # Just check for known-good files in the checkout, to prevent attempted - # foot-shootings. Determining a canonical git checkout of mozilla-unified - # is...complicated -- elif git_dir.exists(): -+ elif git_dir.exists() or hg_dir.exists(): - moz_configure = path / "moz.configure" - if moz_configure.exists(): - _warn_if_risky_revision(path) -- return "git", path -+ return ("git" if git_dir.exists() else "hg"), path - - if not len(path.parents): - break -@@ -639,13 +639,23 @@ def update_git_tools(git: Optional[Path] - # repository. It now only downloads prebuilt binaries, so if we are - # updating from an old setup, remove the repository and start over. - if (cinnabar_dir / ".git").exists(): -- shutil.rmtree(str(cinnabar_dir)) -+ # git sets pack files read-only, which causes problems removing -+ # them on Windows. To work around that, we use an error handler -+ # on rmtree that retries to remove the file after chmod'ing it. -+ def onerror(func, path, exc): -+ if func == os.unlink: -+ os.chmod(path, stat.S_IRWXU) -+ func(path) -+ else: -+ raise -+ -+ shutil.rmtree(str(cinnabar_dir), onerror=onerror) - - # If we already have an executable, ask it to update itself. - exists = cinnabar_exe.exists() - if exists: - try: -- subprocess.check_call([cinnabar_exe, "self-update"]) -+ subprocess.check_call([str(cinnabar_exe), "self-update"]) - except subprocess.CalledProcessError as e: - print(e) - -diff --git a/python/mozboot/mozboot/centosfedora.py b/python/mozboot/mozboot/centosfedora.py ---- a/python/mozboot/mozboot/centosfedora.py -+++ b/python/mozboot/mozboot/centosfedora.py -@@ -2,10 +2,11 @@ - # 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/. - --from __future__ import absolute_import, print_function, unicode_literals -+import subprocess - - from mozboot.base import BaseBootstrapper - from mozboot.linux_common import LinuxBootstrapper -+from mozfile import which - - - class CentOSFedoraBootstrapper(LinuxBootstrapper, BaseBootstrapper): -@@ -16,79 +17,63 @@ class CentOSFedoraBootstrapper(LinuxBoot - self.version = int(version.split(".")[0]) - self.dist_id = dist_id - -- self.group_packages = [] -- -- self.packages = ["which"] -- -- self.browser_group_packages = ["GNOME Software Development"] -- -- self.browser_packages = [ -- "alsa-lib-devel", -- "dbus-glib-devel", -- "glibc-static", -- # Development group. -- "libstdc++-static", -- "libXt-devel", -- "pulseaudio-libs-devel", -- "gcc-c++", -- ] -- -- self.mobile_android_packages = [] -- -+ def install_packages(self, packages): -+ if self.version >= 33 and "perl" in packages: -+ packages.append("perl-FindBin") -+ # watchman is not available on centos/rocky - if self.distro in ("centos", "rocky"): -- self.group_packages += ["Development Tools"] -- -- self.packages += ["curl-devel"] -- -- self.browser_packages += ["gtk3-devel"] -- -- if self.version == 6: -- self.group_packages += [ -- "Development Libraries", -- "GNOME Software Development", -- ] -- -- else: -- self.packages += ["redhat-rpm-config"] -- -- self.browser_group_packages = ["Development Tools"] -- -- elif self.distro == "fedora": -- self.group_packages += ["C Development Tools and Libraries"] -- -- self.packages += [ -- "redhat-rpm-config", -- "watchman", -- ] -- if self.version >= 33: -- self.packages.append("perl-FindBin") -- -- self.mobile_android_packages += ["ncurses-compat-libs"] -- -- self.packages += ["python3-devel"] -- -- def install_system_packages(self): -- self.dnf_groupinstall(*self.group_packages) -- self.dnf_install(*self.packages) -- -- def install_browser_packages(self, mozconfig_builder, artifact_mode=False): -- # TODO: Figure out what not to install for artifact mode -- self.dnf_groupinstall(*self.browser_group_packages) -- self.dnf_install(*self.browser_packages) -- -- def install_browser_artifact_mode_packages(self, mozconfig_builder): -- self.install_browser_packages(mozconfig_builder, artifact_mode=True) -- -- def install_mobile_android_packages(self, mozconfig_builder, artifact_mode=False): -- # Install Android specific packages. -- self.dnf_install(*self.mobile_android_packages) -- -- super().install_mobile_android_packages( -- mozconfig_builder, artifact_mode=artifact_mode -- ) -+ packages = [p for p in packages if p != "watchman"] -+ self.dnf_install(*packages) - - def upgrade_mercurial(self, current): - if current is None: - self.dnf_install("mercurial") - else: - self.dnf_update("mercurial") -+ -+ def dnf_install(self, *packages): -+ if which("dnf"): -+ -+ def not_installed(package): -+ # We could check for "Error: No matching Packages to list", but -+ # checking `dnf`s exit code is sufficent. -+ # Ideally we'd invoke dnf with '--cacheonly', but there's: -+ # https://bugzilla.redhat.com/show_bug.cgi?id=2030255 -+ is_installed = subprocess.run( -+ ["dnf", "list", "--installed", package], -+ stdout=subprocess.PIPE, -+ stderr=subprocess.STDOUT, -+ ) -+ if is_installed.returncode not in [0, 1]: -+ stdout = is_installed.stdout -+ raise Exception( -+ f'Failed to determine whether package "{package}" is installed: "{stdout}"' -+ ) -+ return is_installed.returncode != 0 -+ -+ packages = list(filter(not_installed, packages)) -+ if len(packages) == 0: -+ # avoid sudo prompt (support unattended re-bootstrapping) -+ return -+ -+ command = ["dnf", "install"] -+ else: -+ command = ["yum", "install"] -+ -+ if self.no_interactive: -+ command.append("-y") -+ command.extend(packages) -+ -+ self.run_as_root(command) -+ -+ def dnf_update(self, *packages): -+ if which("dnf"): -+ command = ["dnf", "update"] -+ else: -+ command = ["yum", "update"] -+ -+ if self.no_interactive: -+ command.append("-y") -+ command.extend(packages) -+ -+ self.run_as_root(command) -diff --git a/python/mozboot/mozboot/debian.py b/python/mozboot/mozboot/debian.py ---- a/python/mozboot/mozboot/debian.py -+++ b/python/mozboot/mozboot/debian.py -@@ -2,48 +2,13 @@ - # 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/. - --from __future__ import absolute_import, print_function, unicode_literals -+import sys - --from mozboot.base import BaseBootstrapper, MERCURIAL_INSTALL_PROMPT -+from mozboot.base import MERCURIAL_INSTALL_PROMPT, BaseBootstrapper - from mozboot.linux_common import LinuxBootstrapper - --import sys -- - - class DebianBootstrapper(LinuxBootstrapper, BaseBootstrapper): -- -- # These are common packages for all Debian-derived distros (such as -- # Ubuntu). -- COMMON_PACKAGES = [ -- "build-essential", -- "libpython3-dev", -- "m4", -- "unzip", -- "uuid", -- "zip", -- ] -- -- # These are common packages for building Firefox for Desktop -- # (browser) for all Debian-derived distros (such as Ubuntu). -- BROWSER_COMMON_PACKAGES = [ -- "libasound2-dev", -- "libcurl4-openssl-dev", -- "libdbus-1-dev", -- "libdbus-glib-1-dev", -- "libdrm-dev", -- "libgtk-3-dev", -- "libpulse-dev", -- "libx11-xcb-dev", -- "libxt-dev", -- "xvfb", -- ] -- -- # These are common packages for building Firefox for Android -- # (mobile/android) for all Debian-derived distros (such as Ubuntu). -- MOBILE_ANDROID_COMMON_PACKAGES = [ -- "libncurses5", # For native debugging in Android Studio -- ] -- - def __init__(self, distro, version, dist_id, codename, **kwargs): - BaseBootstrapper.__init__(self, **kwargs) - -@@ -52,16 +17,6 @@ class DebianBootstrapper(LinuxBootstrapp - self.dist_id = dist_id - self.codename = codename - -- self.packages = list(self.COMMON_PACKAGES) -- -- try: -- version_number = int(version) -- except ValueError: -- version_number = None -- -- if (version_number and (version_number >= 11)) or version == "unstable": -- self.packages += ["watchman"] -- - def suggest_install_distutils(self): - print( - "HINT: Try installing distutils with " -@@ -75,26 +30,15 @@ class DebianBootstrapper(LinuxBootstrapp - file=sys.stderr, - ) - -- def install_system_packages(self): -- self.apt_install(*self.packages) -- -- def install_browser_packages(self, mozconfig_builder, artifact_mode=False): -- # TODO: Figure out what not to install for artifact mode -- self.apt_install(*self.BROWSER_COMMON_PACKAGES) -- -- def install_browser_artifact_mode_packages(self, mozconfig_builder): -- self.install_browser_packages(mozconfig_builder, artifact_mode=True) -+ def install_packages(self, packages): -+ try: -+ if int(self.version) < 11: -+ # watchman is only available starting from Debian 11. -+ packages = [p for p in packages if p != "watchman"] -+ except ValueError: -+ pass - -- def install_mobile_android_packages(self, mozconfig_builder, artifact_mode=False): -- # Multi-part process: -- # 1. System packages. -- # 2. Android SDK. Android NDK only if we are not in artifact mode. Android packages. -- self.apt_install(*self.MOBILE_ANDROID_COMMON_PACKAGES) -- -- # 2. Android pieces. -- super().install_mobile_android_packages( -- mozconfig_builder, artifact_mode=artifact_mode -- ) -+ self.apt_install(*packages) - - def _update_package_manager(self): - self.apt_update() -@@ -122,3 +66,18 @@ class DebianBootstrapper(LinuxBootstrapp - # pip. - assert res == 1 - self.run_as_root(["pip3", "install", "--upgrade", "Mercurial"]) -+ -+ def apt_install(self, *packages): -+ command = ["apt-get", "install"] -+ if self.no_interactive: -+ command.append("-y") -+ command.extend(packages) -+ -+ self.run_as_root(command) -+ -+ def apt_update(self): -+ command = ["apt-get", "update"] -+ if self.no_interactive: -+ command.append("-y") -+ -+ self.run_as_root(command) -diff --git a/python/mozboot/mozboot/freebsd.py b/python/mozboot/mozboot/freebsd.py ---- a/python/mozboot/mozboot/freebsd.py -+++ b/python/mozboot/mozboot/freebsd.py -@@ -2,7 +2,6 @@ - # 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/. - --from __future__ import absolute_import, print_function, unicode_literals - import sys - - from mozboot.base import BaseBootstrapper -@@ -19,11 +18,11 @@ class FreeBSDBootstrapper(BaseBootstrapp - "gmake", - "gtar", - "m4", -+ "npm", - "pkgconf", - "py%d%d-sqlite3" % sys.version_info[0:2], - "rust", - "watchman", -- "zip", - ] - - self.browser_packages = [ -@@ -56,10 +55,11 @@ class FreeBSDBootstrapper(BaseBootstrapp - def install_browser_packages(self, mozconfig_builder, artifact_mode=False): - # TODO: Figure out what not to install for artifact mode - packages = self.browser_packages.copy() -- if sys.platform.startswith("netbsd"): -- packages.extend(["brotli", "gtk3+", "libv4l"]) -- else: -- packages.extend(["gtk3", "mesa-dri", "v4l_compat"]) -+ if not artifact_mode: -+ if sys.platform.startswith("netbsd"): -+ packages.extend(["brotli", "gtk3+", "libv4l", "cbindgen"]) -+ else: -+ packages.extend(["gtk3", "mesa-dri", "v4l_compat", "rust-cbindgen"]) - self.pkg_install(*packages) - - def install_browser_artifact_mode_packages(self, mozconfig_builder): -@@ -69,19 +69,5 @@ class FreeBSDBootstrapper(BaseBootstrapp - # TODO: we don't ship clang base static analysis for this platform - pass - -- def ensure_stylo_packages(self): -- # Clang / llvm already installed as browser package -- if sys.platform.startswith("netbsd"): -- self.pkg_install("cbindgen") -- else: -- self.pkg_install("rust-cbindgen") -- -- def ensure_nasm_packages(self): -- # installed via install_browser_packages -- pass -- -- def ensure_node_packages(self): -- self.pkg_install("npm") -- - def upgrade_mercurial(self, current): - self.pkg_install("mercurial") -diff --git a/python/mozboot/mozboot/gentoo.py b/python/mozboot/mozboot/gentoo.py ---- a/python/mozboot/mozboot/gentoo.py -+++ b/python/mozboot/mozboot/gentoo.py -@@ -2,8 +2,6 @@ - # 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/. - --from __future__ import absolute_import, print_function, unicode_literals -- - from mozboot.base import BaseBootstrapper - from mozboot.linux_common import LinuxBootstrapper - -@@ -15,32 +13,13 @@ class GentooBootstrapper(LinuxBootstrapp - self.version = version - self.dist_id = dist_id - -- def install_system_packages(self): -- self.ensure_system_packages() -- -- def ensure_system_packages(self): -- self.run_as_root( -- ["emerge", "--noreplace", "--quiet", "app-arch/zip", "dev-util/watchman"] -- ) -- -- def install_browser_packages(self, mozconfig_builder, artifact_mode=False): -- # TODO: Figure out what not to install for artifact mode -- self.run_as_root( -- [ -- "emerge", -- "--oneshot", -- "--noreplace", -- "--quiet", -- "--newuse", -- "dev-libs/dbus-glib", -- "media-sound/pulseaudio", -- "x11-libs/gtk+:3", -- "x11-libs/libXt", -- ] -- ) -- -- def install_browser_artifact_mode_packages(self, mozconfig_builder): -- self.install_browser_packages(mozconfig_builder, artifact_mode=True) -+ def install_packages(self, packages): -+ DISAMBIGUATE = { -+ "tar": "app-arch/tar", -+ } -+ # watchman is available but requires messing with USEs. -+ packages = [DISAMBIGUATE.get(p, p) for p in packages if p != "watchman"] -+ self.run_as_root(["emerge", "--noreplace"] + packages) - - def _update_package_manager(self): - self.run_as_root(["emerge", "--sync"]) -diff --git a/python/mozboot/mozboot/linux_common.py b/python/mozboot/mozboot/linux_common.py ---- a/python/mozboot/mozboot/linux_common.py -+++ b/python/mozboot/mozboot/linux_common.py -@@ -6,8 +6,6 @@ - # needed to install Stylo and Node dependencies. This class must come before - # BaseBootstrapper in the inheritance list. - --from __future__ import absolute_import, print_function, unicode_literals -- - import platform - - -@@ -15,68 +13,6 @@ def is_non_x86_64(): - return platform.machine() != "x86_64" - - --class SccacheInstall(object): -- def __init__(self, **kwargs): -- pass -- -- def ensure_sccache_packages(self): -- self.install_toolchain_artifact("sccache") -- -- --class FixStacksInstall(object): -- def __init__(self, **kwargs): -- pass -- -- def ensure_fix_stacks_packages(self): -- self.install_toolchain_artifact("fix-stacks") -- -- --class StyloInstall(object): -- def __init__(self, **kwargs): -- pass -- -- def ensure_stylo_packages(self): -- if is_non_x86_64(): -- print( -- "Cannot install bindgen clang and cbindgen packages from taskcluster.\n" -- "Please install these packages manually." -- ) -- return -- -- self.install_toolchain_artifact("clang") -- self.install_toolchain_artifact("cbindgen") -- -- --class NasmInstall(object): -- def __init__(self, **kwargs): -- pass -- -- def ensure_nasm_packages(self): -- if is_non_x86_64(): -- print( -- "Cannot install nasm from taskcluster.\n" -- "Please install this package manually." -- ) -- return -- -- self.install_toolchain_artifact("nasm") -- -- --class NodeInstall(object): -- def __init__(self, **kwargs): -- pass -- -- def ensure_node_packages(self): -- if is_non_x86_64(): -- print( -- "Cannot install node package from taskcluster.\n" -- "Please install this package manually." -- ) -- return -- -- self.install_toolchain_artifact("node") -- -- - class ClangStaticAnalysisInstall(object): - def __init__(self, **kwargs): - pass -@@ -94,14 +30,6 @@ class ClangStaticAnalysisInstall(object) - self.install_toolchain_static_analysis(static_analysis.LINUX_CLANG_TIDY) - - --class MinidumpStackwalkInstall(object): -- def __init__(self, **kwargs): -- pass -- -- def ensure_minidump_stackwalk_packages(self): -- self.install_toolchain_artifact("minidump-stackwalk") -- -- - class MobileAndroidBootstrapper(object): - def __init__(self, **kwargs): - pass -@@ -154,13 +82,32 @@ class MobileAndroidBootstrapper(object): - - class LinuxBootstrapper( - ClangStaticAnalysisInstall, -- FixStacksInstall, -- MinidumpStackwalkInstall, - MobileAndroidBootstrapper, -- NasmInstall, -- NodeInstall, -- SccacheInstall, -- StyloInstall, - ): - def __init__(self, **kwargs): - pass -+ -+ def ensure_sccache_packages(self): -+ pass -+ -+ def install_system_packages(self): -+ self.install_packages( -+ [ -+ "bash", -+ "findutils", # contains xargs -+ "gzip", -+ "libxml2", # used by bootstrapped clang -+ "m4", -+ "make", -+ "perl", -+ "tar", -+ "unzip", -+ "watchman", -+ ] -+ ) -+ -+ def install_browser_packages(self, mozconfig_builder, artifact_mode=False): -+ pass -+ -+ def install_browser_artifact_mode_packages(self, mozconfig_builder): -+ pass -diff --git a/python/mozboot/mozboot/mach_commands.py b/python/mozboot/mozboot/mach_commands.py ---- a/python/mozboot/mozboot/mach_commands.py -+++ b/python/mozboot/mozboot/mach_commands.py -@@ -2,13 +2,11 @@ - # 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/. - --from __future__ import absolute_import, print_function, unicode_literals -- - import errno - import sys -+from pathlib import Path - --from pathlib import Path --from mach.decorators import CommandArgument, Command -+from mach.decorators import Command, CommandArgument - from mozboot.bootstrap import APPLICATIONS - - -@@ -71,8 +69,8 @@ def vcs_setup(command_context, update_on - """ - import mozboot.bootstrap as bootstrap - import mozversioncontrol -+ from mach.util import to_optional_path - from mozfile import which -- from mach.util import to_optional_path - - repo = mozversioncontrol.get_repository_object(command_context._mach_context.topdir) - tool = "hg" -diff --git a/python/mozboot/mozboot/mozconfig.py b/python/mozboot/mozboot/mozconfig.py ---- a/python/mozboot/mozboot/mozconfig.py -+++ b/python/mozboot/mozboot/mozconfig.py -@@ -2,15 +2,11 @@ - # 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/. - --from __future__ import absolute_import -- - import filecmp - import os -- - from pathlib import Path - from typing import Union - -- - MOZ_MYCONFIG_ERROR = """ - The MOZ_MYCONFIG environment variable to define the location of mozconfigs - is deprecated. If you wish to define the mozconfig path via an environment -diff --git a/python/mozboot/mozboot/mozillabuild.py b/python/mozboot/mozboot/mozillabuild.py ---- a/python/mozboot/mozboot/mozillabuild.py -+++ b/python/mozboot/mozboot/mozillabuild.py -@@ -2,8 +2,6 @@ - # 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/. - --from __future__ import absolute_import, print_function, unicode_literals -- - import ctypes - import os - import platform -@@ -231,35 +229,9 @@ class MozillaBuildBootstrapper(BaseBoots - def ensure_sccache_packages(self): - from mozboot import sccache - -- self.install_toolchain_artifact("sccache") - self.install_toolchain_artifact(sccache.RUSTC_DIST_TOOLCHAIN, no_unpack=True) - self.install_toolchain_artifact(sccache.CLANG_DIST_TOOLCHAIN, no_unpack=True) - -- def ensure_stylo_packages(self): -- # On-device artifact builds are supported; on-device desktop builds are not. -- if is_aarch64_host(): -- raise Exception( -- "You should not be performing desktop builds on an " -- "AArch64 device. If you want to do artifact builds " -- "instead, please choose the appropriate artifact build " -- "option when beginning bootstrap." -- ) -- -- self.install_toolchain_artifact("clang") -- self.install_toolchain_artifact("cbindgen") -- -- def ensure_nasm_packages(self): -- self.install_toolchain_artifact("nasm") -- -- def ensure_node_packages(self): -- self.install_toolchain_artifact("node") -- -- def ensure_fix_stacks_packages(self): -- self.install_toolchain_artifact("fix-stacks") -- -- def ensure_minidump_stackwalk_packages(self): -- self.install_toolchain_artifact("minidump-stackwalk") -- - def _update_package_manager(self): - pass - -diff --git a/python/mozboot/mozboot/openbsd.py b/python/mozboot/mozboot/openbsd.py ---- a/python/mozboot/mozboot/openbsd.py -+++ b/python/mozboot/mozboot/openbsd.py -@@ -2,8 +2,6 @@ - # 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/. - --from __future__ import absolute_import, print_function, unicode_literals -- - from mozboot.base import BaseBootstrapper - - -@@ -11,9 +9,17 @@ class OpenBSDBootstrapper(BaseBootstrapp - def __init__(self, version, **kwargs): - BaseBootstrapper.__init__(self, **kwargs) - -- self.packages = ["gmake", "gtar", "rust", "unzip", "zip"] -+ self.packages = ["gmake", "gtar", "rust", "unzip"] - -- self.browser_packages = ["llvm", "nasm", "gtk+3", "dbus-glib", "pulseaudio"] -+ self.browser_packages = [ -+ "llvm", -+ "cbindgen", -+ "nasm", -+ "node", -+ "gtk+3", -+ "dbus-glib", -+ "pulseaudio", -+ ] - - def install_system_packages(self): - # we use -z because there's no other way to say "any autoconf-2.13" -@@ -30,14 +36,3 @@ class OpenBSDBootstrapper(BaseBootstrapp - def ensure_clang_static_analysis_package(self): - # TODO: we don't ship clang base static analysis for this platform - pass -- -- def ensure_stylo_packages(self): -- # Clang / llvm already installed as browser package -- self.run_as_root(["pkg_add", "cbindgen"]) -- -- def ensure_nasm_packages(self): -- # installed via install_browser_packages -- pass -- -- def ensure_node_packages(self): -- self.run_as_root(["pkg_add", "node"]) -diff --git a/python/mozboot/mozboot/opensuse.py b/python/mozboot/mozboot/opensuse.py ---- a/python/mozboot/mozboot/opensuse.py -+++ b/python/mozboot/mozboot/opensuse.py -@@ -2,107 +2,24 @@ - # 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/. - --from __future__ import absolute_import, print_function, unicode_literals -- --from mozboot.base import BaseBootstrapper, MERCURIAL_INSTALL_PROMPT -+from mozboot.base import MERCURIAL_INSTALL_PROMPT, BaseBootstrapper - from mozboot.linux_common import LinuxBootstrapper - --import distro --import subprocess -- - - class OpenSUSEBootstrapper(LinuxBootstrapper, BaseBootstrapper): - """openSUSE experimental bootstrapper.""" - -- SYSTEM_PACKAGES = [ -- "libcurl-devel", -- "libpulse-devel", -- "rpmconf", -- "which", -- "unzip", -- ] -- -- BROWSER_PACKAGES = [ -- "alsa-devel", -- "gcc-c++", -- "gtk3-devel", -- "dbus-1-glib-devel", -- "glibc-devel-static", -- "libstdc++-devel", -- "libXt-devel", -- "libproxy-devel", -- "libuuid-devel", -- "clang-devel", -- "patterns-gnome-devel_gnome", -- ] -- -- OPTIONAL_BROWSER_PACKAGES = [ -- "gconf2-devel", # https://bugzilla.mozilla.org/show_bug.cgi?id=1779931 -- ] -- -- BROWSER_GROUP_PACKAGES = ["devel_C_C++", "devel_gnome"] -- -- MOBILE_ANDROID_COMMON_PACKAGES = ["java-1_8_0-openjdk"] -- - def __init__(self, version, dist_id, **kwargs): - print("Using an experimental bootstrapper for openSUSE.") - BaseBootstrapper.__init__(self, **kwargs) - -- def install_system_packages(self): -- self.zypper_install(*self.SYSTEM_PACKAGES) -- -- def install_browser_packages(self, mozconfig_builder, artifact_mode=False): -- # TODO: Figure out what not to install for artifact mode -- packages_to_install = self.BROWSER_PACKAGES.copy() -- -- for package in self.OPTIONAL_BROWSER_PACKAGES: -- if self.zypper_can_install(package): -- packages_to_install.append(package) -- else: -- print( -- f"WARNING! zypper cannot find a package for '{package}' for " -- f"{distro.name(True)}. It will not be automatically installed." -- ) -- -- self.zypper_install(*packages_to_install) -- -- def install_browser_group_packages(self): -- self.ensure_browser_group_packages() -- -- def install_browser_artifact_mode_packages(self, mozconfig_builder): -- self.install_browser_packages(mozconfig_builder, artifact_mode=True) -- -- def ensure_clang_static_analysis_package(self): -- from mozboot import static_analysis -- -- self.install_toolchain_static_analysis(static_analysis.LINUX_CLANG_TIDY) -- -- def ensure_browser_group_packages(self, artifact_mode=False): -- # TODO: Figure out what not to install for artifact mode -- self.zypper_patterninstall(*self.BROWSER_GROUP_PACKAGES) -- -- def install_mobile_android_packages(self, mozconfig_builder, artifact_mode=False): -- # Multi-part process: -- # 1. System packages. -- # 2. Android SDK. Android NDK only if we are not in artifact mode. Android packages. -- -- # 1. This is hard to believe, but the Android SDK binaries are 32-bit -- # and that conflicts with 64-bit Arch installations out of the box. The -- # solution is to add the multilibs repository; unfortunately, this -- # requires manual intervention. -- try: -- self.zypper_install(*self.MOBILE_ANDROID_COMMON_PACKAGES) -- except Exception as e: -- print( -- "Failed to install all packages. The Android developer " -- "toolchain requires 32 bit binaries be enabled" -- ) -- raise e -- -- # 2. Android pieces. -- super().install_mobile_android_packages( -- mozconfig_builder, artifact_mode=artifact_mode -- ) -+ def install_packages(self, packages): -+ ALTERNATIVE_NAMES = { -+ "libxml2": "libxml2-2", -+ } -+ # watchman is not available -+ packages = [ALTERNATIVE_NAMES.get(p, p) for p in packages if p != "watchman"] -+ self.zypper_install(*packages) - - def _update_package_manager(self): - self.zypper_update() -@@ -142,14 +59,5 @@ class OpenSUSEBootstrapper(LinuxBootstra - def zypper_install(self, *packages): - self.zypper("install", *packages) - -- def zypper_can_install(self, package): -- return ( -- subprocess.call(["zypper", "search", package], stdout=subprocess.DEVNULL) -- == 0 -- ) -- - def zypper_update(self, *packages): - self.zypper("update", *packages) -- -- def zypper_patterninstall(self, *packages): -- self.zypper("install", "-t", "pattern", *packages) -diff --git a/python/mozboot/mozboot/osx.py b/python/mozboot/mozboot/osx.py ---- a/python/mozboot/mozboot/osx.py -+++ b/python/mozboot/mozboot/osx.py -@@ -2,8 +2,6 @@ - # 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/. - --from __future__ import absolute_import, print_function, unicode_literals -- - import platform - import subprocess - import sys -@@ -14,11 +12,10 @@ try: - except ImportError: - from urllib.request import urlopen - --from packaging.version import Version -- -+from mach.util import to_optional_path, to_optional_str - from mozboot.base import BaseBootstrapper - from mozfile import which --from mach.util import to_optional_path, to_optional_str -+from packaging.version import Version - - HOMEBREW_BOOTSTRAP = ( - "https://raw.githubusercontent.com/Homebrew/install/master/install.sh" -@@ -166,21 +163,9 @@ class OSXBootstrapperLight(OSXAndroidBoo - def install_browser_artifact_mode_packages(self, mozconfig_builder): - pass - -- def ensure_node_packages(self): -- pass -- -- def ensure_stylo_packages(self): -- pass -- - def ensure_clang_static_analysis_package(self): - pass - -- def ensure_nasm_packages(self): -- pass -- -- def ensure_minidump_stackwalk_packages(self): -- self.install_toolchain_artifact("minidump-stackwalk") -- - - class OSXBootstrapper(OSXAndroidBootstrapper, BaseBootstrapper): - def __init__(self, version, **kwargs): -@@ -299,26 +284,9 @@ class OSXBootstrapper(OSXAndroidBootstra - def ensure_sccache_packages(self): - from mozboot import sccache - -- self.install_toolchain_artifact("sccache") - self.install_toolchain_artifact(sccache.RUSTC_DIST_TOOLCHAIN, no_unpack=True) - self.install_toolchain_artifact(sccache.CLANG_DIST_TOOLCHAIN, no_unpack=True) - -- def ensure_fix_stacks_packages(self): -- self.install_toolchain_artifact("fix-stacks") -- -- def ensure_stylo_packages(self): -- self.install_toolchain_artifact("clang") -- self.install_toolchain_artifact("cbindgen") -- -- def ensure_nasm_packages(self): -- self.install_toolchain_artifact("nasm") -- -- def ensure_node_packages(self): -- self.install_toolchain_artifact("node") -- -- def ensure_minidump_stackwalk_packages(self): -- self.install_toolchain_artifact("minidump-stackwalk") -- - def install_homebrew(self): - print(BREW_INSTALL) - bootstrap = urlopen(url=HOMEBREW_BOOTSTRAP, timeout=20).read() -diff --git a/python/mozboot/mozboot/rust.py b/python/mozboot/mozboot/rust.py ---- a/python/mozboot/mozboot/rust.py -+++ b/python/mozboot/mozboot/rust.py -@@ -2,16 +2,11 @@ - # 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/. - --from __future__ import absolute_import, print_function, unicode_literals -- - import platform as platform_mod - import sys - -- - # Base url for pulling the rustup installer. --# Use the no-CNAME host for compatibilty with Python 2.7 --# which doesn't support SNI. --RUSTUP_URL_BASE = "https://static-rust-lang-org.s3.amazonaws.com/rustup" -+RUSTUP_URL_BASE = "https://static.rust-lang.org/rustup" - - # Pull this to get the lastest stable version number. - RUSTUP_MANIFEST = RUSTUP_URL_BASE + "/release-stable.toml" -@@ -123,6 +118,7 @@ def rustup_latest_version(): - - def http_download_and_hash(url): - import hashlib -+ - import requests - - h = hashlib.sha256() -diff --git a/python/mozboot/mozboot/sccache.py b/python/mozboot/mozboot/sccache.py ---- a/python/mozboot/mozboot/sccache.py -+++ b/python/mozboot/mozboot/sccache.py -@@ -2,8 +2,6 @@ - # 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/. - --from __future__ import absolute_import, print_function, unicode_literals -- - # sccache-dist currently expects clients to provide toolchains when - # distributing from macOS or Windows, so we download linux binaries capable - # of cross-compiling for these cases. -diff --git a/python/mozboot/mozboot/solus.py b/python/mozboot/mozboot/solus.py ---- a/python/mozboot/mozboot/solus.py -+++ b/python/mozboot/mozboot/solus.py -@@ -2,73 +2,19 @@ - # 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/. - --from __future__ import absolute_import, print_function, unicode_literals -- --import sys --import subprocess -- - from mozboot.base import BaseBootstrapper - from mozboot.linux_common import LinuxBootstrapper - --# NOTE: This script is intended to be run with a vanilla Python install. We --# have to rely on the standard library instead of Python 2+3 helpers like --# the six module. --if sys.version_info < (3,): -- input = raw_input # noqa -- - - class SolusBootstrapper(LinuxBootstrapper, BaseBootstrapper): - """Solus experimental bootstrapper.""" - -- SYSTEM_PACKAGES = ["unzip", "zip"] -- SYSTEM_COMPONENTS = ["system.devel"] -- -- BROWSER_PACKAGES = [ -- "alsa-lib", -- "dbus", -- "libgtk-3", -- "libevent", -- "libvpx", -- "libxt", -- "libstartup-notification", -- "gst-plugins-base", -- "gst-plugins-good", -- "pulseaudio", -- "xorg-server-xvfb", -- ] -- -- MOBILE_ANDROID_COMMON_PACKAGES = [ -- # See comment about 32 bit binaries and multilib below. -- "ncurses-32bit", -- "readline-32bit", -- "zlib-32bit", -- ] -- - def __init__(self, version, dist_id, **kwargs): - print("Using an experimental bootstrapper for Solus.") - BaseBootstrapper.__init__(self, **kwargs) - -- def install_system_packages(self): -- self.package_install(*self.SYSTEM_PACKAGES) -- self.component_install(*self.SYSTEM_COMPONENTS) -- -- def install_browser_packages(self, mozconfig_builder, artifact_mode=False): -- self.package_install(*self.BROWSER_PACKAGES) -- -- def install_browser_artifact_mode_packages(self, mozconfig_builder): -- self.install_browser_packages(mozconfig_builder, artifact_mode=True) -- -- def install_mobile_android_packages(self, mozconfig_builder, artifact_mode=False): -- try: -- self.package_install(*self.MOBILE_ANDROID_COMMON_PACKAGES) -- except Exception as e: -- print("Failed to install all packages!") -- raise e -- -- # 2. Android pieces. -- super().install_mobile_android_packages( -- mozconfig_builder, artifact_mode=artifact_mode -- ) -+ def install_packages(self, packages): -+ self.package_install(*packages) - - def _update_package_manager(self): - pass -@@ -84,15 +30,3 @@ class SolusBootstrapper(LinuxBootstrappe - command.extend(packages) - - self.run_as_root(command) -- -- def component_install(self, *components): -- command = ["eopkg", "install", "-c"] -- if self.no_interactive: -- command.append("--yes-all") -- -- command.extend(components) -- -- self.run_as_root(command) -- -- def run(self, command, env=None): -- subprocess.check_call(command, stdin=sys.stdin, env=env) -diff --git a/python/mozboot/mozboot/static_analysis.py b/python/mozboot/mozboot/static_analysis.py ---- a/python/mozboot/mozboot/static_analysis.py -+++ b/python/mozboot/mozboot/static_analysis.py -@@ -2,8 +2,6 @@ - # 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/. - --from __future__ import absolute_import, print_function, unicode_literals -- - WINDOWS_CLANG_TIDY = "win64-clang-tidy" - LINUX_CLANG_TIDY = "linux64-clang-tidy" - MACOS_CLANG_TIDY = "macosx64-clang-tidy" -diff --git a/python/mozboot/mozboot/util.py b/python/mozboot/mozboot/util.py ---- a/python/mozboot/mozboot/util.py -+++ b/python/mozboot/mozboot/util.py -@@ -2,27 +2,14 @@ - # 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/. - --from __future__ import absolute_import, print_function, unicode_literals -- - import hashlib - import os --import sys -- - from pathlib import Path -+from urllib.request import urlopen - - from mach.site import PythonVirtualenv - from mach.util import get_state_dir - --# NOTE: This script is intended to be run with a vanilla Python install. We --# have to rely on the standard library instead of Python 2+3 helpers like --# the six module. --if sys.version_info < (3,): -- from urllib2 import urlopen -- -- input = raw_input # noqa --else: -- from urllib.request import urlopen -- - MINIMUM_RUST_VERSION = "1.63.0" - - -diff --git a/python/mozboot/mozboot/void.py b/python/mozboot/mozboot/void.py ---- a/python/mozboot/mozboot/void.py -+++ b/python/mozboot/mozboot/void.py -@@ -2,31 +2,11 @@ - # 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/. - --from __future__ import absolute_import, print_function, unicode_literals -- --import os --import subprocess --import sys -- - from mozboot.base import BaseBootstrapper - from mozboot.linux_common import LinuxBootstrapper - - - class VoidBootstrapper(LinuxBootstrapper, BaseBootstrapper): -- -- PACKAGES = ["clang", "make", "mercurial", "watchman", "unzip", "zip"] -- -- BROWSER_PACKAGES = [ -- "dbus-devel", -- "dbus-glib-devel", -- "gtk+3-devel", -- "pulseaudio", -- "pulseaudio-devel", -- "libcurl-devel", -- "libxcb-devel", -- "libXt-devel", -- ] -- - def __init__(self, version, dist_id, **kwargs): - BaseBootstrapper.__init__(self, **kwargs) - -@@ -34,18 +14,10 @@ class VoidBootstrapper(LinuxBootstrapper - self.version = version - self.dist_id = dist_id - -- self.packages = self.PACKAGES -- self.browser_packages = self.BROWSER_PACKAGES -- - def run_as_root(self, command): - # VoidLinux doesn't support users sudo'ing most commands by default because of the group - # configuration. -- if os.geteuid() != 0: -- command = ["su", "root", "-c", " ".join(command)] -- -- print("Executing as root:", subprocess.list2cmdline(command)) -- -- subprocess.check_call(command, stdin=sys.stdin) -+ super().run_as_root(command, may_use_sudo=False) - - def xbps_install(self, *packages): - command = ["xbps-install"] -@@ -62,14 +34,8 @@ class VoidBootstrapper(LinuxBootstrapper - - self.run_as_root(command) - -- def install_system_packages(self): -- self.xbps_install(*self.packages) -- -- def install_browser_packages(self, mozconfig_builder, artifact_mode=False): -- self.xbps_install(*self.browser_packages) -- -- def install_browser_artifact_mode_packages(self, mozconfig_builder): -- self.install_browser_packages(mozconfig_builder, artifact_mode=True) -+ def install_packages(self, packages): -+ self.xbps_install(*packages) - - def _update_package_manager(self): - self.xbps_update() -diff --git a/python/mozboot/mozboot/windows.py b/python/mozboot/mozboot/windows.py ---- a/python/mozboot/mozboot/windows.py -+++ b/python/mozboot/mozboot/windows.py -@@ -2,12 +2,10 @@ - # 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/. - --from __future__ import absolute_import, print_function, unicode_literals -- - import ctypes - import os -+import subprocess - import sys --import subprocess - - from mozboot.base import BaseBootstrapper - from mozfile import which -@@ -50,7 +48,6 @@ class WindowsBootstrapper(BaseBootstrapp - "patchutils", - "diffutils", - "tar", -- "zip", - "unzip", - "mingw-w64-x86_64-toolchain", # TODO: Remove when Mercurial is installable from a wheel. - "mingw-w64-i686-toolchain", -@@ -106,25 +103,6 @@ class WindowsBootstrapper(BaseBootstrapp - - self.install_toolchain_static_analysis(static_analysis.WINDOWS_CLANG_TIDY) - -- def ensure_stylo_packages(self): -- # On-device artifact builds are supported; on-device desktop builds are not. -- if is_aarch64_host(): -- raise Exception( -- "You should not be performing desktop builds on an " -- "AArch64 device. If you want to do artifact builds " -- "instead, please choose the appropriate artifact build " -- "option when beginning bootstrap." -- ) -- -- self.install_toolchain_artifact("clang") -- self.install_toolchain_artifact("cbindgen") -- -- def ensure_nasm_packages(self): -- self.install_toolchain_artifact("nasm") -- -- def ensure_node_packages(self): -- self.install_toolchain_artifact("node") -- - def _update_package_manager(self): - self.pacman_update() - -diff --git a/python/mozbuild/mozbuild/action/langpack_manifest.py b/python/mozbuild/mozbuild/action/langpack_manifest.py ---- a/python/mozbuild/mozbuild/action/langpack_manifest.py -+++ b/python/mozbuild/mozbuild/action/langpack_manifest.py -@@ -4,28 +4,30 @@ - - ### - # This script generates a web manifest JSON file based on the xpi-stage --# directory structure. It extracts the data from defines.inc files from --# the locale directory, chrome registry entries and other information --# necessary to produce the complete manifest file for a language pack. -+# directory structure. It extracts data necessary to produce the complete -+# manifest file for a language pack: -+# from the `langpack-manifest.ftl` file in the locale directory; -+# from chrome registry entries; -+# and from other information in the `xpi-stage` directory. - ### -+ - from __future__ import absolute_import, print_function, unicode_literals - - import argparse --import sys --import os --import json -+import datetime - import io --import datetime --import requests --import mozversioncontrol -+import json -+import logging -+import os -+import sys -+ -+import fluent.syntax.ast as FTL - import mozpack.path as mozpath --from mozpack.chrome.manifest import ( -- Manifest, -- ManifestLocale, -- parse_manifest, --) -+import mozversioncontrol -+import requests -+from fluent.syntax.parser import FluentParser - from mozbuild.configure.util import Version --from mozbuild.preprocessor import Preprocessor -+from mozpack.chrome.manifest import Manifest, ManifestLocale, parse_manifest - - - def write_file(path, content): -@@ -112,53 +114,89 @@ def get_timestamp_for_locale(path): - - - ### --# Parses multiple defines files into a single key-value pair object. -+# Parses an FTL file into a key-value pair object. -+# Does not support attributes, terms, variables, functions or selectors; -+# only messages with values consisting of text elements and literals. - # - # Args: --# paths (str) - a comma separated list of paths to defines files -+# path (str) - a path to an FTL file - # - # Returns: --# (dict) - a key-value dict with defines -+# (dict) - A mapping of message keys to formatted string values. -+# Empty if the file at `path` was not found. - # - # Example: --# res = parse_defines('./toolkit/defines.inc,./browser/defines.inc') -+# res = parse_flat_ftl('./browser/langpack-metadata.ftl') - # res == { --# 'MOZ_LANG_TITLE': 'Polski', --# 'MOZ_LANGPACK_CREATOR': 'Aviary.pl', --# 'MOZ_LANGPACK_CONTRIBUTORS': 'Marek Stepien, Marek Wawoczny' -+# 'langpack-title': 'Polski', -+# 'langpack-creator': 'mozilla.org', -+# 'langpack-contributors': 'Joe Solon, Suzy Solon' - # } - ### --def parse_defines(paths): -- pp = Preprocessor() -- for path in paths: -- pp.do_include(path) -+def parse_flat_ftl(path): -+ parser = FluentParser(with_spans=False) -+ try: -+ with open(path, encoding="utf-8") as file: -+ res = parser.parse(file.read()) -+ except FileNotFoundError as err: -+ logging.warning(err) -+ return {} - -- return pp.context -+ result = {} -+ for entry in res.body: -+ if isinstance(entry, FTL.Message) and isinstance(entry.value, FTL.Pattern): -+ flat = "" -+ for elem in entry.value.elements: -+ if isinstance(elem, FTL.TextElement): -+ flat += elem.value -+ elif isinstance(elem.expression, FTL.Literal): -+ flat += elem.expression.parse()["value"] -+ else: -+ name = type(elem.expression).__name__ -+ raise Exception(f"Unsupported {name} for {entry.id.name} in {path}") -+ result[entry.id.name] = flat.strip() -+ return result - - --### --# Converts the list of contributors from the old RDF based list --# of entries, into a comma separated list. -+## -+# Generates the title and description for the langpack. -+# -+# Uses data stored in a JSON file next to this source, -+# which is expected to have the following format: -+# Record -+# -+# If an English name is given and is different from the native one, -+# it will be included parenthetically in the title. -+# -+# NOTE: If you're updating the native locale names, -+# you should also update the data in -+# toolkit/components/mozintl/mozIntl.sys.mjs. - # - # Args: --# str (str) - a string with an RDF list of contributors entries -+# app (str) - Application name -+# locale (str) - Locale identifier - # - # Returns: --# (str) - a comma separated list of contributors -+# (str, str) - Tuple of title and description - # --# Example: --# s = convert_contributors(' --# Marek Wawoczny --# Marek Stepien --# ') --# s == 'Marek Wawoczny, Marek Stepien' - ### --def convert_contributors(str): -- str = str.replace("", "") -- tokens = str.split("") -- tokens = map(lambda t: t.strip(), tokens) -- tokens = filter(lambda t: t != "", tokens) -- return ", ".join(tokens) -+def get_title_and_description(app, locale): -+ dir = os.path.dirname(__file__) -+ with open(os.path.join(dir, "langpack_localeNames.json"), encoding="utf-8") as nf: -+ names = json.load(nf) -+ if locale in names: -+ data = names[locale] -+ native = data["native"] -+ english = data["english"] if "english" in data else native -+ titleName = f"{native} ({english})" if english != native else native -+ descName = f"{native} ({locale})" -+ else: -+ titleName = locale -+ descName = locale -+ -+ title = f"Language Pack: {titleName}" -+ description = f"{app} Language Pack for {descName}" -+ return title, description - - - ### -@@ -166,26 +204,25 @@ def convert_contributors(str): - # and optionally adding the list of contributors, if provided. - # - # Args: --# author (str) - a string with the name of the author --# contributors (str) - RDF based list of contributors from a chrome manifest -+# ftl (dict) - a key-value mapping of locale-specific strings - # - # Returns: - # (str) - a string to be placed in the author field of the manifest.json - # - # Example: --# s = build_author_string( --# 'Aviary.pl', --# ' --# Marek Wawoczny --# Marek Stepien --# ') --# s == 'Aviary.pl (contributors: Marek Wawoczny, Marek Stepien)' -+# s = get_author({ -+# 'langpack-creator': 'mozilla.org', -+# 'langpack-contributors': 'Joe Solon, Suzy Solon' -+# }) -+# s == 'mozilla.org (contributors: Joe Solon, Suzy Solon)' - ### --def build_author_string(author, contributors): -- contrib = convert_contributors(contributors) -- if len(contrib) == 0: -+def get_author(ftl): -+ author = ftl["langpack-creator"] if "langpack-creator" in ftl else "mozilla.org" -+ contrib = ftl["langpack-contributors"] if "langpack-contributors" in ftl else "" -+ if contrib: -+ return f"{author} (contributors: {contrib})" -+ else: - return author -- return "{0} (contributors: {1})".format(author, contrib) - - - ## -@@ -333,7 +370,7 @@ def get_version_maybe_buildid(version): - # resources are for - # app_name (str) - The name of the application the language - # resources are for --# defines (dict) - A dictionary of defines entries -+# ftl (dict) - A dictionary of locale-specific strings - # chrome_entries (dict) - A dictionary of chrome registry entries - # - # Returns: -@@ -346,7 +383,7 @@ def get_version_maybe_buildid(version): - # '57.0.*', - # 'Firefox', - # '/var/vcs/l10n-central', --# {'MOZ_LANG_TITLE': 'Polski'}, -+# {'langpack-title': 'Polski'}, - # chrome_entries - # ) - # manifest == { -@@ -392,18 +429,13 @@ def create_webmanifest( - app_name, - l10n_basedir, - langpack_eid, -- defines, -+ ftl, - chrome_entries, - ): - locales = list(map(lambda loc: loc.strip(), locstr.split(","))) - main_locale = locales[0] -- -- author = build_author_string( -- defines["MOZ_LANGPACK_CREATOR"], -- defines["MOZ_LANGPACK_CONTRIBUTORS"] -- if "MOZ_LANGPACK_CONTRIBUTORS" in defines -- else "", -- ) -+ title, description = get_title_and_description(app_name, main_locale) -+ author = get_author(ftl) - - manifest = { - "langpack_id": main_locale, -@@ -415,8 +447,8 @@ def create_webmanifest( - "strict_max_version": max_app_ver, - } - }, -- "name": "{0} Language Pack".format(defines["MOZ_LANG_TITLE"]), -- "description": "Language pack for {0} for {1}".format(app_name, main_locale), -+ "name": title, -+ "description": description, - "version": get_version_maybe_buildid(version), - "languages": {}, - "sources": {"browser": {"base_path": "browser/"}}, -@@ -466,10 +498,8 @@ def main(args): - "--langpack-eid", help="Language pack id to use for this locale" - ) - parser.add_argument( -- "--defines", -- default=[], -- nargs="+", -- help="List of defines files to load data from", -+ "--metadata", -+ help="FTL file defining langpack metadata", - ) - parser.add_argument("--input", help="Langpack directory.") - -@@ -480,7 +510,7 @@ def main(args): - os.path.join(args.input, "chrome.manifest"), args.input, chrome_entries - ) - -- defines = parse_defines(args.defines) -+ ftl = parse_flat_ftl(args.metadata) - - # Mangle the app version to set min version (remove patch level) - min_app_version = args.app_version -@@ -502,7 +532,7 @@ def main(args): - args.app_name, - args.l10n_basedir, - args.langpack_eid, -- defines, -+ ftl, - chrome_entries, - ) - write_file(os.path.join(args.input, "manifest.json"), res) -diff --git a/python/mozbuild/mozbuild/action/make_dmg.py b/python/mozbuild/mozbuild/action/make_dmg.py ---- a/python/mozbuild/mozbuild/action/make_dmg.py -+++ b/python/mozbuild/mozbuild/action/make_dmg.py -@@ -2,13 +2,16 @@ - # 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/. - --from __future__ import absolute_import, print_function -+import argparse -+import platform -+import sys -+from pathlib import Path - -+from mozbuild.bootstrap import bootstrap_toolchain - from mozbuild.repackaging.application_ini import get_application_ini_value - from mozpack import dmg - --import argparse --import sys -+is_linux = platform.system() == "Linux" - - - def main(args): -@@ -41,7 +44,20 @@ def main(args): - options.inpath, "App", "CodeName", fallback="Name" - ) - -- dmg.create_dmg(options.inpath, options.dmgfile, volume_name, extra_files) -+ # Resolve required tools -+ dmg_tool = bootstrap_toolchain("dmg/dmg") -+ hfs_tool = bootstrap_toolchain("dmg/hfsplus") -+ mkfshfs_tool = bootstrap_toolchain("hfsplus/newfs_hfs") -+ -+ dmg.create_dmg( -+ source_directory=Path(options.inpath), -+ output_dmg=Path(options.dmgfile), -+ volume_name=volume_name, -+ extra_files=extra_files, -+ dmg_tool=dmg_tool, -+ hfs_tool=hfs_tool, -+ mkfshfs_tool=mkfshfs_tool, -+ ) - - return 0 - -diff --git a/python/mozbuild/mozbuild/action/unpack_dmg.py b/python/mozbuild/mozbuild/action/unpack_dmg.py ---- a/python/mozbuild/mozbuild/action/unpack_dmg.py -+++ b/python/mozbuild/mozbuild/action/unpack_dmg.py -@@ -2,12 +2,18 @@ - # 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/. - --from __future__ import absolute_import, print_function -+import argparse -+import sys -+from pathlib import Path - -+from mozbuild.bootstrap import bootstrap_toolchain - from mozpack import dmg - --import argparse --import sys -+ -+def _path_or_none(input: str): -+ if not input: -+ return None -+ return Path(input) - - - def main(args): -@@ -26,12 +32,17 @@ def main(args): - - options = parser.parse_args(args) - -+ dmg_tool = bootstrap_toolchain("dmg/dmg") -+ hfs_tool = bootstrap_toolchain("dmg/hfsplus") -+ - dmg.extract_dmg( -- dmgfile=options.dmgfile, -- output=options.outpath, -- dsstore=options.dsstore, -- background=options.background, -- icon=options.icon, -+ dmgfile=Path(options.dmgfile), -+ output=Path(options.outpath), -+ dmg_tool=Path(dmg_tool), -+ hfs_tool=Path(hfs_tool), -+ dsstore=_path_or_none(options.dsstore), -+ background=_path_or_none(options.background), -+ icon=_path_or_none(options.icon), - ) - return 0 - -diff --git a/python/mozbuild/mozbuild/artifacts.py b/python/mozbuild/mozbuild/artifacts.py ---- a/python/mozbuild/mozbuild/artifacts.py -+++ b/python/mozbuild/mozbuild/artifacts.py -@@ -129,7 +129,6 @@ class ArtifactJob(object): - ("bin/http3server", ("bin", "bin")), - ("bin/plugins/gmp-*/*/*", ("bin/plugins", "bin")), - ("bin/plugins/*", ("bin/plugins", "plugins")), -- ("bin/components/*.xpt", ("bin/components", "bin/components")), - } - - # We can tell our input is a test archive by this suffix, which happens to -@@ -137,6 +136,32 @@ class ArtifactJob(object): - _test_zip_archive_suffix = ".common.tests.zip" - _test_tar_archive_suffix = ".common.tests.tar.gz" - -+ # A map of extra archives to fetch and unpack. An extra archive might -+ # include optional build output to incorporate into the local artifact -+ # build. Test archives and crashreporter symbols could be extra archives -+ # but they require special handling; this mechanism is generic and intended -+ # only for the simplest cases. -+ # -+ # Each suffix key matches a candidate archive (i.e., an artifact produced by -+ # an upstream build). Each value is itself a dictionary that must contain -+ # the following keys: -+ # -+ # - `description`: a purely informational string description. -+ # - `src_prefix`: entry names in the archive with leading `src_prefix` will -+ # have the prefix stripped. -+ # - `dest_prefix`: entry names in the archive will have `dest_prefix` -+ # prepended. -+ # -+ # The entries in the archive, suitably renamed, will be extracted into `dist`. -+ _extra_archives = { -+ ".xpt_artifacts.zip": { -+ "description": "XPT Artifacts", -+ "src_prefix": "", -+ "dest_prefix": "xpt_artifacts", -+ }, -+ } -+ _extra_archive_suffixes = tuple(sorted(_extra_archives.keys())) -+ - def __init__( - self, - log=None, -@@ -190,6 +215,8 @@ class ArtifactJob(object): - self._symbols_archive_suffix - ): - yield name -+ elif name.endswith(ArtifactJob._extra_archive_suffixes): -+ yield name - else: - self.log( - logging.DEBUG, -@@ -222,6 +249,8 @@ class ArtifactJob(object): - self._symbols_archive_suffix - ): - return self.process_symbols_archive(filename, processed_filename) -+ if filename.endswith(ArtifactJob._extra_archive_suffixes): -+ return self.process_extra_archive(filename, processed_filename) - return self.process_package_artifact(filename, processed_filename) - - def process_package_artifact(self, filename, processed_filename): -@@ -373,6 +402,43 @@ class ArtifactJob(object): - ) - writer.add(destpath.encode("utf-8"), entry) - -+ def process_extra_archive(self, filename, processed_filename): -+ for suffix, extra_archive in ArtifactJob._extra_archives.items(): -+ if filename.endswith(suffix): -+ self.log( -+ logging.INFO, -+ "artifact", -+ {"filename": filename, "description": extra_archive["description"]}, -+ '"{filename}" is a recognized extra archive ({description})', -+ ) -+ break -+ else: -+ raise ValueError('"{}" is not a recognized extra archive!'.format(filename)) -+ -+ src_prefix = extra_archive["src_prefix"] -+ dest_prefix = extra_archive["dest_prefix"] -+ -+ with self.get_writer(file=processed_filename, compress_level=5) as writer: -+ for filename, entry in self.iter_artifact_archive(filename): -+ if not filename.startswith(src_prefix): -+ self.log( -+ logging.DEBUG, -+ "artifact", -+ {"filename": filename, "src_prefix": src_prefix}, -+ "Skipping extra archive item {filename} " -+ "that does not start with {src_prefix}", -+ ) -+ continue -+ destpath = mozpath.relpath(filename, src_prefix) -+ destpath = mozpath.join(dest_prefix, destpath) -+ self.log( -+ logging.INFO, -+ "artifact", -+ {"destpath": destpath}, -+ "Adding {destpath} to processed archive", -+ ) -+ writer.add(destpath.encode("utf-8"), entry) -+ - def iter_artifact_archive(self, filename): - if filename.endswith(".zip"): - reader = JarReader(filename) -@@ -1392,7 +1458,15 @@ https://firefox-source-docs.mozilla.org/ - {"processed_filename": processed_filename}, - "Writing processed {processed_filename}", - ) -- self._artifact_job.process_artifact(filename, processed_filename) -+ try: -+ self._artifact_job.process_artifact(filename, processed_filename) -+ except Exception as e: -+ # Delete the partial output of failed processing. -+ try: -+ os.remove(processed_filename) -+ except FileNotFoundError: -+ pass -+ raise e - - self._artifact_cache._persist_limit.register_file(processed_filename) - -diff --git a/python/mozbuild/mozbuild/backend/base.py b/python/mozbuild/mozbuild/backend/base.py ---- a/python/mozbuild/mozbuild/backend/base.py -+++ b/python/mozbuild/mozbuild/backend/base.py -@@ -215,8 +215,8 @@ class BuildBackend(LoggingMixin): - invalidate the XUL cache (which includes some JS) at application - startup-time. The application checks for .purgecaches in the - application directory, which varies according to -- --enable-application. There's a further wrinkle on macOS, where -- the real application directory is part of a Cocoa bundle -+ --enable-application/--enable-project. There's a further wrinkle on -+ macOS, where the real application directory is part of a Cocoa bundle - produced from the regular application directory by the build - system. In this case, we write to both locations, since the - build system recreates the Cocoa bundle from the contents of the -diff --git a/python/mozbuild/mozbuild/backend/recursivemake.py b/python/mozbuild/mozbuild/backend/recursivemake.py ---- a/python/mozbuild/mozbuild/backend/recursivemake.py -+++ b/python/mozbuild/mozbuild/backend/recursivemake.py -@@ -8,26 +8,24 @@ import io - import logging - import os - import re --import six -- - from collections import defaultdict, namedtuple - from itertools import chain - from operator import itemgetter --from six import StringIO - --from mozpack.manifests import InstallManifest - import mozpack.path as mozpath -- -+import six - from mozbuild import frontend - from mozbuild.frontend.context import ( - AbsolutePath, -+ ObjDirPath, - Path, - RenamedSourcePath, - SourcePath, -- ObjDirPath, - ) --from .common import CommonBackend --from .make import MakeBackend -+from mozbuild.shellutil import quote as shell_quote -+from mozpack.manifests import InstallManifest -+from six import StringIO -+ - from ..frontend.data import ( - BaseLibrary, - BaseProgram, -@@ -46,6 +44,7 @@ from ..frontend.data import ( - HostLibrary, - HostProgram, - HostRustProgram, -+ HostSharedLibrary, - HostSimpleProgram, - HostSources, - InstallationTarget, -@@ -58,7 +57,6 @@ from ..frontend.data import ( - ObjdirPreprocessedFiles, - PerSourceFlag, - Program, -- HostSharedLibrary, - RustProgram, - RustTests, - SandboxedWasmLibrary, -@@ -71,9 +69,10 @@ from ..frontend.data import ( - WasmSources, - XPIDLModule, - ) --from ..util import ensureParentDir, FileAvoidWrite, OrderedDefaultDict, pairwise - from ..makeutil import Makefile --from mozbuild.shellutil import quote as shell_quote -+from ..util import FileAvoidWrite, OrderedDefaultDict, ensureParentDir, pairwise -+from .common import CommonBackend -+from .make import MakeBackend - - # To protect against accidentally adding logic to Makefiles that belong in moz.build, - # we check if moz.build-like variables are defined in Makefiles. If they are, we throw -@@ -367,7 +366,6 @@ class RecursiveMakeBackend(MakeBackend): - self._traversal = RecursiveMakeTraversal() - self._compile_graph = OrderedDefaultDict(set) - self._rust_targets = set() -- self._rust_lib_targets = set() - self._gkrust_target = None - self._pre_compile = set() - -@@ -611,7 +609,6 @@ class RecursiveMakeBackend(MakeBackend): - build_target = self._build_target_for_obj(obj) - self._compile_graph[build_target] - self._rust_targets.add(build_target) -- self._rust_lib_targets.add(build_target) - if obj.is_gkrust: - self._gkrust_target = build_target - -@@ -774,7 +771,6 @@ class RecursiveMakeBackend(MakeBackend): - # on other directories in the tree, so putting them first here will - # start them earlier in the build. - rust_roots = sorted(r for r in roots if r in self._rust_targets) -- rust_libs = sorted(r for r in roots if r in self._rust_lib_targets) - if category == "compile" and rust_roots: - rust_rule = root_deps_mk.create_rule(["recurse_rust"]) - rust_rule.add_dependencies(rust_roots) -@@ -786,7 +782,7 @@ class RecursiveMakeBackend(MakeBackend): - # builds. - for prior_target, target in pairwise( - sorted( -- [t for t in rust_libs], key=lambda t: t != self._gkrust_target -+ [t for t in rust_roots], key=lambda t: t != self._gkrust_target - ) - ): - r = root_deps_mk.create_rule([target]) -@@ -1201,8 +1197,9 @@ class RecursiveMakeBackend(MakeBackend): - self, obj, backend_file, target_variable, target_cargo_variable - ): - backend_file.write_once("CARGO_FILE := %s\n" % obj.cargo_file) -- backend_file.write_once("CARGO_TARGET_DIR := .\n") -- backend_file.write("%s += %s\n" % (target_variable, obj.location)) -+ target_dir = mozpath.normpath(backend_file.environment.topobjdir) -+ backend_file.write_once("CARGO_TARGET_DIR := %s\n" % target_dir) -+ backend_file.write("%s += $(DEPTH)/%s\n" % (target_variable, obj.location)) - backend_file.write("%s += %s\n" % (target_cargo_variable, obj.name)) - - def _process_rust_program(self, obj, backend_file): -diff --git a/python/mozbuild/mozbuild/bootstrap.py b/python/mozbuild/mozbuild/bootstrap.py ---- a/python/mozbuild/mozbuild/bootstrap.py -+++ b/python/mozbuild/mozbuild/bootstrap.py -@@ -2,16 +2,16 @@ - # 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/. - --from mozbuild.configure import ConfigureSandbox --from pathlib import Path - import functools - import io - import logging - import os -+from pathlib import Path -+ -+from mozbuild.configure import ConfigureSandbox - - --@functools.lru_cache(maxsize=None) --def _bootstrap_sandbox(): -+def _raw_sandbox(extra_args=[]): - # Here, we don't want an existing mozconfig to interfere with what we - # do, neither do we want the default for --enable-bootstrap (which is not - # always on) to prevent this from doing something. -@@ -22,9 +22,17 @@ def _bootstrap_sandbox(): - logger.propagate = False - sandbox = ConfigureSandbox( - {}, -- argv=["configure", "--enable-bootstrap", f"MOZCONFIG={os.devnull}"], -+ argv=["configure"] -+ + extra_args -+ + ["--enable-bootstrap", f"MOZCONFIG={os.devnull}"], - logger=logger, - ) -+ return sandbox -+ -+ -+@functools.lru_cache(maxsize=None) -+def _bootstrap_sandbox(): -+ sandbox = _raw_sandbox() - moz_configure = ( - Path(__file__).parent.parent.parent.parent / "build" / "moz.configure" - ) -@@ -42,3 +50,12 @@ def bootstrap_toolchain(toolchain_job): - # Returns the path to the toolchain. - sandbox = _bootstrap_sandbox() - return sandbox._value_for(sandbox["bootstrap_path"](toolchain_job)) -+ -+ -+def bootstrap_all_toolchains_for(configure_args=[]): -+ sandbox = _raw_sandbox(configure_args) -+ moz_configure = Path(__file__).parent.parent.parent.parent / "moz.configure" -+ sandbox.include_file(str(moz_configure)) -+ for depend in sandbox._depends.values(): -+ if depend.name == "bootstrap_path": -+ depend.result() -diff --git a/python/mozbuild/mozbuild/controller/building.py b/python/mozbuild/mozbuild/controller/building.py ---- a/python/mozbuild/mozbuild/controller/building.py -+++ b/python/mozbuild/mozbuild/controller/building.py -@@ -765,11 +765,11 @@ class StaticAnalysisFooter(Footer): - processed = monitor.num_files_processed - percent = "(%.2f%%)" % (processed * 100.0 / total) - parts = [ -- ("dim", "Processing"), -+ ("bright_black", "Processing"), - ("yellow", str(processed)), -- ("dim", "of"), -+ ("bright_black", "of"), - ("yellow", str(total)), -- ("dim", "files"), -+ ("bright_black", "files"), - ("green", percent), - ] - if monitor.current_file: -diff --git a/python/mozbuild/mozbuild/frontend/gyp_reader.py b/python/mozbuild/mozbuild/frontend/gyp_reader.py ---- a/python/mozbuild/mozbuild/frontend/gyp_reader.py -+++ b/python/mozbuild/mozbuild/frontend/gyp_reader.py -@@ -4,18 +4,20 @@ - - from __future__ import absolute_import, print_function, unicode_literals - -+import os -+import sys -+import time -+ - import gyp - import gyp.msvs_emulation -+import mozpack.path as mozpath - import six --import sys --import os --import time -+from mozbuild import shellutil -+from mozbuild.util import expand_variables -+from mozpack.files import FileFinder - --import mozpack.path as mozpath --from mozpack.files import FileFinder -+from .context import VARIABLES, ObjDirPath, SourcePath, TemplateContext - from .sandbox import alphabetical_sorted --from .context import ObjDirPath, SourcePath, TemplateContext, VARIABLES --from mozbuild.util import expand_variables - - # Define this module as gyp.generator.mozbuild so that gyp can use it - # as a generator under the name "mozbuild". -@@ -443,6 +445,12 @@ class GypProcessor(object): - "build_files": [path], - "root_targets": None, - } -+ # The NSS gyp configuration uses CC and CFLAGS to determine the -+ # floating-point ABI on arm. -+ os.environ.update( -+ CC=config.substs["CC"], -+ CFLAGS=shellutil.quote(*config.substs["CC_BASE_FLAGS"]), -+ ) - - if gyp_dir_attrs.no_chromium: - includes = [] -diff --git a/python/mozbuild/mozbuild/generated_sources.py b/python/mozbuild/mozbuild/generated_sources.py ---- a/python/mozbuild/mozbuild/generated_sources.py -+++ b/python/mozbuild/mozbuild/generated_sources.py -@@ -8,8 +8,10 @@ import hashlib - import json - import os - -+import mozpack.path as mozpath - from mozpack.files import FileFinder --import mozpack.path as mozpath -+ -+GENERATED_SOURCE_EXTS = (".rs", ".c", ".h", ".cc", ".cpp") - - - def sha512_digest(data): -@@ -56,7 +58,7 @@ def get_generated_sources(): - base = mozpath.join(buildconfig.substs["RUST_TARGET"], rust_build_kind, "build") - finder = FileFinder(mozpath.join(buildconfig.topobjdir, base)) - for p, f in finder: -- if p.endswith((".rs", ".c", ".h", ".cc", ".cpp")): -+ if p.endswith(GENERATED_SOURCE_EXTS): - yield mozpath.join(base, p), f - - -diff --git a/python/mozbuild/mozbuild/mach_commands.py b/python/mozbuild/mozbuild/mach_commands.py ---- a/python/mozbuild/mozbuild/mach_commands.py -+++ b/python/mozbuild/mozbuild/mach_commands.py -@@ -5,6 +5,7 @@ - from __future__ import absolute_import, print_function, unicode_literals - - import argparse -+import errno - import itertools - import json - import logging -@@ -17,26 +18,20 @@ import subprocess - import sys - import tempfile - import time --import errno -+from pathlib import Path - - import mozbuild.settings # noqa need @SettingsProvider hook to execute - import mozpack.path as mozpath -- --from pathlib import Path - from mach.decorators import ( -+ Command, - CommandArgument, - CommandArgumentGroup, -- Command, - SettingsProvider, - SubCommand, - ) -- --from mozbuild.base import ( -- BinaryNotFoundException, -- BuildEnvironmentNotFoundException, -- MachCommandConditions as conditions, -- MozbuildObject, --) -+from mozbuild.base import BinaryNotFoundException, BuildEnvironmentNotFoundException -+from mozbuild.base import MachCommandConditions as conditions -+from mozbuild.base import MozbuildObject - from mozbuild.util import MOZBUILD_METRICS_PATH - - here = os.path.abspath(os.path.dirname(__file__)) -@@ -217,6 +212,114 @@ def check( - - @SubCommand( - "cargo", -+ "udeps", -+ description="Run `cargo udeps` on a given crate. Defaults to gkrust.", -+ metrics_path=MOZBUILD_METRICS_PATH, -+) -+@CommandArgument( -+ "--all-crates", -+ action="store_true", -+ help="Check all of the crates in the tree.", -+) -+@CommandArgument("crates", default=None, nargs="*", help="The crate name(s) to check.") -+@CommandArgument( -+ "--jobs", -+ "-j", -+ default="0", -+ nargs="?", -+ metavar="jobs", -+ type=int, -+ help="Run the tests in parallel using multiple processes.", -+) -+@CommandArgument("-v", "--verbose", action="store_true", help="Verbose output.") -+@CommandArgument( -+ "--message-format-json", -+ action="store_true", -+ help="Emit error messages as JSON.", -+) -+@CommandArgument( -+ "--expect-unused", -+ action="store_true", -+ help="Do not return an error exit code if udeps detects unused dependencies.", -+) -+def udeps( -+ command_context, -+ all_crates=None, -+ crates=None, -+ jobs=0, -+ verbose=False, -+ message_format_json=False, -+ expect_unused=False, -+): -+ from mozbuild.controller.building import BuildDriver -+ -+ command_context.log_manager.enable_all_structured_loggers() -+ -+ try: -+ command_context.config_environment -+ except BuildEnvironmentNotFoundException: -+ build = command_context._spawn(BuildDriver) -+ ret = build.build( -+ command_context.metrics, -+ what=["pre-export", "export"], -+ jobs=jobs, -+ verbose=verbose, -+ mach_context=command_context._mach_context, -+ ) -+ if ret != 0: -+ return ret -+ # XXX duplication with `mach vendor rust` -+ crates_and_roots = { -+ "gkrust": "toolkit/library/rust", -+ "gkrust-gtest": "toolkit/library/gtest/rust", -+ "geckodriver": "testing/geckodriver", -+ } -+ -+ if all_crates: -+ crates = crates_and_roots.keys() -+ elif not crates: -+ crates = ["gkrust"] -+ -+ for crate in crates: -+ root = crates_and_roots.get(crate, None) -+ if not root: -+ print( -+ "Cannot locate crate %s. Please check your spelling or " -+ "add the crate information to the list." % crate -+ ) -+ return 1 -+ -+ udeps_targets = [ -+ "force-cargo-library-udeps", -+ "force-cargo-host-library-udeps", -+ "force-cargo-program-udeps", -+ "force-cargo-host-program-udeps", -+ ] -+ -+ append_env = {} -+ if message_format_json: -+ append_env["USE_CARGO_JSON_MESSAGE_FORMAT"] = "1" -+ if expect_unused: -+ append_env["CARGO_UDEPS_EXPECT_ERR"] = "1" -+ -+ ret = command_context._run_make( -+ srcdir=False, -+ directory=root, -+ ensure_exit_code=0, -+ silent=not verbose, -+ print_directory=False, -+ target=udeps_targets, -+ num_jobs=jobs, -+ append_env=append_env, -+ ) -+ if ret != 0: -+ return ret -+ -+ return 0 -+ -+ -+@SubCommand( -+ "cargo", - "vet", - description="Run `cargo vet`.", - ) -@@ -278,6 +381,209 @@ def cargo_vet(command_context, arguments - return res if stdout else res.returncode - - -+@SubCommand( -+ "cargo", -+ "clippy", -+ description="Run `cargo clippy` on a given crate. Defaults to gkrust.", -+ metrics_path=MOZBUILD_METRICS_PATH, -+) -+@CommandArgument( -+ "--all-crates", -+ default=None, -+ action="store_true", -+ help="Check all of the crates in the tree.", -+) -+@CommandArgument("crates", default=None, nargs="*", help="The crate name(s) to check.") -+@CommandArgument( -+ "--jobs", -+ "-j", -+ default="0", -+ nargs="?", -+ metavar="jobs", -+ type=int, -+ help="Run the tests in parallel using multiple processes.", -+) -+@CommandArgument("-v", "--verbose", action="store_true", help="Verbose output.") -+@CommandArgument( -+ "--message-format-json", -+ action="store_true", -+ help="Emit error messages as JSON.", -+) -+def clippy( -+ command_context, -+ all_crates=None, -+ crates=None, -+ jobs=0, -+ verbose=False, -+ message_format_json=False, -+): -+ from mozbuild.controller.building import BuildDriver -+ -+ command_context.log_manager.enable_all_structured_loggers() -+ -+ try: -+ command_context.config_environment -+ except BuildEnvironmentNotFoundException: -+ build = command_context._spawn(BuildDriver) -+ ret = build.build( -+ command_context.metrics, -+ what=["pre-export", "export"], -+ jobs=jobs, -+ verbose=verbose, -+ mach_context=command_context._mach_context, -+ ) -+ if ret != 0: -+ return ret -+ # XXX duplication with `mach vendor rust` -+ crates_and_roots = { -+ "gkrust": "toolkit/library/rust", -+ "gkrust-gtest": "toolkit/library/gtest/rust", -+ "geckodriver": "testing/geckodriver", -+ } -+ -+ if all_crates: -+ crates = crates_and_roots.keys() -+ elif crates is None or crates == []: -+ crates = ["gkrust"] -+ -+ final_ret = 0 -+ -+ for crate in crates: -+ root = crates_and_roots.get(crate, None) -+ if not root: -+ print( -+ "Cannot locate crate %s. Please check your spelling or " -+ "add the crate information to the list." % crate -+ ) -+ return 1 -+ -+ check_targets = [ -+ "force-cargo-library-clippy", -+ "force-cargo-host-library-clippy", -+ "force-cargo-program-clippy", -+ "force-cargo-host-program-clippy", -+ ] -+ -+ append_env = {} -+ if message_format_json: -+ append_env["USE_CARGO_JSON_MESSAGE_FORMAT"] = "1" -+ -+ ret = 2 -+ -+ try: -+ ret = command_context._run_make( -+ srcdir=False, -+ directory=root, -+ ensure_exit_code=0, -+ silent=not verbose, -+ print_directory=False, -+ target=check_targets, -+ num_jobs=jobs, -+ append_env=append_env, -+ ) -+ except Exception as e: -+ print("%s" % e) -+ if ret != 0: -+ final_ret = ret -+ -+ return final_ret -+ -+ -+@SubCommand( -+ "cargo", -+ "audit", -+ description="Run `cargo audit` on a given crate. Defaults to gkrust.", -+) -+@CommandArgument( -+ "--all-crates", -+ action="store_true", -+ help="Run `cargo audit` on all the crates in the tree.", -+) -+@CommandArgument( -+ "crates", -+ default=None, -+ nargs="*", -+ help="The crate name(s) to run `cargo audit` on.", -+) -+@CommandArgument( -+ "--jobs", -+ "-j", -+ default="0", -+ nargs="?", -+ metavar="jobs", -+ type=int, -+ help="Run `audit` in parallel using multiple processes.", -+) -+@CommandArgument("-v", "--verbose", action="store_true", help="Verbose output.") -+@CommandArgument( -+ "--message-format-json", -+ action="store_true", -+ help="Emit error messages as JSON.", -+) -+def audit( -+ command_context, -+ all_crates=None, -+ crates=None, -+ jobs=0, -+ verbose=False, -+ message_format_json=False, -+): -+ # XXX duplication with `mach vendor rust` -+ crates_and_roots = { -+ "gkrust": "toolkit/library/rust", -+ "gkrust-gtest": "toolkit/library/gtest/rust", -+ "geckodriver": "testing/geckodriver", -+ } -+ -+ if all_crates: -+ crates = crates_and_roots.keys() -+ elif not crates: -+ crates = ["gkrust"] -+ -+ final_ret = 0 -+ -+ for crate in crates: -+ root = crates_and_roots.get(crate, None) -+ if not root: -+ print( -+ "Cannot locate crate %s. Please check your spelling or " -+ "add the crate information to the list." % crate -+ ) -+ return 1 -+ -+ check_targets = [ -+ "force-cargo-library-audit", -+ "force-cargo-host-library-audit", -+ "force-cargo-program-audit", -+ "force-cargo-host-program-audit", -+ ] -+ -+ append_env = {} -+ if message_format_json: -+ append_env["USE_CARGO_JSON_MESSAGE_FORMAT"] = "1" -+ -+ ret = 2 -+ -+ try: -+ ret = command_context._run_make( -+ srcdir=False, -+ directory=root, -+ ensure_exit_code=0, -+ silent=not verbose, -+ print_directory=False, -+ target=check_targets -+ + ["cargo_build_flags=-f %s/Cargo.lock" % command_context.topsrcdir], -+ num_jobs=jobs, -+ append_env=append_env, -+ ) -+ except Exception as e: -+ print("%s" % e) -+ if ret != 0: -+ final_ret = ret -+ -+ return final_ret -+ -+ - @Command( - "doctor", - category="devenv", -@@ -891,8 +1197,9 @@ def gtest( - pass_thru=True, - ) - -+ import functools -+ - from mozprocess import ProcessHandlerMixin -- import functools - - def handle_line(job_id, line): - # Prepend the jobId -@@ -946,7 +1253,7 @@ def android_gtest( - setup_logging("mach-gtest", {}, {default_format: sys.stdout}, format_args) - - # ensure that a device is available and test app is installed -- from mozrunner.devices.android_device import verify_android_device, get_adb_path -+ from mozrunner.devices.android_device import get_adb_path, verify_android_device - - verify_android_device( - command_context, install=install, app=package, device_serial=device_serial -@@ -1046,8 +1353,8 @@ def install(command_context, **kwargs): - """Install a package.""" - if conditions.is_android(command_context): - from mozrunner.devices.android_device import ( -+ InstallIntent, - verify_android_device, -- InstallIntent, - ) - - ret = ( -@@ -1386,9 +1693,9 @@ def _run_android( - use_existing_process=False, - ): - from mozrunner.devices.android_device import ( -- verify_android_device, -+ InstallIntent, - _get_device, -- InstallIntent, -+ verify_android_device, - ) - from six.moves import shlex_quote - -@@ -1782,7 +2089,7 @@ def _run_desktop( - stacks, - show_dump_stats, - ): -- from mozprofile import Profile, Preferences -+ from mozprofile import Preferences, Profile - - try: - if packaged: -@@ -2106,7 +2413,34 @@ def repackage(command_context): - scriptworkers in order to bundle things up into shippable formats, such as a - .dmg on OSX or an installer exe on Windows. - """ -- print("Usage: ./mach repackage [dmg|installer|mar] [args...]") -+ print("Usage: ./mach repackage [dmg|pkg|installer|mar] [args...]") -+ -+ -+@SubCommand( -+ "repackage", "deb", description="Repackage a tar file into a .deb for Linux" -+) -+@CommandArgument("--input", "-i", type=str, required=True, help="Input filename") -+@CommandArgument("--output", "-o", type=str, required=True, help="Output filename") -+@CommandArgument("--arch", type=str, required=True, help="One of ['x86', 'x86_64']") -+@CommandArgument( -+ "--templates", -+ type=str, -+ required=True, -+ help="Location of the templates used to generate the debian/ directory files", -+) -+def repackage_deb(command_context, input, output, arch, templates): -+ if not os.path.exists(input): -+ print("Input file does not exist: %s" % input) -+ return 1 -+ -+ template_dir = os.path.join( -+ command_context.topsrcdir, -+ templates, -+ ) -+ -+ from mozbuild.repackaging.deb import repackage_deb -+ -+ repackage_deb(input, output, template_dir, arch) - - - @SubCommand("repackage", "dmg", description="Repackage a tar file into a .dmg for OSX") -@@ -2117,18 +2451,24 @@ def repackage_dmg(command_context, input - print("Input file does not exist: %s" % input) - return 1 - -- if not os.path.exists(os.path.join(command_context.topobjdir, "config.status")): -- print( -- "config.status not found. Please run |mach configure| " -- "prior to |mach repackage|." -- ) -- return 1 -- - from mozbuild.repackaging.dmg import repackage_dmg - - repackage_dmg(input, output) - - -+@SubCommand("repackage", "pkg", description="Repackage a tar file into a .pkg for OSX") -+@CommandArgument("--input", "-i", type=str, required=True, help="Input filename") -+@CommandArgument("--output", "-o", type=str, required=True, help="Output filename") -+def repackage_pkg(command_context, input, output): -+ if not os.path.exists(input): -+ print("Input file does not exist: %s" % input) -+ return 1 -+ -+ from mozbuild.repackaging.pkg import repackage_pkg -+ -+ repackage_pkg(input, output) -+ -+ - @SubCommand( - "repackage", "installer", description="Repackage into a Windows installer exe" - ) -diff --git a/python/mozbuild/mozbuild/repackaging/dmg.py b/python/mozbuild/mozbuild/repackaging/dmg.py ---- a/python/mozbuild/mozbuild/repackaging/dmg.py -+++ b/python/mozbuild/mozbuild/repackaging/dmg.py -@@ -2,16 +2,13 @@ - # 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/. - --from __future__ import absolute_import, print_function -+import tarfile -+from pathlib import Path - --import errno --import os --import tempfile --import tarfile --import shutil --import mozpack.path as mozpath -+import mozfile -+from mozbuild.bootstrap import bootstrap_toolchain -+from mozbuild.repackaging.application_ini import get_application_ini_value - from mozpack.dmg import create_dmg --from mozbuild.repackaging.application_ini import get_application_ini_value - - - def repackage_dmg(infile, output): -@@ -19,27 +16,41 @@ def repackage_dmg(infile, output): - if not tarfile.is_tarfile(infile): - raise Exception("Input file %s is not a valid tarfile." % infile) - -- tmpdir = tempfile.mkdtemp() -- try: -+ # Resolve required tools -+ dmg_tool = bootstrap_toolchain("dmg/dmg") -+ if not dmg_tool: -+ raise Exception("DMG tool not found") -+ hfs_tool = bootstrap_toolchain("dmg/hfsplus") -+ if not hfs_tool: -+ raise Exception("HFS tool not found") -+ mkfshfs_tool = bootstrap_toolchain("hfsplus/newfs_hfs") -+ if not mkfshfs_tool: -+ raise Exception("MKFSHFS tool not found") -+ -+ with mozfile.TemporaryDirectory() as tmp: -+ tmpdir = Path(tmp) - with tarfile.open(infile) as tar: - tar.extractall(path=tmpdir) - - # Remove the /Applications symlink. If we don't, an rsync command in - # create_dmg() will break, and create_dmg() re-creates the symlink anyway. -- try: -- os.remove(mozpath.join(tmpdir, " ")) -- except OSError as e: -- if e.errno != errno.ENOENT: -- raise -+ symlink = tmpdir / " " -+ if symlink.is_file(): -+ symlink.unlink() - - volume_name = get_application_ini_value( -- tmpdir, "App", "CodeName", fallback="Name" -+ str(tmpdir), "App", "CodeName", fallback="Name" - ) - - # The extra_files argument is empty [] because they are already a part - # of the original dmg produced by the build, and they remain in the - # tarball generated by the signing task. -- create_dmg(tmpdir, output, volume_name, []) -- -- finally: -- shutil.rmtree(tmpdir) -+ create_dmg( -+ source_directory=tmpdir, -+ output_dmg=Path(output), -+ volume_name=volume_name, -+ extra_files=[], -+ dmg_tool=Path(dmg_tool), -+ hfs_tool=Path(hfs_tool), -+ mkfshfs_tool=Path(mkfshfs_tool), -+ ) -diff --git a/python/mozbuild/mozbuild/test/action/test_langpack_manifest.py b/python/mozbuild/mozbuild/test/action/test_langpack_manifest.py ---- a/python/mozbuild/mozbuild/test/action/test_langpack_manifest.py -+++ b/python/mozbuild/mozbuild/test/action/test_langpack_manifest.py -@@ -5,14 +5,13 @@ - - from __future__ import absolute_import, print_function - --import unittest - import json - import os -- --import mozunit -+import tempfile -+import unittest - - import mozbuild.action.langpack_manifest as langpack_manifest --from mozbuild.preprocessor import Context -+import mozunit - - - class TestGenerateManifest(unittest.TestCase): -@@ -20,16 +19,30 @@ class TestGenerateManifest(unittest.Test - Unit tests for langpack_manifest.py. - """ - -+ def test_parse_flat_ftl(self): -+ src = """ -+langpack-creator = bar {"bar"} -+langpack-contributors = { "" } -+""" -+ tmp = tempfile.NamedTemporaryFile(mode="wt", suffix=".ftl", delete=False) -+ try: -+ tmp.write(src) -+ tmp.close() -+ ftl = langpack_manifest.parse_flat_ftl(tmp.name) -+ self.assertEqual(ftl["langpack-creator"], "bar bar") -+ self.assertEqual(ftl["langpack-contributors"], "") -+ finally: -+ os.remove(tmp.name) -+ -+ def test_parse_flat_ftl_missing(self): -+ ftl = langpack_manifest.parse_flat_ftl("./does-not-exist.ftl") -+ self.assertEqual(len(ftl), 0) -+ - def test_manifest(self): -- ctx = Context() -- ctx["MOZ_LANG_TITLE"] = "Finnish" -- ctx["MOZ_LANGPACK_CREATOR"] = "Suomennosprojekti" -- ctx[ -- "MOZ_LANGPACK_CONTRIBUTORS" -- ] = """ -- Joe Smith -- Mary White -- """ -+ ctx = { -+ "langpack-creator": "Suomennosprojekti", -+ "langpack-contributors": "Joe Smith, Mary White", -+ } - os.environ["MOZ_BUILD_DATE"] = "20210928100000" - manifest = langpack_manifest.create_webmanifest( - "fi", -@@ -44,16 +57,17 @@ class TestGenerateManifest(unittest.Test - ) - - data = json.loads(manifest) -- self.assertEqual(data["name"], "Finnish Language Pack") -+ self.assertEqual(data["name"], "Language Pack: Suomi (Finnish)") - self.assertEqual( - data["author"], "Suomennosprojekti (contributors: Joe Smith, Mary White)" - ) - self.assertEqual(data["version"], "57.0.1buildid20210928.100000") - - def test_manifest_without_contributors(self): -- ctx = Context() -- ctx["MOZ_LANG_TITLE"] = "Finnish" -- ctx["MOZ_LANGPACK_CREATOR"] = "Suomennosprojekti" -+ ctx = { -+ "langpack-creator": "Suomennosprojekti", -+ "langpack-contributors": "", -+ } - manifest = langpack_manifest.create_webmanifest( - "fi", - "57.0.1", -@@ -67,7 +81,7 @@ class TestGenerateManifest(unittest.Test - ) - - data = json.loads(manifest) -- self.assertEqual(data["name"], "Finnish Language Pack") -+ self.assertEqual(data["name"], "Language Pack: Suomi (Finnish)") - self.assertEqual(data["author"], "Suomennosprojekti") - - -diff --git a/python/mozbuild/mozbuild/test/backend/test_recursivemake.py b/python/mozbuild/mozbuild/test/backend/test_recursivemake.py ---- a/python/mozbuild/mozbuild/test/backend/test_recursivemake.py -+++ b/python/mozbuild/mozbuild/test/backend/test_recursivemake.py -@@ -6,21 +6,18 @@ from __future__ import absolute_import, - - import io - import os --import six.moves.cPickle as pickle --import six - import unittest - --from mozpack.manifests import InstallManifest --from mozunit import main -- -+import mozpack.path as mozpath -+import six -+import six.moves.cPickle as pickle - from mozbuild.backend.recursivemake import RecursiveMakeBackend, RecursiveMakeTraversal - from mozbuild.backend.test_manifest import TestManifestBackend - from mozbuild.frontend.emitter import TreeMetadataEmitter - from mozbuild.frontend.reader import BuildReader -- - from mozbuild.test.backend.common import BackendTester -- --import mozpack.path as mozpath -+from mozpack.manifests import InstallManifest -+from mozunit import main - - - class TestRecursiveMakeTraversal(unittest.TestCase): -@@ -1011,10 +1008,10 @@ class TestRecursiveMakeBackend(BackendTe - - expected = [ - "CARGO_FILE := %s/code/Cargo.toml" % env.topsrcdir, -- "CARGO_TARGET_DIR := .", -- "RUST_PROGRAMS += i686-pc-windows-msvc/release/target.exe", -+ "CARGO_TARGET_DIR := %s" % env.topobjdir, -+ "RUST_PROGRAMS += $(DEPTH)/i686-pc-windows-msvc/release/target.exe", - "RUST_CARGO_PROGRAMS += target", -- "HOST_RUST_PROGRAMS += i686-pc-windows-msvc/release/host.exe", -+ "HOST_RUST_PROGRAMS += $(DEPTH)/i686-pc-windows-msvc/release/host.exe", - "HOST_RUST_CARGO_PROGRAMS += host", - ] - -diff --git a/python/mozbuild/mozbuild/vendor/moz_yaml.py b/python/mozbuild/mozbuild/vendor/moz_yaml.py ---- a/python/mozbuild/mozbuild/vendor/moz_yaml.py -+++ b/python/mozbuild/mozbuild/vendor/moz_yaml.py -@@ -104,6 +104,10 @@ origin: - # optional - license-file: COPYING - -+ # If there are any mozilla-specific notes you want to put -+ # about a library, they can be put here. -+ notes: Notes about the library -+ - # Configuration for the automated vendoring system. - # optional - vendoring: -@@ -379,6 +383,7 @@ def _schema_1(): - "origin": { - Required("name"): All(str, Length(min=1)), - Required("description"): All(str, Length(min=1)), -+ "notes": All(str, Length(min=1)), - Required("url"): FqdnUrl(), - Required("license"): Msg(License(), msg="Unsupported License"), - "license-file": All(str, Length(min=1)), -diff --git a/python/mozbuild/mozbuild/vendor/vendor_manifest.py b/python/mozbuild/mozbuild/vendor/vendor_manifest.py ---- a/python/mozbuild/mozbuild/vendor/vendor_manifest.py -+++ b/python/mozbuild/mozbuild/vendor/vendor_manifest.py -@@ -25,7 +25,7 @@ from mozbuild.vendor.rewrite_mozbuild im - MozBuildRewriteException, - ) - --DEFAULT_EXCLUDE_FILES = [".git*"] -+DEFAULT_EXCLUDE_FILES = [".git*", ".git*/**"] - DEFAULT_KEEP_FILES = ["**/moz.build", "**/moz.yaml"] - DEFAULT_INCLUDE_FILES = [] - -diff --git a/python/mozbuild/mozbuild/vendor/vendor_rust.py b/python/mozbuild/mozbuild/vendor/vendor_rust.py ---- a/python/mozbuild/mozbuild/vendor/vendor_rust.py -+++ b/python/mozbuild/mozbuild/vendor/vendor_rust.py -@@ -196,6 +196,7 @@ class VendorRust(MozbuildObject): - f - for f in self.repository.get_changed_files("M") - if os.path.basename(f) not in ("Cargo.toml", "Cargo.lock") -+ and not f.startswith("supply-chain/") - ] - if modified: - self.log( -diff --git a/python/mozbuild/mozpack/dmg.py b/python/mozbuild/mozpack/dmg.py ---- a/python/mozbuild/mozpack/dmg.py -+++ b/python/mozbuild/mozpack/dmg.py -@@ -2,28 +2,18 @@ - # 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/. - --from __future__ import absolute_import, print_function, unicode_literals -- --import buildconfig --import errno --import mozfile - import os - import platform - import shutil - import subprocess -+from pathlib import Path -+from typing import List - -+import mozfile - from mozbuild.util import ensureParentDir - - is_linux = platform.system() == "Linux" -- -- --def mkdir(dir): -- if not os.path.isdir(dir): -- try: -- os.makedirs(dir) -- except OSError as e: -- if e.errno != errno.EEXIST: -- raise -+is_osx = platform.system() == "Darwin" - - - def chmod(dir): -@@ -31,48 +21,50 @@ def chmod(dir): - subprocess.check_call(["chmod", "-R", "a+rX,a-st,u+w,go-w", dir]) - - --def rsync(source, dest): -+def rsync(source: Path, dest: Path): - "rsync the contents of directory source into directory dest" - # Ensure a trailing slash on directories so rsync copies the *contents* of source. -- if not source.endswith("/") and os.path.isdir(source): -- source += "/" -- subprocess.check_call(["rsync", "-a", "--copy-unsafe-links", source, dest]) -+ raw_source = str(source) -+ if source.is_dir(): -+ raw_source = str(source) + "/" -+ subprocess.check_call(["rsync", "-a", "--copy-unsafe-links", raw_source, dest]) - - --def set_folder_icon(dir, tmpdir): -+def set_folder_icon(dir: Path, tmpdir: Path, hfs_tool: Path = None): - "Set HFS attributes of dir to use a custom icon" -- if not is_linux: -+ if is_linux: -+ hfs = tmpdir / "staged.hfs" -+ subprocess.check_call([hfs_tool, hfs, "attr", "/", "C"]) -+ elif is_osx: - subprocess.check_call(["SetFile", "-a", "C", dir]) -- else: -- hfs = os.path.join(tmpdir, "staged.hfs") -- subprocess.check_call([buildconfig.substs["HFS_TOOL"], hfs, "attr", "/", "C"]) - - --def generate_hfs_file(stagedir, tmpdir, volume_name): -+def generate_hfs_file( -+ stagedir: Path, tmpdir: Path, volume_name: str, mkfshfs_tool: Path -+): - """ - When cross compiling, we zero fill an hfs file, that we will turn into - a DMG. To do so we test the size of the staged dir, and add some slight - padding to that. - """ -- if is_linux: -- hfs = os.path.join(tmpdir, "staged.hfs") -- output = subprocess.check_output(["du", "-s", stagedir]) -- size = int(output.split()[0]) / 1000 # Get in MB -- size = int(size * 1.02) # Bump the used size slightly larger. -- # Setup a proper file sized out with zero's -- subprocess.check_call( -- [ -- "dd", -- "if=/dev/zero", -- "of={}".format(hfs), -- "bs=1M", -- "count={}".format(size), -- ] -- ) -- subprocess.check_call([buildconfig.substs["MKFSHFS"], "-v", volume_name, hfs]) -+ hfs = tmpdir / "staged.hfs" -+ output = subprocess.check_output(["du", "-s", stagedir]) -+ size = int(output.split()[0]) / 1000 # Get in MB -+ size = int(size * 1.02) # Bump the used size slightly larger. -+ # Setup a proper file sized out with zero's -+ subprocess.check_call( -+ [ -+ "dd", -+ "if=/dev/zero", -+ "of={}".format(hfs), -+ "bs=1M", -+ "count={}".format(size), -+ ] -+ ) -+ subprocess.check_call([mkfshfs_tool, "-v", volume_name, hfs]) - - --def create_app_symlink(stagedir, tmpdir): -+def create_app_symlink(stagedir: Path, tmpdir: Path, hfs_tool: Path = None): - """ - Make a symlink to /Applications. The symlink name is a space - so we don't have to localize it. The Applications folder icon -@@ -80,18 +72,34 @@ def create_app_symlink(stagedir, tmpdir) - """ - if is_linux: - hfs = os.path.join(tmpdir, "staged.hfs") -- subprocess.check_call( -- [buildconfig.substs["HFS_TOOL"], hfs, "symlink", "/ ", "/Applications"] -- ) -- else: -- os.symlink("/Applications", os.path.join(stagedir, " ")) -+ subprocess.check_call([hfs_tool, hfs, "symlink", "/ ", "/Applications"]) -+ elif is_osx: -+ os.symlink("/Applications", stagedir / " ") - - --def create_dmg_from_staged(stagedir, output_dmg, tmpdir, volume_name): -+def create_dmg_from_staged( -+ stagedir: Path, -+ output_dmg: Path, -+ tmpdir: Path, -+ volume_name: str, -+ hfs_tool: Path = None, -+ dmg_tool: Path = None, -+): - "Given a prepared directory stagedir, produce a DMG at output_dmg." -- if not is_linux: -- # Running on OS X -- hybrid = os.path.join(tmpdir, "hybrid.dmg") -+ if is_linux: -+ # The dmg tool doesn't create the destination directories, and silently -+ # returns success if the parent directory doesn't exist. -+ ensureParentDir(output_dmg) -+ -+ hfs = os.path.join(tmpdir, "staged.hfs") -+ subprocess.check_call([hfs_tool, hfs, "addall", stagedir]) -+ subprocess.check_call( -+ [dmg_tool, "build", hfs, output_dmg], -+ # dmg is seriously chatty -+ stdout=subprocess.DEVNULL, -+ ) -+ elif is_osx: -+ hybrid = tmpdir / "hybrid.dmg" - subprocess.check_call( - [ - "hdiutil", -@@ -121,37 +129,17 @@ def create_dmg_from_staged(stagedir, out - output_dmg, - ] - ) -- else: -- # The dmg tool doesn't create the destination directories, and silently -- # returns success if the parent directory doesn't exist. -- ensureParentDir(output_dmg) -- -- hfs = os.path.join(tmpdir, "staged.hfs") -- subprocess.check_call([buildconfig.substs["HFS_TOOL"], hfs, "addall", stagedir]) -- subprocess.check_call( -- [buildconfig.substs["DMG_TOOL"], "build", hfs, output_dmg], -- # dmg is seriously chatty -- stdout=open(os.devnull, "wb"), -- ) - - --def check_tools(*tools): -- """ -- Check that each tool named in tools exists in SUBSTS and is executable. -- """ -- for tool in tools: -- path = buildconfig.substs[tool] -- if not path: -- raise Exception('Required tool "%s" not found' % tool) -- if not os.path.isfile(path): -- raise Exception('Required tool "%s" not found at path "%s"' % (tool, path)) -- if not os.access(path, os.X_OK): -- raise Exception( -- 'Required tool "%s" at path "%s" is not executable' % (tool, path) -- ) -- -- --def create_dmg(source_directory, output_dmg, volume_name, extra_files): -+def create_dmg( -+ source_directory: Path, -+ output_dmg: Path, -+ volume_name: str, -+ extra_files: List[tuple], -+ dmg_tool: Path, -+ hfs_tool: Path, -+ mkfshfs_tool: Path, -+): - """ - Create a DMG disk image at the path output_dmg from source_directory. - -@@ -162,73 +150,80 @@ def create_dmg(source_directory, output_ - if platform.system() not in ("Darwin", "Linux"): - raise Exception("Don't know how to build a DMG on '%s'" % platform.system()) - -- if is_linux: -- check_tools("DMG_TOOL", "MKFSHFS", "HFS_TOOL") -- with mozfile.TemporaryDirectory() as tmpdir: -- stagedir = os.path.join(tmpdir, "stage") -- os.mkdir(stagedir) -+ with mozfile.TemporaryDirectory() as tmp: -+ tmpdir = Path(tmp) -+ stagedir = tmpdir / "stage" -+ stagedir.mkdir() -+ - # Copy the app bundle over using rsync - rsync(source_directory, stagedir) - # Copy extra files - for source, target in extra_files: -- full_target = os.path.join(stagedir, target) -- mkdir(os.path.dirname(full_target)) -+ full_target = stagedir / target -+ full_target.parent.mkdir(parents=True, exist_ok=True) - shutil.copyfile(source, full_target) -- generate_hfs_file(stagedir, tmpdir, volume_name) -- create_app_symlink(stagedir, tmpdir) -+ if is_linux: -+ # Not needed in osx -+ generate_hfs_file(stagedir, tmpdir, volume_name, mkfshfs_tool) -+ create_app_symlink(stagedir, tmpdir, hfs_tool) - # Set the folder attributes to use a custom icon -- set_folder_icon(stagedir, tmpdir) -+ set_folder_icon(stagedir, tmpdir, hfs_tool) - chmod(stagedir) -- create_dmg_from_staged(stagedir, output_dmg, tmpdir, volume_name) -+ create_dmg_from_staged( -+ stagedir, output_dmg, tmpdir, volume_name, hfs_tool, dmg_tool -+ ) - - --def extract_dmg_contents(dmgfile, destdir): -- import buildconfig -- -+def extract_dmg_contents( -+ dmgfile: Path, -+ destdir: Path, -+ dmg_tool: Path = None, -+ hfs_tool: Path = None, -+): - if is_linux: - with mozfile.TemporaryDirectory() as tmpdir: - hfs_file = os.path.join(tmpdir, "firefox.hfs") - subprocess.check_call( -- [buildconfig.substs["DMG_TOOL"], "extract", dmgfile, hfs_file], -+ [dmg_tool, "extract", dmgfile, hfs_file], - # dmg is seriously chatty -- stdout=open(os.devnull, "wb"), -- ) -- subprocess.check_call( -- [buildconfig.substs["HFS_TOOL"], hfs_file, "extractall", "/", destdir] -+ stdout=subprocess.DEVNULL, - ) -+ subprocess.check_call([hfs_tool, hfs_file, "extractall", "/", destdir]) - else: -- unpack_diskimage = os.path.join( -- buildconfig.topsrcdir, "build", "package", "mac_osx", "unpack-diskimage" -- ) -- unpack_mountpoint = os.path.join( -- "/tmp", "{}-unpack".format(buildconfig.substs["MOZ_APP_NAME"]) -- ) -+ # TODO: find better way to resolve topsrcdir (checkout directory) -+ topsrcdir = Path(__file__).parent.parent.parent.parent.resolve() -+ unpack_diskimage = topsrcdir / "build/package/mac_osx/unpack-diskimage" -+ unpack_mountpoint = Path("/tmp/app-unpack") - subprocess.check_call([unpack_diskimage, dmgfile, unpack_mountpoint, destdir]) - - --def extract_dmg(dmgfile, output, dsstore=None, icon=None, background=None): -+def extract_dmg( -+ dmgfile: Path, -+ output: Path, -+ dmg_tool: Path = None, -+ hfs_tool: Path = None, -+ dsstore: Path = None, -+ icon: Path = None, -+ background: Path = None, -+): - if platform.system() not in ("Darwin", "Linux"): - raise Exception("Don't know how to extract a DMG on '%s'" % platform.system()) - -- if is_linux: -- check_tools("DMG_TOOL", "MKFSHFS", "HFS_TOOL") -- -- with mozfile.TemporaryDirectory() as tmpdir: -- extract_dmg_contents(dmgfile, tmpdir) -- if os.path.islink(os.path.join(tmpdir, " ")): -+ with mozfile.TemporaryDirectory() as tmp: -+ tmpdir = Path(tmp) -+ extract_dmg_contents(dmgfile, tmpdir, dmg_tool, hfs_tool) -+ applications_symlink = tmpdir / " " -+ if applications_symlink.is_symlink(): - # Rsync will fail on the presence of this symlink -- os.remove(os.path.join(tmpdir, " ")) -+ applications_symlink.unlink() - rsync(tmpdir, output) - - if dsstore: -- mkdir(os.path.dirname(dsstore)) -- rsync(os.path.join(tmpdir, ".DS_Store"), dsstore) -+ dsstore.parent.mkdir(parents=True, exist_ok=True) -+ rsync(tmpdir / ".DS_Store", dsstore) - if background: -- mkdir(os.path.dirname(background)) -- rsync( -- os.path.join(tmpdir, ".background", os.path.basename(background)), -- background, -- ) -+ background.parent.mkdir(parents=True, exist_ok=True) -+ rsync(tmpdir / ".background" / background.name, background) - if icon: -- mkdir(os.path.dirname(icon)) -- rsync(os.path.join(tmpdir, ".VolumeIcon.icns"), icon) -+ icon.parent.mkdir(parents=True, exist_ok=True) -+ rsync(tmpdir / ".VolumeIcon.icns", icon) -diff --git a/python/mozbuild/mozpack/mozjar.py b/python/mozbuild/mozpack/mozjar.py ---- a/python/mozbuild/mozpack/mozjar.py -+++ b/python/mozbuild/mozpack/mozjar.py -@@ -287,12 +287,22 @@ class JarFileReader(object): - self.compressed = header["compression"] != JAR_STORED - self.compress = header["compression"] - -+ def readable(self): -+ return True -+ - def read(self, length=-1): - """ - Read some amount of uncompressed data. - """ - return self.uncompressed_data.read(length) - -+ def readinto(self, b): -+ """ -+ Read bytes into a pre-allocated, writable bytes-like object `b` and return -+ the number of bytes read. -+ """ -+ return self.uncompressed_data.readinto(b) -+ - def readlines(self): - """ - Return a list containing all the lines of data in the uncompressed -@@ -320,6 +330,10 @@ class JarFileReader(object): - self.uncompressed_data.close() - - @property -+ def closed(self): -+ return self.uncompressed_data.closed -+ -+ @property - def compressed_data(self): - """ - Return the raw compressed data. -diff --git a/python/mozbuild/mozpack/test/python.ini b/python/mozbuild/mozpack/test/python.ini ---- a/python/mozbuild/mozpack/test/python.ini -+++ b/python/mozbuild/mozpack/test/python.ini -@@ -14,4 +14,5 @@ subsuite = mozbuild - [test_packager_l10n.py] - [test_packager_unpack.py] - [test_path.py] -+[test_pkg.py] - [test_unify.py] -diff --git a/python/mozlint/mozlint/cli.py b/python/mozlint/mozlint/cli.py ---- a/python/mozlint/mozlint/cli.py -+++ b/python/mozlint/mozlint/cli.py -@@ -46,10 +46,13 @@ class MozlintParser(ArgumentParser): - [ - ["-W", "--warnings"], - { -+ "const": True, -+ "nargs": "?", -+ "choices": ["soft"], - "dest": "show_warnings", -- "default": False, -- "action": "store_true", -- "help": "Display and fail on warnings in addition to errors.", -+ "help": "Display and fail on warnings in addition to errors. " -+ "--warnings=soft can be used to report warnings but only fail " -+ "on errors.", - }, - ], - [ -diff --git a/python/mozlint/mozlint/result.py b/python/mozlint/mozlint/result.py ---- a/python/mozlint/mozlint/result.py -+++ b/python/mozlint/mozlint/result.py -@@ -3,6 +3,7 @@ - # file, You can obtain one at http://mozilla.org/MPL/2.0/. - - from collections import defaultdict -+from itertools import chain - from json import JSONEncoder - import os - import mozpack.path as mozpath -@@ -15,7 +16,8 @@ class ResultSummary(object): - - root = None - -- def __init__(self, root): -+ def __init__(self, root, fail_on_warnings=True): -+ self.fail_on_warnings = fail_on_warnings - self.reset() - - # Store the repository root folder to be able to build -@@ -30,9 +32,19 @@ class ResultSummary(object): - self.suppressed_warnings = defaultdict(int) - self.fixed = 0 - -+ def has_issues_failure(self): -+ """Returns true in case issues were detected during the lint run. Do not -+ consider warning issues in case `self.fail_on_warnings` is set to False. -+ """ -+ if self.fail_on_warnings is False: -+ return any( -+ result.level != "warning" for result in chain(*self.issues.values()) -+ ) -+ return len(self.issues) >= 1 -+ - @property - def returncode(self): -- if self.issues or self.failed: -+ if self.has_issues_failure() or self.failed: - return 1 - return 0 - -diff --git a/python/mozlint/mozlint/roller.py b/python/mozlint/mozlint/roller.py ---- a/python/mozlint/mozlint/roller.py -+++ b/python/mozlint/mozlint/roller.py -@@ -177,7 +177,11 @@ class LintRoller(object): - self._setupargs = setupargs or {} - - # result state -- self.result = ResultSummary(root) -+ self.result = ResultSummary( -+ root, -+ # Prevent failing on warnings when the --warnings parameter is set to "soft" -+ fail_on_warnings=lintargs.get("show_warnings") != "soft", -+ ) - - self.root = root - self.exclude = exclude or [] -diff --git a/python/mozlint/mozlint/types.py b/python/mozlint/mozlint/types.py ---- a/python/mozlint/mozlint/types.py -+++ b/python/mozlint/mozlint/types.py -@@ -87,40 +87,6 @@ class BaseType(object): - pass - - --class FileType(BaseType): -- """Abstract base class for linter types that check each file -- -- Subclasses of this linter type will read each file and check the file contents -- """ -- -- __metaclass__ = ABCMeta -- -- @abstractmethod -- def lint_single_file(payload, line, config): -- """Run linter defined by `config` against `paths` with `lintargs`. -- -- :param path: Path to the file to lint. -- :param config: Linter config the paths are being linted against. -- :param lintargs: External arguments to the linter not defined in -- the definition, but passed in by a consumer. -- :returns: An error message or None -- """ -- pass -- -- def _lint(self, path, config, **lintargs): -- if os.path.isdir(path): -- return self._lint_dir(path, config, **lintargs) -- -- payload = config["payload"] -- -- errors = [] -- message = self.lint_single_file(payload, path, config) -- if message: -- errors.append(result.from_config(config, message=message, path=path)) -- -- return errors -- -- - class LineType(BaseType): - """Abstract base class for linter types that check each line individually. - -@@ -182,6 +148,10 @@ class ExternalType(BaseType): - return func(files, config, **lintargs) - - -+class ExternalFileType(ExternalType): -+ batch = False -+ -+ - class GlobalType(ExternalType): - """Linter type that runs an external global linting function just once. - -@@ -237,6 +207,7 @@ supported_types = { - "string": StringType(), - "regex": RegexType(), - "external": ExternalType(), -+ "external-file": ExternalFileType(), - "global": GlobalType(), - "structured_log": StructuredLogType(), - } -diff --git a/python/mozlint/test/test_roller.py b/python/mozlint/test/test_roller.py ---- a/python/mozlint/test/test_roller.py -+++ b/python/mozlint/test/test_roller.py -@@ -14,6 +14,7 @@ import pytest - - from mozlint.errors import LintersNotConfigured, NoValidLinter - from mozlint.result import Issue, ResultSummary -+from mozlint.roller import LintRoller - from itertools import chain - - -@@ -152,26 +153,41 @@ def test_roll_warnings(lint, linters, fi - assert result.total_suppressed_warnings == 0 - - --def test_roll_code_review(monkeypatch, lint, linters, files): -+def test_roll_code_review(monkeypatch, linters, files): - monkeypatch.setenv("CODE_REVIEW", "1") -- lint.lintargs["show_warnings"] = False -+ lint = LintRoller(root=here, show_warnings=False) - lint.read(linters("warning")) - result = lint.roll(files) - assert len(result.issues) == 1 - assert result.total_issues == 2 - assert len(result.suppressed_warnings) == 0 - assert result.total_suppressed_warnings == 0 -+ assert result.returncode == 1 - - --def test_roll_code_review_warnings_disabled(monkeypatch, lint, linters, files): -+def test_roll_code_review_warnings_disabled(monkeypatch, linters, files): - monkeypatch.setenv("CODE_REVIEW", "1") -- lint.lintargs["show_warnings"] = False -+ lint = LintRoller(root=here, show_warnings=False) - lint.read(linters("warning_no_code_review")) - result = lint.roll(files) - assert len(result.issues) == 0 - assert result.total_issues == 0 -+ assert lint.result.fail_on_warnings is True - assert len(result.suppressed_warnings) == 1 - assert result.total_suppressed_warnings == 2 -+ assert result.returncode == 0 -+ -+ -+def test_roll_code_review_warnings_soft(linters, files): -+ lint = LintRoller(root=here, show_warnings="soft") -+ lint.read(linters("warning_no_code_review")) -+ result = lint.roll(files) -+ assert len(result.issues) == 1 -+ assert result.total_issues == 2 -+ assert lint.result.fail_on_warnings is False -+ assert len(result.suppressed_warnings) == 0 -+ assert result.total_suppressed_warnings == 0 -+ assert result.returncode == 0 - - - def fake_run_worker(config, paths, **lintargs): -diff --git a/python/mozperftest/mozperftest/test/webpagetest.py b/python/mozperftest/mozperftest/test/webpagetest.py ---- a/python/mozperftest/mozperftest/test/webpagetest.py -+++ b/python/mozperftest/mozperftest/test/webpagetest.py -@@ -29,6 +29,7 @@ ACCEPTED_CONNECTIONS = [ - - ACCEPTED_STATISTICS = ["average", "median", "standardDeviation"] - WPT_KEY_FILE = "WPT_key.txt" -+WPT_API_EXPIRED_MESSAGE = "API key expired" - - - class WPTTimeOutError(Exception): -@@ -112,6 +113,14 @@ class WPTInvalidStatisticsError(Exceptio - pass - - -+class WPTExpiredAPIKeyError(Exception): -+ """ -+ This error is raised if we get a notification from WPT that our API key has expired -+ """ -+ -+ pass -+ -+ - class PropagatingErrorThread(Thread): - def run(self): - self.exc = None -@@ -244,6 +253,11 @@ class WebPageTest(Layer): - requested_results = requests.get(url) - results_of_request = json.loads(requested_results.text) - start = time.time() -+ if ( -+ "statusText" in results_of_request.keys() -+ and results_of_request["statusText"] == WPT_API_EXPIRED_MESSAGE -+ ): -+ raise WPTExpiredAPIKeyError("The API key has expired") - while ( - requested_results.status_code == 200 - and time.time() - start < self.timeout_limit -diff --git a/python/mozperftest/mozperftest/tests/test_webpagetest.py b/python/mozperftest/mozperftest/tests/test_webpagetest.py ---- a/python/mozperftest/mozperftest/tests/test_webpagetest.py -+++ b/python/mozperftest/mozperftest/tests/test_webpagetest.py -@@ -13,10 +13,12 @@ from mozperftest.test.webpagetest import - WPTBrowserSelectionError, - WPTInvalidURLError, - WPTLocationSelectionError, -- WPTInvalidConnectionSelection, -- ACCEPTED_STATISTICS, - WPTInvalidStatisticsError, - WPTDataProcessingError, -+ WPTExpiredAPIKeyError, -+ WPTInvalidConnectionSelection, -+ WPT_API_EXPIRED_MESSAGE, -+ ACCEPTED_STATISTICS, - ) - - WPT_METRICS = [ -@@ -82,7 +84,9 @@ def init_placeholder_wpt_data(fvonly=Fal - return placeholder_data - - --def init_mocked_request(status_code, WPT_test_status_code=200, **kwargs): -+def init_mocked_request( -+ status_code, WPT_test_status_code=200, WPT_test_status_text="Ok", **kwargs -+): - mock_data = { - "data": { - "ec2-us-east-1": {"PendingTests": {"Queued": 3}, "Label": "California"}, -@@ -92,6 +96,7 @@ def init_mocked_request(status_code, WPT - "remaining": 2000, - }, - "statusCode": WPT_test_status_code, -+ "statusText": WPT_test_status_text, - } - for key, value in kwargs.items(): - mock_data["data"][key] = value -@@ -245,3 +250,23 @@ def test_webpagetest_test_metric_not_fou - test = webpagetest.WebPageTest(env, mach_cmd) - with pytest.raises(WPTDataProcessingError): - test.run(metadata) -+ -+ -+@mock.patch("mozperftest.utils.get_tc_secret", return_value={"wpt_key": "fake_key"}) -+@mock.patch( -+ "mozperftest.test.webpagetest.WebPageTest.location_queue", return_value=None -+) -+@mock.patch( -+ "requests.get", -+ return_value=init_mocked_request( -+ 200, WPT_test_status_code=400, WPT_test_status_text=WPT_API_EXPIRED_MESSAGE -+ ), -+) -+@mock.patch("mozperftest.test.webpagetest.WPT_KEY_FILE", "tests/data/WPT_fakekey.txt") -+def test_webpagetest_test_expired_api_key(*mocked): -+ mach_cmd, metadata, env = running_env(tests=[str(EXAMPLE_WPT_TEST)]) -+ metadata.script["options"]["test_list"] = ["google.ca"] -+ metadata.script["options"]["test_parameters"]["wait_between_requests"] = 1 -+ test = webpagetest.WebPageTest(env, mach_cmd) -+ with pytest.raises(WPTExpiredAPIKeyError): -+ test.run(metadata) -diff --git a/python/mozterm/mozterm/widgets.py b/python/mozterm/mozterm/widgets.py ---- a/python/mozterm/mozterm/widgets.py -+++ b/python/mozterm/mozterm/widgets.py -@@ -6,6 +6,8 @@ from __future__ import absolute_import, - - from .terminal import Terminal - -+DEFAULT = "\x1b(B\x1b[m" -+ - - class BaseWidget(object): - def __init__(self, terminal=None): -@@ -39,7 +41,16 @@ class Footer(BaseWidget): - for part in parts: - try: - func, part = part -- encoded = getattr(self.term, func)(part) -+ attribute = getattr(self.term, func) -+ # In Blessed, these attributes aren't always callable -+ if callable(attribute): -+ encoded = attribute(part) -+ else: -+ # If it's not callable, assume it's just the raw -+ # ANSI Escape Sequence and prepend it ourselves. -+ # Append DEFAULT to stop text that comes afterwards -+ # from inheriting the formatting we prepended. -+ encoded = attribute + part + DEFAULT - except ValueError: - encoded = part - -diff --git a/python/mozterm/test/test_terminal.py b/python/mozterm/test/test_terminal.py ---- a/python/mozterm/test/test_terminal.py -+++ b/python/mozterm/test/test_terminal.py -@@ -9,32 +9,17 @@ import sys - - import mozunit - import pytest -- --from mozterm import Terminal, NullTerminal -+from mozterm import NullTerminal, Terminal - - - def test_terminal(): -- blessings = pytest.importorskip("blessings") -+ blessed = pytest.importorskip("blessed") - term = Terminal() -- assert isinstance(term, blessings.Terminal) -+ assert isinstance(term, blessed.Terminal) - - term = Terminal(disable_styling=True) - assert isinstance(term, NullTerminal) - -- del sys.modules["blessings"] -- orig = sys.path[:] -- for path in orig: -- if "blessings" in path: -- sys.path.remove(path) -- -- term = Terminal() -- assert isinstance(term, NullTerminal) -- -- with pytest.raises(ImportError): -- term = Terminal(raises=True) -- -- sys.path = orig -- - - def test_null_terminal(): - term = NullTerminal() -diff --git a/python/mozterm/test/test_widgets.py b/python/mozterm/test/test_widgets.py ---- a/python/mozterm/test/test_widgets.py -+++ b/python/mozterm/test/test_widgets.py -@@ -4,41 +4,42 @@ - - from __future__ import absolute_import, unicode_literals - -+import sys - from io import StringIO - - import mozunit - import pytest -- - from mozterm import Terminal - from mozterm.widgets import Footer - - - @pytest.fixture --def terminal(monkeypatch): -- blessings = pytest.importorskip("blessings") -+def terminal(): -+ blessed = pytest.importorskip("blessed") - - kind = "xterm-256color" - try: - term = Terminal(stream=StringIO(), force_styling=True, kind=kind) -- except blessings.curses.error: -+ except blessed.curses.error: - pytest.skip("terminal '{}' not found".format(kind)) - -- # For some reason blessings returns None for width/height though a comment -- # says that shouldn't ever happen. -- monkeypatch.setattr(term, "_height_and_width", lambda: (100, 100)) - return term - - -+@pytest.mark.skipif( -+ not sys.platform.startswith("win"), -+ reason="Only do ANSI Escape Sequence comparisons on Windows.", -+) - def test_footer(terminal): - footer = Footer(terminal=terminal) - footer.write( - [ -- ("dim", "foo"), -+ ("bright_black", "foo"), - ("green", "bar"), - ] - ) - value = terminal.stream.getvalue() -- expected = "\x1b7\x1b[2mfoo\x1b(B\x1b[m \x1b[32mbar\x1b(B\x1b[m\x1b8" -+ expected = "\x1b7\x1b[90mfoo\x1b(B\x1b[m \x1b[32mbar\x1b(B\x1b[m\x1b8" - assert value == expected - - footer.clear() -diff --git a/python/mozversioncontrol/mozversioncontrol/__init__.py b/python/mozversioncontrol/mozversioncontrol/__init__.py ---- a/python/mozversioncontrol/mozversioncontrol/__init__.py -+++ b/python/mozversioncontrol/mozversioncontrol/__init__.py -@@ -222,6 +222,16 @@ class Repository(object): - """ - - @abc.abstractmethod -+ def get_ignored_files_finder(self): -+ """Obtain a mozpack.files.BaseFinder of ignored files in the working -+ directory. -+ -+ The Finder will have its list of all files in the repo cached for its -+ entire lifetime, so operations on the Finder will not track with, for -+ example, changes to the repo during the Finder's lifetime. -+ """ -+ -+ @abc.abstractmethod - def working_directory_clean(self, untracked=False, ignored=False): - """Determine if the working directory is free of modifications. - -@@ -501,6 +511,15 @@ class HgRepository(Repository): - ) - return FileListFinder(files) - -+ def get_ignored_files_finder(self): -+ # Can return backslashes on Windows. Normalize to forward slashes. -+ files = list( -+ p.replace("\\", "/").split(" ")[-1] -+ for p in self._run("status", "-i").split("\n") -+ if p -+ ) -+ return FileListFinder(files) -+ - def working_directory_clean(self, untracked=False, ignored=False): - args = ["status", "--modified", "--added", "--removed", "--deleted"] - if untracked: -@@ -675,6 +694,16 @@ class GitRepository(Repository): - files = [p for p in self._run("ls-files", "-z").split("\0") if p] - return FileListFinder(files) - -+ def get_ignored_files_finder(self): -+ files = [ -+ p -+ for p in self._run( -+ "ls-files", "-i", "-o", "-z", "--exclude-standard" -+ ).split("\0") -+ if p -+ ] -+ return FileListFinder(files) -+ - def working_directory_clean(self, untracked=False, ignored=False): - args = ["status", "--porcelain"] - -diff --git a/python/sites/mach.txt b/python/sites/mach.txt ---- a/python/sites/mach.txt -+++ b/python/sites/mach.txt -@@ -42,10 +42,10 @@ pth:testing/mozbase/mozsystemmonitor - pth:testing/mozbase/mozscreenshot - pth:testing/mozbase/moztest - pth:testing/mozbase/mozversion -+pth:testing/mozharness - pth:testing/raptor - pth:testing/talos - pth:testing/web-platform --vendored:testing/web-platform/tests/tools/third_party/funcsigs - vendored:testing/web-platform/tests/tools/third_party/h2 - vendored:testing/web-platform/tests/tools/third_party/hpack - vendored:testing/web-platform/tests/tools/third_party/html5lib -@@ -139,5 +139,5 @@ pypi-optional:glean-sdk==51.8.2:telemetr - # 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). --pypi-optional:psutil>=5.4.2,<=5.8.0:telemetry will be missing some data --pypi-optional:zstandard>=0.11.1,<=0.17.0:zstd archives will not be possible to extract -+pypi-optional:psutil>=5.4.2,<=5.9.4:telemetry will be missing some data -+pypi-optional:zstandard>=0.11.1,<=0.19.0:zstd archives will not be possible to extract diff --git a/run-wayland-compositor b/run-wayland-compositor index cc993dd..2ac9f69 100755 --- a/run-wayland-compositor +++ b/run-wayland-compositor @@ -20,7 +20,6 @@ if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then # if not found, launch a new one eval `dbus-launch --sh-syntax` fi -eval `echo '' | /usr/bin/gnome-keyring-daemon -r -d --unlock --components=secrets` if [ -z "$XDG_RUNTIME_DIR" ]; then export XDG_RUNTIME_DIR=$HOME @@ -33,7 +32,7 @@ if [ -S "$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY" ]; then fi echo "Launch mutter for $WAYLAND_DISPLAY" -xvfb-run -s "-screen 0 1600x1200x24" mutter --nested --wayland --wayland-display=$WAYLAND_DISPLAY & MUTTER_PID=$! +mutter --headless --virtual-monitor 1920x1080 --wayland-display=$WAYLAND_DISPLAY --no-x11 & MUTTER_PID=$! export MUTTER_PID echo "Mutter PID $MUTTER_PID" diff --git a/sources b/sources index 17988a3..b87ab2c 100644 --- a/sources +++ b/sources @@ -2,6 +2,6 @@ SHA512 (mochitest-python.tar.gz) = 089b1593068b76f4572af0086eaccf52a6a1299bfffb5 SHA512 (dump_syms-vendor.tar.xz) = ee0ea52aac781b8dd48936a3d13b140bd725a48cc488d23693b68edbe3bcfba5723022dba3c3849d0da1bacf0e37ddd307cfc56304159f91b71495ce8a08b54a SHA512 (wasi-sdk-25.tar.gz) = 1285981d26aa5eff27f08ed4b409909639ddcd62c94ee0cff7093ef68722f4b024c099ca3aa3ab50411e9aace13b86f1f30c5e08a3fc58b6a46b87369d6904aa SHA512 (wasm-component-ld-vendor.tar.xz) = 707d942d31455ae0a4f68bf419fb09a20407b6747f831ca554dcd00925b7ea98ef4d03a8652b6d2ae54cf48d7ad15d85aa7eb8d0778ef66b89593eaa8b5c3465 -SHA512 (cbindgen-vendor.tar.xz) = dd99c0233c421e973d62512aee0dfe6e31bf5f30c26522485474541f37806052298f1e9a4fb0f388ed0074564fc1dc7edc0c16c411886576b754df92e97caf8f -SHA512 (firefox-138.0.3.source.tar.xz) = 0f1c8ee05bec465b55429c18d788856574c5b2e31d911f15f76d31c00de84d8b8681961799c4101cd1540bd228afd201a4b59fd7c9a88918695040965b9dc0f1 -SHA512 (firefox-langpacks-138.0.3-20250512.tar.xz) = 4c3b2d2ac9b0003bfb63610c1b3c2e21e043ea86778b115737414f014c86c7f963eb634d387eb97fee02e26f3b8bb378132fa33baaf3580f7b0c77bb635d7be0 +SHA512 (cbindgen-vendor.tar.xz) = bea420e66bdd1c7c944655dd3e01abd6e7d6ac4b245c7ee190f31d800f7786f21e5cae11715b479bf795f4369d18c40dc12df19e0b643664f2f78e5c8a681415 +SHA512 (firefox-langpacks-147.0-20260106.tar.xz) = 4006c6e8dda8722509c1d1756807373d431d75b20d5a0c3f19e72a2a0dc76df62b15ef871e3fff2d30b2682e6a56b4a4541d8445ea1b83641559a3270e0057b7 +SHA512 (firefox-147.0.source.tar.xz) = ac9017b1a2da7b2f139392c394c36341fd3476e3d4ea1a3c7e5e7bf100dc30d185132ef9256be7e6b0f9dbfc69234ac571ea1fc6db9d84543b15772f4ec85161 diff --git a/wasi.patch b/wasi.patch index f089570..0a83f8c 100644 --- a/wasi.patch +++ b/wasi.patch @@ -6,7 +6,7 @@ diff -up firefox-134.0.1/toolkit/moz.configure.wasi firefox-134.0.1/toolkit/moz. if wasi_sysroot: log.info("Using wasi sysroot in %s", wasi_sysroot) - return ["--sysroot=%s" % wasi_sysroot] -+ return ["--sysroot=%s" % wasi_sysroot, "-nodefaultlibs", "-lc", "-lwasi-emulated-process-clocks", "-lc++", "-lc++abi", "/raid/CVS/firefox/firefox-138.0.3-build/firefox-138.0.3/wasi-sdk-25/build/sysroot/install/wasi-resource-dir/lib/wasi/libclang_rt.builtins-wasm32.a"] ++ return ["--sysroot=%s" % wasi_sysroot, "-nodefaultlibs", "-lc", "-lwasi-emulated-process-clocks", "-lc++", "-lc++abi", "/raid/CVS/firefox/firefox-147.0-build/firefox-147.0/wasi-sdk-25/build/sysroot/install/wasi-resource-dir/lib/wasi/libclang_rt.builtins-wasm32.a"] return [] set_config("WASI_SYSROOT", wasi_sysroot)