kristall/src/browsertab.hpp

266 lines
5.8 KiB
C++

#ifndef BROWSERTAB_HPP
#define BROWSERTAB_HPP
#include <memory>
#include <QWidget>
#include <QUrl>
#include <QGraphicsScene>
#include <QTextDocument>
#include <QNetworkAccessManager>
#include <QElapsedTimer>
#include <QTimer>
#include <QTextCursor>
#include "documentoutlinemodel.hpp"
#include "tabbrowsinghistory.hpp"
#include "renderers/geminirenderer.hpp"
#include "cryptoidentity.hpp"
#include "protocolhandler.hpp"
#include "mimeparser.hpp"
namespace Ui {
class BrowserTab;
}
class MainWindow;
enum class UIDensity : int;
struct DocumentStats
{
int loading_time = 0; // in ms
MimeType mime_type;
qint64 file_size = 0;
bool loaded_from_cache = false;
bool isValid() const {
return mime_type.isValid();
}
};
enum RequestFlags : int
{
None = 0,
// Forces request to be made to server
// instead of reading from cache.
DontReadFromCache = 1,
// If the user navigated back/forward
// (i.e if using back/forward buttons in toolbar)
NavigatedBackOrForward = 2,
};
class BrowserTab : public QWidget
{
Q_OBJECT
public:
enum PushToHistory {
DontPush,
PushImmediate,
};
public:
explicit BrowserTab(MainWindow * mainWindow);
~BrowserTab();
void navigateTo(QUrl const & url, PushToHistory mode, RequestFlags flags = RequestFlags::None);
void navigateBack(const QModelIndex &history_index);
void navOneBackward();
void navOneForward();
void navigateToRoot();
void navigateToParent();
void scrollToAnchor(QString const & anchor);
void reloadPage();
void focusUrlBar();
void focusSearchBar();
void openSourceView();
void renderPage(const QByteArray & data, const MimeType & mime);
void rerenderPage();
void updatePageTitle();
void refreshFavButton();
void showFavouritesPopup();
void setUrlBarText(const QString & text);
void updateUrlBarStyle();
void setUiDensity(UIDensity density);
void updatePageMargins();
void refreshOptionalToolbarItems();
void refreshToolbarIcons();
signals:
void titleChanged(QString const & title);
void locationChanged(QUrl const & url);
void fileLoaded(DocumentStats const & stats);
void requestStateChanged(RequestState state);
private slots:
void on_url_bar_returnPressed();
void on_url_bar_escapePressed();
void on_url_bar_focused();
void on_url_bar_blurred();
void on_refresh_button_clicked();
void on_root_button_clicked();
void on_parent_button_clicked();
void on_fav_button_clicked();
void on_text_browser_anchorClicked(const QUrl &arg1, bool open_in_new_tab);
void on_text_browser_highlighted(const QUrl &arg1);
void on_back_button_clicked();
void on_forward_button_clicked();
void on_stop_button_clicked();
void on_home_button_clicked();
void on_text_browser_customContextMenuRequested(const QPoint pos);
void on_enable_client_cert_button_clicked(bool checked);
void on_search_box_textChanged(const QString &arg1);
void on_search_box_returnPressed();
void on_search_next_clicked();
void on_search_previous_clicked();
void on_close_search_clicked();
private: // network slots
void on_requestProgress(qint64 transferred);
void on_requestComplete(QByteArray const & data, QString const & mime);
void on_requestComplete(QByteArray const & data, MimeType const & mime);
void on_redirected(QUrl uri, bool is_permanent);
void on_inputRequired(QString const & user_query, bool is_sensitive);
void on_networkError(ProtocolHandler::NetworkError error, QString const & reason);
void on_certificateRequired(QString const & info);
void on_hostCertificateLoaded(QSslCertificate const & cert);
void on_networkTimeout();
private: // ui slots
void on_focusSearchbar();
private:
void setErrorMessage(QString const & msg);
void pushToHistory(QUrl const & url);
void updateUI();
bool trySetClientCertificate(QString const & query);
void resetClientCertificate();
void addProtocolHandler(std::unique_ptr<ProtocolHandler> && handler);
template<typename T>
void addProtocolHandler() {
this->addProtocolHandler(std::make_unique<T>());
}
bool startRequest(QUrl const & url, ProtocolHandler::RequestOptions options, RequestFlags flags = RequestFlags::None);
void updateMouseCursor(bool waiting);
bool enableClientCertificate(CryptoIdentity const & ident);
void disableClientCertificate();
bool searchBoxFind(QString text, bool backward=false);
protected:
void dragEnterEvent(QDragEnterEvent * event);
void dropEvent(QDropEvent * event);
void resizeEvent(QResizeEvent * event);
public:
Ui::BrowserTab *ui;
MainWindow * mainWindow;
QUrl current_location;
std::vector<std::unique_ptr<ProtocolHandler>> protocol_handlers;
ProtocolHandler * current_handler;
int redirection_count = 0;
bool successfully_loaded = false;
DocumentOutlineModel outline;
QGraphicsScene graphics_scene;
TabBrowsingHistory history;
QModelIndex current_history_index;
std::unique_ptr<QTextDocument> current_document;
QSslCertificate current_server_certificate;
QByteArray current_buffer;
MimeType current_mime;
QElapsedTimer timer;
CryptoIdentity current_identity;
bool is_internal_location;
DocumentStats current_stats;
QTimer network_timeout_timer;
QTextCursor current_search_position;
bool needs_rerender;
QString page_title;
bool no_url_style = false;
bool was_read_from_cache = false;
bool lazy_loading = false;
RequestState request_state;
DocumentStyle current_style;
//! If set, `on_requestComplete` will navigate to the fragment of the url.
bool navigate_to_fragment = false;
};
#endif // BROWSERTAB_HPP