From 445a93eb8b52f8187b172a81d009b933e1de3ed8 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Mon, 18 Sep 2017 10:09:45 +0200 Subject: [PATCH] Use task! to reestablish the event source connection --- components/script/dom/eventsource.rs | 72 ++++++++++++++-------------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/components/script/dom/eventsource.rs b/components/script/dom/eventsource.rs index 438200e3bab..273ee2c0475 100644 --- a/components/script/dom/eventsource.rs +++ b/components/script/dom/eventsource.rs @@ -121,12 +121,43 @@ impl EventSourceContext { return; } - // Step 1 - let task = box ReestablishConnectionTask { - event_source: self.event_source.clone(), - action_sender: self.action_sender.clone() - }; - let _ = event_source.global().networking_task_source().queue(task, &*event_source.global()); + let trusted_event_source = self.event_source.clone(); + let action_sender = self.action_sender.clone(); + let global = event_source.global(); + // FIXME(nox): Why are errors silenced here? + let _ = global.networking_task_source().queue( + box task!(reestablish_the_event_source_onnection: move || { + let event_source = trusted_event_source.root(); + + // Step 1.1. + if event_source.ready_state.get() == ReadyState::Closed { + return; + } + + // Step 1.2. + event_source.ready_state.set(ReadyState::Connecting); + + // Step 1.3. + event_source.upcast::().fire_event(atom!("error")); + + // Step 2. + let duration = Length::new(event_source.reconnection_time.get()); + + // Step 3. + // TODO: Optionally wait some more. + + // Steps 4-5. + let callback = OneshotTimerCallback::EventSourceTimeout( + EventSourceTimeoutCallback { + event_source: trusted_event_source, + action_sender, + } + ); + // FIXME(nox): Why are errors silenced here? + let _ = event_source.global().schedule_callback(callback, duration); + }), + &global, + ); } // https://html.spec.whatwg.org/multipage/#processField @@ -499,35 +530,6 @@ impl Task for FailConnectionTask { } } -pub struct ReestablishConnectionTask { - event_source: Trusted, - action_sender: ipc::IpcSender, -} - -impl Task for ReestablishConnectionTask { - // https://html.spec.whatwg.org/multipage/#reestablish-the-connection - fn run(self: Box) { - let event_source = self.event_source.root(); - // Step 1.1 - if event_source.ready_state.get() == ReadyState::Closed { - return; - } - // Step 1.2 - event_source.ready_state.set(ReadyState::Connecting); - // Step 1.3 - event_source.upcast::().fire_event(atom!("error")); - // Step 2 - let duration = Length::new(event_source.reconnection_time.get()); - // TODO Step 3: Optionally wait some more - // Steps 4-5 - let callback = OneshotTimerCallback::EventSourceTimeout(EventSourceTimeoutCallback { - event_source: self.event_source.clone(), - action_sender: self.action_sender.clone() - }); - let _ = event_source.global().schedule_callback(callback, duration); - } -} - #[derive(HeapSizeOf, JSTraceable)] pub struct EventSourceTimeoutCallback { #[ignore_heap_size_of = "Because it is non-owning"]