HTMLResourcePreloader.cpp [plain text]
#include "config.h"
#include "HTMLResourcePreloader.h"
#include "CachedResourceLoader.h"
#include "Document.h"
#include "MediaList.h"
#include "MediaQueryEvaluator.h"
#include "RenderView.h"
namespace WebCore {
bool PreloadRequest::isSafeToSendToAnotherThread() const
{
return m_initiator.isSafeToSendToAnotherThread()
&& m_charset.isSafeToSendToAnotherThread()
&& m_resourceURL.isSafeToSendToAnotherThread()
&& m_mediaAttribute.isSafeToSendToAnotherThread()
&& m_baseURL.isSafeToSendToAnotherThread();
}
URL PreloadRequest::completeURL(Document& document)
{
return document.completeURL(m_resourceURL, m_baseURL.isEmpty() ? document.url() : m_baseURL);
}
CachedResourceRequest PreloadRequest::resourceRequest(Document& document)
{
ASSERT(isMainThread());
CachedResourceRequest request(ResourceRequest(completeURL(document)));
request.setInitiator(m_initiator);
if (m_resourceType == CachedResource::Script)
request.mutableResourceRequest().setAllowCookies(m_crossOriginModeAllowsCookies);
return request;
}
void HTMLResourcePreloader::preload(PreloadRequestStream requests)
{
for (auto& request : requests)
preload(WTF::move(request));
}
static bool mediaAttributeMatches(Frame* frame, RenderStyle* renderStyle, const String& attributeValue)
{
RefPtr<MediaQuerySet> mediaQueries = MediaQuerySet::createAllowingDescriptionSyntax(attributeValue);
MediaQueryEvaluator mediaQueryEvaluator("screen", frame, renderStyle);
return mediaQueryEvaluator.eval(mediaQueries.get());
}
void HTMLResourcePreloader::preload(std::unique_ptr<PreloadRequest> preload)
{
ASSERT(m_document.frame());
ASSERT(m_document.renderView());
if (!preload->media().isEmpty() && !mediaAttributeMatches(m_document.frame(), &m_document.renderView()->style(), preload->media()))
return;
CachedResourceRequest request = preload->resourceRequest(m_document);
m_document.cachedResourceLoader()->preload(preload->resourceType(), request, preload->charset());
}
}