summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Rohrbach <p.b.r@gmx.net>2013-07-30 21:53:23 +0200
committerAndrea Diamantini <adjam7@gmail.com>2013-07-30 21:53:23 +0200
commitb715a3c6a64f96706ea5d186c60647040d7e91d3 (patch)
treeb2770e1f92da0bf88330325094781e47cd074c92
parentMove autoscroll timer interval from 100ms to 16ms (diff)
downloadrekonq-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
-rw-r--r--src/adblock/adblockmanager.cpp22
-rw-r--r--src/adblock/adblockmanager.h2
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;
};