diff options
| author | Aqua-sama <aqua@iserlohn-fortress.net> | 2017-01-24 16:09:07 +0100 | 
|---|---|---|
| committer | Aqua-sama <aqua@iserlohn-fortress.net> | 2017-01-24 16:09:07 +0100 | 
| commit | 0250559bcf5764fb8cf3a8ccc4e330b8ed855f96 (patch) | |
| tree | 2283350e44f78e83a8c0257b66c184939cd95a98 | |
| parent | Made Profile menu a regular menu (diff) | |
| download | smolbote-0250559bcf5764fb8cf3a8ccc4e330b8ed855f96.tar.xz | |
Blocker UI
| -rw-r--r-- | src/forms/blockerdialog.cpp | 31 | ||||
| -rw-r--r-- | src/forms/blockerdialog.h | 24 | ||||
| -rw-r--r-- | src/forms/blockerdialog.ui | 168 | ||||
| -rw-r--r-- | src/mainwindow.cpp | 2 | ||||
| -rw-r--r-- | src/mainwindow.h | 4 | ||||
| -rw-r--r-- | src/smolbote.pro | 15 | ||||
| -rw-r--r-- | src/webengine/adblockinterceptor.cpp | 56 | ||||
| -rw-r--r-- | src/webengine/blockerrule.cpp (renamed from src/webengine/adblockrule.cpp) | 6 | ||||
| -rw-r--r-- | src/webengine/blockerrule.h (renamed from src/webengine/adblockrule.h) | 4 | ||||
| -rw-r--r-- | src/webengine/blockersubscription.cpp | 103 | ||||
| -rw-r--r-- | src/webengine/blockersubscription.h | 41 | ||||
| -rw-r--r-- | src/webengine/urlinterceptor.cpp | 19 | ||||
| -rw-r--r-- | src/webengine/urlinterceptor.h (renamed from src/webengine/adblockinterceptor.h) | 4 | ||||
| -rw-r--r-- | test/config.ini | 3 | 
14 files changed, 409 insertions, 71 deletions
| diff --git a/src/forms/blockerdialog.cpp b/src/forms/blockerdialog.cpp new file mode 100644 index 0000000..f755af6 --- /dev/null +++ b/src/forms/blockerdialog.cpp @@ -0,0 +1,31 @@ +#include "blockerdialog.h" +#include "ui_blockerdialog.h" + +#include "settings.h" +#include <QLabel> + +BlockerDialog::BlockerDialog(QWidget *parent) : +    QDialog(parent), +    ui(new Ui::UrlInterceptorDialog) +{ +    Settings settings; +    ui->setupUi(this); + +    subscription = new BlockerSubscription(this); +    QString sublocation = settings.value("blocker/subscription").toString(); +    if(!sublocation.isEmpty()) { +        subscription->loadFromFile(sublocation); +    } + +    ui->title->setText(subscription->title()); +    ui->homepage->setText(subscription->homepage()); +    ui->license->setText(subscription->license()); +    ui->version->setText(subscription->version()); +    ui->lastModified->setText(subscription->lastModified().toString()); +    ui->expires->setText(subscription->expires().toString()); +} + +BlockerDialog::~BlockerDialog() +{ +    delete ui; +} diff --git a/src/forms/blockerdialog.h b/src/forms/blockerdialog.h new file mode 100644 index 0000000..0c8e8ba --- /dev/null +++ b/src/forms/blockerdialog.h @@ -0,0 +1,24 @@ +#ifndef URLINTERCEPTORDIALOG_H +#define URLINTERCEPTORDIALOG_H + +#include <QDialog> +#include "webengine/blockersubscription.h" + +namespace Ui { +class UrlInterceptorDialog; +} + +class BlockerDialog : public QDialog +{ +    Q_OBJECT + +public: +    explicit BlockerDialog(QWidget *parent = 0); +    ~BlockerDialog(); + +private: +    Ui::UrlInterceptorDialog *ui; +    BlockerSubscription *subscription; +}; + +#endif // URLINTERCEPTORDIALOG_H diff --git a/src/forms/blockerdialog.ui b/src/forms/blockerdialog.ui new file mode 100644 index 0000000..dc0a1f4 --- /dev/null +++ b/src/forms/blockerdialog.ui @@ -0,0 +1,168 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>UrlInterceptorDialog</class> + <widget class="QDialog" name="UrlInterceptorDialog"> +  <property name="geometry"> +   <rect> +    <x>0</x> +    <y>0</y> +    <width>640</width> +    <height>480</height> +   </rect> +  </property> +  <property name="windowTitle"> +   <string>Dialog</string> +  </property> +  <layout class="QVBoxLayout" name="verticalLayout"> +   <item> +    <widget class="QGroupBox" name="groupBox"> +     <property name="title"> +      <string>GroupBox</string> +     </property> +     <layout class="QHBoxLayout" name="horizontalLayout"> +      <item> +       <layout class="QFormLayout" name="leftFormLayout"> +        <item row="0" column="0"> +         <widget class="QLabel" name="title_label"> +          <property name="text"> +           <string>Title</string> +          </property> +         </widget> +        </item> +        <item row="0" column="1"> +         <widget class="QLabel" name="title"> +          <property name="text"> +           <string>TextLabel</string> +          </property> +         </widget> +        </item> +        <item row="1" column="0"> +         <widget class="QLabel" name="homepage_label"> +          <property name="text"> +           <string>Homepage</string> +          </property> +         </widget> +        </item> +        <item row="1" column="1"> +         <widget class="QLabel" name="homepage"> +          <property name="text"> +           <string>TextLabel</string> +          </property> +         </widget> +        </item> +        <item row="2" column="0"> +         <widget class="QLabel" name="license_label"> +          <property name="text"> +           <string>License</string> +          </property> +         </widget> +        </item> +        <item row="2" column="1"> +         <widget class="QLabel" name="license"> +          <property name="text"> +           <string>TextLabel</string> +          </property> +         </widget> +        </item> +       </layout> +      </item> +      <item> +       <layout class="QFormLayout" name="rightFormLayout"> +        <item row="0" column="0"> +         <widget class="QLabel" name="version_label"> +          <property name="text"> +           <string>Version</string> +          </property> +         </widget> +        </item> +        <item row="0" column="1"> +         <widget class="QLabel" name="version"> +          <property name="text"> +           <string>TextLabel</string> +          </property> +         </widget> +        </item> +        <item row="1" column="0"> +         <widget class="QLabel" name="lastModified_label"> +          <property name="text"> +           <string>Last Modified</string> +          </property> +         </widget> +        </item> +        <item row="1" column="1"> +         <widget class="QLabel" name="lastModified"> +          <property name="text"> +           <string>TextLabel</string> +          </property> +         </widget> +        </item> +        <item row="2" column="0"> +         <widget class="QLabel" name="expires_label"> +          <property name="text"> +           <string>Expires</string> +          </property> +         </widget> +        </item> +        <item row="2" column="1"> +         <widget class="QLabel" name="expires"> +          <property name="text"> +           <string>TextLabel</string> +          </property> +         </widget> +        </item> +       </layout> +      </item> +     </layout> +    </widget> +   </item> +   <item> +    <widget class="QListWidget" name="listWidget"/> +   </item> +   <item> +    <widget class="QDialogButtonBox" name="buttonBox"> +     <property name="orientation"> +      <enum>Qt::Horizontal</enum> +     </property> +     <property name="standardButtons"> +      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> +     </property> +    </widget> +   </item> +  </layout> + </widget> + <resources/> + <connections> +  <connection> +   <sender>buttonBox</sender> +   <signal>accepted()</signal> +   <receiver>UrlInterceptorDialog</receiver> +   <slot>accept()</slot> +   <hints> +    <hint type="sourcelabel"> +     <x>248</x> +     <y>254</y> +    </hint> +    <hint type="destinationlabel"> +     <x>157</x> +     <y>274</y> +    </hint> +   </hints> +  </connection> +  <connection> +   <sender>buttonBox</sender> +   <signal>rejected()</signal> +   <receiver>UrlInterceptorDialog</receiver> +   <slot>reject()</slot> +   <hints> +    <hint type="sourcelabel"> +     <x>316</x> +     <y>260</y> +    </hint> +    <hint type="destinationlabel"> +     <x>286</x> +     <y>274</y> +    </hint> +   </hints> +  </connection> + </connections> +</ui> diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 2b7a2b9..1062823 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -34,6 +34,7 @@  MainWindow::MainWindow(Browser *instance, QUrl defaultUrl, QWidget *parent) :      QMainWindow(parent),      downloadManager(new DownloadDialog(this)), +    blocklistManager(new BlockerDialog(this)),      ui(new Ui::MainWindow),      navigationToolBar(new QToolBar(this)),      tabToolBar(new QToolBar(this)), @@ -63,6 +64,7 @@ MainWindow::MainWindow(Browser *instance, QUrl defaultUrl, QWidget *parent) :      QMenu *toolsMenu = new QMenu(tr("Tools"), ui->menuBar);      ui->menuBar->addMenu(toolsMenu);      toolsMenu->addAction(tr("Downloads"), downloadManager, SLOT(show())); +    toolsMenu->addAction(tr("Blocker"), blocklistManager, SLOT(show()));      // Profile menu      QMenu *profileMenu = new QMenu(tr("Profile"), ui->menuBar); diff --git a/src/mainwindow.h b/src/mainwindow.h index 351a794..e4c1a1f 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -29,7 +29,8 @@  #include <QUrl>  #include "widgets/webviewtabbar.h"  #include "forms/downloaddialog.h" -#include "webengine/adblockinterceptor.h" +#include "webengine/urlinterceptor.h" +#include "forms/blockerdialog.h"  namespace Ui {  class MainWindow; @@ -66,6 +67,7 @@ private slots:  private:      Browser *browserInstance;      DownloadDialog *downloadManager; +    BlockerDialog *blocklistManager;      QString profileName;      WebEngineProfile *profile = nullptr; diff --git a/src/smolbote.pro b/src/smolbote.pro index 857a60a..c8be516 100644 --- a/src/smolbote.pro +++ b/src/smolbote.pro @@ -20,8 +20,10 @@ SOURCES += main.cpp \      webengine/webengineprofile.cpp \      forms/downloaddialog.cpp \      webengine/downloaditemform.cpp \ -    webengine/adblockinterceptor.cpp \ -    webengine/adblockrule.cpp +    webengine/urlinterceptor.cpp \ +    forms/blockerdialog.cpp \ +    webengine/blockersubscription.cpp \ +    webengine/blockerrule.cpp  HEADERS  += mainwindow.h \      browser.h \ @@ -31,13 +33,16 @@ HEADERS  += mainwindow.h \      webengine/webengineprofile.h \      forms/downloaddialog.h \      webengine/downloaditemform.h \ -    webengine/adblockinterceptor.h \ -    webengine/adblockrule.h +    webengine/urlinterceptor.h \ +    forms/blockerdialog.h \ +    webengine/blockersubscription.h \ +    webengine/blockerrule.h  FORMS    += mainwindow.ui \      forms/profiledialog.ui \      forms/downloaddialog.ui \ -    webengine/downloaditemform.ui +    webengine/downloaditemform.ui \ +    forms/blockerdialog.ui  RESOURCES += \      data/resources.qrc diff --git a/src/webengine/adblockinterceptor.cpp b/src/webengine/adblockinterceptor.cpp deleted file mode 100644 index 02bf2f4..0000000 --- a/src/webengine/adblockinterceptor.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "adblockinterceptor.h" - -#include <QFile> -#include <QTextStream> - -AdBlockInterceptor::AdBlockInterceptor(QObject *parent) : -    QWebEngineUrlRequestInterceptor(parent) -{ -    loadSubscription("blocklist.txt"); -} - -void AdBlockInterceptor::interceptRequest(QWebEngineUrlRequestInfo &info) -{ -    bool blocked = false; -    for(AdBlockRule *rule : m_urlBlacklist) { -        if(rule->match(info.requestUrl())) { -            info.block(true); -            blocked = true; -        } -    } - -    qDebug("%i %i %i %s %s", blocked, info.navigationType(), info.resourceType(), qUtf8Printable(info.requestMethod()), qUtf8Printable(info.requestUrl().toString())); -} - -int AdBlockInterceptor::loadSubscription(const QString &subpath) -{ -    QFile subfile(subpath); -    if(!subfile.open(QIODevice::ReadOnly | QIODevice::Text)) { -        qDebug("AdBlockInterceptor: cannot load subscription: %s", qUtf8Printable(subpath)); -        return -1; -    } - -    QTextStream subscription(&subfile); - -    QString header = subscription.readLine(); -    if(header != "[Adblock Plus 2.0]") { -        qDebug("AdBlockInterceptor: invalid format of subscription: %s", qUtf8Printable(subpath)); -        return -1; -    } - -    int rules = 0; - -    while(!subscription.atEnd()) { -        QString line = subscription.readLine(); -        if(!line.isEmpty() && !line.startsWith('!')) { -            // The line is not a comment -            AdBlockRule *rule = new AdBlockRule(line, this); -            m_urlBlacklist.append(rule); -            rules++; -        } -    } - -    qDebug("Loaded %i rules from subscription %s", rules, qUtf8Printable(subpath)); - -    return rules; -} diff --git a/src/webengine/adblockrule.cpp b/src/webengine/blockerrule.cpp index fe3e64e..a4a0982 100644 --- a/src/webengine/adblockrule.cpp +++ b/src/webengine/blockerrule.cpp @@ -1,12 +1,12 @@ -#include "adblockrule.h" +#include "blockerrule.h" -AdBlockRule::AdBlockRule(QString rule, QObject *parent) : +BlockerRule::BlockerRule(QString rule, QObject *parent) :      QObject(parent)  {      ruleExpression.setPattern(rule);  } -bool AdBlockRule::match(const QUrl &url) +bool BlockerRule::match(const QUrl &url)  {      return ruleExpression.match(url.toString()).hasMatch();  } diff --git a/src/webengine/adblockrule.h b/src/webengine/blockerrule.h index 8c68de7..9d73004 100644 --- a/src/webengine/adblockrule.h +++ b/src/webengine/blockerrule.h @@ -5,11 +5,11 @@  #include <QUrl>  #include <QRegularExpression> -class AdBlockRule : public QObject +class BlockerRule : public QObject  {      Q_OBJECT  public: -    explicit AdBlockRule(QString rule, QObject *parent = 0); +    explicit BlockerRule(QString rule, QObject *parent = 0);      bool match(const QUrl &url); diff --git a/src/webengine/blockersubscription.cpp b/src/webengine/blockersubscription.cpp new file mode 100644 index 0000000..5a0664b --- /dev/null +++ b/src/webengine/blockersubscription.cpp @@ -0,0 +1,103 @@ +#include "blockersubscription.h" + +#include <QFile> +#include <QTextStream> + +BlockerSubscription::BlockerSubscription(QObject *parent) : +    QObject(parent) +{ +} + +int BlockerSubscription::loadFromFile(const QString &file) +{ +    QFile subfile(file); +    if(!subfile.open(QIODevice::ReadOnly | QIODevice::Text)) { +        qDebug("Cannot open subscription: %s", qUtf8Printable(file)); +        return -1; +    } + +    QTextStream subscription(&subfile); + +    QString header = subscription.readLine(); +    if(header != "[Adblock Plus 2.0]") { +        qDebug("Invalid format of subscription: %s", qUtf8Printable(file)); +        return -1; +    } + +    int rules = 0; + +    while(!subscription.atEnd()) { +        QString line = subscription.readLine(); +        if(!line.isEmpty()) { +            if(line.startsWith('!')) { +                parseComment(line); +            } else { +                // The line is not a comment +                BlockerRule *rule = new BlockerRule(line, this); +                m_urlBlacklist.append(rule); +                rules++; +            } +        } +    } + +    qDebug("Loaded %i rules from subscription %s", rules, qUtf8Printable(file)); +    return rules; +} + +const QString BlockerSubscription::title() +{ +    return m_title; +} + +const QString BlockerSubscription::homepage() +{ +    return m_homepage; +} + +const QString BlockerSubscription::license() +{ +    return m_license; +} + +const QString BlockerSubscription::version() +{ +    return m_version; +} + +const QDateTime BlockerSubscription::lastModified() +{ +    return m_lastModified; +} + +const QDateTime BlockerSubscription::expires() +{ +    return m_expires; +} + +void BlockerSubscription::parseComment(const QString &line) +{ +    if(line.startsWith("! Title: ")) { +        m_title = line.right(line.length() - 9); +        return; +    } +    if(line.startsWith("! Homepage: ")) { +        m_homepage = line.right(line.length() - 12); +        return; +    } +    if(line.startsWith("! Licence: ")) { +        m_license = line.right(line.length() - 11); +        return; +    } +    if(line.startsWith("! Version: ")) { +        m_version = line.right(line.length() - 11); +        return; +    } +    if(line.startsWith("! Last modified: ")) { +        m_lastModified = QDateTime::fromString(line.right(line.length() - 17), Qt::RFC2822Date); +        return; +    } +    if(line.startsWith("! Expires: ")) { +        m_expires = m_lastModified.addDays(line.right(line.length() - 11).left(2).toInt()); +        return; +    } +} diff --git a/src/webengine/blockersubscription.h b/src/webengine/blockersubscription.h new file mode 100644 index 0000000..1379936 --- /dev/null +++ b/src/webengine/blockersubscription.h @@ -0,0 +1,41 @@ +#ifndef URLINTERCEPTORSUBSCRIPTION_H +#define URLINTERCEPTORSUBSCRIPTION_H + +#include <QObject> +#include <QDateTime> +#include "blockerrule.h" + +class BlockerSubscription : public QObject +{ +    Q_OBJECT +public: +    explicit BlockerSubscription(QObject *parent = 0); + +    int loadFromFile(const QString &file); + +    const QString title(); +    const QString homepage(); +    const QString license(); +    const QString version(); +    const QDateTime lastModified(); +    const QDateTime expires(); + +signals: + +public slots: + +private: +    void parseComment(const QString &line); + +    QString m_title; +    QString m_homepage; +    QString m_license; + +    QString m_version; +    QDateTime m_lastModified; +    QDateTime m_expires; + +    QList<BlockerRule*> m_urlBlacklist; +}; + +#endif // URLINTERCEPTORSUBSCRIPTION_H diff --git a/src/webengine/urlinterceptor.cpp b/src/webengine/urlinterceptor.cpp new file mode 100644 index 0000000..87879a5 --- /dev/null +++ b/src/webengine/urlinterceptor.cpp @@ -0,0 +1,19 @@ +#include "urlinterceptor.h" + +AdBlockInterceptor::AdBlockInterceptor(QObject *parent) : +    QWebEngineUrlRequestInterceptor(parent) +{ +} + +void AdBlockInterceptor::interceptRequest(QWebEngineUrlRequestInfo &info) +{ +//    bool blocked = false; +//    for(AdBlockRule *rule : m_urlBlacklist) { +//        if(rule->match(info.requestUrl())) { +//            info.block(true); +//            blocked = true; +//        } +//    } + +    qDebug("%i %i %s %s", info.navigationType(), info.resourceType(), qUtf8Printable(info.requestMethod()), qUtf8Printable(info.requestUrl().toString())); +} diff --git a/src/webengine/adblockinterceptor.h b/src/webengine/urlinterceptor.h index 061b626..7834430 100644 --- a/src/webengine/adblockinterceptor.h +++ b/src/webengine/urlinterceptor.h @@ -2,7 +2,6 @@  #define ADBLOCKINTERCEPTOR_H  #include <QWebEngineUrlRequestInterceptor> -#include "adblockrule.h"  class AdBlockInterceptor : public QWebEngineUrlRequestInterceptor  { @@ -12,14 +11,11 @@ public:      void interceptRequest(QWebEngineUrlRequestInfo &info); -    int loadSubscription(const QString &subpath); -  signals:  public slots:  private: -    QList<AdBlockRule*> m_urlBlacklist;  };  #endif // ADBLOCKINTERCEPTOR_H diff --git a/test/config.ini b/test/config.ini index 2c4b114..03447e4 100644 --- a/test/config.ini +++ b/test/config.ini @@ -5,3 +5,6 @@ profile=Default  [window]  width=1280  height=720 + +[blocker] +subscription=blocklist.txt | 
