mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
Add Websocket task source
According to the doc: https://html.spec.whatwg.org/multipage/web-sockets.html#network The task source for all tasks queued in the websocket section are the websocket task source, so this commit also updates those references to use the appropriate one.
This commit is contained in:
parent
f7630dad87
commit
5dd6e21c2e
7 changed files with 82 additions and 13 deletions
|
@ -59,6 +59,7 @@ use task_source::file_reading::FileReadingTaskSource;
|
|||
use task_source::networking::NetworkingTaskSource;
|
||||
use task_source::performance_timeline::PerformanceTimelineTaskSource;
|
||||
use task_source::remote_event::RemoteEventTaskSource;
|
||||
use task_source::websocket::WebsocketTaskSource;
|
||||
use time::{Timespec, get_time};
|
||||
use timers::{IsInterval, OneshotTimerCallback, OneshotTimerHandle};
|
||||
use timers::{OneshotTimers, TimerCallback};
|
||||
|
@ -430,6 +431,18 @@ impl GlobalScope {
|
|||
unreachable!();
|
||||
}
|
||||
|
||||
/// `ScriptChan` to send messages to the websocket task source of
|
||||
/// this global scope.
|
||||
pub fn websocket_task_source(&self) -> WebsocketTaskSource {
|
||||
if let Some(window) = self.downcast::<Window>() {
|
||||
return window.websocket_task_source();
|
||||
}
|
||||
if let Some(worker) = self.downcast::<WorkerGlobalScope>() {
|
||||
return worker.websocket_task_source();
|
||||
}
|
||||
unreachable!();
|
||||
}
|
||||
|
||||
/// Evaluate JS code on this global scope.
|
||||
pub fn evaluate_js_on_global_with_result(
|
||||
&self, code: &str, rval: MutableHandleValue) -> bool {
|
||||
|
|
|
@ -39,8 +39,8 @@ use std::cell::Cell;
|
|||
use std::ptr;
|
||||
use std::thread;
|
||||
use task::{TaskOnce, TaskCanceller};
|
||||
use task_source::{TaskSource, TaskSourceName};
|
||||
use task_source::networking::NetworkingTaskSource;
|
||||
use task_source::TaskSource;
|
||||
use task_source::websocket::WebsocketTaskSource;
|
||||
|
||||
#[derive(Clone, Copy, Debug, JSTraceable, MallocSizeOf, PartialEq)]
|
||||
enum WebSocketRequestState {
|
||||
|
@ -70,7 +70,7 @@ mod close_code {
|
|||
|
||||
pub fn close_the_websocket_connection(
|
||||
address: Trusted<WebSocket>,
|
||||
task_source: &NetworkingTaskSource,
|
||||
task_source: &WebsocketTaskSource,
|
||||
canceller: &TaskCanceller,
|
||||
code: Option<u16>,
|
||||
reason: String,
|
||||
|
@ -86,7 +86,7 @@ pub fn close_the_websocket_connection(
|
|||
|
||||
pub fn fail_the_websocket_connection(
|
||||
address: Trusted<WebSocket>,
|
||||
task_source: &NetworkingTaskSource,
|
||||
task_source: &WebsocketTaskSource,
|
||||
canceller: &TaskCanceller,
|
||||
) {
|
||||
let close_task = CloseTask {
|
||||
|
@ -199,11 +199,8 @@ impl WebSocket {
|
|||
};
|
||||
let _ = global.core_resource_thread().send(CoreResourceMsg::Fetch(request, channels));
|
||||
|
||||
// TODO: use a dedicated task source,
|
||||
// https://html.spec.whatwg.org/multipage/#websocket-task-source
|
||||
// When making the switch, also update the task_canceller call.
|
||||
let task_source = global.networking_task_source();
|
||||
let canceller = global.task_canceller(TaskSourceName::Networking);
|
||||
let task_source = global.websocket_task_source();
|
||||
let canceller = global.task_canceller(WebsocketTaskSource::NAME);
|
||||
thread::spawn(move || {
|
||||
while let Ok(event) = dom_event_receiver.recv() {
|
||||
match event {
|
||||
|
@ -273,7 +270,7 @@ impl WebSocket {
|
|||
WebSocketEvent,
|
||||
task,
|
||||
Some(pipeline_id),
|
||||
TaskSourceName::Networking,
|
||||
WebsocketTaskSource::NAME,
|
||||
))
|
||||
.unwrap();
|
||||
}
|
||||
|
@ -407,10 +404,10 @@ impl WebSocketMethods for WebSocket {
|
|||
// TODO: use a dedicated task source,
|
||||
// https://html.spec.whatwg.org/multipage/#websocket-task-source
|
||||
// When making the switch, also update the task_canceller call.
|
||||
let task_source = self.global().networking_task_source();
|
||||
let task_source = self.global().websocket_task_source();
|
||||
fail_the_websocket_connection(address,
|
||||
&task_source,
|
||||
&self.global().task_canceller(TaskSourceName::Networking));
|
||||
&self.global().task_canceller(WebsocketTaskSource::NAME));
|
||||
}
|
||||
WebSocketRequestState::Open => {
|
||||
self.ready_state.set(WebSocketRequestState::Closing);
|
||||
|
|
|
@ -128,6 +128,7 @@ use task_source::networking::NetworkingTaskSource;
|
|||
use task_source::performance_timeline::PerformanceTimelineTaskSource;
|
||||
use task_source::remote_event::RemoteEventTaskSource;
|
||||
use task_source::user_interaction::UserInteractionTaskSource;
|
||||
use task_source::websocket::WebsocketTaskSource;
|
||||
use time;
|
||||
use timers::{IsInterval, TimerCallback};
|
||||
use url::Position;
|
||||
|
@ -186,6 +187,8 @@ pub struct Window {
|
|||
performance_timeline_task_source: PerformanceTimelineTaskSource,
|
||||
#[ignore_malloc_size_of = "task sources are hard"]
|
||||
remote_event_task_source: RemoteEventTaskSource,
|
||||
#[ignore_malloc_size_of = "task sources are hard"]
|
||||
websocket_task_source: WebsocketTaskSource,
|
||||
navigator: MutNullableDom<Navigator>,
|
||||
#[ignore_malloc_size_of = "Arc"]
|
||||
image_cache: Arc<ImageCache>,
|
||||
|
@ -376,6 +379,10 @@ impl Window {
|
|||
self.remote_event_task_source.clone()
|
||||
}
|
||||
|
||||
pub fn websocket_task_source(&self) -> WebsocketTaskSource {
|
||||
self.websocket_task_source.clone()
|
||||
}
|
||||
|
||||
pub fn main_thread_script_chan(&self) -> &Sender<MainThreadScriptMsg> {
|
||||
&self.script_chan.0
|
||||
}
|
||||
|
@ -1904,6 +1911,7 @@ impl Window {
|
|||
file_reading_task_source: FileReadingTaskSource,
|
||||
performance_timeline_task_source: PerformanceTimelineTaskSource,
|
||||
remote_event_task_source: RemoteEventTaskSource,
|
||||
websocket_task_source: WebsocketTaskSource,
|
||||
image_cache_chan: Sender<ImageCacheMsg>,
|
||||
image_cache: Arc<ImageCache>,
|
||||
resource_threads: ResourceThreads,
|
||||
|
@ -1957,6 +1965,7 @@ impl Window {
|
|||
file_reading_task_source,
|
||||
performance_timeline_task_source,
|
||||
remote_event_task_source,
|
||||
websocket_task_source,
|
||||
image_cache_chan,
|
||||
image_cache,
|
||||
navigator: Default::default(),
|
||||
|
|
|
@ -47,6 +47,7 @@ use task_source::file_reading::FileReadingTaskSource;
|
|||
use task_source::networking::NetworkingTaskSource;
|
||||
use task_source::performance_timeline::PerformanceTimelineTaskSource;
|
||||
use task_source::remote_event::RemoteEventTaskSource;
|
||||
use task_source::websocket::WebsocketTaskSource;
|
||||
use time::precise_time_ns;
|
||||
use timers::{IsInterval, TimerCallback};
|
||||
|
||||
|
@ -386,6 +387,10 @@ impl WorkerGlobalScope {
|
|||
RemoteEventTaskSource(self.script_chan(), self.pipeline_id())
|
||||
}
|
||||
|
||||
pub fn websocket_task_source(&self) -> WebsocketTaskSource {
|
||||
WebsocketTaskSource(self.script_chan(), self.pipeline_id())
|
||||
}
|
||||
|
||||
pub fn new_script_pair(&self) -> (Box<ScriptChan + Send>, Box<ScriptPort + Send>) {
|
||||
let dedicated = self.downcast::<DedicatedWorkerGlobalScope>();
|
||||
if let Some(dedicated) = dedicated {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue