diff --git a/Libraries/LibWeb/HTML/TraversableNavigable.cpp b/Libraries/LibWeb/HTML/TraversableNavigable.cpp
index 6a0cf7f0b22..64ebff28d84 100644
--- a/Libraries/LibWeb/HTML/TraversableNavigable.cpp
+++ b/Libraries/LibWeb/HTML/TraversableNavigable.cpp
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2022, Andreas Kling
+ * Copyright (c) 2025, Jelle Raaijmakers
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@@ -25,29 +26,35 @@ namespace Web::HTML {
GC_DEFINE_ALLOCATOR(TraversableNavigable);
+static RefPtr g_cached_skia_backend_context;
+
+static RefPtr get_skia_backend_context()
+{
+ if (!g_cached_skia_backend_context) {
+#ifdef AK_OS_MACOS
+ auto metal_context = Gfx::get_metal_context();
+ g_cached_skia_backend_context = Gfx::SkiaBackendContext::create_metal_context(*metal_context);
+#elif USE_VULKAN
+ auto maybe_vulkan_context = Gfx::create_vulkan_context();
+ if (maybe_vulkan_context.is_error()) {
+ dbgln("Vulkan context creation failed: {}", maybe_vulkan_context.error());
+ return {};
+ }
+
+ auto vulkan_context = maybe_vulkan_context.release_value();
+ g_cached_skia_backend_context = Gfx::SkiaBackendContext::create_vulkan_context(vulkan_context);
+#endif
+ }
+ return g_cached_skia_backend_context;
+}
+
TraversableNavigable::TraversableNavigable(GC::Ref page)
: Navigable(page)
, m_session_history_traversal_queue(vm().heap().allocate())
{
-#ifdef USE_VULKAN
- auto display_list_player_type = page->client().display_list_player_type();
- if (display_list_player_type == DisplayListPlayerType::SkiaGPUIfAvailable) {
- auto maybe_vulkan_context = Gfx::create_vulkan_context();
- if (!maybe_vulkan_context.is_error()) {
- auto vulkan_context = maybe_vulkan_context.release_value();
- m_skia_backend_context = Gfx::SkiaBackendContext::create_vulkan_context(vulkan_context);
- } else {
- dbgln("Vulkan context creation failed: {}", maybe_vulkan_context.error());
- }
- }
-#endif
-
-#ifdef AK_OS_MACOS
auto display_list_player_type = page->client().display_list_player_type();
if (display_list_player_type == DisplayListPlayerType::SkiaGPUIfAvailable)
- auto metal_context = Gfx::get_metal_context();
- m_skia_backend_context = Gfx::SkiaBackendContext::create_metal_context(*metal_context);
-#endif
+ m_skia_backend_context = get_skia_backend_context();
}
TraversableNavigable::~TraversableNavigable() = default;