From aafa09e7a5b5a9353d1a36d7877fd1d5039cd79f Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Fri, 7 Apr 2023 00:03:15 +0300 Subject: [PATCH] LibWeb: Implement "traverse the history by delta" for traversables --- .../LibWeb/HTML/TraversableNavigable.cpp | 28 +++++++++++++++++++ .../LibWeb/HTML/TraversableNavigable.h | 1 + 2 files changed, 29 insertions(+) diff --git a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp index ae7ecd3ff96..2d46cf44a83 100644 --- a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp +++ b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.cpp @@ -470,4 +470,32 @@ void TraversableNavigable::clear_the_forward_session_history() } } +// https://html.spec.whatwg.org/multipage/browsing-the-web.html#traverse-the-history-by-a-delta +void TraversableNavigable::traverse_the_history_by_delta(int delta) +{ + // FIXME: 1. Let sourceSnapshotParams and initiatorToCheck be null. + + // FIXME: 2. If sourceDocument is given, then: + + // 3. Append the following session history traversal steps to traversable: + + // 1. Let allSteps be the result of getting all used history steps for traversable. + auto all_steps = get_all_used_history_steps(); + + // 2. Let currentStepIndex be the index of traversable's current session history step within allSteps. + auto current_step_index = *all_steps.find_first_index(current_session_history_step()); + + // 3. Let targetStepIndex be currentStepIndex plus delta + auto target_step_index = current_step_index + delta; + + // 4. If allSteps[targetStepIndex] does not exist, then abort these steps. + if (target_step_index >= all_steps.size()) { + return; + } + + // 5. Apply the history step allSteps[targetStepIndex] to traversable, with checkForUserCancelation set to true, + // sourceSnapshotParams set to sourceSnapshotParams, and initiatorToCheck set to initiatorToCheck. + apply_the_history_step(all_steps[target_step_index]); +} + } diff --git a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h index 68be0956426..810e2e44591 100644 --- a/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h +++ b/Userland/Libraries/LibWeb/HTML/TraversableNavigable.h @@ -42,6 +42,7 @@ public: Vector> get_all_navigables_whose_current_session_history_entry_will_change_or_reload(int) const; Vector get_all_used_history_steps() const; void clear_the_forward_session_history(); + void traverse_the_history_by_delta(int delta); private: TraversableNavigable();