mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 14:57:35 +00:00
LibWeb: Implement the dns-prefetch and preconnect link relationships
This commit is contained in:
parent
e9b9f89e70
commit
f0e2c517fc
4 changed files with 26 additions and 3 deletions
|
@ -42,6 +42,10 @@ void HTMLLinkElement::inserted()
|
||||||
LoadRequest request;
|
LoadRequest request;
|
||||||
request.set_url(document().parse_url(attribute(HTML::AttributeNames::href)));
|
request.set_url(document().parse_url(attribute(HTML::AttributeNames::href)));
|
||||||
m_preload_resource = ResourceLoader::the().load_resource(Resource::Type::Generic, request);
|
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;
|
m_relationship = 0;
|
||||||
auto parts = value.split_view(' ');
|
auto parts = value.split_view(' ');
|
||||||
for (auto& part : parts) {
|
for (auto& part : parts) {
|
||||||
if (part == "stylesheet")
|
if (part == "stylesheet"sv)
|
||||||
m_relationship |= Relationship::Stylesheet;
|
m_relationship |= Relationship::Stylesheet;
|
||||||
else if (part == "alternate")
|
else if (part == "alternate"sv)
|
||||||
m_relationship |= Relationship::Alternate;
|
m_relationship |= Relationship::Alternate;
|
||||||
else if (part == "preload")
|
else if (part == "preload"sv)
|
||||||
m_relationship |= Relationship::Preload;
|
m_relationship |= Relationship::Preload;
|
||||||
|
else if (part == "dns-prefetch"sv)
|
||||||
|
m_relationship |= Relationship::DNSPrefetch;
|
||||||
|
else if (part == "preconnect"sv)
|
||||||
|
m_relationship |= Relationship::Preconnect;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,8 @@ private:
|
||||||
Alternate = 1 << 0,
|
Alternate = 1 << 0,
|
||||||
Stylesheet = 1 << 1,
|
Stylesheet = 1 << 1,
|
||||||
Preload = 1 << 2,
|
Preload = 1 << 2,
|
||||||
|
DNSPrefetch = 1 << 3,
|
||||||
|
Preconnect = 1 << 4,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -52,6 +52,16 @@ void ResourceLoader::load_sync(LoadRequest& request, Function<void(ReadonlyBytes
|
||||||
loop.exec();
|
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;
|
static HashMap<LoadRequest, NonnullRefPtr<Resource>> s_resource_cache;
|
||||||
|
|
||||||
RefPtr<Resource> ResourceLoader::load_resource(Resource::Type type, LoadRequest& request)
|
RefPtr<Resource> ResourceLoader::load_resource(Resource::Type type, LoadRequest& request)
|
||||||
|
|
|
@ -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(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 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;
|
Function<void()> on_load_counter_change;
|
||||||
|
|
||||||
int pending_loads() const { return m_pending_loads; }
|
int pending_loads() const { return m_pending_loads; }
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue