/* ============================================================ * * This file is a part of the rekonq project * * Copyright (C) 2013 by Paul Rohrbach * * * 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 . * * ============================================================ */ // 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; } const QStringList lst = rule.split(QL1S("##")); QString domainSpecificRule = lst[1]; QStringList domains = lst[0].split(QL1C(',')); Q_FOREACH(const 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, const QString &domain) const { //first apply generic rules Q_FOREACH(const QString &rule, m_GenericRules) { applyStringRule(document, rule); } //check for whitelisted rules QStringList whiteListedRules; const QStringList subdomainList = generateSubdomainList(domain); Q_FOREACH(const QString &d, subdomainList) { whiteListedRules.append(m_DomainSpecificRulesWhitelist.values(d)); } //apply rules if not whitelisted Q_FOREACH(const QString &d, subdomainList) { const QList ruleList = m_DomainSpecificRules.values(d); Q_FOREACH(const 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; }