From kde-commits Tue Aug 26 03:38:54 2008 From: Maks Orlovich Date: Tue, 26 Aug 2008 03:38:54 +0000 To: kde-commits Subject: branches/KDE/4.1/kdelibs/khtml Message-Id: <1219721934.121249.30294.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=121972194618006 SVN commit 852593 by orlovich: Backport ad filtering improvements --- mostly huge (~7.6x) performance improvements thanks to vtokarev's ultra-cool RK implementation, some compatibility improvements (e.g. understanding @@ whitelist directives) and a bit of refactoring so we don't clutter khtml_settings.cc with computer science. M +1 -0 CMakeLists.txt A khtml_filter.cpp trunk/KDE/kdelibs/khtml/khtml_filter.cpp#852301 [License: LGPL (v2+)] A khtml_filter_p.h trunk/KDE/kdelibs/khtml/khtml_filter_p.h#852301 [License: LGPL (v2+)] M +15 -41 khtml_settings.cc --- branches/KDE/4.1/kdelibs/khtml/CMakeLists.txt #852592:852593 @@ -289,6 +289,7 @@ khtml_run.cpp khtml_global.cpp khtml_settings.cc + khtml_filter.cpp khtml_events.cpp khtml_ext.cpp khtml_pagecache.cpp --- branches/KDE/4.1/kdelibs/khtml/khtml_settings.cc #852592:852593 @@ -28,6 +28,7 @@ #include #include #include +#include /** * @internal @@ -107,7 +108,8 @@ QStringList fonts; QStringList defaultFonts; - QVector adFilters; + khtml::FilterSet adBlackList; + khtml::FilterSet adWhiteList; QList< QPair< QString, QChar > > m_fallbackAccessKeysAssignments; }; @@ -324,40 +326,22 @@ d->m_adFilterEnabled = cgFilter.readEntry("Enabled", false); d->m_hideAdsEnabled = cgFilter.readEntry("Shrink", false); - d->adFilters.clear(); + d->adBlackList.clear(); + d->adWhiteList.clear(); QMap entryMap = cgFilter.entryMap(); QMap::ConstIterator it; - d->adFilters.reserve(entryMap.count()); for( it = entryMap.constBegin(); it != entryMap.constEnd(); ++it ) { QString name = it.key(); QString url = it.value(); - if (url.startsWith("!")) - continue; - if (name.startsWith("Filter")) { - if (url.length()>2 && url[0]=='/' && url[url.length()-1] == '/') - { - QString inside = url.mid(1, url.length()-2); - QRegExp rx(inside); - d->adFilters.append(rx); - } + if (url.startsWith(QLatin1String("@@"))) + d->adWhiteList.addFilter(url); else - { - QRegExp rx; - int left,right; - - for (right=url.length(); right>0 && url[right-1]=='*' ; --right); - for (left=0; leftadFilters.append(rx); - } + d->adBlackList.addFilter(url); } } } @@ -738,16 +722,8 @@ { if (!url.startsWith("data:")) { - QVector::const_iterator it(d->adFilters.constBegin()); - QVector::const_iterator end(d->adFilters.constEnd()); - for (; it != end; ++it) - { - if ((*it).indexIn(url) != -1) - { - kDebug( 6080 ) << "Filtered: " << url; - return true; - } - } + // Check the blacklist, and only if that matches, the whitelist + return d->adBlackList.isUrlMatched(url) && !d->adWhiteList.isUrlMatched(url); } } return false; @@ -758,6 +734,9 @@ KConfigGroup config = KSharedConfig::openConfig( "khtmlrc", KConfig::NoGlobals )->group( "Filter Settings" ); QRegExp rx; + + // Try compiling to avoid invalid stuff. Only support the basic syntax here... + // ### refactor somewhat if (url.length()>2 && url[0]=='/' && url[url.length()-1] == '/') { QString inside = url.mid(1, url.length()-2); @@ -765,13 +744,8 @@ } else { - int left,right; - rx.setPatternSyntax(QRegExp::Wildcard); - for (right=url.length(); right>0 && url[right-1]=='*' ; --right); - for (left=0; leftadFilters.append(rx); + d->adBlackList.addFilter(url); } else {