/******************************************************************************* ** ** smolbote: yet another qute browser ** Copyright (C) 2017 Xian Nox ** ** 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 3 of the License, or ** (at your option) any later version. ** ** 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 . ** ******************************************************************************/ #include "filterrule.h" FilterRule::FilterRule(const QString firstPartyUrl, const QString requestUrl, ResourceRules rules, bool shouldBlock, QObject *parent) : QObject(parent) { m_firstPartyUrl.setPattern(firstPartyUrl); m_requestUrl.setPattern(requestUrl); m_rules = rules; m_shouldBlock = shouldBlock; m_valid = true; #ifdef DEBUG_VERBOSE qDebug("Created rule [%s] [%s]", qUtf8Printable(firstPartyUrl), qUtf8Printable(requestUrl)); #endif } bool FilterRule::hasMatch(const QWebEngineUrlRequestInfo &info) { if(m_firstPartyUrl.hasMatch(info.firstPartyUrl().toString()) && m_requestUrl.hasMatch(info.requestUrl().toString())) { return true; } else { return false; } } bool FilterRule::shouldBlock(const QWebEngineUrlRequestInfo &info) { if(!m_valid) { return false; } // Check options switch (info.resourceType()) { case QWebEngineUrlRequestInfo::ResourceTypeMainFrame: return testFlag(MainFrame); case QWebEngineUrlRequestInfo::ResourceTypeSubFrame: return testFlag(SubFrame); case QWebEngineUrlRequestInfo::ResourceTypeStylesheet: return testFlag(Stylesheet); case QWebEngineUrlRequestInfo::ResourceTypeScript: return testFlag(Script); case QWebEngineUrlRequestInfo::ResourceTypeImage: return testFlag(Image); case QWebEngineUrlRequestInfo::ResourceTypeFontResource: return testFlag(FontResource); case QWebEngineUrlRequestInfo::ResourceTypeSubResource: return testFlag(SubResource); case QWebEngineUrlRequestInfo::ResourceTypeObject: return testFlag(Object); case QWebEngineUrlRequestInfo::ResourceTypeMedia: return testFlag(Media); case QWebEngineUrlRequestInfo::ResourceTypeWorker: return testFlag(Worker); case QWebEngineUrlRequestInfo::ResourceTypeSharedWorker: return testFlag(SharedWorker); case QWebEngineUrlRequestInfo::ResourceTypePrefetch: return testFlag(Prefetch); case QWebEngineUrlRequestInfo::ResourceTypeFavicon: return testFlag(Favicon); case QWebEngineUrlRequestInfo::ResourceTypeXhr: return testFlag(Xhr); case QWebEngineUrlRequestInfo::ResourceTypePing: return testFlag(Ping); case QWebEngineUrlRequestInfo::ResourceTypeServiceWorker: return testFlag(ServiceWorker); case QWebEngineUrlRequestInfo::ResourceTypeCspReport: return testFlag(CspReport); case QWebEngineUrlRequestInfo::ResourceTypePluginResource: return testFlag(PluginResource); case QWebEngineUrlRequestInfo::ResourceTypeUnknown: break; } return m_shouldBlock; } bool FilterRule::isValid() { return m_valid; } QString FilterRule::filter() const { return "'" + m_firstPartyUrl.pattern() + "' | '" + m_requestUrl.pattern() + "'"; } bool FilterRule::testFlag(ResourceType flag) { if(m_rules.allowed.testFlag(flag)) { return false; } else if(m_rules.blocked.testFlag(flag)) { return true; } else { return m_shouldBlock; } }