diff --git a/components/constellation/constellation.rs b/components/constellation/constellation.rs index 9217939ee2c..016762b4b16 100644 --- a/components/constellation/constellation.rs +++ b/components/constellation/constellation.rs @@ -2453,13 +2453,13 @@ impl Constellation self.trim_history(top_level_id); } + self.notify_history_changed(change.top_level_browsing_context_id); self.update_frame_tree_if_active(change.top_level_browsing_context_id); } fn trim_history(&mut self, top_level_browsing_context_id: TopLevelBrowsingContextId) { let pipelines_to_evict = { - let session_history = self.joint_session_histories.entry(top_level_browsing_context_id) - .or_insert(JointSessionHistory::new()); + let session_history = self.get_joint_session_history(top_level_browsing_context_id); let history_length = PREFS.get("session-history.max-length").as_u64().unwrap_or(20) as usize; @@ -2493,8 +2493,7 @@ impl Constellation self.close_pipeline(evicted_id, DiscardBrowsingContext::No, ExitPipelineMode::Normal); } - let session_history = self.joint_session_histories.entry(top_level_browsing_context_id) - .or_insert(JointSessionHistory::new()); + let session_history = self.get_joint_session_history(top_level_browsing_context_id); for (alive_id, dead) in dead_pipelines { session_history.replace(NeedsToReload::No(alive_id), dead); @@ -2778,6 +2777,11 @@ impl Constellation Some(browsing_context) => browsing_context, }; + { + let session_history = self.get_joint_session_history(browsing_context.top_level_id); + session_history.remove_entries_for_browsing_context(browsing_context_id); + } + if BrowsingContextId::from(browsing_context.top_level_id) == browsing_context_id { self.event_loops.remove(&browsing_context.top_level_id); } @@ -2905,6 +2909,10 @@ impl Constellation } } + fn get_joint_session_history(&mut self, top_level_id: TopLevelBrowsingContextId) -> &mut JointSessionHistory { + self.joint_session_histories.entry(top_level_id).or_insert(JointSessionHistory::new()) + } + // Convert a browsing context to a sendable form to pass to the compositor fn browsing_context_to_sendable(&self, browsing_context_id: BrowsingContextId) -> Option { self.browsing_contexts.get(&browsing_context_id).and_then(|browsing_context| { diff --git a/components/constellation/session_history.rs b/components/constellation/session_history.rs index 67210a450b9..e297acd1c21 100644 --- a/components/constellation/session_history.rs +++ b/components/constellation/session_history.rs @@ -42,6 +42,15 @@ impl JointSessionHistory { diff.replace(&old_reloader, &new_reloader); } } + + pub fn remove_entries_for_browsing_context(&mut self, context_id: BrowsingContextId) { + self.past.retain(|&SessionHistoryDiff::BrowsingContextDiff { browsing_context_id, .. }| { + browsing_context_id != context_id + }); + self.future.retain(|&SessionHistoryDiff::BrowsingContextDiff { browsing_context_id, .. }| { + browsing_context_id != context_id + }); + } } /// Represents a pending change in a session history, that will be applied diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index fc18aa9789c..27f49354c7e 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -274059,6 +274059,11 @@ {} ] ], + "html/browsers/history/joint-session-history/joint-session-history-filler.html": [ + [ + {} + ] + ], "html/browsers/history/joint-session-history/joint-session-history-grandchild1.html": [ [ {} @@ -327276,6 +327281,12 @@ {} ] ], + "html/browsers/history/joint-session-history/joint-session-history-remove-iframe.html": [ + [ + "/html/browsers/history/joint-session-history/joint-session-history-remove-iframe.html", + {} + ] + ], "html/browsers/history/the-history-interface/001.html": [ [ "/html/browsers/history/the-history-interface/001.html", @@ -554639,6 +554650,10 @@ "c8309aa28105f557d99d7a36e86df977bfe003e9", "support" ], + "html/browsers/history/joint-session-history/joint-session-history-filler.html": [ + "54568c8fe456d139e05620c0639a4e60765c8f90", + "support" + ], "html/browsers/history/joint-session-history/joint-session-history-grandchild1.html": [ "c4b5d65cf89e66fc6df209c7166ff56dd66bcf16", "support" @@ -554651,6 +554666,10 @@ "e5087c8e51160b36134efab21ed2fbc200a9697d", "testharness" ], + "html/browsers/history/joint-session-history/joint-session-history-remove-iframe.html": [ + "2ff693526c5637a11658831961c9ff0a738329de", + "testharness" + ], "html/browsers/history/the-history-interface/.gitkeep": [ "da39a3ee5e6b4b0d3255bfef95601890afd80709", "support" diff --git a/tests/wpt/web-platform-tests/html/browsers/history/joint-session-history/joint-session-history-filler.html b/tests/wpt/web-platform-tests/html/browsers/history/joint-session-history/joint-session-history-filler.html new file mode 100644 index 00000000000..b6d47c310b9 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/browsers/history/joint-session-history/joint-session-history-filler.html @@ -0,0 +1 @@ +Filler diff --git a/tests/wpt/web-platform-tests/html/browsers/history/joint-session-history/joint-session-history-remove-iframe.html b/tests/wpt/web-platform-tests/html/browsers/history/joint-session-history/joint-session-history-remove-iframe.html new file mode 100644 index 00000000000..b66adcbc701 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/browsers/history/joint-session-history/joint-session-history-remove-iframe.html @@ -0,0 +1,23 @@ + + +Joint session history length does not include entries from a removed iframe. + + + + + +