mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
MessagePort: implement disentanglement (#36654)
Implement [disentangle](https://html.spec.whatwg.org/multipage/#disentangle) Remove bespoke gc logic which now becomes unnecessary. Adds a wpt test that hits the "disentangle while in transfer" logic. Updates streams code, fixing an error where disentanglement is conditional on an error. Test coverage: there are existing tests in `/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js` for the no transfer case, and the simple completed transfer case, and this PR adds a test for the more complicated transfer in progress case. Fix https://github.com/servo/servo/issues/36465 --------- Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
This commit is contained in:
parent
c46402e222
commit
af5d665efa
19 changed files with 356 additions and 191 deletions
|
@ -157,18 +157,29 @@ pub struct PortMessageTask {
|
|||
pub data: StructuredSerializedData,
|
||||
}
|
||||
|
||||
/// The information needed by a global to process the transfer of a port.
|
||||
#[derive(Debug, Deserialize, MallocSizeOf, Serialize)]
|
||||
pub struct PortTransferInfo {
|
||||
/// <https://html.spec.whatwg.org/multipage/#port-message-queue>
|
||||
pub port_message_queue: VecDeque<PortMessageTask>,
|
||||
/// A boolean indicating whether the port has been disentangled while in transfer,
|
||||
/// if so, the disentanglement should be completed along with the transfer.
|
||||
/// <https://html.spec.whatwg.org/multipage/#disentangle>
|
||||
pub disentangled: bool,
|
||||
}
|
||||
|
||||
/// Messages for communication between the constellation and a global managing ports.
|
||||
#[derive(Debug, Deserialize, Serialize)]
|
||||
#[allow(clippy::large_enum_variant)]
|
||||
pub enum MessagePortMsg {
|
||||
/// Complete the transfer for a batch of ports.
|
||||
CompleteTransfer(HashMap<MessagePortId, VecDeque<PortMessageTask>>),
|
||||
CompleteTransfer(HashMap<MessagePortId, PortTransferInfo>),
|
||||
/// Complete the transfer of a single port,
|
||||
/// whose transfer was pending because it had been requested
|
||||
/// while a previous failed transfer was being rolled-back.
|
||||
CompletePendingTransfer(MessagePortId, VecDeque<PortMessageTask>),
|
||||
/// Remove a port, the entangled one doesn't exists anymore.
|
||||
RemoveMessagePort(MessagePortId),
|
||||
CompletePendingTransfer(MessagePortId, PortTransferInfo),
|
||||
/// <https://html.spec.whatwg.org/multipage/#disentangle>
|
||||
CompleteDisentanglement(MessagePortId),
|
||||
/// Handle a new port-message-task.
|
||||
NewTask(MessagePortId, PortMessageTask),
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue