diff --git a/components/script/script_module.rs b/components/script/script_module.rs index abbc0241ac5f..399331218992 100644 --- a/components/script/script_module.rs +++ b/components/script/script_module.rs @@ -49,6 +49,7 @@ use js::jsapi::{GetRequestedModules, SetModuleMetadataHook}; use js::jsapi::{GetWaitForAllPromise, ModuleEvaluate, ModuleInstantiate}; use js::jsapi::{Heap, JSContext, JS_ClearPendingException, SetModulePrivate}; use js::jsapi::{JSAutoRealm, JSObject, JSString}; +use js::jsapi::{JS_DefineProperty4, JS_NewStringCopyN, JSPROP_ENUMERATE}; use js::jsapi::{SetModuleDynamicImportHook, SetScriptPrivateReferenceHooks}; use js::jsval::{JSVal, PrivateValue, UndefinedValue}; use js::rust::jsapi_wrapped::{GetRequestedModuleSpecifier, JS_GetPendingException}; @@ -1063,7 +1064,7 @@ pub unsafe fn EnsureModuleHooksInitialized(rt: *mut JSRuntime) { } SetModuleResolveHook(rt, Some(HostResolveImportedModule)); - SetModuleMetadataHook(rt, None); + SetModuleMetadataHook(rt, Some(HostPopulateImportMeta)); SetScriptPrivateReferenceHooks(rt, None, None); SetModuleDynamicImportHook(rt, None); @@ -1118,6 +1119,39 @@ unsafe extern "C" fn HostResolveImportedModule( unreachable!() } +#[allow(unsafe_code, non_snake_case)] +/// https://tc39.es/ecma262/#sec-hostgetimportmetaproperties +/// https://html.spec.whatwg.org/multipage/#hostgetimportmetaproperties +unsafe extern "C" fn HostPopulateImportMeta( + cx: *mut JSContext, + reference_private: RawHandleValue, + meta_object: RawHandle<*mut JSObject>, +) -> bool { + let in_realm_proof = AlreadyInRealm::assert_for_cx(SafeJSContext::from_ptr(cx)); + let global_scope = GlobalScope::from_context(cx, InRealm::Already(&in_realm_proof)); + + // Step 2. + let base_url = match (reference_private.to_private() as *const ModuleScript).as_ref() { + Some(module_data) => module_data.base_url.clone(), + None => global_scope.api_base_url(), + }; + + rooted!(in(cx) let url_string = JS_NewStringCopyN( + cx, + base_url.as_str().as_ptr() as *const i8, + base_url.as_str().len() + )); + + // Step 3. + JS_DefineProperty4( + cx, + meta_object, + "url\0".as_ptr() as *const i8, + url_string.handle().into_handle(), + JSPROP_ENUMERATE.into(), + ) +} + /// https://html.spec.whatwg.org/multipage/#fetch-a-module-script-tree pub fn fetch_external_module_script( owner: ModuleOwner, diff --git a/tests/wpt/include.ini b/tests/wpt/include.ini index 13171fab6f8f..e64053982278 100644 --- a/tests/wpt/include.ini +++ b/tests/wpt/include.ini @@ -121,8 +121,6 @@ skip: true skip: false [dynamic-import] skip: true - [import-meta] - skip: true [moving-between-documents] skip: true [js] diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/import-meta/import-meta-url.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/import-meta/import-meta-url.html.ini deleted file mode 100644 index f4f4373816c5..000000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/import-meta/import-meta-url.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[import-meta-url.html] - expected: TIMEOUT