diff options
Diffstat (limited to 'components/script/dom/xmlhttprequest.rs')
-rw-r--r-- | components/script/dom/xmlhttprequest.rs | 68 |
1 files changed, 39 insertions, 29 deletions
diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index 5fb6ec6c34e..b8a60187cb4 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -57,6 +57,7 @@ use std::cell::{Cell, RefCell}; use std::default::Default; use std::sync::mpsc::channel; use std::sync::{Arc, Mutex}; +use string_cache::Atom; use time; use timers::{ScheduledCallback, TimerHandle}; use url::{Url, UrlParser}; @@ -253,7 +254,7 @@ impl XMLHttpRequest { } fn data_available(&mut self, payload: Vec<u8>) { - self.buf.borrow_mut().push_all(&payload); + self.buf.borrow_mut().extend_from_slice(&payload); self.xhr.root().process_data_available(self.gen_id, self.buf.borrow().clone()); } @@ -403,8 +404,8 @@ impl XMLHttpRequestMethods for XMLHttpRequest { Some(raw) => { debug!("SetRequestHeader: old value = {:?}", raw[0]); let mut buf = raw[0].clone(); - buf.push_all(b", "); - buf.push_all(&value); + buf.extend_from_slice(b", "); + buf.extend_from_slice(&value); debug!("SetRequestHeader: new value = {:?}", buf); value = ByteString::new(buf); }, @@ -505,12 +506,12 @@ impl XMLHttpRequestMethods for XMLHttpRequest { // 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. let gen_id = self.generation_id.get(); - self.dispatch_response_progress_event("loadstart".to_owned()); + self.dispatch_response_progress_event(atom!("loadstart")); if self.generation_id.get() != gen_id { return Ok(()); } if !self.upload_complete.get() { - self.dispatch_upload_progress_event("loadstart".to_owned(), Some(0)); + self.dispatch_upload_progress_event(atom!("loadstart"), Some(0)); if self.generation_id.get() != gen_id { return Ok(()); } @@ -530,8 +531,8 @@ impl XMLHttpRequestMethods for XMLHttpRequest { fn join_raw(a: &str, b: &str) -> Vec<u8> { let len = a.len() + b.len(); let mut vec = Vec::with_capacity(len); - vec.push_all(a.as_bytes()); - vec.push_all(b.as_bytes()); + vec.extend_from_slice(a.as_bytes()); + vec.extend_from_slice(b.as_bytes()); vec } @@ -577,12 +578,20 @@ impl XMLHttpRequestMethods for XMLHttpRequest { let mut buf = String::new(); buf.push_str(&referer_url.scheme); buf.push_str("://"); - referer_url.serialize_host().map(|ref h| buf.push_str(h)); - referer_url.port().as_ref().map(|&p| { + + if let Some(ref h) = referer_url.serialize_host() { + buf.push_str(h); + } + + if let Some(ref p) = referer_url.port().as_ref() { buf.push_str(":"); buf.push_str(&p.to_string()); - }); - referer_url.serialize_path().map(|ref h| buf.push_str(h)); + } + + if let Some(ref h) = referer_url.serialize_path() { + buf.push_str(h); + } + self.request_headers.borrow_mut().set_raw("Referer".to_owned(), vec![buf.into_bytes()]); }, Ok(Some(ref req)) => self.insert_trusted_header("origin".to_owned(), @@ -775,11 +784,12 @@ pub type TrustedXHRAddress = Trusted<XMLHttpRequest>; impl XMLHttpRequest { fn change_ready_state(&self, rs: XMLHttpRequestState) { + use string_cache::Atom; assert!(self.ready_state.get() != rs); self.ready_state.set(rs); let global = self.global.root(); let event = Event::new(global.r(), - DOMString::from("readystatechange"), + atom!("readystatechange"), EventBubbles::DoesNotBubble, EventCancelable::Cancelable); event.fire(self.upcast()); @@ -855,11 +865,11 @@ impl XMLHttpRequest { self.upload_complete.set(true); // Substeps 2-4 if !self.sync.get() { - self.dispatch_upload_progress_event("progress".to_owned(), None); + self.dispatch_upload_progress_event(atom!("progress"), None); return_if_fetch_was_terminated!(); - self.dispatch_upload_progress_event("load".to_owned(), None); + self.dispatch_upload_progress_event(atom!("load"), None); return_if_fetch_was_terminated!(); - self.dispatch_upload_progress_event("loadend".to_owned(), None); + self.dispatch_upload_progress_event(atom!("loadend"), None); return_if_fetch_was_terminated!(); } // Part of step 13, send() (processing response) @@ -887,7 +897,7 @@ impl XMLHttpRequest { self.change_ready_state(XMLHttpRequestState::Loading); return_if_fetch_was_terminated!(); } - self.dispatch_response_progress_event("progress".to_owned()); + self.dispatch_response_progress_event(atom!("progress")); } }, XHRProgress::Done(_) => { @@ -905,11 +915,11 @@ impl XMLHttpRequest { self.change_ready_state(XMLHttpRequestState::Done); return_if_fetch_was_terminated!(); // Subsubsteps 10-12 - self.dispatch_response_progress_event("progress".to_owned()); + self.dispatch_response_progress_event(atom!("progress")); return_if_fetch_was_terminated!(); - self.dispatch_response_progress_event("load".to_owned()); + self.dispatch_response_progress_event(atom!("load")); return_if_fetch_was_terminated!(); - self.dispatch_response_progress_event("loadend".to_owned()); + self.dispatch_response_progress_event(atom!("loadend")); }, XHRProgress::Errored(_, e) => { self.cancel_timeout(); @@ -929,18 +939,18 @@ impl XMLHttpRequest { let upload_complete = &self.upload_complete; if !upload_complete.get() { upload_complete.set(true); - self.dispatch_upload_progress_event("progress".to_owned(), None); + self.dispatch_upload_progress_event(atom!("progress"), None); return_if_fetch_was_terminated!(); - self.dispatch_upload_progress_event(errormsg.to_owned(), None); + self.dispatch_upload_progress_event(Atom::from(errormsg), None); return_if_fetch_was_terminated!(); - self.dispatch_upload_progress_event("loadend".to_owned(), None); + self.dispatch_upload_progress_event(atom!("loadend"), None); return_if_fetch_was_terminated!(); } - self.dispatch_response_progress_event("progress".to_owned()); + self.dispatch_response_progress_event(atom!("progress")); return_if_fetch_was_terminated!(); - self.dispatch_response_progress_event(errormsg.to_owned()); + self.dispatch_response_progress_event(Atom::from(errormsg)); return_if_fetch_was_terminated!(); - self.dispatch_response_progress_event("loadend".to_owned()); + self.dispatch_response_progress_event(atom!("loadend")); } } } @@ -957,10 +967,10 @@ impl XMLHttpRequest { self.request_headers.borrow_mut().set_raw(name, vec![value.into_bytes()]); } - fn dispatch_progress_event(&self, upload: bool, type_: String, loaded: u64, total: Option<u64>) { + fn dispatch_progress_event(&self, upload: bool, type_: Atom, loaded: u64, total: Option<u64>) { let global = self.global.root(); let progressevent = ProgressEvent::new(global.r(), - DOMString::from(type_), + type_, EventBubbles::DoesNotBubble, EventCancelable::NotCancelable, total.is_some(), loaded, @@ -973,14 +983,14 @@ impl XMLHttpRequest { progressevent.upcast::<Event>().fire(target); } - fn dispatch_upload_progress_event(&self, type_: String, partial_load: Option<u64>) { + fn dispatch_upload_progress_event(&self, type_: Atom, partial_load: Option<u64>) { // If partial_load is None, loading has completed and we can just use the value from the request body let total = self.request_body_len.get() as u64; self.dispatch_progress_event(true, type_, partial_load.unwrap_or(total), Some(total)); } - fn dispatch_response_progress_event(&self, type_: String) { + fn dispatch_response_progress_event(&self, type_: Atom) { let len = self.response.borrow().len() as u64; let total = self.response_headers.borrow().get::<ContentLength>().map(|x| { **x as u64 }); self.dispatch_progress_event(false, type_, len, total); |