From 5e2cfbd7786acb64dd191cec9bc8965b46df3766 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Thu, 28 Apr 2022 10:30:01 +0200 Subject: [PATCH] more instant image load, red placeholder in case of error --- .../desktop/com.github.rssguard.appdata.xml | 2 +- .../graphics/misc/image-placeholder-error.png | Bin 0 -> 65590 bytes resources/rssguard.qrc | 1 + .../qtextbrowser/textbrowserviewer.cpp | 121 +++++++++++------- .../qtextbrowser/textbrowserviewer.h | 9 +- src/librssguard/network-web/downloader.cpp | 2 +- 6 files changed, 85 insertions(+), 50 deletions(-) create mode 100755 resources/graphics/misc/image-placeholder-error.png diff --git a/resources/desktop/com.github.rssguard.appdata.xml b/resources/desktop/com.github.rssguard.appdata.xml index c69521035..3084be741 100644 --- a/resources/desktop/com.github.rssguard.appdata.xml +++ b/resources/desktop/com.github.rssguard.appdata.xml @@ -26,7 +26,7 @@ https://github.com/sponsors/martinrotter - + none diff --git a/resources/graphics/misc/image-placeholder-error.png b/resources/graphics/misc/image-placeholder-error.png new file mode 100755 index 0000000000000000000000000000000000000000..279c1750ac6e291db53939f7a6ef270d109a27dc GIT binary patch literal 65590 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 literal 0 HcmV?d00001 diff --git a/resources/rssguard.qrc b/resources/rssguard.qrc index 85dc7bf5f..03cd65c7b 100644 --- a/resources/rssguard.qrc +++ b/resources/rssguard.qrc @@ -36,6 +36,7 @@ graphics/misc/gmail.png graphics/misc/google.png graphics/misc/image-placeholder.png + graphics/misc/image-placeholder-error.png graphics/misc/inoreader.png graphics/misc/newsblur.png graphics/misc/nextcloud.png diff --git a/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.cpp b/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.cpp index def199771..83705b888 100644 --- a/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.cpp +++ b/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.cpp @@ -2,6 +2,7 @@ #include "gui/webviewers/qtextbrowser/textbrowserviewer.h" +#include "3rd-party/boolinq/boolinq.h" #include "gui/dialogs/formmain.h" #include "gui/messagebox.h" #include "gui/webbrowser.h" @@ -20,7 +21,8 @@ TextBrowserViewer::TextBrowserViewer(QWidget* parent) : QTextBrowser(parent), m_resourcesEnabled(false), m_resourceDownloader(new Downloader(this)), - m_placeholderImage(qApp->icons()->miscPixmap("image-placeholder")), m_downloader(new Downloader(this)), + m_placeholderImage(qApp->icons()->miscPixmap("image-placeholder")), + m_placeholderImageError(qApp->icons()->miscPixmap("image-placeholder-error")), m_downloader(new Downloader(this)), m_document(new TextBrowserDocument(this)) { setAutoFillBackground(true); setFrameShape(QFrame::Shape::NoFrame); @@ -29,9 +31,6 @@ TextBrowserViewer::TextBrowserViewer(QWidget* parent) setOpenLinks(false); viewport()->setAutoFillBackground(true); - m_resourceTimer.setSingleShot(false); - m_resourceTimer.setInterval(100); - setResourcesEnabled(qApp->settings()->value(GROUP(Messages), SETTING(Messages::ShowResourcesInArticles)).toBool()); setDocument(m_document.data()); @@ -41,7 +40,6 @@ TextBrowserViewer::TextBrowserViewer(QWidget* parent) setVerticalScrollBarPosition(scr); }); - connect(&m_resourceTimer, &QTimer::timeout, this, &TextBrowserViewer::reloadHtmlDelayed); connect(m_resourceDownloader.data(), &Downloader::completed, this, &TextBrowserViewer::resourceDownloaded); connect(this, &QTextBrowser::anchorClicked, this, &TextBrowserViewer::onAnchorClicked); connect(this, QOverload::of(&QTextBrowser::highlighted), this, &TextBrowserViewer::linkMouseHighlighted); @@ -59,39 +57,37 @@ QVariant TextBrowserViewer::loadOneResource(int type, const QUrl& name) { return {}; } - if (!m_resourcesEnabled) { + if (!m_resourcesEnabled || !m_loadedResources.contains(name)) { // Resources are not enabled. return m_placeholderImage; } - if (m_loadedResources.contains(name)) { - // Resources are enabled and we already have the resource. - return QImage::fromData(m_loadedResources.value(name)); + // Resources are enabled and we already have the resource. + QByteArray resource_data = m_loadedResources.value(name); + + if (resource_data.isEmpty()) { + return m_placeholderImageError; } else { - // Resources are not enabled and we need to download the resource. - if (!m_neededResources.contains(name) && m_resourceTimer.isActive()) { - m_neededResources.append(name); - m_resourceTimer.start(); - } - - return m_placeholderImage; + return QImage::fromData(m_loadedResources.value(name)); } } -QPair TextBrowserViewer::prepareHtmlForMessage(const QList& messages, - RootItem* selected_item) const { - QString html; +PreparedHtml TextBrowserViewer::prepareHtmlForMessage(const QList& messages, RootItem* selected_item) const { + PreparedHtml html; for (const Message& message : messages) { - html += QString("

