/* 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<MessagePort>, port2: Dom<MessagePort>, } impl MessageChannel { /// <https://html.spec.whatwg.org/multipage/#dom-messagechannel> fn new( incumbent: &GlobalScope, proto: Option<HandleObject>, can_gc: CanGc, ) -> DomRoot<MessageChannel> { // 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<crate::DomTypeHolder> for MessageChannel { /// <https://html.spec.whatwg.org/multipage/#dom-messagechannel> fn Constructor( global: &GlobalScope, proto: Option<HandleObject>, can_gc: CanGc, ) -> DomRoot<MessageChannel> { MessageChannel::new(global, proto, can_gc) } /// <https://html.spec.whatwg.org/multipage/#dom-messagechannel-port1> fn Port1(&self) -> DomRoot<MessagePort> { DomRoot::from_ref(&*self.port1) } /// <https://html.spec.whatwg.org/multipage/#dom-messagechannel-port2> fn Port2(&self) -> DomRoot<MessagePort> { DomRoot::from_ref(&*self.port2) } }