#include "filterdomain.h" #include bool isMatchingDomain(const QString &domain, const QString &filter) { // domain and filter are the same if(domain == filter) { return true; } // domain can't be matched by filter if it doesn't end with filter // ex. example2.com isn't matched by example.com if(!domain.endsWith(filter)) { return false; } // match with subdomains // ex. subdomain.example.com is matched by example.com int index = domain.indexOf(filter); // match if (domain ends with filter) && (filter has been found) and (character before filter is '.') return index > 0 && domain[index - 1] == QLatin1Char('.'); } FilterDomain::FilterDomain(QObject *parent) : QObject(parent) { } void FilterDomain::addDomain(const QString &domain, bool isException) { if(domain.isEmpty()) return; if(!isException) m_allowedOnDomains.append(domain); else m_blockedOnDomains.append(domain); } void FilterDomain::addRule(FilterRule_ptr &rule) { Q_ASSERT(rule); m_rules.emplace_back(std::move(rule)); } bool FilterDomain::hasMatch(const QString &host) const { for(const auto &domain : qAsConst(m_blockedOnDomains)) { if(isMatchingDomain(host, domain)) return false; } for(const auto &domain : qAsConst(m_allowedOnDomains)) { if(isMatchingDomain(host, domain)) return true; } return false; } void FilterDomain::process(QWebEngineUrlRequestInfo &info) const { for(const FilterRule_ptr &rule : m_rules) { if(rule->matchRequestUrl(info.requestUrl().toString(), info.resourceType())) rule->process(info); } }