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') 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