зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1427610 - Implement import.meta in the browser r=bkelly
This commit is contained in:
Родитель
5e77cd6fcb
Коммит
a844ec84c4
|
@ -785,6 +785,34 @@ HostResolveImportedModule(JSContext* aCx, JS::Handle<JSObject*> aModule,
|
||||||
return ms->ModuleRecord();
|
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
|
static void
|
||||||
EnsureModuleResolveHook(JSContext* aCx)
|
EnsureModuleResolveHook(JSContext* aCx)
|
||||||
{
|
{
|
||||||
|
@ -794,6 +822,7 @@ EnsureModuleResolveHook(JSContext* aCx)
|
||||||
}
|
}
|
||||||
|
|
||||||
JS::SetModuleResolveHook(rt, HostResolveImportedModule);
|
JS::SetModuleResolveHook(rt, HostResolveImportedModule);
|
||||||
|
JS::SetModuleMetadataHook(rt, HostPopulateImportMeta);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[import-meta-url.html]
|
|
||||||
[Untitled]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -21,6 +21,27 @@ test(() => {
|
||||||
base + "/import-meta-dependent.js");
|
base + "/import-meta-dependent.js");
|
||||||
}, "import.meta.url in a dependent external script");
|
}, "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,
|
import { importMetaOnRootModule as hashedImportMetaOnRootModule1,
|
||||||
importMetaOnDependentModule as hashedImportMetaOnDependentModule1 }
|
importMetaOnDependentModule as hashedImportMetaOnDependentModule1 }
|
||||||
from "./import-meta-root.js#1";
|
from "./import-meta-root.js#1";
|
||||||
|
|
Загрузка…
Ссылка в новой задаче