summaryrefslogtreecommitdiff
path: root/Userland/Applications/Browser/Tab.h
blob: 0d3515925bbbd007944d401773581dfbc9b1fcc5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*
 * Copyright (c) 2020-2021, Andreas Kling <kling@serenityos.org>
 * Copyright (c) 2022, the SerenityOS developers.
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

#pragma once

#include "History.h"
#include <AK/Optional.h>
#include <AK/URL.h>
#include <LibGUI/ActionGroup.h>
#include <LibGUI/Widget.h>
#include <LibGfx/ShareableBitmap.h>
#include <LibHTTP/Job.h>
#include <LibWeb/Forward.h>

namespace WebView {
class OutOfProcessWebView;
}

namespace Browser {

class BrowserWindow;
class InspectorWidget;
class ConsoleWidget;
class StorageWidget;

class Tab final : public GUI::Widget {
    C_OBJECT(Tab);

    // FIXME: This should go away eventually.
    friend class BrowserWindow;

public:
    virtual ~Tab() override = default;

    URL url() const;

    enum class LoadType {
        Normal,
        HistoryNavigation,
    };

    void load(const URL&, LoadType = LoadType::Normal);
    void reload();
    void go_back(int steps = 1);
    void go_forward(int steps = 1);

    void did_become_active();
    void context_menu_requested(Gfx::IntPoint const& screen_position);
    void content_filters_changed();
    void proxy_mappings_changed();

    void action_entered(GUI::Action&);
    void action_left(GUI::Action&);

    Function<void(String const&)> on_title_change;
    Function<void(const URL&)> on_tab_open_request;
    Function<void(Tab&)> on_tab_close_request;
    Function<void(Tab&)> on_tab_close_other_request;
    Function<void(Gfx::Bitmap const&)> on_favicon_change;
    Function<String(const URL&, Web::Cookie::Source source)> on_get_cookie;
    Function<void(const URL&, Web::Cookie::ParsedCookie const& cookie, Web::Cookie::Source source)> on_set_cookie;
    Function<void()> on_dump_cookies;
    Function<Vector<Web::Cookie::Cookie>()> on_get_cookies_entries;
    Function<OrderedHashMap<String, String>()> on_get_local_storage_entries;
    Function<OrderedHashMap<String, String>()> on_get_session_storage_entries;

    enum class InspectorTarget {
        Document,
        HoveredElement
    };
    void show_inspector_window(InspectorTarget);

    void show_console_window();
    void show_storage_inspector();

    String const& title() const { return m_title; }
    Gfx::Bitmap const* icon() const { return m_icon; }

    WebView::OutOfProcessWebView& view() { return *m_web_content_view; }

private:
    explicit Tab(BrowserWindow&);

    virtual void show_event(GUI::ShowEvent&) override;
    virtual void hide_event(GUI::HideEvent&) override;

    BrowserWindow const& window() const;
    BrowserWindow& window();

    void update_actions();
    void bookmark_current_url();
    void update_bookmark_button(String const& url);
    void start_download(const URL& url);
    void view_source(const URL& url, String const& source);
    void update_status(Optional<String> text_override = {}, i32 count_waiting = 0);

    enum class MayAppendTLD {
        No,
        Yes
    };

    Optional<URL> url_from_location_bar(MayAppendTLD = MayAppendTLD::No);

    History m_history;

    RefPtr<WebView::OutOfProcessWebView> m_web_content_view;

    RefPtr<GUI::UrlBox> m_location_box;
    RefPtr<GUI::Button> m_bookmark_button;
    RefPtr<InspectorWidget> m_dom_inspector_widget;
    RefPtr<ConsoleWidget> m_console_widget;
    RefPtr<StorageWidget> m_storage_widget;
    RefPtr<GUI::Statusbar> m_statusbar;
    RefPtr<GUI::ToolbarContainer> m_toolbar_container;

    RefPtr<GUI::Menu> m_link_context_menu;
    RefPtr<GUI::Action> m_link_context_menu_default_action;
    URL m_link_context_menu_url;

    RefPtr<GUI::Menu> m_image_context_menu;
    Gfx::ShareableBitmap m_image_context_menu_bitmap;
    URL m_image_context_menu_url;

    RefPtr<GUI::Menu> m_tab_context_menu;
    RefPtr<GUI::Menu> m_page_context_menu;
    RefPtr<GUI::Menu> m_go_back_context_menu;
    RefPtr<GUI::Menu> m_go_forward_context_menu;
    String m_title;
    RefPtr<const Gfx::Bitmap> m_icon;

    Optional<URL> m_navigating_url;

    bool m_loaded { false };
    bool m_is_history_navigation { false };
};

URL url_from_user_input(String const& input);

}