diff --git a/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.cpp
index 29548d04b2..47f40c798f 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.cpp
+++ b/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.cpp
@@ -42,6 +42,10 @@ void HTMLLinkElement::inserted()
LoadRequest request;
request.set_url(document().parse_url(attribute(HTML::AttributeNames::href)));
m_preload_resource = ResourceLoader::the().load_resource(Resource::Type::Generic, request);
+ } else if (m_relationship & Relationship::DNSPrefetch) {
+ ResourceLoader::the().prefetch_dns(document().parse_url(attribute(HTML::AttributeNames::href)));
+ } else if (m_relationship & Relationship::Preconnect) {
+ ResourceLoader::the().preconnect(document().parse_url(attribute(HTML::AttributeNames::href)));
}
}
@@ -51,12 +55,16 @@ void HTMLLinkElement::parse_attribute(const FlyString& name, const String& value
m_relationship = 0;
auto parts = value.split_view(' ');
for (auto& part : parts) {
- if (part == "stylesheet")
+ if (part == "stylesheet"sv)
m_relationship |= Relationship::Stylesheet;
- else if (part == "alternate")
+ else if (part == "alternate"sv)
m_relationship |= Relationship::Alternate;
- else if (part == "preload")
+ else if (part == "preload"sv)
m_relationship |= Relationship::Preload;
+ else if (part == "dns-prefetch"sv)
+ m_relationship |= Relationship::DNSPrefetch;
+ else if (part == "preconnect"sv)
+ m_relationship |= Relationship::Preconnect;
}
}
}
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.h b/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.h
index aebd3a38d1..3405c92a99 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.h
+++ b/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.h
@@ -33,6 +33,8 @@ private:
Alternate = 1 << 0,
Stylesheet = 1 << 1,
Preload = 1 << 2,
+ DNSPrefetch = 1 << 3,
+ Preconnect = 1 << 4,
};
};
diff --git a/Userland/Libraries/LibWeb/Loader/ResourceLoader.cpp b/Userland/Libraries/LibWeb/Loader/ResourceLoader.cpp
index 9d9f4c8efd..02ba6d19b0 100644
--- a/Userland/Libraries/LibWeb/Loader/ResourceLoader.cpp
+++ b/Userland/Libraries/LibWeb/Loader/ResourceLoader.cpp
@@ -52,6 +52,16 @@ void ResourceLoader::load_sync(LoadRequest& request, Functionensure_connection(url, RequestServer::CacheLevel::ResolveOnly);
+}
+
+void ResourceLoader::preconnect(AK::URL const& url)
+{
+ m_protocol_client->ensure_connection(url, RequestServer::CacheLevel::CreateConnection);
+}
+
static HashMap> s_resource_cache;
RefPtr ResourceLoader::load_resource(Resource::Type type, LoadRequest& request)
diff --git a/Userland/Libraries/LibWeb/Loader/ResourceLoader.h b/Userland/Libraries/LibWeb/Loader/ResourceLoader.h
index 0e2ffeec72..e311baddea 100644
--- a/Userland/Libraries/LibWeb/Loader/ResourceLoader.h
+++ b/Userland/Libraries/LibWeb/Loader/ResourceLoader.h
@@ -37,6 +37,9 @@ public:
void load(const AK::URL&, Function& response_headers, Optional status_code)> success_callback, Function status_code)> error_callback = nullptr);
void load_sync(LoadRequest&, Function& response_headers, Optional status_code)> success_callback, Function status_code)> error_callback = nullptr);
+ void prefetch_dns(AK::URL const&);
+ void preconnect(AK::URL const&);
+
Function on_load_counter_change;
int pending_loads() const { return m_pending_loads; }