diff --git a/Userland/Libraries/LibWeb/HTML/Navigator.cpp b/Userland/Libraries/LibWeb/HTML/Navigator.cpp
index df9ec06aeed..9c0f2d15630 100644
--- a/Userland/Libraries/LibWeb/HTML/Navigator.cpp
+++ b/Userland/Libraries/LibWeb/HTML/Navigator.cpp
@@ -12,6 +12,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -64,6 +65,7 @@ void Navigator::visit_edges(Cell::Visitor& visitor)
visitor.visit(m_plugin_array);
visitor.visit(m_clipboard);
visitor.visit(m_user_activation);
+ visitor.visit(m_service_worker_container);
}
JS::NonnullGCPtr Navigator::mime_types()
@@ -113,4 +115,11 @@ Optional Navigator::do_not_track() const
return {};
}
+JS::NonnullGCPtr Navigator::service_worker()
+{
+ if (!m_service_worker_container)
+ m_service_worker_container = heap().allocate(realm(), realm());
+ return *m_service_worker_container;
+}
+
}
diff --git a/Userland/Libraries/LibWeb/HTML/Navigator.h b/Userland/Libraries/LibWeb/HTML/Navigator.h
index 7d85faea3cb..de5703ba2cb 100644
--- a/Userland/Libraries/LibWeb/HTML/Navigator.h
+++ b/Userland/Libraries/LibWeb/HTML/Navigator.h
@@ -54,6 +54,8 @@ public:
Optional do_not_track() const;
+ JS::NonnullGCPtr service_worker();
+
static WebIDL::Long max_touch_points();
virtual ~Navigator() override;
@@ -77,6 +79,9 @@ private:
// https://html.spec.whatwg.org/multipage/interaction.html#dom-navigator-useractivation
JS::GCPtr m_user_activation;
+
+ // https://w3c.github.io/ServiceWorker/#navigator-serviceworker
+ JS::GCPtr m_service_worker_container;
};
}
diff --git a/Userland/Libraries/LibWeb/HTML/Navigator.idl b/Userland/Libraries/LibWeb/HTML/Navigator.idl
index a551d3c13c9..92655d8189a 100644
--- a/Userland/Libraries/LibWeb/HTML/Navigator.idl
+++ b/Userland/Libraries/LibWeb/HTML/Navigator.idl
@@ -6,6 +6,7 @@
#import
#import
#import
+#import
#import
#import
@@ -25,6 +26,9 @@ interface Navigator {
// https://www.w3.org/TR/tracking-dnt/#dom-navigator-donottrack
readonly attribute DOMString? doNotTrack;
+
+ // https://w3c.github.io/ServiceWorker/#navigator-serviceworker
+ [SecureContext, SameObject] readonly attribute ServiceWorkerContainer serviceWorker;
};
// NOTE: As NavigatorContentUtils, NavigatorCookies, NavigatorPlugins, and NavigatorAutomationInformation