#pragma once
#include "CachedResource.h"
#include "CachedResourceClient.h"
#include "CachedResourceHandle.h"
#include "LinkLoaderClient.h"
#include <wtf/WeakPtr.h>
namespace WebCore {
class Document;
class URL;
class LinkPreloadResourceClient;
struct LinkRelAttribute;
class LinkLoader : private CachedResourceClient {
public:
explicit LinkLoader(LinkLoaderClient&);
virtual ~LinkLoader();
bool loadLink(const LinkRelAttribute&, const URL&, const String& as, const String& media, const String& type, const String& crossOrigin, Document&);
static std::optional<CachedResource::Type> resourceTypeFromAsAttribute(const String& as);
enum class MediaAttributeCheck { MediaAttributeEmpty, MediaAttributeNotEmpty };
static void loadLinksFromHeader(const String& headerValue, const URL& baseURL, Document&, MediaAttributeCheck);
static bool isSupportedType(CachedResource::Type, const String& mimeType);
WeakPtr<LinkLoader> createWeakPtr() { return m_weakPtrFactory.createWeakPtr(*this); }
void triggerEvents(const CachedResource&);
void cancelLoad();
private:
void notifyFinished(CachedResource&) override;
static std::unique_ptr<LinkPreloadResourceClient> preloadIfNeeded(const LinkRelAttribute&, const URL& href, Document&, const String& as, const String& media, const String& type, const String& crossOriginMode, LinkLoader*);
LinkLoaderClient& m_client;
CachedResourceHandle<CachedResource> m_cachedLinkResource;
std::unique_ptr<LinkPreloadResourceClient> m_preloadResourceClient;
WeakPtrFactory<LinkLoader> m_weakPtrFactory;
};
}