From 74fdef683fa899abb57f790a6f157f6124c09816 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malte=20J=C3=BCrgens?= Date: Wed, 15 Feb 2023 15:19:43 +0100 Subject: [PATCH] try to prefetch external userstyle urls --- src/discordpage.cpp | 67 +++++++++++++++++++++++++++++++++++++++++---- src/discordpage.h | 4 +++ src/log.cpp | 1 + src/log.h | 1 + 4 files changed, 68 insertions(+), 5 deletions(-) diff --git a/src/discordpage.cpp b/src/discordpage.cpp index bcb4ed7..429684d 100644 --- a/src/discordpage.cpp +++ b/src/discordpage.cpp @@ -52,15 +52,72 @@ void DiscordPage::setupPermissions() { } void DiscordPage::setupUserStyles() { - QString file = + auto file = new QFile( QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + - "/userstyles.css"; - if (QFileInfo(file).exists()) { - qDebug(mainLog) << "Found userstyles:" << file; - injectFile(&DiscordPage::injectStylesheet, "userstyles.js", file); + "/userstyles.css"); + if (file->exists()) { + qDebug(userstylesLog) << "Found userstyles:" << file->fileName(); + fetchUserStyles(file); } } +void DiscordPage::fetchUserStyles(QFile *file) { + file->open(QIODevice::ReadOnly); + auto fileContent = file->readAll(); + file->close(); + QRegularExpression importRegex( + R"r(@import url\(['"]{0,1}([^'"]+?)['"]{0,1}\);)r"); + QRegularExpression urlRegex( + R"r(url\(['"]{0,1}((?!data:)[^'"]+?)['"]{0,1}\))r"); + bool foundImport = true; + auto match = importRegex.match(fileContent); + if (!match.hasMatch()) { + foundImport = false; + match = urlRegex.match(fileContent); + } + if (match.hasMatch()) { + auto url = match.captured(1); + if (url.toLower().contains("usrbg.css") || + url.toLower().contains("usrbgs.css")) { + qDebug(userstylesLog) + << "Skipping" << url << "because it we can't prefetch it"; + } else { + qDebug(userstylesLog) << "Fetching" << url; + QNetworkRequest request(url); + auto reply = m_networkAccessManager.get(request); + connect(reply, &QNetworkReply::finished, [=]() { + QByteArray content = ""; + if (reply->error() == QNetworkReply::NoError) { + if (!reply->attribute(QNetworkRequest::RedirectionTargetAttribute) + .isNull()) + content = + reply->attribute(QNetworkRequest::RedirectionTargetAttribute) + .toByteArray(); + else + content = reply->readAll(); + } else + qDebug(userstylesLog) << reply->errorString().toUtf8().constData(); + file->open(QIODevice::WriteOnly); + file->write( + QString(fileContent) + .replace(match.captured(0), + foundImport + ? content + : "url(data:application/octet-stream;base64," + + content.toBase64() + ")") + .toUtf8() + .constData()); + file->close(); + fetchUserStyles(file); + }); + return; + } + } + injectFile(&DiscordPage::injectStylesheet, "userstyles.js", file->fileName()); + file->close(); + file->deleteLater(); +} + void DiscordPage::injectScript( QString name, QString content, QWebEngineScript::InjectionPoint injectionPoint) { diff --git a/src/discordpage.h b/src/discordpage.h index 2b0f58f..39a4026 100644 --- a/src/discordpage.h +++ b/src/discordpage.h @@ -2,6 +2,8 @@ #include "userscript.h" +#include +#include #include #include #include @@ -14,8 +16,10 @@ public: private: UserScript m_userScript; + QNetworkAccessManager m_networkAccessManager; void setupPermissions(); void setupUserStyles(); + void fetchUserStyles(QFile *file); bool acceptNavigationRequest(const QUrl &url, QWebEnginePage::NavigationType type, bool isMainFrame) override; diff --git a/src/log.cpp b/src/log.cpp index fd85be4..bfc75f0 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -5,3 +5,4 @@ Q_LOGGING_CATEGORY(discordLog, "discord"); Q_LOGGING_CATEGORY(userscriptLog, "userscript"); Q_LOGGING_CATEGORY(virtmicLog, "virtmic"); Q_LOGGING_CATEGORY(shortcutLog, "shortcut"); +Q_LOGGING_CATEGORY(userstylesLog, "userstyles"); diff --git a/src/log.h b/src/log.h index 22998ef..93497ee 100644 --- a/src/log.h +++ b/src/log.h @@ -7,3 +7,4 @@ Q_DECLARE_LOGGING_CATEGORY(discordLog); Q_DECLARE_LOGGING_CATEGORY(userscriptLog); Q_DECLARE_LOGGING_CATEGORY(virtmicLog); Q_DECLARE_LOGGING_CATEGORY(shortcutLog); +Q_DECLARE_LOGGING_CATEGORY(userstylesLog);