diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index a81236fc477..7f2c3d6113b 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -78,7 +78,7 @@ use serde::{Deserialize, Serialize}; use smallvec::SmallVec; use std::boxed::FnBox; use std::cell::{Cell, UnsafeCell}; -use std::collections::{BTreeMap, HashMap, HashSet}; +use std::collections::{BTreeMap, HashMap, HashSet, VecDeque}; use std::hash::{BuildHasher, Hash}; use std::ops::{Deref, DerefMut}; use std::path::PathBuf; @@ -208,6 +208,15 @@ impl JSTraceable for Vec { } } +impl JSTraceable for VecDeque { + #[inline] + fn trace(&self, trc: *mut JSTracer) { + for e in &*self { + e.trace(trc); + } + } +} + impl JSTraceable for (T, T, T, T) { fn trace(&self, trc: *mut JSTracer) { self.0.trace(trc); diff --git a/components/script/dom/servoparser/mod.rs b/components/script/dom/servoparser/mod.rs index 252305619fc..cb8fc3d753d 100644 --- a/components/script/dom/servoparser/mod.rs +++ b/components/script/dom/servoparser/mod.rs @@ -34,6 +34,7 @@ use profile_traits::time::{TimerMetadata, TimerMetadataFrameType}; use profile_traits::time::{TimerMetadataReflowType, ProfilerCategory, profile}; use script_thread::ScriptThread; use std::cell::Cell; +use std::collections::VecDeque; use url::Url; use util::resource_files::read_resource_file; use xml5ever::tokenizer::XmlTokenizer; @@ -51,7 +52,7 @@ pub struct ServoParser { /// does not correspond to a page load. pipeline: Option, /// Input chunks received but not yet passed to the parser. - pending_input: DOMRefCell>, + pending_input: DOMRefCell>, /// The tokenizer of this parser. tokenizer: DOMRefCell, /// Whether to expect any further input from the associated network request. @@ -78,7 +79,7 @@ impl ServoParser { reflector: Reflector::new(), document: JS::from_ref(document), pipeline: pipeline, - pending_input: DOMRefCell::new(vec![]), + pending_input: DOMRefCell::new(VecDeque::new()), tokenizer: DOMRefCell::new(tokenizer), last_chunk_received: Cell::new(last_chunk_state == LastChunkState::Received), suspended: Default::default(), @@ -111,7 +112,7 @@ impl ServoParser { } fn push_input_chunk(&self, chunk: String) { - self.pending_input.borrow_mut().push(chunk); + self.pending_input.borrow_mut().push_back(chunk); } fn take_next_input_chunk(&self) -> Option { @@ -119,7 +120,7 @@ impl ServoParser { if pending_input.is_empty() { None } else { - Some(pending_input.remove(0)) + pending_input.pop_front() } }