aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authorshanehandley <1322294+shanehandley@users.noreply.github.com>2024-12-18 23:47:20 +1100
committerGitHub <noreply@github.com>2024-12-18 12:47:20 +0000
commit3a4e5d4245d3d4a4c29a03fc50d78ed1eb0f0c67 (patch)
treed2492c8182421ab45c137f55d3004122167c7fe5 /components
parent3cbc8c2442b18ad50a2e24dc3570101833677c28 (diff)
downloadservo-3a4e5d4245d3d4a4c29a03fc50d78ed1eb0f0c67.tar.gz
servo-3a4e5d4245d3d4a4c29a03fc50d78ed1eb0f0c67.zip
Replace HistoryEntryReplacement with NavigationHistoryBehavior from the navigation API (#34681)
Signed-off-by: Shane Handley <shanehandley@fastmail.com>
Diffstat (limited to 'components')
-rw-r--r--components/constellation/constellation.rs76
-rw-r--r--components/script/dom/htmlformelement.rs4
-rw-r--r--components/script/dom/htmliframeelement.rs31
-rw-r--r--components/script/dom/htmlmetaelement.rs4
-rw-r--r--components/script/dom/location.rs16
-rw-r--r--components/script/dom/window.rs8
-rw-r--r--components/script/dom/windowproxy.rs13
-rw-r--r--components/script/links.rs19
-rw-r--r--components/script/script_thread.rs20
-rw-r--r--components/shared/script/lib.rs27
-rw-r--r--components/shared/script/script_msg.rs17
11 files changed, 127 insertions, 108 deletions
diff --git a/components/constellation/constellation.rs b/components/constellation/constellation.rs
index f85f6c676e4..5282cbe26c9 100644
--- a/components/constellation/constellation.rs
+++ b/components/constellation/constellation.rs
@@ -138,9 +138,9 @@ use script_traits::CompositorEvent::{MouseButtonEvent, MouseMoveEvent};
use script_traits::{
webdriver_msg, AnimationState, AnimationTickType, AuxiliaryBrowsingContextLoadInfo,
BroadcastMsg, CompositorEvent, ConstellationControlMsg, DiscardBrowsingContext,
- DocumentActivity, DocumentState, GamepadEvent, HistoryEntryReplacement, IFrameLoadInfo,
- IFrameLoadInfoWithData, IFrameSandboxState, IFrameSizeMsg, Job, LayoutMsg as FromLayoutMsg,
- LoadData, LoadOrigin, LogEntry, MediaSessionActionType, MessagePortMsg, MouseEventType,
+ DocumentActivity, DocumentState, GamepadEvent, IFrameLoadInfo, IFrameLoadInfoWithData,
+ IFrameSandboxState, IFrameSizeMsg, Job, LayoutMsg as FromLayoutMsg, LoadData, LoadOrigin,
+ LogEntry, MediaSessionActionType, MessagePortMsg, MouseEventType, NavigationHistoryBehavior,
PortMessageTask, SWManagerMsg, SWManagerSenders, ScriptMsg as FromScriptMsg,
ScriptToConstellationChan, ServiceWorkerManagerFactory, ServiceWorkerMsg,
StructuredSerializedData, Theme, TimerSchedulerMsg, TraversalDirection, UpdatePipelineIdReason,
@@ -175,7 +175,7 @@ use crate::session_history::{
use crate::timer_scheduler::TimerScheduler;
use crate::webview::WebViewManager;
-type PendingApprovalNavigations = HashMap<PipelineId, (LoadData, HistoryEntryReplacement)>;
+type PendingApprovalNavigations = HashMap<PipelineId, (LoadData, NavigationHistoryBehavior)>;
#[derive(Debug)]
/// The state used by MessagePortInfo to represent the various states the port can be in.
@@ -1373,13 +1373,13 @@ where
};
match pending {
- Some((load_data, replace)) => {
+ Some((load_data, history_handling)) => {
if allowed {
self.load_url(
top_level_browsing_context_id,
pipeline_id,
load_data,
- replace,
+ history_handling,
);
} else {
let pipeline_is_top_level_pipeline = self
@@ -1449,7 +1449,7 @@ where
top_level_browsing_context_id,
pipeline_id,
load_data,
- HistoryEntryReplacement::Disabled,
+ NavigationHistoryBehavior::Push,
);
},
FromCompositorMsg::IsReadyToSaveImage(pipeline_states) => {
@@ -1673,8 +1673,13 @@ where
self.handle_change_running_animations_state(source_pipeline_id, animation_state)
},
// Ask the embedder for permission to load a new page.
- FromScriptMsg::LoadUrl(load_data, replace) => {
- self.schedule_navigation(source_top_ctx_id, source_pipeline_id, load_data, replace);
+ FromScriptMsg::LoadUrl(load_data, history_handling) => {
+ self.schedule_navigation(
+ source_top_ctx_id,
+ source_pipeline_id,
+ load_data,
+ history_handling,
+ );
},
FromScriptMsg::AbortLoadUrl => {
self.handle_abort_load_url_msg(source_pipeline_id);
@@ -3273,7 +3278,7 @@ where
top_level_browsing_context_id,
new_pipeline_id,
is_private,
- mut replace,
+ mut history_handling,
..
} = load_info.info;
@@ -3286,7 +3291,7 @@ where
// see https://html.spec.whatwg.org/multipage/#the-iframe-element:completely-loaded
if let Some(old_pipeline) = old_pipeline {
if !old_pipeline.completely_loaded {
- replace = HistoryEntryReplacement::Enabled;
+ history_handling = NavigationHistoryBehavior::Replace;
}
debug!(
"{:?}: Old pipeline is {}completely loaded",
@@ -3332,11 +3337,10 @@ where
},
};
- let replace = match replace {
- HistoryEntryReplacement::Enabled => {
- Some(NeedsToReload::No(browsing_context.pipeline_id))
- },
- HistoryEntryReplacement::Disabled => None,
+ let replace = if history_handling == NavigationHistoryBehavior::Replace {
+ Some(NeedsToReload::No(browsing_context.pipeline_id))
+ } else {
+ None
};
// https://github.com/rust-lang/rust/issues/59159
@@ -3592,7 +3596,7 @@ where
top_level_browsing_context_id: TopLevelBrowsingContextId,
source_id: PipelineId,
load_data: LoadData,
- replace: HistoryEntryReplacement,
+ history_handling: NavigationHistoryBehavior,
) {
match self.pending_approval_navigations.entry(source_id) {
Entry::Occupied(_) => {
@@ -3602,7 +3606,7 @@ where
);
},
Entry::Vacant(entry) => {
- let _ = entry.insert((load_data.clone(), replace));
+ let _ = entry.insert((load_data.clone(), history_handling));
},
};
// Allow the embedder to handle the url itself
@@ -3622,14 +3626,15 @@ where
top_level_browsing_context_id: TopLevelBrowsingContextId,
source_id: PipelineId,
load_data: LoadData,
- replace: HistoryEntryReplacement,
+ history_handling: NavigationHistoryBehavior,
) -> Option<PipelineId> {
debug!(
"{}: Loading ({}replacing): {}",
source_id,
- match replace {
- HistoryEntryReplacement::Enabled => "",
- HistoryEntryReplacement::Disabled => "not ",
+ match history_handling {
+ NavigationHistoryBehavior::Push => "",
+ NavigationHistoryBehavior::Replace => "not ",
+ NavigationHistoryBehavior::Auto => "unsure if ",
},
load_data.url,
);
@@ -3676,7 +3681,7 @@ where
parent_pipeline_id,
browsing_context_id,
load_data,
- replace,
+ history_handling,
);
let result = match self.pipelines.get(&parent_pipeline_id) {
Some(parent_pipeline) => parent_pipeline.event_loop.send(msg),
@@ -3712,9 +3717,10 @@ where
// Create the new pipeline
- let replace = match replace {
- HistoryEntryReplacement::Enabled => Some(NeedsToReload::No(pipeline_id)),
- HistoryEntryReplacement::Disabled => None,
+ let replace = if history_handling == NavigationHistoryBehavior::Replace {
+ Some(NeedsToReload::No(pipeline_id))
+ } else {
+ None
};
let new_pipeline_id = PipelineId::new();
@@ -3826,7 +3832,7 @@ where
&mut self,
pipeline_id: PipelineId,
new_url: ServoUrl,
- replacement_enabled: HistoryEntryReplacement,
+ history_handling: NavigationHistoryBehavior,
) {
let (top_level_browsing_context_id, old_url) = match self.pipelines.get_mut(&pipeline_id) {
Some(pipeline) => {
@@ -3838,18 +3844,20 @@ where
},
};
- match replacement_enabled {
- HistoryEntryReplacement::Disabled => {
+ match history_handling {
+ NavigationHistoryBehavior::Replace => {},
+ _ => {
let diff = SessionHistoryDiff::Hash {
pipeline_reloader: NeedsToReload::No(pipeline_id),
new_url,
old_url,
};
+
self.get_joint_session_history(top_level_browsing_context_id)
.push_diff(diff);
+
self.notify_history_changed(top_level_browsing_context_id);
},
- HistoryEntryReplacement::Enabled => {},
}
}
@@ -4662,7 +4670,7 @@ where
top_level_browsing_context_id,
load_data,
response_sender,
- HistoryEntryReplacement::Disabled,
+ NavigationHistoryBehavior::Push,
);
},
WebDriverCommandMsg::Refresh(top_level_browsing_context_id, response_sender) => {
@@ -4681,7 +4689,7 @@ where
top_level_browsing_context_id,
load_data,
response_sender,
- HistoryEntryReplacement::Enabled,
+ NavigationHistoryBehavior::Replace,
);
},
WebDriverCommandMsg::ScriptCommand(browsing_context_id, cmd) => {
@@ -4909,7 +4917,7 @@ where
top_level_browsing_context_id: TopLevelBrowsingContextId,
load_data: LoadData,
response_sender: IpcSender<webdriver_msg::LoadStatus>,
- replace: HistoryEntryReplacement,
+ history_handling: NavigationHistoryBehavior,
) {
let browsing_context_id = BrowsingContextId::from(top_level_browsing_context_id);
let pipeline_id = match self.browsing_contexts.get(&browsing_context_id) {
@@ -4926,7 +4934,7 @@ where
top_level_browsing_context_id,
pipeline_id,
load_data,
- replace,
+ history_handling,
) {
debug!(
"Setting up webdriver load notification for {:?}",
diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs
index dd278cc8ad3..0467d30bdf6 100644
--- a/components/script/dom/htmlformelement.rs
+++ b/components/script/dom/htmlformelement.rs
@@ -15,7 +15,7 @@ use js::rust::HandleObject;
use mime::{self, Mime};
use net_traits::http_percent_encode;
use net_traits::request::Referrer;
-use script_traits::{HistoryEntryReplacement, LoadData, LoadOrigin};
+use script_traits::{LoadData, LoadOrigin, NavigationHistoryBehavior};
use servo_atoms::Atom;
use servo_rand::random;
use style::attr::AttrValue;
@@ -1030,7 +1030,7 @@ impl HTMLFormElement {
window
.root()
.load_url(
- HistoryEntryReplacement::Disabled,
+ NavigationHistoryBehavior::Push,
false,
load_data,
CanGc::note(),
diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs
index f12f7daea40..b3cf46343b5 100644
--- a/components/script/dom/htmliframeelement.rs
+++ b/components/script/dom/htmliframeelement.rs
@@ -13,8 +13,8 @@ use net_traits::ReferrerPolicy;
use profile_traits::ipc as ProfiledIpc;
use script_traits::IFrameSandboxState::{IFrameSandboxed, IFrameUnsandboxed};
use script_traits::{
- HistoryEntryReplacement, IFrameLoadInfo, IFrameLoadInfoWithData, JsEvalResult, LoadData,
- LoadOrigin, NewLayoutInfo, ScriptMsg, UpdatePipelineIdReason, WindowSizeData,
+ IFrameLoadInfo, IFrameLoadInfoWithData, JsEvalResult, LoadData, LoadOrigin,
+ NavigationHistoryBehavior, NewLayoutInfo, ScriptMsg, UpdatePipelineIdReason, WindowSizeData,
};
use servo_atoms::Atom;
use servo_url::ServoUrl;
@@ -117,17 +117,22 @@ impl HTMLIFrameElement {
pub fn navigate_or_reload_child_browsing_context(
&self,
load_data: LoadData,
- replace: HistoryEntryReplacement,
+ history_handling: NavigationHistoryBehavior,
can_gc: CanGc,
) {
- self.start_new_pipeline(load_data, PipelineType::Navigation, replace, can_gc);
+ self.start_new_pipeline(
+ load_data,
+ PipelineType::Navigation,
+ history_handling,
+ can_gc,
+ );
}
fn start_new_pipeline(
&self,
mut load_data: LoadData,
pipeline_type: PipelineType,
- replace: HistoryEntryReplacement,
+ history_handling: NavigationHistoryBehavior,
can_gc: CanGc,
) {
let sandboxed = if self.is_sandboxed() {
@@ -191,7 +196,7 @@ impl HTMLIFrameElement {
new_pipeline_id,
is_private: false, // FIXME
inherited_secure_context: load_data.inherited_secure_context,
- replace,
+ history_handling,
};
let window_size = WindowSizeData {
@@ -269,7 +274,7 @@ impl HTMLIFrameElement {
load_data.srcdoc = String::from(element.get_string_attribute(&local_name!("srcdoc")));
self.navigate_or_reload_child_browsing_context(
load_data,
- HistoryEntryReplacement::Disabled,
+ NavigationHistoryBehavior::Push,
can_gc,
);
return;
@@ -361,12 +366,14 @@ impl HTMLIFrameElement {
// see https://html.spec.whatwg.org/multipage/#the-iframe-element:about:blank-3
let is_about_blank =
pipeline_id.is_some() && pipeline_id == self.about_blank_pipeline_id.get();
- let replace = if is_about_blank {
- HistoryEntryReplacement::Enabled
+
+ let history_handling = if is_about_blank {
+ NavigationHistoryBehavior::Replace
} else {
- HistoryEntryReplacement::Disabled
+ NavigationHistoryBehavior::Push
};
- self.navigate_or_reload_child_browsing_context(load_data, replace, can_gc);
+
+ self.navigate_or_reload_child_browsing_context(load_data, history_handling, can_gc);
}
fn create_nested_browsing_context(&self, can_gc: CanGc) {
@@ -407,7 +414,7 @@ impl HTMLIFrameElement {
self.start_new_pipeline(
load_data,
PipelineType::InitialAboutBlank,
- HistoryEntryReplacement::Disabled,
+ NavigationHistoryBehavior::Push,
can_gc,
);
}
diff --git a/components/script/dom/htmlmetaelement.rs b/components/script/dom/htmlmetaelement.rs
index e3df38f9f91..6a8863cbf84 100644
--- a/components/script/dom/htmlmetaelement.rs
+++ b/components/script/dom/htmlmetaelement.rs
@@ -10,7 +10,7 @@ use dom_struct::dom_struct;
use html5ever::{LocalName, Prefix};
use js::rust::HandleObject;
use regex::bytes::Regex;
-use script_traits::HistoryEntryReplacement;
+use script_traits::NavigationHistoryBehavior;
use servo_url::ServoUrl;
use style::str::HTML_SPACE_CHARACTERS;
@@ -49,7 +49,7 @@ impl RefreshRedirectDue {
pub fn invoke(self, can_gc: CanGc) {
self.window.Location().navigate(
self.url.clone(),
- HistoryEntryReplacement::Enabled,
+ NavigationHistoryBehavior::Replace,
NavigationType::DeclarativeRefresh,
can_gc,
);
diff --git a/components/script/dom/location.rs b/components/script/dom/location.rs
index a0ad9f583d8..d8e5d823e3c 100644
--- a/components/script/dom/location.rs
+++ b/components/script/dom/location.rs
@@ -4,7 +4,7 @@
use dom_struct::dom_struct;
use net_traits::request::Referrer;
-use script_traits::{HistoryEntryReplacement, LoadData, LoadOrigin};
+use script_traits::{LoadData, LoadOrigin, NavigationHistoryBehavior};
use servo_url::{MutableOrigin, ServoUrl};
use crate::dom::bindings::codegen::Bindings::LocationBinding::LocationMethods;
@@ -69,7 +69,7 @@ impl Location {
pub fn navigate(
&self,
url: ServoUrl,
- replacement_flag: HistoryEntryReplacement,
+ history_handling: NavigationHistoryBehavior,
navigation_type: NavigationType,
can_gc: CanGc,
) {
@@ -131,7 +131,7 @@ impl Location {
None, // Top navigation doesn't inherit secure context
);
self.window
- .load_url(replacement_flag, reload_triggered, load_data, can_gc);
+ .load_url(history_handling, reload_triggered, load_data, can_gc);
}
/// Get if this `Location`'s [relevant `Document`][1] is non-null.
@@ -233,7 +233,7 @@ impl Location {
// Step 6: Location-object navigate to copyURL.
self.navigate(
copy_url,
- HistoryEntryReplacement::Disabled,
+ NavigationHistoryBehavior::Push,
NavigationType::Normal,
can_gc,
);
@@ -254,7 +254,7 @@ impl Location {
let url = self.window.get_url();
self.navigate(
url,
- HistoryEntryReplacement::Enabled,
+ NavigationHistoryBehavior::Replace,
NavigationType::ReloadByConstellation,
can_gc,
);
@@ -290,7 +290,7 @@ impl LocationMethods<crate::DomTypeHolder> for Location {
let url = self.get_url_if_same_origin()?;
self.navigate(
url,
- HistoryEntryReplacement::Enabled,
+ NavigationHistoryBehavior::Replace,
NavigationType::ReloadByScript,
can_gc,
);
@@ -312,7 +312,7 @@ impl LocationMethods<crate::DomTypeHolder> for Location {
// the replacement flag set.
self.navigate(
url,
- HistoryEntryReplacement::Enabled,
+ NavigationHistoryBehavior::Replace,
NavigationType::Normal,
can_gc,
);
@@ -424,7 +424,7 @@ impl LocationMethods<crate::DomTypeHolder> for Location {
// Step 3: Location-object navigate to the resulting URL record.
self.navigate(
url,
- HistoryEntryReplacement::Disabled,
+ NavigationHistoryBehavior::Push,
NavigationType::Normal,
can_gc,
);
diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs
index 666762bc549..d9b2a86e855 100644
--- a/components/script/dom/window.rs
+++ b/components/script/dom/window.rs
@@ -56,7 +56,7 @@ use script_layout_interface::{
};
use script_traits::webdriver_msg::{WebDriverJSError, WebDriverJSResult};
use script_traits::{
- ConstellationControlMsg, DocumentState, HistoryEntryReplacement, IFrameSizeMsg, LoadData,
+ ConstellationControlMsg, DocumentState, IFrameSizeMsg, LoadData, NavigationHistoryBehavior,
ScriptMsg, ScriptToConstellationChan, ScrollState, StructuredSerializedData, Theme,
TimerSchedulerMsg, WindowSizeData, WindowSizeType,
};
@@ -2387,7 +2387,7 @@ impl Window {
/// <https://html.spec.whatwg.org/multipage/#navigating-across-documents>
pub fn load_url(
&self,
- replace: HistoryEntryReplacement,
+ history_handling: NavigationHistoryBehavior,
force_reload: bool,
load_data: LoadData,
can_gc: CanGc,
@@ -2403,7 +2403,7 @@ impl Window {
if let Some(fragment) = load_data.url.fragment() {
self.send_to_constellation(ScriptMsg::NavigatedToFragment(
load_data.url.clone(),
- replace,
+ history_handling,
));
doc.check_and_scroll_fragment(fragment, can_gc);
let this = Trusted::new(self);
@@ -2462,7 +2462,7 @@ impl Window {
window_proxy.browsing_context_id(),
pipeline_id,
load_data,
- replace,
+ history_handling,
);
};
}
diff --git a/components/script/dom/windowproxy.rs b/components/script/dom/windowproxy.rs
index 02267471930..a85ce40a919 100644
--- a/components/script/dom/windowproxy.rs
+++ b/components/script/dom/windowproxy.rs
@@ -31,8 +31,8 @@ use js::JSCLASS_IS_GLOBAL;
use malloc_size_of::{MallocSizeOf, MallocSizeOfOps};
use net_traits::request::Referrer;
use script_traits::{
- AuxiliaryBrowsingContextLoadInfo, HistoryEntryReplacement, LoadData, LoadOrigin, NewLayoutInfo,
- ScriptMsg,
+ AuxiliaryBrowsingContextLoadInfo, LoadData, LoadOrigin, NavigationHistoryBehavior,
+ NewLayoutInfo, ScriptMsg,
};
use serde::{Deserialize, Serialize};
use servo_url::{ImmutableOrigin, ServoUrl};
@@ -526,12 +526,13 @@ impl WindowProxy {
referrer_policy,
Some(secure),
);
- let replacement_flag = if new {
- HistoryEntryReplacement::Enabled
+ let history_handling = if new {
+ NavigationHistoryBehavior::Replace
} else {
- HistoryEntryReplacement::Disabled
+ NavigationHistoryBehavior::Push
};
- target_window.load_url(replacement_flag, false, load_data, can_gc);
+
+ target_window.load_url(history_handling, false, load_data, can_gc);
}
if noopener {
// Step 15 (Dis-owning has been done in create_auxiliary_browsing_context).
diff --git a/components/script/links.rs b/components/script/links.rs
index b004f0bcd52..8312bd13130 100644
--- a/components/script/links.rs
+++ b/components/script/links.rs
@@ -7,7 +7,7 @@
use html5ever::{local_name, namespace_url, ns};
use malloc_size_of::malloc_size_of_is_0;
use net_traits::request::Referrer;
-use script_traits::{HistoryEntryReplacement, LoadData, LoadOrigin};
+use script_traits::{LoadData, LoadOrigin, NavigationHistoryBehavior};
use style::str::HTML_SPACE_CHARACTERS;
use crate::dom::bindings::codegen::Bindings::AttrBinding::Attr_Binding::AttrMethods;
@@ -367,20 +367,17 @@ pub fn follow_hyperlink(
let noopener = relations.get_element_noopener(target_attribute_value.as_ref());
// Step 7.
- let (maybe_chosen, replace) = match target_attribute_value {
+ let (maybe_chosen, history_handling) = match target_attribute_value {
Some(name) => {
let (maybe_chosen, new) = source.choose_browsing_context(name, noopener);
- let replace = if new {
- HistoryEntryReplacement::Enabled
+ let history_handling = if new {
+ NavigationHistoryBehavior::Replace
} else {
- HistoryEntryReplacement::Disabled
+ NavigationHistoryBehavior::Push
};
- (maybe_chosen, replace)
+ (maybe_chosen, history_handling)
},
- None => (
- Some(window.window_proxy()),
- HistoryEntryReplacement::Disabled,
- ),
+ None => (Some(window.window_proxy()), NavigationHistoryBehavior::Push),
};
// Step 8.
@@ -433,7 +430,7 @@ pub fn follow_hyperlink(
let target = Trusted::new(target_window);
let task = task!(navigate_follow_hyperlink: move || {
debug!("following hyperlink to {}", load_data.url);
- target.root().load_url(replace, false, load_data, CanGc::note());
+ target.root().load_url(history_handling, false, load_data, CanGc::note());
});
target_window
.task_manager()
diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs
index 2a72c475688..97fa9c55af3 100644
--- a/components/script/script_thread.rs
+++ b/components/script/script_thread.rs
@@ -82,9 +82,9 @@ use script_layout_interface::{
use script_traits::webdriver_msg::WebDriverScriptCommand;
use script_traits::{
CompositorEvent, ConstellationControlMsg, DiscardBrowsingContext, DocumentActivity,
- EventResult, HistoryEntryReplacement, InitialScriptState, JsEvalResult, LayoutMsg, LoadData,
- LoadOrigin, MediaSessionActionType, MouseButton, MouseEventType, NewLayoutInfo, Painter,
- ProgressiveWebMetricType, ScriptMsg, ScriptToConstellationChan, ScrollState,
+ EventResult, InitialScriptState, JsEvalResult, LayoutMsg, LoadData, LoadOrigin,
+ MediaSessionActionType, MouseButton, MouseEventType, NavigationHistoryBehavior, NewLayoutInfo,
+ Painter, ProgressiveWebMetricType, ScriptMsg, ScriptToConstellationChan, ScrollState,
StructuredSerializedData, Theme, TimerSchedulerMsg, TouchEventType, TouchId,
UntrustedNodeAddress, UpdatePipelineIdReason, WheelDelta, WindowSizeData, WindowSizeType,
};
@@ -915,7 +915,7 @@ impl ScriptThread {
browsing_context: BrowsingContextId,
pipeline_id: PipelineId,
mut load_data: LoadData,
- replace: HistoryEntryReplacement,
+ history_handling: NavigationHistoryBehavior,
) {
with_script_thread(|script_thread| {
let is_javascript = load_data.url.scheme() == "javascript";
@@ -936,7 +936,7 @@ impl ScriptThread {
if ScriptThread::check_load_origin(&load_data.load_origin, &window.get_url().origin()) {
ScriptThread::eval_js_url(&trusted_global.root(), &mut load_data, CanGc::note());
sender
- .send((pipeline_id, ScriptMsg::LoadUrl(load_data, replace)))
+ .send((pipeline_id, ScriptMsg::LoadUrl(load_data, history_handling)))
.unwrap();
}
}
@@ -955,7 +955,7 @@ impl ScriptThread {
script_thread
.script_sender
- .send((pipeline_id, ScriptMsg::LoadUrl(load_data, replace)))
+ .send((pipeline_id, ScriptMsg::LoadUrl(load_data, history_handling)))
.expect("Sending a LoadUrl message to the constellation failed");
}
});
@@ -2242,12 +2242,12 @@ impl ScriptThread {
parent_pipeline_id,
browsing_context_id,
load_data,
- replace,
+ history_handling,
) => self.handle_navigate_iframe(
parent_pipeline_id,
browsing_context_id,
load_data,
- replace,
+ history_handling,
can_gc,
),
ConstellationControlMsg::UnloadDocument(pipeline_id) => {
@@ -3923,7 +3923,7 @@ impl ScriptThread {
parent_pipeline_id: PipelineId,
browsing_context_id: BrowsingContextId,
load_data: LoadData,
- replace: HistoryEntryReplacement,
+ history_handling: NavigationHistoryBehavior,
can_gc: CanGc,
) {
let iframe = self
@@ -3931,7 +3931,7 @@ impl ScriptThread {
.borrow()
.find_iframe(parent_pipeline_id, browsing_context_id);
if let Some(iframe) = iframe {
- iframe.navigate_or_reload_child_browsing_context(load_data, replace, can_gc);
+ iframe.navigate_or_reload_child_browsing_context(load_data, history_handling, can_gc);
}
}
diff --git a/components/shared/script/lib.rs b/components/shared/script/lib.rs
index 1f4767af126..8a248a873ae 100644
--- a/components/shared/script/lib.rs
+++ b/components/shared/script/lib.rs
@@ -64,9 +64,9 @@ use webrender_traits::{
};
pub use crate::script_msg::{
- DOMMessage, EventResult, HistoryEntryReplacement, IFrameSizeMsg, Job, JobError, JobResult,
- JobResultValue, JobType, LayoutMsg, LogEntry, SWManagerMsg, SWManagerSenders, ScopeThings,
- ScriptMsg, ServiceWorkerMsg, TraversalDirection,
+ DOMMessage, EventResult, IFrameSizeMsg, Job, JobError, JobResult, JobResultValue, JobType,
+ LayoutMsg, LogEntry, SWManagerMsg, SWManagerSenders, ScopeThings, ScriptMsg, ServiceWorkerMsg,
+ TraversalDirection,
};
use crate::serializable::{BlobData, BlobImpl};
use crate::transferable::MessagePortImpl;
@@ -233,6 +233,21 @@ pub enum DiscardBrowsingContext {
No,
}
+/// <https://html.spec.whatwg.org/multipage/#navigation-supporting-concepts:navigationhistorybehavior>
+#[derive(Debug, Default, Deserialize, PartialEq, Serialize)]
+pub enum NavigationHistoryBehavior {
+ /// The default value, which will be converted very early in the navigate algorithm into "push"
+ /// or "replace". Usually it becomes "push", but under certain circumstances it becomes
+ /// "replace" instead.
+ #[default]
+ Auto,
+ /// A regular navigation which adds a new session history entry, and will clear the forward
+ /// session history.
+ Push,
+ /// A navigation that will replace the active session history entry.
+ Replace,
+}
+
/// Is a document fully active, active or inactive?
/// A document is active if it is the current active document in its session history,
/// it is fuly active if it is active and all of its ancestors are active,
@@ -316,7 +331,7 @@ pub enum ConstellationControlMsg {
PipelineId,
BrowsingContextId,
LoadData,
- HistoryEntryReplacement,
+ NavigationHistoryBehavior,
),
/// Post a message to a given window.
PostMessage {
@@ -721,9 +736,9 @@ pub struct IFrameLoadInfo {
pub is_private: bool,
/// Whether this iframe should be considered secure
pub inherited_secure_context: Option<bool>,
- /// Wether this load should replace the current entry (reload). If true, the current
+ /// Whether this load should replace the current entry (reload). If true, the current
/// entry will be replaced instead of a new entry being added.
- pub replace: HistoryEntryReplacement,
+ pub history_handling: NavigationHistoryBehavior,
}
/// Specifies the information required to load a URL in an iframe.
diff --git a/components/shared/script/script_msg.rs b/components/shared/script/script_msg.rs
index 9e51cf6d548..c391267643a 100644
--- a/components/shared/script/script_msg.rs
+++ b/components/shared/script/script_msg.rs
@@ -28,8 +28,8 @@ use webgpu::{wgc, WebGPU, WebGPUResponse};
use crate::{
AnimationState, AuxiliaryBrowsingContextLoadInfo, BroadcastMsg, DocumentState,
- IFrameLoadInfoWithData, LoadData, MessagePortMsg, PortMessageTask, StructuredSerializedData,
- WindowSizeType, WorkerGlobalScopeInit, WorkerScriptLoadOrigin,
+ IFrameLoadInfoWithData, LoadData, MessagePortMsg, NavigationHistoryBehavior, PortMessageTask,
+ StructuredSerializedData, WindowSizeType, WorkerGlobalScopeInit, WorkerScriptLoadOrigin,
};
/// An iframe sizing operation.
@@ -83,15 +83,6 @@ pub enum LogEntry {
Warn(String),
}
-/// <https://html.spec.whatwg.org/multipage/#replacement-enabled>
-#[derive(Debug, Deserialize, Serialize)]
-pub enum HistoryEntryReplacement {
- /// Traverse the history with replacement enabled.
- Enabled,
- /// Traverse the history with replacement disabled.
- Disabled,
-}
-
/// Messages from the script to the constellation.
#[derive(Deserialize, Serialize)]
pub enum ScriptMsg {
@@ -181,7 +172,7 @@ pub enum ScriptMsg {
LoadComplete,
/// A new load has been requested, with an option to replace the current entry once loaded
/// instead of adding a new entry.
- LoadUrl(LoadData, HistoryEntryReplacement),
+ LoadUrl(LoadData, NavigationHistoryBehavior),
/// Abort loading after sending a LoadUrl message.
AbortLoadUrl,
/// Post a message to the currently active window of a given browsing context.
@@ -199,7 +190,7 @@ pub enum ScriptMsg {
data: StructuredSerializedData,
},
/// Inform the constellation that a fragment was navigated to and whether or not it was a replacement navigation.
- NavigatedToFragment(ServoUrl, HistoryEntryReplacement),
+ NavigatedToFragment(ServoUrl, NavigationHistoryBehavior),
/// HTMLIFrameElement Forward or Back traversal.
TraverseHistory(TraversalDirection),
/// Inform the constellation of a pushed history state.