summaryrefslogtreecommitdiff
path: root/src/adblock/adblockelementhiding.cpp
diff options
context:
space:
mode:
authorPaul Rohrbach <p.b.r@gmx.net>2013-07-30 21:15:24 +0200
committerAndrea Diamantini <adjam7@gmail.com>2013-07-30 21:17:12 +0200
commitf28c7dc42b6b6924e01b4b97736a89acdaddb244 (patch)
treebdca694cfc4da8e1786553f30c6fec6100daa2ee /src/adblock/adblockelementhiding.cpp
parentProperly resolve url before pasteAndGo (diff)
downloadrekonq-f28c7dc42b6b6924e01b4b97736a89acdaddb244.tar.xz
Adding domain-specific hiding support to the adblocker.
The domain-specific rules are stored in a QMultiHash, where the key is the domain and the values are the rules for the specified domain. This causes redundancy, because on rule can be applied to more than one domain, but has a really fast look-up time. The code for the generic hiding has not changed and is just relocated. REVIEW: 111521 REVIEWED-BY: adjam
Diffstat (limited to 'src/adblock/adblockelementhiding.cpp')
-rw-r--r--src/adblock/adblockelementhiding.cpp132
1 files changed, 132 insertions, 0 deletions
diff --git a/src/adblock/adblockelementhiding.cpp b/src/adblock/adblockelementhiding.cpp
new file mode 100644
index 00000000..442e652c
--- /dev/null
+++ b/src/adblock/adblockelementhiding.cpp
@@ -0,0 +1,132 @@
+/* ============================================================
+*
+* This file is a part of the rekonq project
+*
+* Copyright (C) 2013 by Paul Rohrbach <p.b.r at gmx dot net>
+*
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License as
+* published by the Free Software Foundation; either version 2 of
+* the License or (at your option) version 3 or any later version
+* accepted by the membership of KDE e.V. (or its successor approved
+* by the membership of KDE e.V.), which shall act as a proxy
+* defined in Section 14 of version 3 of the license.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+* ============================================================ */
+
+
+// Self Includes
+#include "adblockelementhiding.h"
+
+// Rekonq Includes
+#include "rekonq_defines.h"
+
+AdBlockElementHiding::AdBlockElementHiding()
+{
+}
+
+
+bool AdBlockElementHiding::addRule(const QString &rule)
+{
+ if (!rule.contains(QL1S("##")))
+ return false;
+
+ if (rule.startsWith(QL1S("##")))
+ {
+ m_GenericRules.push_back(rule.mid(2));
+ return true;
+ }
+
+ QStringList lst = rule.split(QL1S("##"));
+ QString domainSpecificRule = lst[1];
+
+ QStringList domains = lst[0].split(QL1C(','));
+ Q_FOREACH(QString domain, domains)
+ {
+ if(domain.startsWith(QL1C('~')))
+ {
+ m_DomainSpecificRulesWhitelist.insert(domain.mid(1),
+ domainSpecificRule);
+ continue;
+ }
+
+ m_DomainSpecificRules.insert(domain, domainSpecificRule);
+ }
+
+ return true;
+}
+
+void AdBlockElementHiding::apply(QWebElement &document, QString domain) const
+{
+
+ //first apply generic rules
+ Q_FOREACH(QString rule, m_GenericRules)
+ {
+ applyStringRule(document, rule);
+ }
+
+ //check for whitelisted rules
+ QStringList whiteListedRules;
+ QStringList subdomainList = generateSubdomainList(domain);
+
+ Q_FOREACH(QString d, subdomainList)
+ {
+ whiteListedRules.append(m_DomainSpecificRulesWhitelist.values(d));
+ }
+
+ //apply rules if not whitelisted
+ Q_FOREACH(QString d, subdomainList)
+ {
+ QList<QString> ruleList = m_DomainSpecificRules.values(d);
+ Q_FOREACH(QString rule, ruleList)
+ {
+ if (!whiteListedRules.contains(rule))
+ applyStringRule(document, rule);
+ }
+ }
+}
+
+void AdBlockElementHiding::clear()
+{
+ m_GenericRules.clear();
+ m_DomainSpecificRules.clear();
+ m_DomainSpecificRulesWhitelist.clear();
+}
+
+void AdBlockElementHiding::applyStringRule(QWebElement &document, const QString &rule) const
+{
+ QWebElementCollection elements = document.findAll(rule);
+
+ Q_FOREACH(QWebElement el, elements)
+ {
+ if (el.isNull())
+ continue;
+ kDebug() << "Hide element: " << el.localName();
+ el.removeFromDocument();
+ }
+}
+
+QStringList AdBlockElementHiding::generateSubdomainList(const QString &domain) const
+{
+ QStringList returnList;
+
+ int dotPosition = domain.lastIndexOf(QL1C('.'));
+ dotPosition = domain.lastIndexOf(QL1C('.'), dotPosition - 1);
+ while (dotPosition != -1)
+ {
+ returnList.append(domain.mid(dotPosition + 1));
+ dotPosition = domain.lastIndexOf(QL1C('.'), dotPosition - 1);
+ }
+ returnList.append(domain);
+
+ return returnList;
+}