Kaynağa Gözat

LibWeb: Implement the dns-prefetch and preconnect link relationships

Ali Mohammad Pur 3 yıl önce
ebeveyn
işleme
f0e2c517fc

+ 11 - 3
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;
         }
     }
 }

+ 2 - 0
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,
         };
     };
 

+ 10 - 0
Userland/Libraries/LibWeb/Loader/ResourceLoader.cpp

@@ -52,6 +52,16 @@ void ResourceLoader::load_sync(LoadRequest& request, Function<void(ReadonlyBytes
     loop.exec();
 }
 
+void ResourceLoader::prefetch_dns(AK::URL const& url)
+{
+    m_protocol_client->ensure_connection(url, RequestServer::CacheLevel::ResolveOnly);
+}
+
+void ResourceLoader::preconnect(AK::URL const& url)
+{
+    m_protocol_client->ensure_connection(url, RequestServer::CacheLevel::CreateConnection);
+}
+
 static HashMap<LoadRequest, NonnullRefPtr<Resource>> s_resource_cache;
 
 RefPtr<Resource> ResourceLoader::load_resource(Resource::Type type, LoadRequest& request)

+ 3 - 0
Userland/Libraries/LibWeb/Loader/ResourceLoader.h

@@ -37,6 +37,9 @@ public:
     void load(const AK::URL&, Function<void(ReadonlyBytes, const HashMap<String, String, CaseInsensitiveStringTraits>& response_headers, Optional<u32> status_code)> success_callback, Function<void(const String&, Optional<u32> status_code)> error_callback = nullptr);
     void load_sync(LoadRequest&, Function<void(ReadonlyBytes, const HashMap<String, String, CaseInsensitiveStringTraits>& response_headers, Optional<u32> status_code)> success_callback, Function<void(const String&, Optional<u32> status_code)> error_callback = nullptr);
 
+    void prefetch_dns(AK::URL const&);
+    void preconnect(AK::URL const&);
+
     Function<void()> on_load_counter_change;
 
     int pending_loads() const { return m_pending_loads; }