From 8080d3b70b85bc4d644d0de1b50194d6b550ff0a Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Sat, 22 May 2021 19:32:04 +0200 Subject: [PATCH] Parse but ignore unsupported adblock patterns --- src/lib/adblock/adblockmatcher.cpp | 6 ++-- src/lib/adblock/adblockrule.cpp | 44 ++++++++++++++++++++++----- src/lib/adblock/adblockrule.h | 6 +++- src/lib/adblock/adblocktreewidget.cpp | 5 ++- src/lib/webtab/searchtoolbar.cpp | 4 +-- 5 files changed, 52 insertions(+), 13 deletions(-) diff --git a/src/lib/adblock/adblockmatcher.cpp b/src/lib/adblock/adblockmatcher.cpp index 62954951a..c3245a4f7 100644 --- a/src/lib/adblock/adblockmatcher.cpp +++ b/src/lib/adblock/adblockmatcher.cpp @@ -132,6 +132,9 @@ void AdBlockMatcher::update() // Don't add internally disabled rules to cache if (rule->isInternalDisabled()) continue; + // Or unsupported ones + if (rule->isUnsupportedRule()) + continue; if (rule->isCssRule()) { // We will add only enabled css rules to cache, because there is no enabled/disabled @@ -153,8 +156,7 @@ void AdBlockMatcher::update() else if (rule->isException()) { if (!m_networkExceptionTree.add(rule)) m_networkExceptionRules.append(rule); - } - else { + } else { if (!m_networkBlockTree.add(rule)) m_networkBlockRules.append(rule); } diff --git a/src/lib/adblock/adblockrule.cpp b/src/lib/adblock/adblockrule.cpp index 3ac5d8630..ba334036a 100644 --- a/src/lib/adblock/adblockrule.cpp +++ b/src/lib/adblock/adblockrule.cpp @@ -149,6 +149,11 @@ QString AdBlockRule::cssSelector() const return m_matchString; } +bool AdBlockRule::isUnsupportedRule() const +{ + return m_type == ExtendedCssRule || m_type == SnippetRule || m_isInternalDisabled; +} + bool AdBlockRule::isDocument() const { return hasOption(DocumentOption); @@ -356,13 +361,44 @@ void AdBlockRule::parseFilter() return; } + // Exception always starts with @@ + if (parsedLine.startsWith(QL1S("@@"))) { + m_isException = true; + parsedLine.remove(0, 2); + } + + // Extended CSS element hiding + if (parsedLine.contains(QL1S("#?#"))) { + m_type = ExtendedCssRule; + int pos = parsedLine.indexOf(QL1C('#')); + if (!parsedLine.startsWith(QL1S("#"))) { + QString domains = parsedLine.left(pos); + parseDomains(domains, QL1C(',')); + } + m_matchString = parsedLine.mid(pos + 3); + // CSS rule cannot have more options -> stop parsing + return; + } + + // Snippet rule + if (parsedLine.contains(QL1S("#$#"))) { + m_type = SnippetRule; + int pos = parsedLine.indexOf(QL1C('#')); + if (!parsedLine.startsWith(QL1S("#"))) { + QString domains = parsedLine.left(pos); + parseDomains(domains, QL1C(',')); + } + m_matchString = parsedLine.mid(pos + 3); + return; + } + // CSS Element hiding rule if (parsedLine.contains(QL1S("##")) || parsedLine.contains(QL1S("#@#"))) { m_type = CssRule; int pos = parsedLine.indexOf(QL1C('#')); // Domain restricted rule - if (!parsedLine.startsWith(QL1S("##"))) { + if (!parsedLine.startsWith(QL1S("#"))) { QString domains = parsedLine.left(pos); parseDomains(domains, QL1C(',')); } @@ -374,12 +410,6 @@ void AdBlockRule::parseFilter() return; } - // Exception always starts with @@ - if (parsedLine.startsWith(QL1S("@@"))) { - m_isException = true; - parsedLine.remove(0, 2); - } - // Parse all options following $ char int optionsIndex = parsedLine.indexOf(QL1C('$')); if (optionsIndex >= 0) { diff --git a/src/lib/adblock/adblockrule.h b/src/lib/adblock/adblockrule.h index adf6d0269..261fc9584 100644 --- a/src/lib/adblock/adblockrule.h +++ b/src/lib/adblock/adblockrule.h @@ -77,6 +77,8 @@ public: bool isCssRule() const; QString cssSelector() const; + bool isUnsupportedRule() const; + bool isDocument() const; bool isElemhide() const; @@ -112,7 +114,9 @@ private: StringEndsMatchRule = 3, StringContainsMatchRule = 4, MatchAllUrlsRule = 5, - Invalid = 6 + ExtendedCssRule = 6, + SnippetRule = 7, + Invalid = 8 }; enum RuleOption { diff --git a/src/lib/adblock/adblocktreewidget.cpp b/src/lib/adblock/adblocktreewidget.cpp index aa2362737..b7cfe555a 100644 --- a/src/lib/adblock/adblocktreewidget.cpp +++ b/src/lib/adblock/adblocktreewidget.cpp @@ -210,7 +210,10 @@ void AdBlockTreeWidget::adjustItemFeatures(QTreeWidgetItem* item, const AdBlockR item->setForeground(0, palette().windowText()); item->setFont(0, font()); - if (rule->isException()) { + if (rule->isUnsupportedRule()) { + item->setForeground(0, QColor(Qt::gray)); + item->setFont(0, QFont()); + } else if (rule->isException()) { item->setForeground(0, QColor(Qt::darkGreen)); item->setFont(0, QFont()); } diff --git a/src/lib/webtab/searchtoolbar.cpp b/src/lib/webtab/searchtoolbar.cpp index 73bcfa2bb..4d9a94aa1 100644 --- a/src/lib/webtab/searchtoolbar.cpp +++ b/src/lib/webtab/searchtoolbar.cpp @@ -29,7 +29,7 @@ SearchToolBar::SearchToolBar(WebView* view, QWidget* parent) : QWidget(parent) , ui(new Ui::SearchToolbar) , m_view(view) - , m_findFlags(0) + , m_findFlags{} { setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(this); @@ -82,7 +82,7 @@ void SearchToolBar::close() void SearchToolBar::findNext() { - m_findFlags = 0; + m_findFlags = {}; updateFindFlags(); searchText(ui->lineEdit->text());