%1

").arg(message.m_title); - if (!message.m_url.isEmpty()) { - html += QString("[url] %1
").arg(message.m_url); + html.m_html += QSL("

%1

").arg(message.m_title, message.m_url); + } + else { + html.m_html += QSL("

%1

").arg(message.m_title); } + html.m_html += QSL("
"); + for (const Enclosure& enc : message.m_enclosures) { - html += QString("[%2] %1
").arg(enc.m_url, enc.m_mimeType); + html.m_html += QString("[%2] %1
").arg(enc.m_url, enc.m_mimeType); } static QRegularExpression img_tag_rgx("\\]*src\\s*=\\s*[\"\']([^\"\']*)[\"\'][^\\>]*\\>", @@ -102,8 +98,9 @@ QPair TextBrowserViewer::prepareHtmlForMessage(const QList[%1] %2").arg(tr("image"), match.captured(1)); + pictures_html += QString("
[%1] %2").arg(tr("image"), captured_url); } QString cnts = message.m_contents; @@ -111,12 +108,14 @@ QPair TextBrowserViewer::prepareHtmlForMessage(const QListsettings()->value(GROUP(Messages), SETTING(Messages::MessageHeadImageHeight)).toInt(); // Fixup all "img" tags. - html += cnts.replace(img_tag_rgx, - QSL("") - .arg(forced_img_size <= 0 ? QString() : QString::number(forced_img_size))); - html += pictures_html; + html.m_html += cnts.replace(img_tag_rgx, + QSL("") + .arg(forced_img_size <= 0 ? QString() : QString::number(forced_img_size))); + html.m_html += pictures_html; } + html.m_html += QSL("
"); + QColor a_color = qApp->skins()->currentSkin().colorForModel(SkinEnums::PaletteColors::FgInteresting).value(); if (!a_color.isValid()) { @@ -138,14 +137,17 @@ QPair TextBrowserViewer::prepareHtmlForMessage(const QList" - "" - "%1" - "") - .arg(html, a_color.name()), - base_url}; + // Final html, with replaced link colors. + html.m_html = QSL("" + "" + "%1" + "") + .arg(html.m_html, a_color.name()); + html.m_baseUrl = base_url; + + return html; } void TextBrowserViewer::bindToBrowser(WebBrowser* browser) { @@ -203,6 +205,7 @@ BlockingResult TextBrowserViewer::blockedWithAdblock(const QUrl& url) { void TextBrowserViewer::setUrl(const QUrl& url) { emit loadingStarted(); + QString html_str; QUrl nonconst_url = url; bool is_error = false; @@ -262,7 +265,7 @@ void TextBrowserViewer::loadMessages(const QList& messages, RootItem* r auto html_messages = prepareHtmlForMessage(messages, root); - setHtml(html_messages.first, html_messages.second); + setHtml(html_messages.m_html, html_messages.m_baseUrl); emit loadingFinished(true); } @@ -428,12 +431,37 @@ void TextBrowserViewer::onAnchorClicked(const QUrl& url) { } void TextBrowserViewer::setHtml(const QString& html, const QUrl& base_url) { - m_resourceTimer.stop(); - m_neededResources.clear(); - m_resourceTimer.start(); + setVerticalScrollBarPosition(0.0); + + static QRegularExpression img_tag_rgx("\\]*src\\s*=\\s*[\"\']([^\"\']*)[\"\'][^\\>]*\\>", + QRegularExpression::PatternOption::CaseInsensitiveOption | + QRegularExpression::PatternOption::InvertedGreedinessOption); + QRegularExpressionMatchIterator i = img_tag_rgx.globalMatch(html); + QList found_resources; + + while (i.hasNext()) { + QRegularExpressionMatch match = i.next(); + auto captured_url = match.captured(1); + + if (!found_resources.contains(captured_url)) { + found_resources.append(captured_url); + } + } + + auto really_needed_resources = boolinq::from(found_resources) + .where([this](const QUrl& res) { + return !m_loadedResources.contains(res); + }) + .toStdList(); + + m_neededResources = FROM_STD_LIST(QList, really_needed_resources); setHtmlPrivate(html, base_url); + if (!m_neededResources.isEmpty()) { + QTimer::singleShot(20, this, &TextBrowserViewer::reloadHtmlDelayed); + } + // TODO: implement RTL for viewers somehow? /* auto to = document()->defaultTextOption(); @@ -464,10 +492,6 @@ QVariant TextBrowserDocument::loadResource(int type, const QUrl& name) { } void TextBrowserViewer::reloadHtmlDelayed() { - // Timer has elapsed, we do not wait for other resources, - // we download what we know about. - m_resourceTimer.stop(); - if (!m_neededResources.isEmpty()) { downloadNextNeededResource(); } @@ -479,7 +503,9 @@ void TextBrowserViewer::downloadNextNeededResource() { emit reloadDocument(); } else { - m_resourceDownloader.data()->manipulateData(m_neededResources.takeFirst().toString(), + QUrl res = m_neededResources.takeFirst(); + + m_resourceDownloader.data()->manipulateData(res.toString(), QNetworkAccessManager::Operation::GetOperation, {}, 5000); @@ -487,9 +513,12 @@ void TextBrowserViewer::downloadNextNeededResource() { } void TextBrowserViewer::resourceDownloaded(const QUrl& url, QNetworkReply::NetworkError status, QByteArray contents) { - if (status == QNetworkReply::NetworkError::NoError && !m_loadedResources.contains(url)) { + if (status == QNetworkReply::NetworkError::NoError) { m_loadedResources.insert(url, contents); } + else { + m_loadedResources.insert(url, {}); + } downloadNextNeededResource(); } diff --git a/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.h b/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.h index ca7848c55..8422b6563 100644 --- a/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.h +++ b/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.h @@ -34,6 +34,11 @@ class TextBrowserDocument : public QTextDocument { QPointer m_viewer; }; +struct PreparedHtml { + QString m_html; + QUrl m_baseUrl; +}; + class TextBrowserViewer : public QTextBrowser, public WebViewer { Q_OBJECT Q_INTERFACES(WebViewer) @@ -85,11 +90,11 @@ class TextBrowserViewer : public QTextBrowser, public WebViewer { private: bool m_resourcesEnabled; - QTimer m_resourceTimer; QList m_neededResources; QScopedPointer m_resourceDownloader; QMap m_loadedResources; QPixmap m_placeholderImage; + QPixmap m_placeholderImageError; signals: void pageTitleChanged(const QString& new_title); @@ -107,7 +112,7 @@ class TextBrowserViewer : public QTextBrowser, public WebViewer { BlockingResult blockedWithAdblock(const QUrl& url); QScopedPointer m_downloader; - QPair prepareHtmlForMessage(const QList& messages, RootItem* selected_item) const; + PreparedHtml prepareHtmlForMessage(const QList& messages, RootItem* selected_item) const; private: QUrl m_currentUrl; diff --git a/src/librssguard/network-web/downloader.cpp b/src/librssguard/network-web/downloader.cpp index 66cdfab74..032294bc5 100644 --- a/src/librssguard/network-web/downloader.cpp +++ b/src/librssguard/network-web/downloader.cpp @@ -211,7 +211,7 @@ void Downloader::finished() { m_inputMultipartData->deleteLater(); } - emit completed(reply->url(), m_lastOutputError, m_lastOutputData); + emit completed(reply->request().url(), m_lastOutputError, m_lastOutputData); } }