1
mirror of https://invent.kde.org/network/falkon.git synced 2024-11-11 09:32:12 +01:00

AdBlockSubscription: Don't allocate search tree on heap.

This commit is contained in:
nowrep 2013-11-03 14:29:23 +01:00
parent c07e9cff3c
commit 511ef3c346
4 changed files with 26 additions and 26 deletions

View File

@ -25,6 +25,17 @@ AdBlockSearchTree::AdBlockSearchTree()
{ {
} }
AdBlockSearchTree::~AdBlockSearchTree()
{
deleteNode(m_root);
}
void AdBlockSearchTree::clear()
{
deleteNode(m_root);
m_root = new Node;
}
bool AdBlockSearchTree::add(const AdBlockRule* rule) bool AdBlockSearchTree::add(const AdBlockRule* rule)
{ {
if (rule->m_type != AdBlockRule::StringContainsMatchRule) { if (rule->m_type != AdBlockRule::StringContainsMatchRule) {
@ -58,7 +69,7 @@ bool AdBlockSearchTree::add(const AdBlockRule* rule)
return true; return true;
} }
const AdBlockRule* AdBlockSearchTree::find(const QNetworkRequest &request, const QString &domain, const QString &string) const AdBlockRule* AdBlockSearchTree::find(const QNetworkRequest &request, const QString &domain, const QString &string) const
{ {
int len = string.size(); int len = string.size();
@ -76,7 +87,7 @@ const AdBlockRule* AdBlockSearchTree::find(const QNetworkRequest &request, const
return 0; return 0;
} }
const AdBlockRule* AdBlockSearchTree::prefixSearch(const QNetworkRequest &request, const QString &domain, const QString &urlString, const QString &string) const AdBlockRule* AdBlockSearchTree::prefixSearch(const QNetworkRequest &request, const QString &domain, const QString &urlString, const QString &string) const
{ {
int len = string.size(); int len = string.size();
@ -127,8 +138,3 @@ void AdBlockSearchTree::deleteNode(AdBlockSearchTree::Node* node)
delete node; delete node;
} }
AdBlockSearchTree::~AdBlockSearchTree()
{
deleteNode(m_root);
}

View File

@ -33,8 +33,10 @@ public:
explicit AdBlockSearchTree(); explicit AdBlockSearchTree();
~AdBlockSearchTree(); ~AdBlockSearchTree();
void clear();
bool add(const AdBlockRule* rule); bool add(const AdBlockRule* rule);
const AdBlockRule* find(const QNetworkRequest &request, const QString &domain, const QString &string); const AdBlockRule* find(const QNetworkRequest &request, const QString &domain, const QString &string) const;
private: private:
struct Node { struct Node {
@ -46,7 +48,7 @@ private:
}; };
const AdBlockRule* prefixSearch(const QNetworkRequest &request, const QString &domain, const AdBlockRule* prefixSearch(const QNetworkRequest &request, const QString &domain,
const QString &urlString, const QString &string); const QString &urlString, const QString &string) const;
void deleteNode(Node* node); void deleteNode(Node* node);

View File

@ -58,8 +58,6 @@
AdBlockSubscription::AdBlockSubscription(const QString &title, QObject* parent) AdBlockSubscription::AdBlockSubscription(const QString &title, QObject* parent)
: QObject(parent) : QObject(parent)
, m_reply(0) , m_reply(0)
, m_networkBlockTree(0)
, m_networkExceptionTree(0)
, m_title(title) , m_title(title)
, m_updated(false) , m_updated(false)
{ {
@ -203,11 +201,11 @@ void AdBlockSubscription::saveDownloadedData(const QByteArray &data)
const AdBlockRule* AdBlockSubscription::match(const QNetworkRequest &request, const QString &urlDomain, const QString &urlString) const const AdBlockRule* AdBlockSubscription::match(const QNetworkRequest &request, const QString &urlDomain, const QString &urlString) const
{ {
if (m_networkExceptionTree->find(request, urlDomain, urlString)) { if (m_networkExceptionTree.find(request, urlDomain, urlString)) {
return 0; return 0;
} }
if (const AdBlockRule* rule = m_networkBlockTree->find(request, urlDomain, urlString)) { if (const AdBlockRule* rule = m_networkBlockTree.find(request, urlDomain, urlString)) {
return rule; return rule;
} }
@ -377,19 +375,15 @@ const AdBlockRule* AdBlockSubscription::replaceRule(AdBlockRule* rule, int offse
void AdBlockSubscription::populateCache() void AdBlockSubscription::populateCache()
{ {
m_networkExceptionTree.clear();
m_networkExceptionRules.clear(); m_networkExceptionRules.clear();
m_networkBlockTree.clear();
m_networkBlockRules.clear(); m_networkBlockRules.clear();
m_domainRestrictedCssRules.clear(); m_domainRestrictedCssRules.clear();
m_elementHidingRules.clear(); m_elementHidingRules.clear();
m_documentRules.clear(); m_documentRules.clear();
m_elemhideRules.clear(); m_elemhideRules.clear();
delete m_networkBlockTree;
delete m_networkExceptionTree;
m_networkBlockTree = new AdBlockSearchTree;
m_networkExceptionTree = new AdBlockSearchTree;
// Apparently, excessive amount of selectors for one CSS rule is not what WebKit likes. // Apparently, excessive amount of selectors for one CSS rule is not what WebKit likes.
// (In my testings, 4931 is the number that makes it crash) // (In my testings, 4931 is the number that makes it crash)
// So let's split it by 1000 selectors... // So let's split it by 1000 selectors...
@ -423,12 +417,12 @@ void AdBlockSubscription::populateCache()
m_elemhideRules.append(rule); m_elemhideRules.append(rule);
} }
else if (rule->isException()) { else if (rule->isException()) {
if (!m_networkExceptionTree->add(rule)) { if (!m_networkExceptionTree.add(rule)) {
m_networkExceptionRules.append(rule); m_networkExceptionRules.append(rule);
} }
} }
else { else {
if (!m_networkBlockTree->add(rule)) { if (!m_networkBlockTree.add(rule)) {
m_networkBlockRules.append(rule); m_networkBlockRules.append(rule);
} }
} }
@ -443,8 +437,6 @@ void AdBlockSubscription::populateCache()
AdBlockSubscription::~AdBlockSubscription() AdBlockSubscription::~AdBlockSubscription()
{ {
qDeleteAll(m_rules); qDeleteAll(m_rules);
delete m_networkBlockTree;
delete m_networkExceptionTree;
} }
// AdBlockCustomList // AdBlockCustomList

View File

@ -51,12 +51,12 @@
#include "qz_namespace.h" #include "qz_namespace.h"
#include "adblockrule.h" #include "adblockrule.h"
#include "adblocksearchtree.h"
class QNetworkRequest; class QNetworkRequest;
class QNetworkReply; class QNetworkReply;
class QUrl; class QUrl;
class AdBlockSearchTree;
class FollowRedirectReply; class FollowRedirectReply;
class QT_QUPZILLA_EXPORT AdBlockSubscription : public QObject class QT_QUPZILLA_EXPORT AdBlockSubscription : public QObject
@ -124,8 +124,8 @@ protected:
QVector<const AdBlockRule*> m_documentRules; QVector<const AdBlockRule*> m_documentRules;
QVector<const AdBlockRule*> m_elemhideRules; QVector<const AdBlockRule*> m_elemhideRules;
AdBlockSearchTree* m_networkBlockTree; AdBlockSearchTree m_networkBlockTree;
AdBlockSearchTree* m_networkExceptionTree; AdBlockSearchTree m_networkExceptionTree;
private: private:
QString m_title; QString m_title;