more efficient network stack

This commit is contained in:
Martin Rotter 2022-03-26 16:46:49 +01:00
parent fe47c2d417
commit 2c95858fa9
2 changed files with 44 additions and 31 deletions

View File

@ -8,6 +8,7 @@
#include "miscellaneous/skinfactory.h" #include "miscellaneous/skinfactory.h"
#include "network-web/adblock/adblockmanager.h" #include "network-web/adblock/adblockmanager.h"
#include "network-web/adblock/adblockrequestinfo.h" #include "network-web/adblock/adblockrequestinfo.h"
#include "network-web/downloader.h"
#include "network-web/networkfactory.h" #include "network-web/networkfactory.h"
#include "network-web/webfactory.h" #include "network-web/webfactory.h"
@ -16,25 +17,14 @@
#include <QScrollBar> #include <QScrollBar>
#include <QWheelEvent> #include <QWheelEvent>
LiteHtmlViewer::LiteHtmlViewer(QWidget* parent) : QLiteHtmlWidget(parent) { LiteHtmlViewer::LiteHtmlViewer(QWidget* parent) : QLiteHtmlWidget(parent), m_downloader(new Downloader(this)) {
setResourceHandler([this](const QUrl& url) { setResourceHandler([this](const QUrl& url) {
emit loadProgress(-1); emit loadProgress(-1);
return handleResource(url); return handleResource(url);
}); });
connect(this, &LiteHtmlViewer::linkClicked, this, &LiteHtmlViewer::setUrl); connect(this, &LiteHtmlViewer::linkClicked, this, &LiteHtmlViewer::setUrl);
connect(this, &LiteHtmlViewer::copyAvailable, this, &LiteHtmlViewer::selectedTextChanged);
connect(this, &LiteHtmlViewer::copyAvailable, this, [this](bool available) {
if (!available) {
return;
}
QString sel_text = QLiteHtmlWidget::selectedText();
if (!sel_text.isEmpty()) {
QGuiApplication::clipboard()->setText(sel_text, QClipboard::Mode::Selection);
}
});
} }
void LiteHtmlViewer::bindToBrowser(WebBrowser* browser) { void LiteHtmlViewer::bindToBrowser(WebBrowser* browser) {
@ -86,25 +76,29 @@ void LiteHtmlViewer::setUrl(const QUrl& url) {
return; return;
} }
QByteArray output; QEventLoop loop;
auto net_res = NetworkFactory::performNetworkOperation(
url.toString(), connect(m_downloader.data(), &Downloader::completed, &loop, &QEventLoop::quit);
5000, m_downloader->manipulateData(url.toString(),
QNetworkAccessManager::Operation::GetOperation,
{}, {},
output, 5000);
QNetworkAccessManager::Operation::GetOperation);
loop.exec();
auto net_error = m_downloader->lastOutputError();
QString html_str; QString html_str;
if (net_res.m_networkError != QNetworkReply::NetworkError::NoError) { if (net_error != QNetworkReply::NetworkError::NoError) {
html_str = "Error!"; html_str = "Error!";
} }
else { else {
html_str = QString::fromUtf8(output); html_str = QString::fromUtf8(m_downloader->lastOutputData());
} }
setHtml(html_str, url); setHtml(html_str, url);
emit loadFinished(net_res.m_networkError == QNetworkReply::NetworkError::NoError); emit loadFinished(net_error == QNetworkReply::NetworkError::NoError);
} }
void LiteHtmlViewer::setHtml(const QString& html, const QUrl& base_url) { void LiteHtmlViewer::setHtml(const QString& html, const QUrl& base_url) {
@ -243,6 +237,18 @@ void LiteHtmlViewer::setZoomFactor(qreal zoom_factor) {
} }
} }
void LiteHtmlViewer::selectedTextChanged(bool available) {
if (!available) {
return;
}
QString sel_text = QLiteHtmlWidget::selectedText();
if (!sel_text.isEmpty()) {
QGuiApplication::clipboard()->setText(sel_text, QClipboard::Mode::Selection);
}
}
void LiteHtmlViewer::wheelEvent(QWheelEvent* event) { void LiteHtmlViewer::wheelEvent(QWheelEvent* event) {
if ((event->modifiers() & Qt::KeyboardModifier::ControlModifier) > 0) { if ((event->modifiers() & Qt::KeyboardModifier::ControlModifier) > 0) {
if (event->angleDelta().y() > 0 && canZoomIn()) { if (event->angleDelta().y() > 0 && canZoomIn()) {
@ -273,16 +279,16 @@ QByteArray LiteHtmlViewer::handleResource(const QUrl& url) {
return {}; return {};
} }
else { else {
QByteArray output; QEventLoop loop;
NetworkFactory::performNetworkOperation( connect(m_downloader.data(), &Downloader::completed, &loop, &QEventLoop::quit);
url.toString(), m_downloader->manipulateData(url.toString(),
5000, QNetworkAccessManager::Operation::GetOperation,
{}, {},
output, 5000);
QNetworkAccessManager::Operation::GetOperation);
return output; loop.exec();
return m_downloader->lastOutputData();
} }
} }

View File

@ -6,6 +6,7 @@
#include "3rd-party/qlitehtml/qlitehtmlwidget.h" #include "3rd-party/qlitehtml/qlitehtmlwidget.h"
#include "gui/webviewer.h" #include "gui/webviewer.h"
class Downloader;
class QWheelEvent; class QWheelEvent;
class LiteHtmlViewer : public QLiteHtmlWidget, public WebViewer { class LiteHtmlViewer : public QLiteHtmlWidget, public WebViewer {
@ -33,6 +34,9 @@ class LiteHtmlViewer : public QLiteHtmlWidget, public WebViewer {
virtual void zoomOut(); virtual void zoomOut();
virtual void setZoomFactor(qreal zoom_factor); virtual void setZoomFactor(qreal zoom_factor);
private slots:
void selectedTextChanged(bool available);
signals: signals:
void zoomFactorChanged(); void zoomFactorChanged();
void titleChanged(const QString& new_title); void titleChanged(const QString& new_title);
@ -47,6 +51,9 @@ class LiteHtmlViewer : public QLiteHtmlWidget, public WebViewer {
private: private:
QByteArray handleResource(const QUrl& url); QByteArray handleResource(const QUrl& url);
private:
QScopedPointer<Downloader> m_downloader;
}; };
#endif // LITEHTMLVIEWER_H #endif // LITEHTMLVIEWER_H