diff options
author | Paul Rohrbach <p.b.r@gmx.net> | 2013-07-30 21:53:23 +0200 |
---|---|---|
committer | Andrea Diamantini <adjam7@gmail.com> | 2013-07-30 21:53:23 +0200 |
commit | b715a3c6a64f96706ea5d186c60647040d7e91d3 (patch) | |
tree | b2770e1f92da0bf88330325094781e47cd074c92 /src/adblock | |
parent | Move autoscroll timer interval from 100ms to 16ms (diff) | |
download | rekonq-b715a3c6a64f96706ea5d186c60647040d7e91d3.tar.xz |
Load the adblock settings in background.
If you open rekonq and start typing immediately, there is a small lag
(about half a second).
This is caused by the AdBlockManager::loadSettings function reading
the adblock rules. It is called with a one second delay to make the
startup faster. With this patch, the function is called in a separate
thread using QtConcurrent::run to eliminate the lag.
To make this safe, the adblocker is enabled after the settings are
loaded, which means, that the first site loaded could be partially
with ads. But this is no change in behavior, as the adblocker in
current master is disabled for a whole second.
The only times this blocks now is in situations, where it is necessary
that the settings are loaded (showSettings and addCustomRule), but I
guess that no normal user will use those in under
a second after startup :)
REVIEW: 111712
REVIEWED-BY: adjam
Diffstat (limited to 'src/adblock')
-rw-r--r-- | src/adblock/adblockmanager.cpp | 22 | ||||
-rw-r--r-- | src/adblock/adblockmanager.h | 2 |
2 files changed, 20 insertions, 4 deletions
diff --git a/src/adblock/adblockmanager.cpp b/src/adblock/adblockmanager.cpp index 114f7551..93f6065c 100644 --- a/src/adblock/adblockmanager.cpp +++ b/src/adblock/adblockmanager.cpp @@ -46,6 +46,7 @@ #include <QWebElement> #include <QNetworkReply> #include <QNetworkRequest> +#include <QtConcurrentRun> QWeakPointer<AdBlockManager> AdBlockManager::s_adBlockManager; @@ -69,8 +70,8 @@ AdBlockManager::AdBlockManager(QObject *parent) , _isAdblockEnabled(false) , _isHideAdsEnabled(false) { - // NOTE: launch this with 1 sec delay to get sure we can start up fast... - QTimer::singleShot(1000, this, SLOT(loadSettings())); + // NOTE: launch this in a second thread so that it does not delay startup + _settingsLoaded = QtConcurrent::run(this, &AdBlockManager::loadSettings); } @@ -120,11 +121,13 @@ void AdBlockManager::loadSettings() _elementHiding.clear(); KConfigGroup settingsGroup(_adblockConfig, "Settings"); - _isAdblockEnabled = settingsGroup.readEntry("adBlockEnabled", false); // no need to load filters if adblock is not enabled :) - if (!_isAdblockEnabled) + if (!settingsGroup.readEntry("adBlockEnabled", false)) + { + _isAdblockEnabled = false; return; + } // just to be sure.. _isHideAdsEnabled = settingsGroup.readEntry("hideAdsEnabled", false); @@ -169,6 +172,8 @@ void AdBlockManager::loadSettings() // load local rules QString localRulesFilePath = KStandardDirs::locateLocal("appdata" , QL1S("adblockrules_local")); loadRules(localRulesFilePath); + + _isAdblockEnabled = true; } @@ -341,6 +346,9 @@ bool AdBlockManager::subscriptionFileExists(int i) void AdBlockManager::showSettings() { + // at this point, the settings should be loaded + _settingsLoaded.waitForFinished(); + QPointer<KDialog> dialog = new KDialog(); dialog->setCaption(i18nc("@title:window", "Ad Block Settings")); dialog->setButtons(KDialog::Ok | KDialog::Cancel); @@ -357,6 +365,9 @@ void AdBlockManager::showSettings() void AdBlockManager::addCustomRule(const QString &stringRule, bool reloadPage) { + // at this point, the settings should be loaded + _settingsLoaded.waitForFinished(); + // save rule in local filters QString localRulesFilePath = KStandardDirs::locateLocal("appdata" , QL1S("adblockrules_local")); @@ -383,6 +394,9 @@ void AdBlockManager::addCustomRule(const QString &stringRule, bool reloadPage) bool AdBlockManager::isAdblockEnabledForHost(const QString &host) { + if (!_isAdblockEnabled) + return false; + return ! _hostWhiteList.match(host); } diff --git a/src/adblock/adblockmanager.h b/src/adblock/adblockmanager.h index f65abe71..4a1f9be8 100644 --- a/src/adblock/adblockmanager.h +++ b/src/adblock/adblockmanager.h @@ -137,6 +137,7 @@ #include <QObject> #include <QStringList> #include <QByteArray> +#include <QFuture> // Forward Includes class QNetworkRequest; @@ -205,6 +206,7 @@ private: AdBlockElementHiding _elementHiding; KSharedConfig::Ptr _adblockConfig; + QFuture<void> _settingsLoaded; static QWeakPointer<AdBlockManager> s_adBlockManager; }; |