feat: 端口与通道事件处理器改原型访问器加 dispatchEvent 交付

This commit is contained in:
2026-10-11 09:06:51 +00:00
parent 0ae232c3f5
commit 10caf694b5
6 changed files with 154 additions and 130 deletions
@@ -1,7 +1,7 @@
use std::sync::Arc;
use crate::bind_constructor;
use crate::bindings::{apply_binding_table, bind_accessor_getter, configure_native_constructor};
use crate::bindings::{apply_binding_table, bind_accessor_getset, bind_accessor_getter, configure_native_constructor};
use oxide_kernel::kernel::{KernelCore, KernelSession};
use oxide_types::object::{JsObject, PropAttributes};
use oxide_types::value::JsValue;
@@ -134,4 +134,22 @@ pub fn bind_broadcast_channel(core: &Arc<KernelCore>, session: &KernelSession, g
oxide_builtins::broadcast_channel::broadcast_channel_ready_state::<crate::vm::Vm> as *const (),
);
}
// onmessage / onmessageerror / onerror 访问器属性(getter 读注册表属性条目、
// setter 写),lookup_position 守卫。
for name in ["onmessage", "onmessageerror", "onerror"] {
let key = sf.intern(name).0;
if sh.lookup_position(proto.shape_id(), key).is_none() {
bind_accessor_getset(
core,
session,
proto,
key,
&format!("get {name}"),
&format!("set {name}"),
crate::worker::bindings::worker_event_handler_getter as *const (),
crate::worker::bindings::worker_event_handler_setter as *const (),
);
}
}
}
@@ -1,7 +1,7 @@
use std::sync::Arc;
use crate::bind_constructor;
use crate::bindings::{apply_binding_table, bind_accessor_getter, configure_native_constructor};
use crate::bindings::{apply_binding_table, bind_accessor_getset, bind_accessor_getter, configure_native_constructor};
use oxide_kernel::kernel::{KernelCore, KernelSession};
use oxide_types::object::{JsObject, PropAttributes};
use oxide_types::value::JsValue;
@@ -127,4 +127,22 @@ pub fn bind_message_channel(core: &Arc<KernelCore>, session: &KernelSession, glo
oxide_builtins::message_channel::message_port_ready_state::<crate::vm::Vm> as *const (),
);
}
// onmessage / onmessageerror / onerror 访问器属性(getter 读注册表属性条目、
// setter 写),lookup_position 守卫。
for name in ["onmessage", "onmessageerror", "onerror"] {
let key = sf.intern(name).0;
if sh.lookup_position(proto.shape_id(), key).is_none() {
bind_accessor_getset(
core,
session,
proto,
key,
&format!("get {name}"),
&format!("set {name}"),
crate::worker::bindings::worker_event_handler_getter as *const (),
crate::worker::bindings::worker_event_handler_setter as *const (),
);
}
}
}