From 7435db26ac93de57c24a5c29693282cd7bbf9f6c Mon Sep 17 00:00:00 2001 From: Mukilan Thiyagarajan Date: Sat, 11 Oct 2014 23:50:48 +0530 Subject: Fix race condition in XHR and handle other abort/open scenarios This fixes issue #3630 A short summary of the changes: * Use generation id to cancel inflight requests * Handles nested calls to abort, open, send inside handlers * Adds XHRReleaseMsg to delay freeing XHR object till all inflight events are processed * Change the ErroredMsg enum to be more symmetric with the returned Error enum --- components/script/script_task.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'components/script/script_task.rs') diff --git a/components/script/script_task.rs b/components/script/script_task.rs index deb6aaded80..5a6e6ca4173 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -100,6 +100,8 @@ pub enum ScriptMsg { ExitWindowMsg(PipelineId), /// Notifies the script of progress on a fetch (dispatched to all tasks). XHRProgressMsg(TrustedXHRAddress, XHRProgress), + /// Releases one reference to the XHR object (dispatched to all tasks). + XHRReleaseMsg(TrustedXHRAddress), /// Message sent through Worker.postMessage (only dispatched to /// DedicatedWorkerGlobalScope). DOMMessage(*mut u64, size_t), @@ -530,7 +532,8 @@ impl ScriptTask { FromConstellation(ExitPipelineMsg(id)) => if self.handle_exit_pipeline_msg(id) { return false }, FromScript(ExitWindowMsg(id)) => self.handle_exit_window_msg(id), FromConstellation(ResizeMsg(..)) => fail!("should have handled ResizeMsg already"), - FromScript(XHRProgressMsg(addr, progress)) => XMLHttpRequest::handle_xhr_progress(addr, progress), + FromScript(XHRProgressMsg(addr, progress)) => XMLHttpRequest::handle_progress(addr, progress), + FromScript(XHRReleaseMsg(addr)) => XMLHttpRequest::handle_release(addr), FromScript(DOMMessage(..)) => fail!("unexpected message"), FromScript(WorkerPostMessage(addr, data, nbytes)) => Worker::handle_message(addr, data, nbytes), FromScript(WorkerRelease(addr)) => Worker::handle_release(addr), -- cgit v1.2.3