From 49324c8d4acbf36902754a2f1c62fb134df1b19e Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Thu, 25 May 2017 16:12:29 +0200 Subject: Merged FilterRule into FilterNode --- src/blocker/filtercollection.cpp | 106 ++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 63 deletions(-) (limited to 'src/blocker/filtercollection.cpp') 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 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); } } -- cgit v1.2.1