diff --git a/components/constellation/constellation.rs b/components/constellation/constellation.rs index 15c0e258ea3..e3aefdeaa46 100644 --- a/components/constellation/constellation.rs +++ b/components/constellation/constellation.rs @@ -2033,9 +2033,7 @@ impl Constellation debug_assert_eq!(entry.instant, curr_entry.instant); - frame.pipeline_id = pipeline_id; - frame.instant = entry.instant; - frame.url = entry.url.clone(); + frame.update_current(pipeline_id, &entry); old_pipeline_id }, @@ -2130,7 +2128,7 @@ impl Constellation let (evicted_id, new_frame, clear_future, location_changed) = if let Some(mut entry) = frame_change.replace { debug!("Replacing pipeline in existing frame."); let evicted_id = entry.pipeline_id; - entry.pipeline_id = Some(frame_change.new_pipeline_id); + entry.replace_pipeline(frame_change.new_pipeline_id, frame_change.url.clone()); self.traverse_to_entry(entry); (evicted_id, false, false, false) } else if let Some(frame) = self.frames.get_mut(&frame_change.frame_id) { diff --git a/components/constellation/frame.rs b/components/constellation/frame.rs index 1613e18b670..daa443b2b80 100644 --- a/components/constellation/frame.rs +++ b/components/constellation/frame.rs @@ -76,6 +76,13 @@ impl Frame { pub fn remove_forward_entries(&mut self) -> Vec { replace(&mut self.next, vec!()) } + + /// Update the current entry of the Frame from an entry that has been traversed to. + pub fn update_current(&mut self, pipeline_id: PipelineId, entry: &FrameState) { + self.pipeline_id = pipeline_id; + self.instant = entry.instant; + self.url = entry.url.clone(); + } } /// An entry in a frame's session history. @@ -99,6 +106,15 @@ pub struct FrameState { pub frame_id: FrameId, } +impl FrameState { + /// Updates the entry's pipeline and url. This is used when navigating with replacement + /// enabled. + pub fn replace_pipeline(&mut self, pipeline_id: PipelineId, url: ServoUrl) { + self.pipeline_id = Some(pipeline_id); + self.url = url; + } +} + /// Represents a pending change in the frame tree, that will be applied /// once the new pipeline has loaded and completed initial layout / paint. pub struct FrameChange {