From 1143429887f61d8b3c74a4c3a1fafca632eb4b87 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Thu, 25 May 2017 20:59:43 +0200 Subject: Filter code refactoring --- src/filter/filter.cpp | 237 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 237 insertions(+) create mode 100644 src/filter/filter.cpp (limited to 'src/filter/filter.cpp') diff --git a/src/filter/filter.cpp b/src/filter/filter.cpp new file mode 100644 index 0000000..e0d01a9 --- /dev/null +++ b/src/filter/filter.cpp @@ -0,0 +1,237 @@ +/******************************************************************************* + ** + ** 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 "filter.h" + +Filter::Filter(const QString &domain, const QString &request, ResourceRules rules, bool shouldBlock, Filter *parentItem) +{ + m_parentItem = parentItem; + + m_domainUrl.setPattern(domain); + m_requestUrl.setPattern(request); + m_rules = rules; + m_shouldBlock = shouldBlock; + + m_valid = false; +} + +Filter::~Filter() +{ + qDeleteAll(m_children); +} + +void Filter::enable() +{ + m_valid = true; +} + +Filter *Filter::parentItem() +{ + return m_parentItem; +} + +void Filter::appendChild(Filter *child) +{ + m_children.append(child); +} + +Filter *Filter::child(int row) +{ + return m_children.value(row); +} + +int Filter::childCount() const +{ + return m_children.count(); +} + +QString Filter::domain() const +{ + return m_domainUrl.pattern(); +} + +QString Filter::request() const +{ + return m_requestUrl.pattern(); +} + +bool Filter::isBlocking() +{ + return m_shouldBlock; +} + +QString Filter::allowedTypes() const +{ + return flags(m_rules.allowed); +} + +QString Filter::blockedTypes() const +{ + return flags(m_rules.blocked); +} + +int Filter::row() const +{ + if(m_parentItem) { + return m_parentItem->m_children.indexOf(const_cast(this)); + } + + return 0; +} + +bool Filter::hasMatch(const QWebEngineUrlRequestInfo &info) +{ + if(m_domainUrl.hasMatch(info.firstPartyUrl().toString()) && m_requestUrl.hasMatch(info.requestUrl().toString())) { + return true; + } else { + return false; + } +} + +bool Filter::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(Font); + 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 Filter::isValid() +{ + return m_valid; +} + +bool Filter::testFlag(ResourceType flag) +{ + if(m_rules.allowed.testFlag(flag)) { + return false; + } else if(m_rules.blocked.testFlag(flag)) { + return true; + } else { + return m_shouldBlock; + } +} + +QString Filter::flags(Resources f) const +{ + QStringList r; + if(f.testFlag(MainFrame)) { + r << QObject::tr("Main Frame"); + } + if(f.testFlag(SubFrame)) { + r << QObject::tr("Sub Frame"); + } + if(f.testFlag(Stylesheet)) { + r << QObject::tr("Stylesheet"); + } + if(f.testFlag(Script)) { + r << QObject::tr("Script"); + } + if(f.testFlag(Image)) { + r << QObject::tr("Image"); + } + if(f.testFlag(Font)) { + r << QObject::tr("Font"); + } + if(f.testFlag(SubResource)) { + r << QObject::tr("Sub Resource"); + } + if(f.testFlag(Object)) { + r << QObject::tr("Object"); + } + if(f.testFlag(Media)) { + r << QObject::tr("Media"); + } + if(f.testFlag(Worker)) { + r << QObject::tr("Worker"); + } + if(f.testFlag(SharedWorker)) { + r << QObject::tr("Shared Worker"); + } + if(f.testFlag(Prefetch)) { + r << QObject::tr("Prefetch"); + } + if(f.testFlag(Favicon)) { + r << QObject::tr("Favicon"); + } + if(f.testFlag(Xhr)) { + r << QObject::tr("Xhr"); + } + if(f.testFlag(Ping)) { + r << QObject::tr("Ping"); + } + if(f.testFlag(ServiceWorker)) { + r << QObject::tr("Service Worker"); + } + if(f.testFlag(CspReport)) { + r << QObject::tr("Csp Report"); + } + if(f.testFlag(PluginResource)) { + r << QObject::tr("Plugin Resource"); + } + if(f.testFlag(Unknown)) { + r << QObject::tr("Unknown"); + } + return r.join(','); +} -- cgit v1.2.1