diff options
author | shanehandley <1322294+shanehandley@users.noreply.github.com> | 2024-12-18 23:47:20 +1100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-12-18 12:47:20 +0000 |
commit | 3a4e5d4245d3d4a4c29a03fc50d78ed1eb0f0c67 (patch) | |
tree | d2492c8182421ab45c137f55d3004122167c7fe5 /components | |
parent | 3cbc8c2442b18ad50a2e24dc3570101833677c28 (diff) | |
download | servo-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.rs | 76 | ||||
-rw-r--r-- | components/script/dom/htmlformelement.rs | 4 | ||||
-rw-r--r-- | components/script/dom/htmliframeelement.rs | 31 | ||||
-rw-r--r-- | components/script/dom/htmlmetaelement.rs | 4 | ||||
-rw-r--r-- | components/script/dom/location.rs | 16 | ||||
-rw-r--r-- | components/script/dom/window.rs | 8 | ||||
-rw-r--r-- | components/script/dom/windowproxy.rs | 13 | ||||
-rw-r--r-- | components/script/links.rs | 19 | ||||
-rw-r--r-- | components/script/script_thread.rs | 20 | ||||
-rw-r--r-- | components/shared/script/lib.rs | 27 | ||||
-rw-r--r-- | components/shared/script/script_msg.rs | 17 |
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. |