diff options
author | Gregory Terzian <gterzian@users.noreply.github.com> | 2018-07-01 20:30:05 +0800 |
---|---|---|
committer | Gregory Terzian <gterzian@users.noreply.github.com> | 2018-07-29 16:42:59 +0800 |
commit | f2ee941da2f56b22d2258057a83998306e862350 (patch) | |
tree | dcbbd50e8799659084874b0eae4abe9a4f868a5b /components/script/dom/globalscope.rs | |
parent | ff62ca7c018eb3e6d50b516dc653e5090dbe7e37 (diff) | |
download | servo-f2ee941da2f56b22d2258057a83998306e862350.tar.gz servo-f2ee941da2f56b22d2258057a83998306e862350.zip |
Introduce DOMTracker, cancel eventsource fetch when aborting document load
Diffstat (limited to 'components/script/dom/globalscope.rs')
-rw-r--r-- | components/script/dom/globalscope.rs | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs index 08e7b2d3d62..325e05de882 100644 --- a/components/script/dom/globalscope.rs +++ b/components/script/dom/globalscope.rs @@ -4,6 +4,7 @@ use devtools_traits::{ScriptToDevtoolsControlMsg, WorkerId}; use dom::bindings::cell::DomRefCell; +use dom::bindings::codegen::Bindings::EventSourceBinding::EventSourceBinding::EventSourceMethods; use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use dom::bindings::codegen::Bindings::WorkerGlobalScopeBinding::WorkerGlobalScopeMethods; use dom::bindings::conversions::root_from_object; @@ -13,10 +14,12 @@ use dom::bindings::reflector::DomObject; use dom::bindings::root::{DomRoot, MutNullableDom}; use dom::bindings::settings_stack::{AutoEntryScript, entry_global, incumbent_global}; use dom::bindings::str::DOMString; +use dom::bindings::weakref::DOMTracker; use dom::crypto::Crypto; use dom::dedicatedworkerglobalscope::DedicatedWorkerGlobalScope; use dom::errorevent::ErrorEvent; use dom::event::{Event, EventBubbles, EventCancelable, EventStatus}; +use dom::eventsource::EventSource; use dom::eventtarget::EventTarget; use dom::performance::Performance; use dom::window::Window; @@ -131,6 +134,9 @@ pub struct GlobalScope { /// Vector storing closing references of all workers #[ignore_malloc_size_of = "Arc"] list_auto_close_worker: DomRefCell<Vec<AutoCloseWorker>>, + + /// Vector storing references of all eventsources. + event_source_tracker: DOMTracker<EventSource>, } impl GlobalScope { @@ -164,6 +170,7 @@ impl GlobalScope { origin, microtask_queue, list_auto_close_worker: Default::default(), + event_source_tracker: DOMTracker::new(), } } @@ -171,6 +178,24 @@ impl GlobalScope { self.list_auto_close_worker.borrow_mut().push(AutoCloseWorker(closing_worker)); } + pub fn track_event_source(&self, event_source: &EventSource) { + self.event_source_tracker.track(event_source); + } + + pub fn close_event_sources(&self) -> bool { + let mut canceled_any_fetch = false; + self.event_source_tracker.for_each(|event_source: DomRoot<EventSource>| { + match event_source.ReadyState() { + 2 => {}, + _ => { + event_source.cancel(); + canceled_any_fetch = true; + } + } + }); + canceled_any_fetch + } + /// Returns the global scope of the realm that the given DOM object's reflector /// was created in. #[allow(unsafe_code)] |