#pragma once
#include "CachedResource.h"
#include "CachedResourceClient.h"
#include "CachedResourceHandle.h"
#include "LinkLoaderClient.h"
#include "LinkRelAttribute.h"
#include "ReferrerPolicy.h"
#include <wtf/WeakPtr.h>
namespace WebCore {
class Document;
class LinkPreloadResourceClient;
struct LinkLoadParameters {
LinkRelAttribute relAttribute;
URL href;
String as;
String media;
String mimeType;
String crossOrigin;
String imageSrcSet;
String imageSizes;
ReferrerPolicy referrerPolicy { ReferrerPolicy::EmptyString };
};
class LinkLoader : private CachedResourceClient, public CanMakeWeakPtr<LinkLoader> {
public:
explicit LinkLoader(LinkLoaderClient&);
virtual ~LinkLoader();
void loadLink(const LinkLoadParameters&, Document&);
static Optional<CachedResource::Type> resourceTypeFromAsAttribute(const String& as);
enum class MediaAttributeCheck { MediaAttributeEmpty, MediaAttributeNotEmpty, SkipMediaAttributeCheck };
static void loadLinksFromHeader(const String& headerValue, const URL& baseURL, Document&, MediaAttributeCheck);
static bool isSupportedType(CachedResource::Type, const String& mimeType);
void triggerEvents(const CachedResource&);
void cancelLoad();
private:
void notifyFinished(CachedResource&, const NetworkLoadMetrics&) override;
static void preconnectIfNeeded(const LinkLoadParameters&, Document&);
static std::unique_ptr<LinkPreloadResourceClient> preloadIfNeeded(const LinkLoadParameters&, Document&, LinkLoader*);
void prefetchIfNeeded(const LinkLoadParameters&, Document&);
LinkLoaderClient& m_client;
CachedResourceHandle<CachedResource> m_cachedLinkResource;
std::unique_ptr<LinkPreloadResourceClient> m_preloadResourceClient;
};
}