aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/globalscope.rs
diff options
context:
space:
mode:
authorGregory Terzian <gterzian@users.noreply.github.com>2018-07-01 20:30:05 +0800
committerGregory Terzian <gterzian@users.noreply.github.com>2018-07-29 16:42:59 +0800
commitf2ee941da2f56b22d2258057a83998306e862350 (patch)
treedcbbd50e8799659084874b0eae4abe9a4f868a5b /components/script/dom/globalscope.rs
parentff62ca7c018eb3e6d50b516dc653e5090dbe7e37 (diff)
downloadservo-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.rs25
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)]