diff --git a/components/config/opts.rs b/components/config/opts.rs index f4da0658011..32195664f2d 100644 --- a/components/config/opts.rs +++ b/components/config/opts.rs @@ -521,7 +521,7 @@ pub fn default_opts() -> Opts { userscripts: None, user_stylesheets: Vec::new(), output_file: None, - max_session_history: 16, + max_session_history: 20, replace_surrogates: false, gc_profile: false, load_webfonts_synchronously: false, @@ -615,7 +615,7 @@ pub fn from_cmdline_args(args: &[String]) -> ArgumentParsingResult { "Probability of randomly closing a pipeline (for testing constellation hardening).", "0.0"); opts.optopt("", "random-pipeline-closure-seed", "A fixed seed for repeatbility of random pipeline closure.", ""); - opts.optopt("", "max-session-history", "Maximum amount of session history to store in each tab.", "16"); + opts.optopt("", "max-session-history", "Maximum amount of session history to store in each tab.", "20"); opts.optmulti("Z", "debug", "A comma-separated string of debug options. Pass help to show available options.", ""); opts.optflag("h", "help", "Print this message"); @@ -786,7 +786,7 @@ pub fn from_cmdline_args(args: &[String]) -> ArgumentParsingResult { let max_session_history = opt_match.opt_str("max-session-history").map(|max| { max.parse().unwrap_or_else(|err| args_fail(&format!("Error parsing option: --max-session-history ({})", err))) - }).unwrap_or(16); + }).unwrap_or(20); if opt_match.opt_present("M") { MULTIPROCESS.store(true, Ordering::SeqCst) diff --git a/components/constellation/constellation.rs b/components/constellation/constellation.rs index 18d9689adfe..8adf2e6ab29 100644 --- a/components/constellation/constellation.rs +++ b/components/constellation/constellation.rs @@ -2102,7 +2102,8 @@ impl Constellation } else if let Some(frame) = self.frames.get_mut(&frame_change.frame_id) { debug!("Adding pipeline to existing frame."); frame.load(frame_change.new_pipeline_id, frame_change.url.clone()); - let evicted_id = frame.prev.get_mut(opts::get().max_session_history) + let evicted_id = frame.prev.len().checked_sub(opts::get().max_session_history) + .and_then(|index| frame.prev.get_mut(index)) .and_then(|entry| entry.pipeline_id.take()); (evicted_id, false, true, true) } else { diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index 4f7b9c4ec43..c60b1486f1e 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -15128,6 +15128,12 @@ "url": "/_mozilla/mozilla/service-workers/service-worker-registration.html" } ], + "mozilla/servo-max-session-history.html": [ + { + "path": "mozilla/servo-max-session-history.html", + "url": "/_mozilla/mozilla/servo-max-session-history.html" + } + ], "mozilla/sigsegv.html": [ { "path": "mozilla/sigsegv.html", diff --git a/tests/wpt/mozilla/tests/mozilla/servo-max-session-history.html b/tests/wpt/mozilla/tests/mozilla/servo-max-session-history.html new file mode 100644 index 00000000000..7d60d8f3f9f --- /dev/null +++ b/tests/wpt/mozilla/tests/mozilla/servo-max-session-history.html @@ -0,0 +1,36 @@ + + + + + + + +