From b715a3c6a64f96706ea5d186c60647040d7e91d3 Mon Sep 17 00:00:00 2001
From: Paul Rohrbach
Date: Tue, 30 Jul 2013 21:53:23 +0200
Subject: 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
---
src/adblock/adblockmanager.cpp | 22 ++++++++++++++++++----
src/adblock/adblockmanager.h | 2 ++
2 files changed, 20 insertions(+), 4 deletions(-)
(limited to 'src/adblock')
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
#include
#include
+#include
QWeakPointer 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 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
#include
#include
+#include
// Forward Includes
class QNetworkRequest;
@@ -205,6 +206,7 @@ private:
AdBlockElementHiding _elementHiding;
KSharedConfig::Ptr _adblockConfig;
+ QFuture _settingsLoaded;
static QWeakPointer s_adBlockManager;
};
--
cgit v1.2.1