JSModuleLoader.cpp [plain text]
#include "config.h"
#include "JSModuleLoader.h"
#include "Document.h"
#include "ExceptionCode.h"
#include "Frame.h"
#include "JSDOMBinding.h"
#include <runtime/JSInternalPromiseDeferred.h>
#include <runtime/JSModuleRecord.h>
#include <runtime/JSString.h>
#include <runtime/Symbol.h>
namespace WebCore {
JSModuleLoader::JSModuleLoader(Document& document)
: m_document(document)
{
}
JSC::JSInternalPromise* JSModuleLoader::resolve(JSC::JSGlobalObject* globalObject, JSC::ExecState* exec, JSC::JSValue moduleNameValue, JSC::JSValue importerModuleKey)
{
JSC::JSInternalPromiseDeferred* deferred = JSC::JSInternalPromiseDeferred::create(exec, globalObject);
if (moduleNameValue.isSymbol())
return deferred->resolve(exec, moduleNameValue);
if (!moduleNameValue.isString())
return deferred->reject(exec, JSC::createTypeError(exec, "Module name is not Symbol or String."));
String moduleName = asString(moduleNameValue)->value(exec);
URL completedUrl;
if (importerModuleKey.isSymbol())
completedUrl = m_document.completeURL(moduleName);
else if (importerModuleKey.isUndefined())
completedUrl = m_document.completeURL(moduleName);
else if (importerModuleKey.isString()) {
URL importerModuleUrl(URL(), asString(importerModuleKey)->value(exec));
if (!importerModuleUrl.isValid())
return deferred->reject(exec, JSC::createTypeError(exec, "Importer module key is an invalid URL."));
completedUrl = m_document.completeURL(moduleName, importerModuleUrl);
} else
return deferred->reject(exec, JSC::createTypeError(exec, "Importer module key is not Symbol or String."));
if (!completedUrl.isValid())
return deferred->reject(exec, JSC::createTypeError(exec, "Module name constructs an invalid URL."));
return deferred->resolve(exec, jsString(exec, completedUrl.string()));
}
JSC::JSInternalPromise* JSModuleLoader::fetch(JSC::JSGlobalObject* globalObject, JSC::ExecState* exec, JSC::JSValue moduleKeyValue)
{
JSC::JSInternalPromiseDeferred* deferred = JSC::JSInternalPromiseDeferred::create(exec, globalObject);
if (moduleKeyValue.isSymbol())
return deferred->reject(exec, JSC::createTypeError(exec, "Symbol module key should be already fulfilled with the inlined resource."));
if (!moduleKeyValue.isString())
return deferred->reject(exec, JSC::createTypeError(exec, "Module key is not Symbol or String."));
URL completedUrl(URL(), asString(moduleKeyValue)->value(exec));
if (!completedUrl.isValid())
return deferred->reject(exec, JSC::createTypeError(exec, "Module key is an invalid URL."));
return deferred->promise();
}
JSC::JSValue JSModuleLoader::evaluate(JSC::JSGlobalObject*, JSC::ExecState* exec, JSC::JSValue moduleKeyValue, JSC::JSValue moduleRecordValue)
{
JSC::JSModuleRecord* moduleRecord = JSC::jsDynamicCast<JSC::JSModuleRecord*>(moduleRecordValue);
if (!moduleRecord)
return JSC::jsUndefined();
URL sourceUrl;
if (moduleKeyValue.isSymbol())
sourceUrl = m_document.url();
else if (moduleKeyValue.isString())
sourceUrl = URL(URL(), asString(moduleKeyValue)->value(exec));
else
return JSC::throwTypeError(exec, ASCIILiteral("Module key is not Symbol or String."));
if (!sourceUrl.isValid())
return JSC::throwTypeError(exec, ASCIILiteral("Module key is an invalid URL."));
return JSC::jsUndefined();
}
}