diff --git a/components/script/dom/bindings/str.rs b/components/script/dom/bindings/str.rs index 3f3c14bf854a..72e4fc4cd812 100644 --- a/components/script/dom/bindings/str.rs +++ b/components/script/dom/bindings/str.rs @@ -7,6 +7,7 @@ use std::ascii::AsciiExt; use std::borrow::ToOwned; use std::hash::{Hash, Hasher}; +use std::mem; use std::ops; use std::str; use std::str::FromStr; @@ -28,6 +29,12 @@ impl ByteString { str::from_utf8(&vec).ok() } + /// Returns ownership of the underlying Vec and copies an empty + /// vec in its place + pub fn bytes(&mut self) -> Vec { + mem::replace(&mut self.0, Vec::new()) + } + /// Returns the length. pub fn len(&self) -> usize { let ByteString(ref vector) = *self; @@ -117,6 +124,12 @@ impl ByteString { } } +impl Into> for ByteString { + fn into(self) -> Vec { + self.0 + } +} + impl Hash for ByteString { fn hash(&self, state: &mut H) { let ByteString(ref vec) = *self; diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index 8f1e8ade7185..7fc2b71d088e 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -435,7 +435,7 @@ impl XMLHttpRequestMethods for XMLHttpRequest { None => {} } - headers.set_raw(name_str.to_owned(), vec![value.to_vec()]); + headers.set_raw(name_str.to_owned(), vec![value.into()]); Ok(()) } diff --git a/tests/unit/script/dom/bindings.rs b/tests/unit/script/dom/bindings.rs new file mode 100644 index 000000000000..e67421071369 --- /dev/null +++ b/tests/unit/script/dom/bindings.rs @@ -0,0 +1,17 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use script::dom::bindings::str::ByteString; + +#[test] +fn test_byte_string_move() { + let mut byte_str = ByteString::new(vec![0x73, 0x65, 0x72, 0x76, 0x6f]); + let mut byte_vec = byte_str.bytes(); + + assert_eq!(byte_vec, "servo".as_bytes()); + assert_eq!(*byte_str, []); + + byte_vec = byte_str.into(); + assert_eq!(byte_vec, Vec::new()); +} diff --git a/tests/unit/script/lib.rs b/tests/unit/script/lib.rs index 7996dae56cb2..fd5bea0f7186 100644 --- a/tests/unit/script/lib.rs +++ b/tests/unit/script/lib.rs @@ -9,5 +9,6 @@ extern crate util; #[cfg(all(test, target_pointer_width = "64"))] mod size_of; #[cfg(test)] mod textinput; #[cfg(test)] mod dom { + mod bindings; mod blob; }