diff options
Diffstat (limited to 'components/script/dom/websocket.rs')
-rw-r--r-- | components/script/dom/websocket.rs | 99 |
1 files changed, 49 insertions, 50 deletions
diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs index 957793e34cd..8f45c472c76 100644 --- a/components/script/dom/websocket.rs +++ b/components/script/dom/websocket.rs @@ -144,9 +144,56 @@ impl WebSocket { ) } + // https://html.spec.whatwg.org/multipage/#dom-websocket-send + fn send_impl(&self, data_byte_len: u64) -> Fallible<bool> { + let return_after_buffer = match self.ready_state.get() { + WebSocketRequestState::Connecting => { + return Err(Error::InvalidState); + }, + WebSocketRequestState::Open => false, + WebSocketRequestState::Closing | WebSocketRequestState::Closed => true, + }; + + let address = Trusted::new(self); + + match data_byte_len.checked_add(self.buffered_amount.get()) { + None => panic!(), + Some(new_amount) => self.buffered_amount.set(new_amount), + }; + + if return_after_buffer { + return Ok(false); + } + + if !self.clearing_buffer.get() && self.ready_state.get() == WebSocketRequestState::Open { + self.clearing_buffer.set(true); + + let task = Box::new(BufferedAmountTask { address }); + + let pipeline_id = self.global().pipeline_id(); + self.global() + .script_chan() + // TODO: Use a dedicated `websocket-task-source` task source instead. + .send(CommonScriptMsg::Task( + WebSocketEvent, + task, + Some(pipeline_id), + WebsocketTaskSource::NAME, + )) + .unwrap(); + } + + Ok(true) + } + + pub fn origin(&self) -> ImmutableOrigin { + self.url.origin() + } +} + +impl WebSocketMethods for WebSocket { /// <https://html.spec.whatwg.org/multipage/#dom-websocket> - #[allow(non_snake_case)] - pub fn Constructor( + fn Constructor( global: &GlobalScope, proto: Option<HandleObject>, can_gc: CanGc, @@ -257,54 +304,6 @@ impl WebSocket { Ok(ws) } - // https://html.spec.whatwg.org/multipage/#dom-websocket-send - fn send_impl(&self, data_byte_len: u64) -> Fallible<bool> { - let return_after_buffer = match self.ready_state.get() { - WebSocketRequestState::Connecting => { - return Err(Error::InvalidState); - }, - WebSocketRequestState::Open => false, - WebSocketRequestState::Closing | WebSocketRequestState::Closed => true, - }; - - let address = Trusted::new(self); - - match data_byte_len.checked_add(self.buffered_amount.get()) { - None => panic!(), - Some(new_amount) => self.buffered_amount.set(new_amount), - }; - - if return_after_buffer { - return Ok(false); - } - - if !self.clearing_buffer.get() && self.ready_state.get() == WebSocketRequestState::Open { - self.clearing_buffer.set(true); - - let task = Box::new(BufferedAmountTask { address }); - - let pipeline_id = self.global().pipeline_id(); - self.global() - .script_chan() - // TODO: Use a dedicated `websocket-task-source` task source instead. - .send(CommonScriptMsg::Task( - WebSocketEvent, - task, - Some(pipeline_id), - WebsocketTaskSource::NAME, - )) - .unwrap(); - } - - Ok(true) - } - - pub fn origin(&self) -> ImmutableOrigin { - self.url.origin() - } -} - -impl WebSocketMethods for WebSocket { // https://html.spec.whatwg.org/multipage/#handler-websocket-onopen event_handler!(open, GetOnopen, SetOnopen); |