diff --git a/moli-renderer-v8/src/context_bootstrap/window_runtime/navigator.rs b/moli-renderer-v8/src/context_bootstrap/window_runtime/navigator.rs index 324bd6fdc8..6b65b706df 100644 --- a/moli-renderer-v8/src/context_bootstrap/window_runtime/navigator.rs +++ b/moli-renderer-v8/src/context_bootstrap/window_runtime/navigator.rs @@ -3345,14 +3345,15 @@ fn strings_to_array<'s>( scope: &mut v8::PinScope<'s, '_>, values: &[String], ) -> v8::Local<'s, v8::Array> { - let array = v8::Array::new(scope, values.len() as i32); - for (index, value) in values.iter().enumerate() { - let Some(value) = v8_string(scope, value) else { - continue; - }; - let _ = array.set_index(scope, index as u32, value.into()); + let mut elements = Vec::with_capacity(values.len()); + for value in values { + elements.push( + v8_string(scope, value) + .expect("storage name should allocate") + .into(), + ); } - array + v8::Array::new_with_elements(scope, &elements) } pub(in crate::context_bootstrap) fn navigator_ua_data_to_json_callback<'s>( diff --git a/moli-renderer-v8/src/script_vm/tests/mod.rs b/moli-renderer-v8/src/script_vm/tests/mod.rs index 50fc47b6b5..9bda52dbe6 100644 --- a/moli-renderer-v8/src/script_vm/tests/mod.rs +++ b/moli-renderer-v8/src/script_vm/tests/mod.rs @@ -2167,6 +2167,7 @@ mod readable_algorithm_arrays; mod remote_playback_interface; mod rendering_update; mod script_terminal_completion; +mod storage_dense_name_arrays; mod streams; mod svg_filter_interfaces; mod svg_number_validation; diff --git a/moli-renderer-v8/src/script_vm/tests/storage_dense_name_arrays.rs b/moli-renderer-v8/src/script_vm/tests/storage_dense_name_arrays.rs new file mode 100644 index 0000000000..38397513df --- /dev/null +++ b/moli-renderer-v8/src/script_vm/tests/storage_dense_name_arrays.rs @@ -0,0 +1,43 @@ +use super::*; + +#[tokio::test(flavor = "current_thread")] +async fn storage_name_arrays_ignore_numeric_prototype_properties() { + let loader = static_http_loader(std::iter::empty::()); + let mut vm = new_storage_page_task_executor_test_vm_with_loader( + "https://storage-dense-name-arrays.test/", + &loader, + ); + assert_eq!(vm.eval(r#"(() => { + const own=Object.getOwnPropertyDescriptor,define=Object.defineProperty; + globalThis.__storageNameArrayFacts={complete:false,error:null}; + (async()=>{ + const apis=[navigator.storageBuckets,caches]; + for(let a=0;a{__storageNameArrayFacts.error=String(error);}).finally(()=>{__storageNameArrayFacts.complete=true;}); + return 'ok'; +})()"#).expect("native regression"), "ok"); + advance_page_task_executor_until_eval_equals( + &mut vm, + &loader, + "String(__storageNameArrayFacts.complete)", + "true", + "dense-storage-names", + ) + .await; + assert_eq!( + vm.eval("String(__storageNameArrayFacts.error)").unwrap(), + "null" + ); +}