CachedScriptFetcher.cpp [plain text]
#include "config.h"
#include "CachedScriptFetcher.h"
#include "CachedResourceLoader.h"
#include "CachedScript.h"
#include "ContentSecurityPolicy.h"
#include "CrossOriginAccessControl.h"
#include "Document.h"
#include "Settings.h"
namespace WebCore {
Ref<CachedScriptFetcher> CachedScriptFetcher::create(const String& charset)
{
return adoptRef(*new CachedScriptFetcher(charset));
}
CachedResourceHandle<CachedScript> CachedScriptFetcher::requestModuleScript(Document& document, const URL& sourceURL, String&& integrity) const
{
return requestScriptWithCache(document, sourceURL, String { }, WTFMove(integrity));
}
CachedResourceHandle<CachedScript> CachedScriptFetcher::requestScriptWithCache(Document& document, const URL& sourceURL, const String& crossOriginMode, String&& integrity) const
{
if (!document.settings().isScriptEnabled())
return nullptr;
ASSERT(document.contentSecurityPolicy());
bool hasKnownNonce = document.contentSecurityPolicy()->allowScriptWithNonce(m_nonce, m_isInUserAgentShadowTree);
ResourceLoaderOptions options = CachedResourceLoader::defaultCachedResourceOptions();
options.contentSecurityPolicyImposition = hasKnownNonce ? ContentSecurityPolicyImposition::SkipPolicyCheck : ContentSecurityPolicyImposition::DoPolicyCheck;
options.sameOriginDataURLFlag = SameOriginDataURLFlag::Set;
options.integrity = WTFMove(integrity);
options.referrerPolicy = m_referrerPolicy;
auto request = createPotentialAccessControlRequest(sourceURL, WTFMove(options), document, crossOriginMode);
request.upgradeInsecureRequestIfNeeded(document);
request.setCharset(m_charset);
if (!m_initiatorName.isNull())
request.setInitiator(m_initiatorName);
return document.cachedResourceLoader().requestScript(WTFMove(request)).value_or(nullptr);
}
}