// For license of this file, see /LICENSE.md. #ifndef TEXTBROWSERVIEWER_H #define TEXTBROWSERVIEWER_H #include "gui/webviewers/webviewer.h" #include #include "network-web/adblock/adblockmanager.h" #include #include #include #include class QContextMenuEvent; class QResizeEvent; class WebBrowser; class Downloader; class TextBrowserViewer; class TextBrowserDocument : public QTextDocument { Q_OBJECT public: explicit TextBrowserDocument(TextBrowserViewer* parent = nullptr); protected: virtual QVariant loadResource(int type, const QUrl& name); private: QPointer m_viewer; }; class TextBrowserViewer : public QTextBrowser, public WebViewer { Q_OBJECT Q_INTERFACES(WebViewer) public: explicit TextBrowserViewer(QWidget* parent = nullptr); QVariant loadOneResource(int type, const QUrl& name); virtual QSize sizeHint() const; virtual void bindToBrowser(WebBrowser* browser); virtual void findText(const QString& text, bool backwards); virtual void setUrl(const QUrl& url); virtual void setHtml(const QString& html, const QUrl& base_url = {}); virtual void setReadabledHtml(const QString& html, const QUrl& base_url = {}); virtual QString html() const; virtual QUrl url() const; virtual void clear(); virtual void loadMessages(const QList& messages, RootItem* root); virtual double verticalScrollBarPosition() const; virtual void setVerticalScrollBarPosition(double pos); virtual void applyFont(const QFont& fon); virtual qreal zoomFactor() const; virtual void setZoomFactor(qreal zoom_factor); bool resourcesEnabled() const; void setResourcesEnabled(bool enabled); protected: virtual ContextMenuData provideContextMenuData(QContextMenuEvent* event) const; virtual void contextMenuEvent(QContextMenuEvent* event); virtual void resizeEvent(QResizeEvent* event); virtual void wheelEvent(QWheelEvent* event); private slots: void enableResources(bool enable); void downloadLink(); void onAnchorClicked(const QUrl& url); void reloadHtmlDelayed(); void downloadNextNeededResource(); void resourceDownloaded(const QUrl& url, QNetworkReply::NetworkError status, int http_code, QByteArray contents = QByteArray()); signals: void reloadDocument(); void pageTitleChanged(const QString& new_title); void pageUrlChanged(const QUrl& url); void pageIconChanged(const QIcon&); void linkMouseHighlighted(const QUrl& url); void loadingStarted(); void loadingProgress(int progress); void loadingFinished(bool success); void newWindowRequested(WebViewer* viewer); void closeWindowRequested(); private: void setHtmlPrivate(const QString& html, const QUrl& base_url); BlockingResult blockedWithAdblock(const QUrl& url); QScopedPointer m_downloader; PreparedHtml prepareHtmlForMessage(const QList& messages, RootItem* selected_item) const; private: bool m_resourcesEnabled; QList m_neededResources; // All URLs here must be resolved. QScopedPointer m_resourceDownloader; QMap m_loadedResources; // All URLs here must be resolved. QPixmap m_placeholderImage; QPixmap m_placeholderImageError; QUrl m_currentUrl; QString m_currentHtml; QPointer m_root; QFont m_baseFont; qreal m_zoomFactor = 1.0; QScopedPointer m_actionEnableResources; QScopedPointer m_actionDownloadLink; QScopedPointer m_document; QPoint m_lastContextMenuPos; }; #endif // TEXTBROWSERVIEWER_H