Skip to content

Commit

Permalink
Introduce import.meta hook for module script
Browse files Browse the repository at this point in the history
  • Loading branch information
CYBAI committed May 17, 2020
1 parent 0a00ea3 commit 6bc6240
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 5 deletions.
36 changes: 35 additions & 1 deletion components/script/script_module.rs
Expand Up @@ -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};
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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,
Expand Down
2 changes: 0 additions & 2 deletions tests/wpt/include.ini
Expand Up @@ -121,8 +121,6 @@ skip: true
skip: false
[dynamic-import]
skip: true
[import-meta]
skip: true
[moving-between-documents]
skip: true
[js]
Expand Down

This file was deleted.

0 comments on commit 6bc6240

Please sign in to comment.