aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/script_module.rs
diff options
context:
space:
mode:
authorCYBAI <cyb.ai.815@gmail.com>2020-05-16 14:09:41 +0900
committerCYBAI <cyb.ai.815@gmail.com>2020-05-17 11:34:35 +0900
commit6bc624001bf124921e337b8e67d5238cc147744d (patch)
treefd206b3ad826f234a617a456ecb44bbe1bd2f7b6 /components/script/script_module.rs
parent0a00ea3db3c2353c78435030040fd3f57f5f4497 (diff)
downloadservo-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.rs36
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,