diff options
Diffstat (limited to 'core/runtime.rs')
-rw-r--r-- | core/runtime.rs | 74 |
1 files changed, 73 insertions, 1 deletions
diff --git a/core/runtime.rs b/core/runtime.rs index d4a9c697c..377137a01 100644 --- a/core/runtime.rs +++ b/core/runtime.rs @@ -629,7 +629,11 @@ impl JsRuntime { Rc::into_raw(state_rc.clone()) as *mut c_void, ); - let module_map_rc = Rc::new(RefCell::new(ModuleMap::new(loader, op_state))); + let module_map_rc = Rc::new(RefCell::new(ModuleMap::new( + loader, + op_state, + snapshot_options == SnapshotOptions::Load, + ))); if let Some(module_map_data) = module_map_data { let scope = &mut v8::HandleScope::with_context(&mut isolate, global_context); @@ -4928,4 +4932,72 @@ Deno.core.ops.op_async_serialize_object_with_numbers_as_keys({ ) .is_ok()); } + + #[tokio::test] + async fn cant_load_internal_module_when_snapshot_is_loaded_and_not_snapshotting( + ) { + #[derive(Default)] + struct ModsLoader; + + impl ModuleLoader for ModsLoader { + fn resolve( + &self, + specifier: &str, + referrer: &str, + _kind: ResolutionKind, + ) -> Result<ModuleSpecifier, Error> { + assert_eq!(specifier, "file:///main.js"); + assert_eq!(referrer, "."); + let s = crate::resolve_import(specifier, referrer).unwrap(); + Ok(s) + } + + fn load( + &self, + _module_specifier: &ModuleSpecifier, + _maybe_referrer: Option<ModuleSpecifier>, + _is_dyn_import: bool, + ) -> Pin<Box<ModuleSourceFuture>> { + let source = r#" + // This module doesn't really exist, just verifying that we'll get + // an error when specifier starts with "internal:". + import { core } from "internal:core.js"; + "#; + + async move { + Ok(ModuleSource { + code: source.as_bytes().to_vec().into_boxed_slice(), + module_url_specified: "file:///main.js".to_string(), + module_url_found: "file:///main.js".to_string(), + module_type: ModuleType::JavaScript, + }) + } + .boxed_local() + } + } + + let snapshot = { + let runtime = JsRuntime::new(RuntimeOptions { + will_snapshot: true, + ..Default::default() + }); + let snap: &[u8] = &runtime.snapshot(); + Vec::from(snap).into_boxed_slice() + }; + + let mut runtime2 = JsRuntime::new(RuntimeOptions { + module_loader: Some(Rc::new(ModsLoader)), + startup_snapshot: Some(Snapshot::Boxed(snapshot)), + ..Default::default() + }); + + let err = runtime2 + .load_main_module(&crate::resolve_url("file:///main.js").unwrap(), None) + .await + .unwrap_err(); + assert_eq!( + err.to_string(), + "Cannot load internal module from external code" + ); + } } |