/*******************************************************************************
**
** 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 "filternode.h"
FilterNode::FilterNode(const QString &domain, const QString &request, ResourceRules rules, bool shouldBlock, FilterNode *parentItem)
{
m_parentItem = parentItem;
m_domainUrl.setPattern(domain);
m_requestUrl.setPattern(request);
m_rules = rules;
m_shouldBlock = shouldBlock;
m_valid = false;
#ifdef DEBUG_VERBOSE
qDebug("Created rule [%s] [%s]", qUtf8Printable(domain), qUtf8Printable(request));
#endif
}
FilterNode::~FilterNode()
{
qDeleteAll(m_children);
}
void FilterNode::enable()
{
m_valid = true;
}
FilterNode *FilterNode::parentItem()
{
return m_parentItem;
}
void FilterNode::appendChild(FilterNode *child)
{
m_children.append(child);
}
FilterNode *FilterNode::child(int row)
{
return m_children.value(row);
}
int FilterNode::childCount() const
{
return m_children.count();
}
QString FilterNode::domain() const
{
return m_domainUrl.pattern();
}
QString FilterNode::request() const
{
return m_requestUrl.pattern();
}
bool FilterNode::isBlocking()
{
return m_shouldBlock;
}
int FilterNode::row() const
{
if(m_parentItem) {
return m_parentItem->m_children.indexOf(const_cast(this));
}
return 0;
}
bool FilterNode::hasMatch(const QWebEngineUrlRequestInfo &info)
{
if(m_domainUrl.hasMatch(info.firstPartyUrl().toString()) && m_requestUrl.hasMatch(info.requestUrl().toString())) {
return true;
} else {
return false;
}
}
bool FilterNode::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 FilterNode::isValid()
{
return m_valid;
}
bool FilterNode::testFlag(ResourceType flag)
{
if(m_rules.allowed.testFlag(flag)) {
return false;
} else if(m_rules.blocked.testFlag(flag)) {
return true;
} else {
return m_shouldBlock;
}
}