Bug 1427610 - Implement import.meta in the browser r=bkelly

This commit is contained in:
Jon Coppeard 2018-05-23 09:30:13 +01:00
Родитель 5e77cd6fcb
Коммит a844ec84c4
3 изменённых файлов: 50 добавлений и 4 удалений

Просмотреть файл

@ -785,6 +785,34 @@ HostResolveImportedModule(JSContext* aCx, JS::Handle<JSObject*> aModule,
return ms->ModuleRecord();
}
bool
HostPopulateImportMeta(JSContext* aCx, JS::Handle<JSObject*> aModule,
JS::Handle<JSObject*> aMetaObject)
{
MOZ_DIAGNOSTIC_ASSERT(aModule);
JS::Value value = JS::GetModuleHostDefinedField(aModule);
if (value.isUndefined()) {
JS_ReportErrorASCII(aCx, "Module script not found");
return false;
}
auto script = static_cast<ModuleScript*>(value.toPrivate());
MOZ_DIAGNOSTIC_ASSERT(script->ModuleRecord() == aModule);
nsAutoCString url;
MOZ_DIAGNOSTIC_ASSERT(script->BaseURL());
MOZ_ALWAYS_SUCCEEDS(script->BaseURL()->GetAsciiSpec(url));
JS::Rooted<JSString*> urlString(aCx, JS_NewStringCopyZ(aCx, url.get()));
if (!urlString) {
JS_ReportOutOfMemory(aCx);
return false;
}
return JS_DefineProperty(aCx, aMetaObject, "url", urlString, JSPROP_ENUMERATE);
}
static void
EnsureModuleResolveHook(JSContext* aCx)
{
@ -794,6 +822,7 @@ EnsureModuleResolveHook(JSContext* aCx)
}
JS::SetModuleResolveHook(rt, HostResolveImportedModule);
JS::SetModuleMetadataHook(rt, HostPopulateImportMeta);
}
void

Просмотреть файл

@ -1,4 +0,0 @@
[import-meta-url.html]
[Untitled]
expected: FAIL

Просмотреть файл

@ -21,6 +21,27 @@ test(() => {
base + "/import-meta-dependent.js");
}, "import.meta.url in a dependent external script");
test(() => {
assert_equals(typeof importMetaOnRootModule, "object");
assert_not_equals(importMetaOnRootModule, null);
}, "import.meta is an object");
test(() => {
importMetaOnRootModule.newProperty = 1;
assert_true(Object.isExtensible(importMetaOnRootModule));
}, "import.meta is extensible");
test(() => {
let names = new Set(Reflect.ownKeys(importMetaOnRootModule));
for (name of names) {
var desc = Object.getOwnPropertyDescriptor(importMetaOnRootModule, name);
assert_equals(desc.writable, true);
assert_equals(desc.enumerable, true);
assert_equals(desc.configurable, true);
}
}, "import.meta's properties are writable, configurable, and enumerable");
import { importMetaOnRootModule as hashedImportMetaOnRootModule1,
importMetaOnDependentModule as hashedImportMetaOnDependentModule1 }
from "./import-meta-root.js#1";