diff --git a/moli-core/src/dom/tests.rs b/moli-core/src/dom/tests.rs
index 330cf3f983..dfa1c48cf2 100644
--- a/moli-core/src/dom/tests.rs
+++ b/moli-core/src/dom/tests.rs
@@ -1,6 +1,6 @@
use url::Url;
-use crate::{parser::HtmlParser, renderer::ReflectorRegistry};
+use crate::parser::HtmlParser;
use super::native::{NativeDom, NodeType};
@@ -187,19 +187,6 @@ fn native_dom_treats_noscript_contents_as_raw_text_when_scripting_is_enabled() {
);
}
-#[test]
-fn native_dom_node_ids_can_be_interned_by_reflector_registry() {
- let native_dom = parse_fixture("
ok
");
- let body_node_id = native_dom.body_node_id().expect("body should exist");
-
- let mut registry = ReflectorRegistry::default();
- let first = registry.intern(body_node_id);
- let second = registry.intern(body_node_id);
-
- assert_eq!(first.id(), second.id());
- assert_eq!(registry.len(), 1);
-}
-
#[test]
fn native_dom_exposes_node_traversal_and_equality_helpers() {
let native_dom = parse_fixture(
diff --git a/moli-core/src/renderer.rs b/moli-core/src/renderer.rs
index 9e94698407..e96675a724 100644
--- a/moli-core/src/renderer.rs
+++ b/moli-core/src/renderer.rs
@@ -76,7 +76,5 @@ pub(crate) fn materialize_page_created_reply_with_side_effect(
})
}
-#[cfg(test)]
-pub(crate) use moli_renderer_v8::ReflectorRegistry;
#[cfg(test)]
pub(crate) use moli_renderer_v8::{PageId, RendererPageTestingHandle, RendererPageView};
diff --git a/moli-renderer-v8/src/lib.rs b/moli-renderer-v8/src/lib.rs
index 44db7e74a0..2290b9cbd7 100644
--- a/moli-renderer-v8/src/lib.rs
+++ b/moli-renderer-v8/src/lib.rs
@@ -82,7 +82,6 @@ mod parser_script;
mod queue_microtask;
mod range_boundary;
mod referrer_policy;
-pub(crate) mod reflector;
mod render_runtime;
mod renderer_resource_scheduler;
mod resource_owner;
@@ -214,7 +213,6 @@ pub use host::{
};
pub use local_executor::is_on_js_local_executor;
pub use native_bridge::element::ClientRect as RendererClientRect;
-pub use reflector::ReflectorRegistry;
pub use runtime::RendererRuntimeInspectorMessageResponseOrder;
pub use runtime::{
DetachedParserScriptFetchContinuation, DevToolsSessionKey, ExternalRawDocumentBodyStream,
diff --git a/moli-renderer-v8/src/native_bridge/bindings.rs b/moli-renderer-v8/src/native_bridge/bindings.rs
index d3b6731dcf..6ab85cba2c 100644
--- a/moli-renderer-v8/src/native_bridge/bindings.rs
+++ b/moli-renderer-v8/src/native_bridge/bindings.rs
@@ -6,8 +6,9 @@ use moli_webapi_declare::WebApiObject;
use super::super::context_bootstrap::bridge_descriptor::{
WrapperKind, node_bridge_descriptor, node_bridge_descriptors,
};
-use super::super::reflector::ReflectorId;
-use super::{BridgeHandle, JsContextHost, collections, document, element, traversal, window};
+use super::{
+ BridgeHandle, JsContextHost, ReflectorId, collections, document, element, traversal, window,
+};
mod native_template;
mod node_template;
diff --git a/moli-renderer-v8/src/native_bridge/bridge/wrappers.rs b/moli-renderer-v8/src/native_bridge/bridge/wrappers.rs
index 9bb06ddfd2..6de7b49d88 100644
--- a/moli-renderer-v8/src/native_bridge/bridge/wrappers.rs
+++ b/moli-renderer-v8/src/native_bridge/bridge/wrappers.rs
@@ -23,7 +23,7 @@ impl NativeDomBridge {
) -> Option> {
let reflector_id = self
.identity
- .existing_reflector_id(BridgeHandle::Node(handle))?;
+ .existing_reflector_id(&BridgeHandle::Node(handle))?;
self.identity.cached_wrapper(scope, reflector_id)
}
@@ -49,7 +49,7 @@ impl NativeDomBridge {
host_ptr: *mut JsContextHost,
handle: BridgeHandle,
) -> Option> {
- let reflector_id = self.identity.reflector_id(handle.clone());
+ let reflector_id = self.identity.reflector_id(&handle);
if let Some(wrapper) = self.identity.cached_wrapper(scope, reflector_id) {
if !matches!(&handle, BridgeHandle::Window) {
self.bindings
diff --git a/moli-renderer-v8/src/native_bridge/identity.rs b/moli-renderer-v8/src/native_bridge/identity.rs
index db4d0a551b..aa6abb341e 100644
--- a/moli-renderer-v8/src/native_bridge/identity.rs
+++ b/moli-renderer-v8/src/native_bridge/identity.rs
@@ -6,12 +6,39 @@ use std::{
rc::Rc,
};
-use super::super::{
- document_runtime::DomHandle,
- reflector::{DomPtr, ReflectorId, ReflectorRegistry},
-};
+use indexmap::IndexSet;
+
+use super::super::document_runtime::DomHandle;
use super::element::{control_label_handles, form_control_elements};
use super::{JsContextHost, RuntimeObservableContextToken};
+use dense_reflector_map::DenseReflectorMap;
+
+mod dense_reflector_map;
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+pub(super) struct ReflectorId(u64);
+
+impl ReflectorId {
+ pub(super) fn from_raw(raw: u64) -> Self {
+ Self(raw)
+ }
+
+ fn from_index(index: usize) -> Self {
+ let raw = u64::try_from(index)
+ .ok()
+ .and_then(|index| index.checked_add(1))
+ .expect("reflector id overflow");
+ Self(raw)
+ }
+
+ fn index(self) -> Option {
+ usize::try_from(self.0.checked_sub(1)?).ok()
+ }
+
+ pub(super) fn raw(self) -> u64 {
+ self.0
+ }
+}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub(super) enum BridgeHandle {
@@ -394,105 +421,6 @@ struct BridgeContextWrapperCache {
live_collection_wrappers: HashMap,
}
-const MAX_DENSE_REFLECTOR_ID_GAP: u64 = 64;
-
-#[derive(Debug)]
-struct DenseReflectorMap {
- dense_base: Option,
- dense: Vec