From 2abefeaf7908973a1694df6f8c85d4a104eba4c7 Mon Sep 17 00:00:00 2001 From: nowrep Date: Sun, 3 Nov 2013 16:04:38 +0100 Subject: [PATCH] AdBlock: Added option to use full EasyList subscription Instead of downloading only the essential half of EasyList, user can now choose to download and use the full list. This restriction is still here because the other half of EasyList is full of domain restricted rules that are using RegExps in our implementation, and thus being slow. --- .../adblock/adblockaddsubscriptiondialog.cpp | 2 +- src/lib/adblock/adblockdialog.cpp | 17 ++++++++++++ src/lib/adblock/adblockdialog.h | 3 +++ src/lib/adblock/adblockdialog.ui | 27 +++++++++++++------ src/lib/adblock/adblockmanager.cpp | 21 ++++++++++++++- src/lib/adblock/adblockmanager.h | 4 +++ src/lib/adblock/adblocksubscription.cpp | 2 +- src/lib/app/qz_namespace.h | 2 ++ 8 files changed, 67 insertions(+), 11 deletions(-) diff --git a/src/lib/adblock/adblockaddsubscriptiondialog.cpp b/src/lib/adblock/adblockaddsubscriptiondialog.cpp index 69fc96e63..0b373cfa3 100644 --- a/src/lib/adblock/adblockaddsubscriptiondialog.cpp +++ b/src/lib/adblock/adblockaddsubscriptiondialog.cpp @@ -24,7 +24,7 @@ AdBlockAddSubscriptionDialog::AdBlockAddSubscriptionDialog(QWidget* parent) { ui->setupUi(this); - m_knownSubscriptions << Subscription("EasyList (English)", "https://easylist-downloads.adblockplus.org/easylist.txt") + m_knownSubscriptions << Subscription("EasyList (English)", ADBLOCK_EASYLIST_URL) << Subscription("Fanboy's List (English)", "http://www.fanboy.co.nz/adblock/fanboy-adblock.txt") << Subscription("Adversity (English)", "http://adversity.googlecode.com/hg/Adversity.txt") << Subscription("BSI Lista Polska (Polish)", "http://www.bsi.info.pl/filtrABP.txt") diff --git a/src/lib/adblock/adblockdialog.cpp b/src/lib/adblock/adblockdialog.cpp index aedbbab3d..82c65e70f 100644 --- a/src/lib/adblock/adblockdialog.cpp +++ b/src/lib/adblock/adblockdialog.cpp @@ -33,6 +33,7 @@ AdBlockDialog::AdBlockDialog(QWidget* parent) , m_currentTreeWidget(0) , m_currentSubscription(0) , m_loaded(false) + , m_useLimitedEasyList(false) { setAttribute(Qt::WA_DeleteOnClose); setupUi(this); @@ -57,6 +58,7 @@ AdBlockDialog::AdBlockDialog(QWidget* parent) connect(adblockCheckBox, SIGNAL(toggled(bool)), this, SLOT(enableAdBlock(bool))); connect(search, SIGNAL(textChanged(QString)), this, SLOT(filterString(QString))); connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(currentChanged(int))); + connect(buttonBox, SIGNAL(accepted()), this, SLOT(close())); load(); @@ -121,6 +123,9 @@ void AdBlockDialog::currentChanged(int index) if (index != -1) { m_currentTreeWidget = qobject_cast(tabWidget->widget(index)); m_currentSubscription = m_currentTreeWidget->subscription(); + + bool isEasyList = m_currentSubscription->url() == QUrl(ADBLOCK_EASYLIST_URL); + useLimitedEasyList->setVisible(isEasyList); } } @@ -174,7 +179,19 @@ void AdBlockDialog::load() tabWidget->addTab(tree, subscription->title()); } + m_useLimitedEasyList = m_manager->useLimitedEasyList(); + useLimitedEasyList->setChecked(m_useLimitedEasyList); + m_loaded = true; QTimer::singleShot(50, this, SLOT(loadSubscriptions())); } + +void AdBlockDialog::closeEvent(QCloseEvent* ev) +{ + if (useLimitedEasyList->isChecked() != m_useLimitedEasyList) { + m_manager->setUseLimitedEasyList(useLimitedEasyList->isChecked()); + } + + QDialog::closeEvent(ev); +} diff --git a/src/lib/adblock/adblockdialog.h b/src/lib/adblock/adblockdialog.h index 1c3066077..a8b0f8fc1 100644 --- a/src/lib/adblock/adblockdialog.h +++ b/src/lib/adblock/adblockdialog.h @@ -55,6 +55,8 @@ private slots: void load(); private: + void closeEvent(QCloseEvent* ev); + AdBlockManager* m_manager; AdBlockTreeWidget* m_currentTreeWidget; AdBlockSubscription* m_currentSubscription; @@ -65,6 +67,7 @@ private: QAction* m_actionRemoveSubscription; bool m_loaded; + bool m_useLimitedEasyList; }; #endif // ADBLOCKDIALOG_H diff --git a/src/lib/adblock/adblockdialog.ui b/src/lib/adblock/adblockdialog.ui index dc54e5e78..5da7eec0d 100644 --- a/src/lib/adblock/adblockdialog.ui +++ b/src/lib/adblock/adblockdialog.ui @@ -121,14 +121,25 @@ - - - Qt::Horizontal - - - QDialogButtonBox::Ok - - + + + + + Use only essential part of EasyList (for performance reasons) + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Ok + + + + diff --git a/src/lib/adblock/adblockmanager.cpp b/src/lib/adblock/adblockmanager.cpp index 218446489..89009ad6c 100644 --- a/src/lib/adblock/adblockmanager.cpp +++ b/src/lib/adblock/adblockmanager.cpp @@ -44,6 +44,7 @@ AdBlockManager::AdBlockManager(QObject* parent) : QObject(parent) , m_loaded(false) , m_enabled(true) + , m_useLimitedEasyList(true) { load(); } @@ -210,6 +211,7 @@ void AdBlockManager::load() Settings settings; settings.beginGroup("AdBlock"); m_enabled = settings.value("enabled", m_enabled).toBool(); + m_useLimitedEasyList = settings.value("useLimitedEasyList", m_useLimitedEasyList).toBool(); m_disabledRules = settings.value("disabledRules", QStringList()).toStringList(); QDateTime lastUpdate = settings.value("lastUpdate", QDateTime()).toDateTime(); settings.endGroup(); @@ -256,7 +258,7 @@ void AdBlockManager::load() // Prepend EasyList if subscriptions are empty if (m_subscriptions.isEmpty()) { AdBlockSubscription* easyList = new AdBlockSubscription(tr("EasyList"), this); - easyList->setUrl(QUrl("https://easylist-downloads.adblockplus.org/easylist.txt")); + easyList->setUrl(QUrl(ADBLOCK_EASYLIST_URL)); easyList->setFilePath(mApp->currentProfilePath() + "adblock/easylist.txt"); connect(easyList, SIGNAL(subscriptionUpdated()), mApp, SLOT(reloadUserStyleSheet())); @@ -309,6 +311,7 @@ void AdBlockManager::save() Settings settings; settings.beginGroup("AdBlock"); settings.setValue("enabled", m_enabled); + settings.setValue("useLimitedEasyList", m_useLimitedEasyList); settings.setValue("disabledRules", m_disabledRules); settings.endGroup(); } @@ -325,6 +328,22 @@ bool AdBlockManager::canRunOnScheme(const QString &scheme) const || scheme == QLatin1String("abp")); } +bool AdBlockManager::useLimitedEasyList() const +{ + return m_useLimitedEasyList; +} + +void AdBlockManager::setUseLimitedEasyList(bool useLimited) +{ + m_useLimitedEasyList = useLimited; + + foreach (AdBlockSubscription* subscription, m_subscriptions) { + if (subscription->url() == QUrl(ADBLOCK_EASYLIST_URL)) { + subscription->updateSubscription(); + } + } +} + bool AdBlockManager::canBeBlocked(const QUrl &url) const { foreach (AdBlockSubscription* subscription, m_subscriptions) { diff --git a/src/lib/adblock/adblockmanager.h b/src/lib/adblock/adblockmanager.h index ad8b33ef4..c98853371 100644 --- a/src/lib/adblock/adblockmanager.h +++ b/src/lib/adblock/adblockmanager.h @@ -48,6 +48,9 @@ public: bool isEnabled() const; bool canRunOnScheme(const QString &scheme) const; + bool useLimitedEasyList() const; + void setUseLimitedEasyList(bool useLimited); + QString elementHidingRules() const; QString elementHidingRulesForDomain(const QUrl &url) const; @@ -79,6 +82,7 @@ private: bool m_loaded; bool m_enabled; + bool m_useLimitedEasyList; QList m_subscriptions; QStringList m_disabledRules; diff --git a/src/lib/adblock/adblocksubscription.cpp b/src/lib/adblock/adblocksubscription.cpp index 29eb09517..7d7d2dd4a 100644 --- a/src/lib/adblock/adblocksubscription.cpp +++ b/src/lib/adblock/adblocksubscription.cpp @@ -182,7 +182,7 @@ void AdBlockSubscription::saveDownloadedData(const QByteArray &data) return; } - if (m_url == QUrl("https://easylist-downloads.adblockplus.org/easylist.txt")) { + if (AdBlockManager::instance()->useLimitedEasyList() && m_url == QUrl(ADBLOCK_EASYLIST_URL)) { // Third-party advertisers rules are with start domain (||) placeholder which needs regexps // So we are ignoring it for keeping good performance // But we will use whitelist rules at the end of list diff --git a/src/lib/app/qz_namespace.h b/src/lib/app/qz_namespace.h index 7ce1d8819..ef1e01ed1 100644 --- a/src/lib/app/qz_namespace.h +++ b/src/lib/app/qz_namespace.h @@ -99,6 +99,8 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(Qz::NewTabPositionFlags) } +#define ADBLOCK_EASYLIST_URL "https://easylist-downloads.adblockplus.org/easylist.txt" + #ifdef Q_OS_WIN #define DEFAULT_THEME_NAME "windows" #elif defined(QZ_WS_X11)