CachedModuleScript.cpp [plain text]
#include "config.h"
#include "CachedModuleScript.h"
#include "CachedModuleScriptClient.h"
#include "DOMWrapperWorld.h"
#include "Document.h"
#include "Element.h"
#include "ExceptionCode.h"
#include "Frame.h"
#include "ScriptController.h"
#include "ScriptElement.h"
#include "ScriptModuleLoader.h"
#include "ScriptRunner.h"
#include "ScriptSourceCode.h"
namespace WebCore {
Ref<CachedModuleScript> CachedModuleScript::create(const String& nonce, const String& crossOriginMode)
{
return adoptRef(*new CachedModuleScript(nonce, crossOriginMode));
}
CachedModuleScript::CachedModuleScript(const String& nonce, const String& crossOriginMode)
: m_nonce(nonce)
, m_crossOriginMode(crossOriginMode)
{
}
void CachedModuleScript::load(Element& initiator, const URL& rootURL)
{
if (auto* frame = initiator.document().frame())
frame->script().loadModuleScript(*this, rootURL.string(), initiator);
}
void CachedModuleScript::load(Element& initiator, const ScriptSourceCode& sourceCode)
{
if (auto* frame = initiator.document().frame())
frame->script().loadModuleScript(*this, sourceCode, initiator);
}
void CachedModuleScript::notifyLoadCompleted(UniquedStringImpl& moduleKey)
{
m_moduleKey = &moduleKey;
notifyClientFinished();
}
void CachedModuleScript::notifyLoadFailed(LoadableScript::Error&& error)
{
m_error = WTFMove(error);
notifyClientFinished();
}
void CachedModuleScript::notifyLoadWasCanceled()
{
m_wasCanceled = true;
notifyClientFinished();
}
void CachedModuleScript::notifyClientFinished()
{
m_isLoaded = true;
Ref<CachedModuleScript> protectedThis(*this);
Vector<CachedModuleScriptClient*> clients;
copyToVector(m_clients, clients);
for (auto& client : clients)
client->notifyFinished(*this);
}
void CachedModuleScript::addClient(CachedModuleScriptClient& client)
{
m_clients.add(&client);
if (!isLoaded())
return;
Ref<CachedModuleScript> protectedThis(*this);
client.notifyFinished(*this);
}
void CachedModuleScript::removeClient(CachedModuleScriptClient& client)
{
m_clients.remove(&client);
}
}