diff options
author | Vincent Ricard <magic@magicninja.org> | 2020-09-22 15:56:28 +0200 |
---|---|---|
committer | Vincent Ricard <magic@magicninja.org> | 2020-09-24 17:01:06 +0200 |
commit | 160714feb6f5bda21ad4faa49719cfce3112c711 (patch) | |
tree | 256df08c0aaf4d7a6cc0b84d58f83ca310226aab /components/script/dom/xmlhttprequest.rs | |
parent | 12f5411aad24eca8faafa12c354fc43b548dba6d (diff) | |
download | servo-160714feb6f5bda21ad4faa49719cfce3112c711.tar.gz servo-160714feb6f5bda21ad4faa49719cfce3112c711.zip |
Implements "upload listener flag" for XHR
Diffstat (limited to 'components/script/dom/xmlhttprequest.rs')
-rw-r--r-- | components/script/dom/xmlhttprequest.rs | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index c4594106832..bc3a401208b 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -154,6 +154,7 @@ pub struct XMLHttpRequest { request_body_len: Cell<usize>, sync: Cell<bool>, upload_complete: Cell<bool>, + upload_listener: Cell<bool>, send_flag: Cell<bool>, timeout_cancel: DomRefCell<Option<OneshotTimerHandle>>, @@ -200,6 +201,7 @@ impl XMLHttpRequest { request_body_len: Cell::new(0), sync: Cell::new(false), upload_complete: Cell::new(false), + upload_listener: Cell::new(false), send_flag: Cell::new(false), timeout_cancel: DomRefCell::new(None), @@ -420,6 +422,7 @@ impl XMLHttpRequestMethods for XMLHttpRequest { self.sync.set(!asynch); *self.request_headers.borrow_mut() = HeaderMap::new(); self.send_flag.set(false); + self.upload_listener.set(false); *self.status_text.borrow_mut() = ByteString::new(vec![]); self.status.set(0); @@ -633,16 +636,23 @@ impl XMLHttpRequestMethods for XMLHttpRequest { .map_or(0, |e| e.total_bytes.unwrap_or(0)), ); + // Step 5 + // If we dont have data to upload, we dont want to emit events + let has_handlers = self.upload.upcast::<EventTarget>().has_handlers(); + self.upload_listener.set(has_handlers && data.is_some()); + // todo preserved headers? - // Step 6 - self.upload_complete.set(false); // Step 7 - self.upload_complete.set(extracted_or_serialized.is_none()); + self.upload_complete.set(false); // Step 8 + // FIXME handle the 'timed out flag' + // Step 9 + self.upload_complete.set(extracted_or_serialized.is_none()); + // Step 10 self.send_flag.set(true); - // Step 9 + // Step 11 if !self.sync.get() { // If one of the event handlers below aborts the fetch by calling // abort or open we will need the current generation id to detect it. @@ -653,7 +663,7 @@ impl XMLHttpRequestMethods for XMLHttpRequest { return Ok(()); } // Substep 2 - if !self.upload_complete.get() { + if !self.upload_complete.get() && self.upload_listener.get() { self.dispatch_upload_progress_event(atom!("loadstart"), Ok(Some(0))); if self.generation_id.get() != gen_id { return Ok(()); @@ -661,9 +671,8 @@ impl XMLHttpRequestMethods for XMLHttpRequest { } } - // Step 5 + // Step 6 //TODO - set referrer_policy/referrer_url in request - let has_handlers = self.upload.upcast::<EventTarget>().has_handlers(); let credentials_mode = if self.with_credentials.get() { CredentialsMode::Include } else { @@ -694,7 +703,7 @@ impl XMLHttpRequestMethods for XMLHttpRequest { .destination(Destination::None) .synchronous(self.sync.get()) .mode(RequestMode::CorsMode) - .use_cors_preflight(has_handlers) + .use_cors_preflight(self.upload_listener.get()) .credentials_mode(credentials_mode) .use_url_credentials(use_url_credentials) .origin(self.global().origin().immutable().clone()) @@ -1100,7 +1109,7 @@ impl XMLHttpRequest { // Substep 1 self.upload_complete.set(true); // Substeps 2-4 - if !self.sync.get() { + if !self.sync.get() && self.upload_listener.get() { self.dispatch_upload_progress_event(atom!("progress"), Ok(None)); return_if_fetch_was_terminated!(); self.dispatch_upload_progress_event(atom!("load"), Ok(None)); @@ -1203,10 +1212,12 @@ impl XMLHttpRequest { let upload_complete = &self.upload_complete; if !upload_complete.get() { upload_complete.set(true); - self.dispatch_upload_progress_event(Atom::from(errormsg), Err(())); - return_if_fetch_was_terminated!(); - self.dispatch_upload_progress_event(atom!("loadend"), Err(())); - return_if_fetch_was_terminated!(); + if self.upload_listener.get() { + self.dispatch_upload_progress_event(Atom::from(errormsg), Err(())); + return_if_fetch_was_terminated!(); + self.dispatch_upload_progress_event(atom!("loadend"), Err(())); + return_if_fetch_was_terminated!(); + } } self.dispatch_response_progress_event(Atom::from(errormsg)); return_if_fetch_was_terminated!(); |