use dom_struct::dom_struct;
use js::context::JSContext;
use js::rust::HandleObject;
use crate::dom::bindings::codegen::Bindings::SharedWorkerBinding::SharedWorkerMethods;
use crate::dom::bindings::codegen::UnionTypes::{
StringOrSharedWorkerOptions, TrustedScriptURLOrUSVString,
};
use crate::dom::bindings::error::{Error, Fallible};
use crate::dom::bindings::inheritance::Castable;
use crate::dom::bindings::reflector::reflect_dom_object_with_proto_and_cx;
use crate::dom::bindings::root::{Dom, DomRoot};
use crate::dom::eventtarget::EventTarget;
use crate::dom::globalscope::GlobalScope;
use crate::dom::messageport::MessagePort;
use crate::dom::trustedtypes::trustedscripturl::TrustedScriptURL;
use crate::dom::window::Window;
use crate::script_runtime::CanGc;
#[dom_struct]
pub(crate) struct SharedWorker {
eventtarget: EventTarget,
port: Dom<MessagePort>,
}
impl SharedWorker {
fn new_inherited(port: &MessagePort) -> SharedWorker {
SharedWorker {
eventtarget: EventTarget::new_inherited(),
port: Dom::from_ref(port),
}
}
fn new(
global: &GlobalScope,
proto: Option<HandleObject>,
port: &MessagePort,
cx: &mut js::context::JSContext,
) -> DomRoot<SharedWorker> {
reflect_dom_object_with_proto_and_cx(
Box::new(SharedWorker::new_inherited(port)),
global,
proto,
cx,
)
}
}
impl SharedWorkerMethods<crate::DomTypeHolder> for SharedWorker {
fn Constructor(
cx: &mut JSContext,
window: &Window,
proto: Option<HandleObject>,
script_url: TrustedScriptURLOrUSVString,
options: StringOrSharedWorkerOptions,
) -> Fallible<DomRoot<SharedWorker>> {
let global = window.upcast::<GlobalScope>();
let compliant_script_url = TrustedScriptURL::get_trusted_type_compliant_string(
cx,
global,
script_url,
"SharedWorker constructor",
)?;
match options {
StringOrSharedWorkerOptions::String(name) => {
let _worker_name = name;
},
StringOrSharedWorkerOptions::SharedWorkerOptions(_opts) => {
},
}
let Ok(_worker_url) = global.encoding_parse_a_url(&compliant_script_url.str()) else {
return Err(Error::Syntax(None));
};
let outside_port = MessagePort::new(global, CanGc::from_cx(cx));
global.track_message_port(&outside_port, None);
Ok(SharedWorker::new(global, proto, &outside_port, cx))
}
fn Port(&self) -> DomRoot<MessagePort> {
DomRoot::from_ref(&*self.port)
}
event_handler!(error, GetOnerror, SetOnerror);
}