/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom_struct::dom_struct; use js::rust::HandleObject; use crate::dom::bindings::codegen::Bindings::MessageChannelBinding::MessageChannelMethods; use crate::dom::bindings::reflector::{Reflector, reflect_dom_object_with_proto}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::globalscope::GlobalScope; use crate::dom::messageport::MessagePort; use crate::script_runtime::CanGc; #[dom_struct] pub(crate) struct MessageChannel { reflector_: Reflector, port1: Dom, port2: Dom, } impl MessageChannel { /// fn new( incumbent: &GlobalScope, proto: Option, can_gc: CanGc, ) -> DomRoot { // Step 1 let port1 = MessagePort::new(incumbent, can_gc); // Step 2 let port2 = MessagePort::new(incumbent, can_gc); incumbent.track_message_port(&port1, None); incumbent.track_message_port(&port2, None); // Step 3 incumbent.entangle_ports(*port1.message_port_id(), *port2.message_port_id()); // Steps 4-6 reflect_dom_object_with_proto( Box::new(MessageChannel::new_inherited(&port1, &port2)), incumbent, proto, can_gc, ) } pub(crate) fn new_inherited(port1: &MessagePort, port2: &MessagePort) -> MessageChannel { MessageChannel { reflector_: Reflector::new(), port1: Dom::from_ref(port1), port2: Dom::from_ref(port2), } } } impl MessageChannelMethods for MessageChannel { /// fn Constructor( global: &GlobalScope, proto: Option, can_gc: CanGc, ) -> DomRoot { MessageChannel::new(global, proto, can_gc) } /// fn Port1(&self) -> DomRoot { DomRoot::from_ref(&*self.port1) } /// fn Port2(&self) -> DomRoot { DomRoot::from_ref(&*self.port2) } }