Use the LibWebView history mirror to preserve traversable session history across WebContent process swaps. WebContent reports snapshots to the UI process, and new renderers can be seeded from the mirror. Browser back and forward now resolve through the UI-owned used history steps. WebContent still runs the spec traversal path when the current renderer has enough matching state to do so. Handle canceled and no-op UI navigations without leaving speculative history entries or pending WebDriver waits behind. Preserve traversal precheck state across synchronous IPC shutdown, and avoid overwriting a restored target entry's persisted scroll state before the document has adopted that entry.
87 lines
2.5 KiB
C++
87 lines
2.5 KiB
C++
/*
|
|
* Copyright (c) 2026, Johan Dahlin <jdahlin@gmail.com>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/Vector.h>
|
|
#include <LibURL/URL.h>
|
|
#include <LibWeb/HTML/ActivateTab.h>
|
|
#include <LibWebView/Menu.h>
|
|
#include <UI/Gtk/Widgets/LadybirdBrowserWindow.h>
|
|
#include <UI/Gtk/Widgets/LadybirdLocationEntry.h>
|
|
|
|
#include <adwaita.h>
|
|
|
|
namespace Ladybird {
|
|
|
|
class Tab;
|
|
class WebContentView;
|
|
|
|
class BrowserWindow {
|
|
public:
|
|
BrowserWindow(AdwApplication* app, Vector<URL::URL> const& initial_urls);
|
|
~BrowserWindow();
|
|
|
|
GtkWindow* gtk_window() const { return GTK_WINDOW(m_window); }
|
|
|
|
Tab& create_new_tab(Web::HTML::ActivateTab activate_tab);
|
|
Tab& create_new_tab(URL::URL const& url, Web::HTML::ActivateTab activate_tab);
|
|
Tab& create_child_tab(Web::HTML::ActivateTab activate_tab, Tab& parent, u64 page_index);
|
|
void close_tab(Tab& tab);
|
|
void close_current_tab();
|
|
Tab* current_tab() const;
|
|
WebContentView* view() const;
|
|
void present();
|
|
int tab_count() const;
|
|
|
|
void update_location_entry(StringView url);
|
|
void update_location_favicon(GdkPaintable* favicon);
|
|
void update_location_loading(bool is_loading);
|
|
void update_zoom_label();
|
|
void update_find_in_page_result(size_t current_match_index, Optional<size_t> const& total_match_count);
|
|
|
|
void show_find_bar();
|
|
void hide_find_bar();
|
|
|
|
void on_devtools_enabled();
|
|
void on_devtools_disabled();
|
|
|
|
void show_toast(AdwToast* toast);
|
|
|
|
static bool is_internal_url(URL::URL const& url);
|
|
|
|
private:
|
|
void setup_ui(AdwApplication* app);
|
|
void register_actions();
|
|
void setup_keyboard_shortcuts();
|
|
void on_tab_close_request(AdwTabPage* page);
|
|
void on_tab_switched();
|
|
void bind_navigation_actions(WebContentView& view);
|
|
|
|
AdwApplicationWindow* m_window { nullptr };
|
|
LadybirdLocationEntry* m_location_entry { nullptr };
|
|
Vector<NonnullOwnPtr<Tab>> m_tabs;
|
|
|
|
AdwTabView* m_tab_view { nullptr };
|
|
AdwHeaderBar* m_header_bar { nullptr };
|
|
GtkButton* m_restore_button { nullptr };
|
|
GtkLabel* m_zoom_label { nullptr };
|
|
AdwBanner* m_devtools_banner { nullptr };
|
|
GtkRevealer* m_find_bar_revealer { nullptr };
|
|
GtkSearchEntry* m_find_entry { nullptr };
|
|
GtkLabel* m_find_result_label { nullptr };
|
|
AdwToastOverlay* m_toast_overlay { nullptr };
|
|
|
|
struct ActionBinding {
|
|
WebView::Action* action { nullptr };
|
|
WebView::Action::Observer* observer { nullptr };
|
|
void detach();
|
|
};
|
|
ActionBinding m_back_binding;
|
|
ActionBinding m_forward_binding;
|
|
};
|
|
|
|
}
|