Skip to content

Commit

Permalink
Replace HistoryEntryReplacement with NavigationHistoryBehavior from t…
Browse files Browse the repository at this point in the history
…he navigation API (servo#34681)

Signed-off-by: Shane Handley <shanehandley@fastmail.com>
  • Loading branch information
shanehandley authored Dec 18, 2024
1 parent 3cbc8c2 commit 3a4e5d4
Show file tree
Hide file tree
Showing 11 changed files with 127 additions and 108 deletions.
76 changes: 42 additions & 34 deletions components/constellation/constellation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -1449,7 +1449,7 @@ where
top_level_browsing_context_id,
pipeline_id,
load_data,
HistoryEntryReplacement::Disabled,
NavigationHistoryBehavior::Push,
);
},
FromCompositorMsg::IsReadyToSaveImage(pipeline_states) => {
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -3273,7 +3278,7 @@ where
top_level_browsing_context_id,
new_pipeline_id,
is_private,
mut replace,
mut history_handling,
..
} = load_info.info;

Expand All @@ -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",
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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(_) => {
Expand All @@ -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
Expand All @@ -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,
);
Expand Down Expand Up @@ -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),
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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) => {
Expand All @@ -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 => {},
}
}

Expand Down Expand Up @@ -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) => {
Expand All @@ -4681,7 +4689,7 @@ where
top_level_browsing_context_id,
load_data,
response_sender,
HistoryEntryReplacement::Enabled,
NavigationHistoryBehavior::Replace,
);
},
WebDriverCommandMsg::ScriptCommand(browsing_context_id, cmd) => {
Expand Down Expand Up @@ -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) {
Expand All @@ -4926,7 +4934,7 @@ where
top_level_browsing_context_id,
pipeline_id,
load_data,
replace,
history_handling,
) {
debug!(
"Setting up webdriver load notification for {:?}",
Expand Down
4 changes: 2 additions & 2 deletions components/script/dom/htmlformelement.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -1030,7 +1030,7 @@ impl HTMLFormElement {
window
.root()
.load_url(
HistoryEntryReplacement::Disabled,
NavigationHistoryBehavior::Push,
false,
load_data,
CanGc::note(),
Expand Down
31 changes: 19 additions & 12 deletions components/script/dom/htmliframeelement.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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() {
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -407,7 +414,7 @@ impl HTMLIFrameElement {
self.start_new_pipeline(
load_data,
PipelineType::InitialAboutBlank,
HistoryEntryReplacement::Disabled,
NavigationHistoryBehavior::Push,
can_gc,
);
}
Expand Down
4 changes: 2 additions & 2 deletions components/script/dom/htmlmetaelement.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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,
);
Expand Down
Loading

0 comments on commit 3a4e5d4

Please sign in to comment.