diff options
author | CYBAI <cyb.ai.815@gmail.com> | 2020-05-16 14:09:41 +0900 |
---|---|---|
committer | CYBAI <cyb.ai.815@gmail.com> | 2020-05-17 11:34:35 +0900 |
commit | 6bc624001bf124921e337b8e67d5238cc147744d (patch) | |
tree | fd206b3ad826f234a617a456ecb44bbe1bd2f7b6 /components/script/script_module.rs | |
parent | 0a00ea3db3c2353c78435030040fd3f57f5f4497 (diff) | |
download | servo-6bc624001bf124921e337b8e67d5238cc147744d.tar.gz servo-6bc624001bf124921e337b8e67d5238cc147744d.zip |
Introduce import.meta hook for module script
Diffstat (limited to 'components/script/script_module.rs')
-rw-r--r-- | components/script/script_module.rs | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/components/script/script_module.rs b/components/script/script_module.rs index abbc0241ac5..39933121899 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, |