Ensure iframe's contentWindow is updated when traversing the session history.

This commit is contained in:
Josh Matthews 2019-03-07 18:58:53 -05:00
parent cc131be2e0
commit edfd15c36f
3 changed files with 29 additions and 3 deletions

View file

@ -2640,12 +2640,16 @@ where
}, },
}; };
let (old_pipeline_id, parent_pipeline_id) = let (old_pipeline_id, parent_pipeline_id, top_level_id) =
match self.browsing_contexts.get_mut(&browsing_context_id) { match self.browsing_contexts.get_mut(&browsing_context_id) {
Some(browsing_context) => { Some(browsing_context) => {
let old_pipeline_id = browsing_context.pipeline_id; let old_pipeline_id = browsing_context.pipeline_id;
browsing_context.update_current_entry(new_pipeline_id); browsing_context.update_current_entry(new_pipeline_id);
(old_pipeline_id, browsing_context.parent_pipeline_id) (
old_pipeline_id,
browsing_context.parent_pipeline_id,
browsing_context.top_level_id,
)
}, },
None => { None => {
return warn!( return warn!(
@ -2662,6 +2666,7 @@ where
let msg = ConstellationControlMsg::UpdatePipelineId( let msg = ConstellationControlMsg::UpdatePipelineId(
parent_pipeline_id, parent_pipeline_id,
browsing_context_id, browsing_context_id,
top_level_id,
new_pipeline_id, new_pipeline_id,
UpdatePipelineIdReason::Traversal, UpdatePipelineIdReason::Traversal,
); );
@ -3581,6 +3586,7 @@ where
let msg = ConstellationControlMsg::UpdatePipelineId( let msg = ConstellationControlMsg::UpdatePipelineId(
parent_pipeline_id, parent_pipeline_id,
change.browsing_context_id, change.browsing_context_id,
change.top_level_browsing_context_id,
pipeline_id, pipeline_id,
UpdatePipelineIdReason::Navigation, UpdatePipelineIdReason::Navigation,
); );

View file

@ -1429,7 +1429,7 @@ impl ScriptThread {
NotifyVisibilityChange(id, ..) => Some(id), NotifyVisibilityChange(id, ..) => Some(id),
Navigate(id, ..) => Some(id), Navigate(id, ..) => Some(id),
PostMessage { target: id, .. } => Some(id), PostMessage { target: id, .. } => Some(id),
UpdatePipelineId(_, _, id, _) => Some(id), UpdatePipelineId(_, _, _, id, _) => Some(id),
UpdateHistoryState(id, ..) => Some(id), UpdateHistoryState(id, ..) => Some(id),
RemoveHistoryStates(id, ..) => Some(id), RemoveHistoryStates(id, ..) => Some(id),
FocusIFrame(id, ..) => Some(id), FocusIFrame(id, ..) => Some(id),
@ -1617,11 +1617,13 @@ impl ScriptThread {
ConstellationControlMsg::UpdatePipelineId( ConstellationControlMsg::UpdatePipelineId(
parent_pipeline_id, parent_pipeline_id,
browsing_context_id, browsing_context_id,
top_level_browsing_context_id,
new_pipeline_id, new_pipeline_id,
reason, reason,
) => self.handle_update_pipeline_id( ) => self.handle_update_pipeline_id(
parent_pipeline_id, parent_pipeline_id,
browsing_context_id, browsing_context_id,
top_level_browsing_context_id,
new_pipeline_id, new_pipeline_id,
reason, reason,
), ),
@ -2153,6 +2155,7 @@ impl ScriptThread {
&self, &self,
parent_pipeline_id: PipelineId, parent_pipeline_id: PipelineId,
browsing_context_id: BrowsingContextId, browsing_context_id: BrowsingContextId,
top_level_browsing_context_id: TopLevelBrowsingContextId,
new_pipeline_id: PipelineId, new_pipeline_id: PipelineId,
reason: UpdatePipelineIdReason, reason: UpdatePipelineIdReason,
) { ) {
@ -2163,6 +2166,21 @@ impl ScriptThread {
if let Some(frame_element) = frame_element { if let Some(frame_element) = frame_element {
frame_element.update_pipeline_id(new_pipeline_id, reason); frame_element.update_pipeline_id(new_pipeline_id, reason);
} }
if let Some(window) = self.documents.borrow().find_window(new_pipeline_id) {
// Ensure that the state of any local window proxies accurately reflects
// the new pipeline.
let _ = self.local_window_proxy(
&*window,
browsing_context_id,
top_level_browsing_context_id,
Some(parent_pipeline_id),
// Any local window proxy has already been created, so there
// is no need to pass along existing opener information that
// will be discarded.
None,
);
}
} }
fn handle_update_history_state_msg( fn handle_update_history_state_msg(
@ -2870,6 +2888,7 @@ impl ScriptThread {
self.handle_update_pipeline_id( self.handle_update_pipeline_id(
parent_pipeline, parent_pipeline,
window_proxy.browsing_context_id(), window_proxy.browsing_context_id(),
window_proxy.top_level_browsing_context_id(),
incomplete.pipeline_id, incomplete.pipeline_id,
UpdatePipelineIdReason::Navigation, UpdatePipelineIdReason::Navigation,
); );

View file

@ -303,6 +303,7 @@ pub enum ConstellationControlMsg {
UpdatePipelineId( UpdatePipelineId(
PipelineId, PipelineId,
BrowsingContextId, BrowsingContextId,
TopLevelBrowsingContextId,
PipelineId, PipelineId,
UpdatePipelineIdReason, UpdatePipelineIdReason,
), ),