diff options
author | webbeef <me@webbeef.org> | 2024-10-10 20:53:39 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-11 03:53:39 +0000 |
commit | 2b71130a8a95d0c723532d2486493b5db0c9e1b1 (patch) | |
tree | 0d6ea3caab12b9787f3f76cd8056272c82eb4afc /components/script/dom/xmlhttprequest.rs | |
parent | c00c6e728ddb82d6cb646eb924a73c4b43a798a4 (diff) | |
download | servo-2b71130a8a95d0c723532d2486493b5db0c9e1b1.tar.gz servo-2b71130a8a95d0c723532d2486493b5db0c9e1b1.zip |
Various CanGc fixes (#33800)
* CanGc fix for pagetransitionevent
Signed-off-by: webbeef <me@webbeef.org>
* CanGc fix for dom/node
Signed-off-by: webbeef <me@webbeef.org>
* CanGc fix for gamepad
Signed-off-by: webbeef <me@webbeef.org>
* CanGc fix for gpu
Signed-off-by: webbeef <me@webbeef.org>
* CanGc fix for dom/element
Signed-off-by: webbeef <me@webbeef.org>
* CanGc fix for xhr
Signed-off-by: webbeef <me@webbeef.org>
* CanGc fix for dom/worker
Signed-off-by: webbeef <me@webbeef.org>
* CanGc fix for rtcdatachannel
Signed-off-by: webbeef <me@webbeef.org>
* CanGc fix for rtcerror
Signed-off-by: webbeef <me@webbeef.org>
* Address review comments
Signed-off-by: webbeef <me@webbeef.org>
---------
Signed-off-by: webbeef <me@webbeef.org>
Diffstat (limited to 'components/script/dom/xmlhttprequest.rs')
-rw-r--r-- | components/script/dom/xmlhttprequest.rs | 74 |
1 files changed, 44 insertions, 30 deletions
diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index 786706db9c2..3daf64c51e5 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -254,24 +254,27 @@ impl XMLHttpRequest { fn process_response(&mut self, metadata: Result<FetchMetadata, NetworkError>) { let xhr = self.xhr.root(); - let rv = xhr.process_headers_available(self.gen_id, metadata); + let rv = xhr.process_headers_available(self.gen_id, metadata, CanGc::note()); if rv.is_err() { *self.sync_status.borrow_mut() = Some(rv); } } fn process_response_chunk(&mut self, chunk: Vec<u8>) { - self.xhr.root().process_data_available(self.gen_id, chunk); + self.xhr + .root() + .process_data_available(self.gen_id, chunk, CanGc::note()); } fn process_response_eof( &mut self, response: Result<ResourceFetchTiming, NetworkError>, ) { - let rv = self - .xhr - .root() - .process_response_complete(self.gen_id, response.map(|_| ())); + let rv = self.xhr.root().process_response_complete( + self.gen_id, + response.map(|_| ()), + CanGc::note(), + ); *self.sync_status.borrow_mut() = Some(rv); } @@ -445,7 +448,7 @@ impl XMLHttpRequestMethods for XMLHttpRequest { // Step 13 if self.ready_state.get() != XMLHttpRequestState::Opened { - self.change_ready_state(XMLHttpRequestState::Opened); + self.change_ready_state(XMLHttpRequestState::Opened, CanGc::note()); } Ok(()) }, @@ -810,7 +813,10 @@ impl XMLHttpRequestMethods for XMLHttpRequest { state == XMLHttpRequestState::Loading { let gen_id = self.generation_id.get(); - self.process_partial_response(XHRProgress::Errored(gen_id, Error::Abort)); + self.process_partial_response( + XHRProgress::Errored(gen_id, Error::Abort), + CanGc::note(), + ); // If open was called in one of the handlers invoked by the // above call then we should terminate the abort sequence if self.generation_id.get() != gen_id { @@ -819,7 +825,7 @@ impl XMLHttpRequestMethods for XMLHttpRequest { } // Step 3 if self.ready_state.get() == XMLHttpRequestState::Done { - self.change_ready_state(XMLHttpRequestState::Unsent); + self.change_ready_state(XMLHttpRequestState::Unsent, CanGc::note()); self.response_status.set(Err(())); self.response.borrow_mut().clear(); self.response_headers.borrow_mut().clear(); @@ -1021,7 +1027,7 @@ impl XMLHttpRequestMethods for XMLHttpRequest { pub type TrustedXHRAddress = Trusted<XMLHttpRequest>; impl XMLHttpRequest { - fn change_ready_state(&self, rs: XMLHttpRequestState) { + fn change_ready_state(&self, rs: XMLHttpRequestState, can_gc: CanGc) { assert_ne!(self.ready_state.get(), rs); self.ready_state.set(rs); if rs != XMLHttpRequestState::Unsent { @@ -1030,7 +1036,7 @@ impl XMLHttpRequest { atom!("readystatechange"), EventBubbles::DoesNotBubble, EventCancelable::Cancelable, - CanGc::note(), + can_gc, ); event.fire(self.upcast()); } @@ -1040,6 +1046,7 @@ impl XMLHttpRequest { &self, gen_id: GenerationId, metadata: Result<FetchMetadata, NetworkError>, + can_gc: CanGc, ) -> Result<(), Error> { let metadata = match metadata { Ok(meta) => match meta { @@ -1052,7 +1059,7 @@ impl XMLHttpRequest { }, }, Err(_) => { - self.process_partial_response(XHRProgress::Errored(gen_id, Error::Network)); + self.process_partial_response(XHRProgress::Errored(gen_id, Error::Network), can_gc); return Err(Error::Network); }, }; @@ -1060,36 +1067,40 @@ impl XMLHttpRequest { metadata.final_url[..Position::AfterQuery].clone_into(&mut self.response_url.borrow_mut()); // XXXManishearth Clear cache entries in case of a network error - self.process_partial_response(XHRProgress::HeadersReceived( - gen_id, - metadata.headers.map(Serde::into_inner), - metadata.status, - )); + self.process_partial_response( + XHRProgress::HeadersReceived( + gen_id, + metadata.headers.map(Serde::into_inner), + metadata.status, + ), + can_gc, + ); Ok(()) } - fn process_data_available(&self, gen_id: GenerationId, payload: Vec<u8>) { - self.process_partial_response(XHRProgress::Loading(gen_id, payload)); + fn process_data_available(&self, gen_id: GenerationId, payload: Vec<u8>, can_gc: CanGc) { + self.process_partial_response(XHRProgress::Loading(gen_id, payload), can_gc); } fn process_response_complete( &self, gen_id: GenerationId, status: Result<(), NetworkError>, + can_gc: CanGc, ) -> ErrorResult { match status { Ok(()) => { - self.process_partial_response(XHRProgress::Done(gen_id)); + self.process_partial_response(XHRProgress::Done(gen_id), can_gc); Ok(()) }, Err(_) => { - self.process_partial_response(XHRProgress::Errored(gen_id, Error::Network)); + self.process_partial_response(XHRProgress::Errored(gen_id, Error::Network), can_gc); Err(Error::Network) }, } } - fn process_partial_response(&self, progress: XHRProgress) { + fn process_partial_response(&self, progress: XHRProgress, can_gc: CanGc) { let msg_id = progress.generation_id(); // Aborts processing if abort() or open() was called @@ -1156,7 +1167,7 @@ impl XMLHttpRequest { } // Substep 3 if !self.sync.get() { - self.change_ready_state(XMLHttpRequestState::HeadersReceived); + self.change_ready_state(XMLHttpRequestState::HeadersReceived, can_gc); } }, XHRProgress::Loading(_, mut partial_response) => { @@ -1174,7 +1185,7 @@ impl XMLHttpRequest { atom!("readystatechange"), EventBubbles::DoesNotBubble, EventCancelable::Cancelable, - CanGc::note(), + can_gc, ); event.fire(self.upcast()); return_if_fetch_was_terminated!(); @@ -1197,7 +1208,7 @@ impl XMLHttpRequest { // Subsubsteps 6-8 self.send_flag.set(false); - self.change_ready_state(XMLHttpRequestState::Done); + self.change_ready_state(XMLHttpRequestState::Done, can_gc); return_if_fetch_was_terminated!(); // Subsubsteps 11-12 self.dispatch_response_progress_event(atom!("load")); @@ -1211,7 +1222,7 @@ impl XMLHttpRequest { self.discard_subsequent_responses(); self.send_flag.set(false); // XXXManishearth set response to NetworkError - self.change_ready_state(XMLHttpRequestState::Done); + self.change_ready_state(XMLHttpRequestState::Done, can_gc); return_if_fetch_was_terminated!(); let errormsg = match e { @@ -1499,7 +1510,7 @@ impl XMLHttpRequest { &document, Some(DOMString::from(decoded)), wr.get_url(), - CanGc::note(), + can_gc, ); document } @@ -1515,7 +1526,7 @@ impl XMLHttpRequest { &document, Some(DOMString::from(decoded)), wr.get_url(), - CanGc::note(), + can_gc, ); document } @@ -1662,10 +1673,13 @@ pub struct XHRTimeoutCallback { } impl XHRTimeoutCallback { - pub fn invoke(self) { + pub fn invoke(self, can_gc: CanGc) { let xhr = self.xhr.root(); if xhr.ready_state.get() != XMLHttpRequestState::Done { - xhr.process_partial_response(XHRProgress::Errored(self.generation_id, Error::Timeout)); + xhr.process_partial_response( + XHRProgress::Errored(self.generation_id, Error::Timeout), + can_gc, + ); } } } |