aboutsummaryrefslogtreecommitdiff
path: root/src/blocker/filtercollection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/blocker/filtercollection.cpp')
-rw-r--r--src/blocker/filtercollection.cpp106
1 files changed, 43 insertions, 63 deletions
diff --git a/src/blocker/filtercollection.cpp b/src/blocker/filtercollection.cpp
index 5b0f96f..935776c 100644
--- a/src/blocker/filtercollection.cpp
+++ b/src/blocker/filtercollection.cpp
@@ -42,15 +42,14 @@ FilterCollection::FilterCollection(const QString path, QWidget *parent) :
{
ui->setupUi(this);
- m_name = "TODO";
- m_url = path;
+ ui->homepage->setText(path);
- qDebug("Adding subscription [%s]", qUtf8Printable(m_url));
+ qDebug("Adding subscription [%s]", qUtf8Printable(path));
m_filters = new FilterTree(this);
ui->treeView->setModel(m_filters);
- QFile filterFile(m_url);
+ QFile filterFile(path);
if(!filterFile.open(QIODevice::ReadOnly)) {
qWarning("Could not open filter!");
return;
@@ -59,7 +58,7 @@ FilterCollection::FilterCollection(const QString path, QWidget *parent) :
QJsonDocument filters(QJsonDocument::fromJson(filterFile.readAll()));
load(filters.object());
- qDebug("Added %i rules", m_rules.size());
+ qDebug("Added %i rules", m_filters->columnCount());
}
FilterCollection::~FilterCollection()
@@ -69,7 +68,7 @@ FilterCollection::~FilterCollection()
QString FilterCollection::name() const
{
- return m_name;
+ return ui->title->text();
}
/**
@@ -81,15 +80,17 @@ FilterCollection::MatchResult FilterCollection::match(QWebEngineUrlRequestInfo &
{
MatchResult result;
- for(FilterRule *rule : qAsConst(m_rules)) {
- result.match = rule->hasMatch(info);
- if(result.match) {
- result.block = rule->shouldBlock(info);
- } else {
- result.block = false;
+ for(FilterNode *rule : m_filters->filters(info.firstPartyUrl().toString())) {
+ if(rule->isValid()) {
+ result.match = rule->hasMatch(info);
+ if(result.match) {
+ result.block = rule->shouldBlock(info);
+ } else {
+ result.block = false;
+ }
+ result.pattern = rule->domain() + " | " + rule->request();
+ return result;
}
- result.pattern = rule->filter();
- return result;
}
// request matches neither whitelist nor blacklist
@@ -100,82 +101,61 @@ FilterCollection::MatchResult FilterCollection::match(QWebEngineUrlRequestInfo &
void FilterCollection::load(const QJsonObject &json)
{
- m_name = json["name"].toString();
- ui->title->setText(m_name);
+ ui->title->setText(json["name"].toString());
+ ui->homepage->setText(json["url"].toString());
- m_url = json["url"].toString();
- ui->homepage->setText(m_url);
-
- FilterRule *r;
for(QJsonValue v : json["rules"].toArray()) {
- r = createRule(v.toObject());
- m_rules.append(r);
- }
-}
-
-/**
- * Create rule from JSON object
- * @param obj
- * @return
- */
-FilterRule* FilterCollection::createRule(const QJsonObject &obj)
-{
- FilterRule *rule;
-
- FilterRule::ResourceRules r;
- r.allowed = parseJsonRules(obj["allowTypes"]);
- r.blocked = parseJsonRules(obj["blockTypes"]);
+ QJsonObject obj = v.toObject();
- rule = new FilterRule(obj["firstPartyUrl"].toString(), obj["requestUrl"].toString(), r, obj["shouldBlock"].toBool(), this);
+ FilterNode::ResourceRules r;
+ r.allowed = parseJsonRules(obj["allowTypes"]);
+ r.blocked = parseJsonRules(obj["blockTypes"]);
- QList<QVariant> nodeData;
- nodeData << obj["firstPartyUrl"].toString() << obj["requestUrl"].toString();
- m_filters->addFilter(nodeData);
-
- return rule;
+ m_filters->addFilter(obj["firstPartyUrl"].toString(), obj["requestUrl"].toString(), r, obj["shouldBlock"].toBool());
+ }
}
-FilterRule::Resources FilterCollection::parseJsonRules(const QJsonValue &obj)
+FilterNode::Resources FilterCollection::parseJsonRules(const QJsonValue &obj)
{
- FilterRule::Resources res;
+ FilterNode::Resources res;
for(QJsonValue v : obj.toArray()) {
QString t = v.toString();
if(t == "MainFrame") {
- res.setFlag(FilterRule::ResourceType::MainFrame);
+ res.setFlag(FilterNode::ResourceType::MainFrame);
} else if(t == "SubFrame") {
- res.setFlag(FilterRule::ResourceType::SubFrame);
+ res.setFlag(FilterNode::ResourceType::SubFrame);
} else if(t == "Stylesheet") {
- res.setFlag(FilterRule::ResourceType::Stylesheet);
+ res.setFlag(FilterNode::ResourceType::Stylesheet);
} else if(t == "Script") {
- res.setFlag(FilterRule::ResourceType::Script);
+ res.setFlag(FilterNode::ResourceType::Script);
} else if(t == "Image") {
- res.setFlag(FilterRule::ResourceType::Image);
+ res.setFlag(FilterNode::ResourceType::Image);
} else if(t == "FontResource") {
- res.setFlag(FilterRule::ResourceType::FontResource);
+ res.setFlag(FilterNode::ResourceType::FontResource);
} else if(t == "SubResource") {
- res.setFlag(FilterRule::ResourceType::SubResource);
+ res.setFlag(FilterNode::ResourceType::SubResource);
} else if(t == "Object") {
- res.setFlag(FilterRule::ResourceType::Object);
+ res.setFlag(FilterNode::ResourceType::Object);
} else if(t == "Media") {
- res.setFlag(FilterRule::ResourceType::Media);
+ res.setFlag(FilterNode::ResourceType::Media);
} else if(t == "Worker") {
- res.setFlag(FilterRule::ResourceType::Worker);
+ res.setFlag(FilterNode::ResourceType::Worker);
} else if(t == "SharedWorker") {
- res.setFlag(FilterRule::ResourceType::SharedWorker);
+ res.setFlag(FilterNode::ResourceType::SharedWorker);
} else if(t == "Prefetch") {
- res.setFlag(FilterRule::ResourceType::Prefetch);
+ res.setFlag(FilterNode::ResourceType::Prefetch);
} else if(t == "Favicon") {
- res.setFlag(FilterRule::ResourceType::Favicon);
+ res.setFlag(FilterNode::ResourceType::Favicon);
} else if(t == "Xhr") {
- res.setFlag(FilterRule::ResourceType::Xhr);
+ res.setFlag(FilterNode::ResourceType::Xhr);
} else if(t == "Ping") {
- res.setFlag(FilterRule::ResourceType::Ping);
+ res.setFlag(FilterNode::ResourceType::Ping);
} else if(t == "ServiceWorker") {
- res.setFlag(FilterRule::ResourceType::ServiceWorker);
+ res.setFlag(FilterNode::ResourceType::ServiceWorker);
} else if(t == "CspWorker") {
- res.setFlag(FilterRule::ResourceType::CspReport);
+ res.setFlag(FilterNode::ResourceType::CspReport);
} else if(t == "PluginResource") {
- res.setFlag(FilterRule::ResourceType::PluginResource);
+ res.setFlag(FilterNode::ResourceType::PluginResource);
}
}