diff options
Diffstat (limited to 'components/shared/script/transferable.rs')
-rw-r--r-- | components/shared/script/transferable.rs | 161 |
1 files changed, 0 insertions, 161 deletions
diff --git a/components/shared/script/transferable.rs b/components/shared/script/transferable.rs deleted file mode 100644 index 8344dd493b0..00000000000 --- a/components/shared/script/transferable.rs +++ /dev/null @@ -1,161 +0,0 @@ -/* 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 https://mozilla.org/MPL/2.0/. */ - -//! This module contains implementations in script that are transferable. -//! The implementations are here instead of in script -//! so that the other modules involved in the transfer don't have -//! to depend on script. - -use std::collections::VecDeque; - -use base::id::MessagePortId; -use malloc_size_of_derive::MallocSizeOf; -use serde::{Deserialize, Serialize}; - -use crate::PortMessageTask; - -#[derive(Debug, Deserialize, MallocSizeOf, Serialize)] -enum MessagePortState { - /// <https://html.spec.whatwg.org/multipage/#detached> - Detached, - /// <https://html.spec.whatwg.org/multipage/#port-message-queue> - /// The message-queue of this port is enabled, - /// the boolean represents awaiting completion of a transfer. - Enabled(bool), - /// <https://html.spec.whatwg.org/multipage/#port-message-queue> - /// The message-queue of this port is disabled, - /// the boolean represents awaiting completion of a transfer. - Disabled(bool), -} - -#[derive(Debug, Deserialize, MallocSizeOf, Serialize)] -/// The data and logic backing the DOM managed MessagePort. -pub struct MessagePortImpl { - /// The current state of the port. - state: MessagePortState, - - /// <https://html.spec.whatwg.org/multipage/#entangle> - entangled_port: Option<MessagePortId>, - - /// <https://html.spec.whatwg.org/multipage/#port-message-queue> - message_buffer: Option<VecDeque<PortMessageTask>>, - - /// The UUID of this port. - message_port_id: MessagePortId, -} - -impl MessagePortImpl { - /// Create a new messageport impl. - pub fn new(port_id: MessagePortId) -> MessagePortImpl { - MessagePortImpl { - state: MessagePortState::Disabled(false), - entangled_port: None, - message_buffer: None, - message_port_id: port_id, - } - } - - /// Get the Id. - pub fn message_port_id(&self) -> &MessagePortId { - &self.message_port_id - } - - /// Maybe get the Id of the entangled port. - pub fn entangled_port_id(&self) -> Option<MessagePortId> { - self.entangled_port - } - - /// Entanged this port with another. - pub fn entangle(&mut self, other_id: MessagePortId) { - self.entangled_port = Some(other_id); - } - - /// Is this port enabled? - pub fn enabled(&self) -> bool { - matches!(self.state, MessagePortState::Enabled(_)) - } - - /// Mark this port as having been shipped. - /// <https://html.spec.whatwg.org/multipage/#has-been-shipped> - pub fn set_has_been_shipped(&mut self) { - match self.state { - MessagePortState::Detached => { - panic!("Messageport set_has_been_shipped called in detached state") - }, - MessagePortState::Enabled(_) => self.state = MessagePortState::Enabled(true), - MessagePortState::Disabled(_) => self.state = MessagePortState::Disabled(true), - } - } - - /// Handle the completion of the transfer, - /// this is data received from the constellation. - pub fn complete_transfer(&mut self, mut tasks: VecDeque<PortMessageTask>) { - match self.state { - MessagePortState::Detached => return, - MessagePortState::Enabled(_) => self.state = MessagePortState::Enabled(false), - MessagePortState::Disabled(_) => self.state = MessagePortState::Disabled(false), - } - - // Note: these are the tasks that were buffered while the transfer was ongoing, - // hence they need to execute first. - // The global will call `start` if we are enabled, - // which will add tasks on the event-loop to dispatch incoming messages. - match self.message_buffer { - Some(ref mut incoming_buffer) => { - while let Some(task) = tasks.pop_back() { - incoming_buffer.push_front(task); - } - }, - None => self.message_buffer = Some(tasks), - } - } - - /// A message was received from our entangled port, - /// returns an optional task to be dispatched. - pub fn handle_incoming(&mut self, task: PortMessageTask) -> Option<PortMessageTask> { - let should_dispatch = match self.state { - MessagePortState::Detached => return None, - MessagePortState::Enabled(in_transfer) => !in_transfer, - MessagePortState::Disabled(_) => false, - }; - - if should_dispatch { - Some(task) - } else { - match self.message_buffer { - Some(ref mut buffer) => { - buffer.push_back(task); - }, - None => { - let mut queue = VecDeque::new(); - queue.push_back(task); - self.message_buffer = Some(queue); - }, - } - None - } - } - - /// <https://html.spec.whatwg.org/multipage/#dom-messageport-start> - /// returns an optional queue of tasks that were buffered while the port was disabled. - pub fn start(&mut self) -> Option<VecDeque<PortMessageTask>> { - match self.state { - MessagePortState::Detached => return None, - MessagePortState::Enabled(_) => {}, - MessagePortState::Disabled(in_transfer) => { - self.state = MessagePortState::Enabled(in_transfer); - }, - } - if let MessagePortState::Enabled(true) = self.state { - return None; - } - self.message_buffer.take() - } - - /// <https://html.spec.whatwg.org/multipage/#dom-messageport-close> - pub fn close(&mut self) { - // Step 1 - self.state = MessagePortState::Detached; - } -} |