From 1c97a54381cd6a5bfd1fb6d97e8695f1b1d49166 Mon Sep 17 00:00:00 2001 From: Andrea Diamantini Date: Tue, 14 Feb 2012 11:27:54 +0100 Subject: Add dialog allowing adblock to list blocked/hided elements and unblock some of them --- src/CMakeLists.txt | 4 ++ src/adblock/adblockmanager.cpp | 43 ++++++++++-- src/adblock/adblockmanager.h | 17 +++-- src/adblock/blocked_elements.ui | 119 ++++++++++++++++++++++++++++++++++ src/adblock/blockedelementswidget.cpp | 106 ++++++++++++++++++++++++++++++ src/adblock/blockedelementswidget.h | 58 +++++++++++++++++ src/mainwindow.cpp | 3 + src/urlbar/urlbar.cpp | 2 +- src/webpage.cpp | 1 + 9 files changed, 344 insertions(+), 9 deletions(-) create mode 100644 src/adblock/blocked_elements.ui create mode 100644 src/adblock/blockedelementswidget.cpp create mode 100644 src/adblock/blockedelementswidget.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 82cf6066..10b57b1c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -69,6 +69,7 @@ SET( rekonq_KDEINIT_SRCS adblock/adblockrulenullimpl.cpp adblock/adblockruletextmatchimpl.cpp adblock/adblockwidget.cpp + adblock/blockedelementswidget.cpp #---------------------------------------- urlbar/stackedurlbar.cpp urlbar/urlbar.cpp @@ -112,7 +113,10 @@ KDE4_ADD_UI_FILES( rekonq_KDEINIT_SRCS settings/settings_tabs.ui settings/settings_appearance.ui settings/settings_webkit.ui + # ---------------------------------------- adblock/settings_adblock.ui + adblock/blocked_elements.ui + # ---------------------------------------- cleardata.ui sslinfo.ui webappcreation.ui diff --git a/src/adblock/adblockmanager.cpp b/src/adblock/adblockmanager.cpp index 27fb4020..8005c7e5 100644 --- a/src/adblock/adblockmanager.cpp +++ b/src/adblock/adblockmanager.cpp @@ -34,6 +34,8 @@ // Local Includes #include "adblocknetworkreply.h" #include "adblockwidget.h" +#include "blockedelementswidget.h" + #include "webpage.h" // KDE Includes @@ -68,6 +70,12 @@ bool AdBlockManager::isEnabled() } +bool AdBlockManager::isHidingElements() +{ + return _isHideAdsEnabled; +} + + void AdBlockManager::loadSettings() { // first, check this... @@ -88,10 +96,13 @@ void AdBlockManager::loadSettings() _hostWhiteList.clear(); _hostBlackList.clear(); + _whiteList.clear(); _blackList.clear(); _hideList.clear(); + clearElementsLists(); + KConfigGroup settingsGroup(_adblockConfig, "Settings"); _isAdblockEnabled = settingsGroup.readEntry("adBlockEnabled", false); kDebug() << "ADBLOCK ENABLED = " << _isAdblockEnabled; @@ -232,7 +243,7 @@ QNetworkReply *AdBlockManager::block(const QNetworkRequest &request, WebPage *pa { kDebug() << "ADBLOCK: BLACK RULE Matched by string: " << urlString; AdBlockNetworkReply *reply = new AdBlockNetworkReply(request, urlString, this); - // TODO: add it to blocked list + _blockedElements << request.url().toString(); page->setHasAdBlockedElements(true); return reply; } @@ -261,7 +272,7 @@ QNetworkReply *AdBlockManager::block(const QNetworkRequest &request, WebPage *pa } AdBlockNetworkReply *reply = new AdBlockNetworkReply(request, urlString, this); - // TODO: add it to blocked list + _blockedElements << request.url().toString(); page->setHasAdBlockedElements(true); return reply; } @@ -297,7 +308,7 @@ void AdBlockManager::applyHidingRules(WebPage *page) kDebug() << "Hide element: " << el.localName(); el.setStyleProperty(QL1S("visibility"), QL1S("hidden")); el.removeFromDocument(); - // TODO: add it to hided list + _hidedElements++; page->setHasAdBlockedElements(true); } } @@ -374,5 +385,29 @@ void AdBlockManager::addCustomRule(const QString &stringRule) AdBlockRule rule(stringRule); _blackList << rule; - // TODO: update page? + emit reloadCurrentPage(); +} + + +void AdBlockManager::showBlockedItemDialog() +{ + QPointer dialog = new KDialog(); + dialog->setCaption(i18nc("@title:window", "Blocked & hided elements")); + dialog->setButtons(KDialog::Ok); + + BlockedElementsWidget widget(this); + widget.setBlockedElements(_blockedElements); + widget.setHidedElements(_hidedElements); + + dialog->setMainWidget(&widget); + dialog->exec(); + + dialog->deleteLater(); +} + + +void AdBlockManager::clearElementsLists() +{ + _blockedElements.clear(); + _hidedElements = 0; } diff --git a/src/adblock/adblockmanager.h b/src/adblock/adblockmanager.h index 2e7f7836..30daa27e 100644 --- a/src/adblock/adblockmanager.h +++ b/src/adblock/adblockmanager.h @@ -155,20 +155,26 @@ public: ~AdBlockManager(); bool isEnabled(); + bool isHidingElements(); QNetworkReply *block(const QNetworkRequest &request, WebPage *page); void applyHidingRules(WebPage *page); void addCustomRule(const QString &); - -public Q_SLOTS: - void loadSettings(); - void showSettings(); + void clearElementsLists(); private: void updateSubscriptions(); void loadRules(const QString &); +private Q_SLOTS: + void loadSettings(); + void showSettings(); + void showBlockedItemDialog(); + +Q_SIGNALS: + void reloadCurrentPage(); + private: bool _isAdblockEnabled; bool _isHideAdsEnabled; @@ -179,6 +185,9 @@ private: AdBlockRuleList _whiteList; QStringList _hideList; + QStringList _blockedElements; + int _hidedElements; + KSharedConfig::Ptr _adblockConfig; }; diff --git a/src/adblock/blocked_elements.ui b/src/adblock/blocked_elements.ui new file mode 100644 index 00000000..884daee6 --- /dev/null +++ b/src/adblock/blocked_elements.ui @@ -0,0 +1,119 @@ + + + BlockedElements + + + + 0 + 0 + 527 + 407 + + + + Form + + + + + + <html><head/><body><p><span style=" font-weight:600;">Blocked elements</span></p></body></html> + + + + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + + true + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + <b>Hided elements</b> + + + + + + + TextLabel + + + + + + + + diff --git a/src/adblock/blockedelementswidget.cpp b/src/adblock/blockedelementswidget.cpp new file mode 100644 index 00000000..cdb40c27 --- /dev/null +++ b/src/adblock/blockedelementswidget.cpp @@ -0,0 +1,106 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2012 by Andrea Diamantini +* +* +* 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 2 of +* the License or (at your option) version 3 or any later version +* accepted by the membership of KDE e.V. (or its successor approved +* by the membership of KDE e.V.), which shall act as a proxy +* defined in Section 14 of version 3 of the license. +* +* 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 . +* +* ============================================================ */ + + +// Self Includes +#include "blockedelementswidget.h" +#include "blockedelementswidget.moc" + +// Local Includes +#include "adblockmanager.h" + +// Qt Includes +#include +#include +#include + + +BlockedElementsWidget::BlockedElementsWidget(QObject *manager, QWidget *parent) + : QWidget(parent) + , _manager(manager) +{ + setupUi(this); +} + + +void BlockedElementsWidget::setBlockedElements(const QStringList &list) +{ + QVBoxLayout *frameLayout = new QVBoxLayout(frame); + + Q_FOREACH(const QString & block, list) + { + QString truncatedUrl = block; + const int maxTextSize = 73; + if (truncatedUrl.length() > maxTextSize) + { + const int truncateSize = 70; + truncatedUrl.truncate(truncateSize); + truncatedUrl += QL1S("..."); + } + QWidget *w = new QWidget(this); + QHBoxLayout *l = new QHBoxLayout(w); + l->addWidget(new QLabel(truncatedUrl, this)); + + QPushButton *button = new QPushButton(KIcon("dialog-ok-apply"), i18n("Unblock"), this); + button->setProperty("URLTOUNBLOCK", block); + button->setFixedWidth(100); + connect(button, SIGNAL(clicked()), this, SLOT(unblockElement())); + l->addWidget(button); + + w->setMinimumWidth(500); + frameLayout->addWidget(w); + } +} + + +void BlockedElementsWidget::setHidedElements(int n) +{ + AdBlockManager *m = qobject_cast(_manager); + if (m->isHidingElements()) + label->setText(i18n("In this page there are %1 hided elements.", QString::number(n))); + else + label->setText(i18n("Hiding elements is disabled.")); +} + + +void BlockedElementsWidget::unblockElement() +{ + QPushButton *buttonClicked = qobject_cast(sender()); + if (!buttonClicked) + return; + + QString newText = i18n("Unblocked"); + if (buttonClicked->text() == newText) + return; + + QString urlString = buttonClicked->property("URLTOUNBLOCK").toString(); + kDebug() << "urlString: " << urlString; + + buttonClicked->setText(newText); + buttonClicked->setIcon(KIcon("dialog-ok")); + + AdBlockManager *m = qobject_cast(_manager); + m->addCustomRule("@@" + urlString); +} diff --git a/src/adblock/blockedelementswidget.h b/src/adblock/blockedelementswidget.h new file mode 100644 index 00000000..6f5ceaf8 --- /dev/null +++ b/src/adblock/blockedelementswidget.h @@ -0,0 +1,58 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2012 by Andrea Diamantini +* +* +* 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 2 of +* the License or (at your option) version 3 or any later version +* accepted by the membership of KDE e.V. (or its successor approved +* by the membership of KDE e.V.), which shall act as a proxy +* defined in Section 14 of version 3 of the license. +* +* 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 . +* +* ============================================================ */ + + +#ifndef BLOCKED_ELEMENTS_WIDGET_H +#define BLOCKED_ELEMENTS_WIDGET_H + + +// Rekonq Includes +#include "rekonq_defines.h" + +// Ui Includes +#include "ui_blocked_elements.h" + +// Qt Includes +#include + + +class BlockedElementsWidget : public QWidget, private Ui::BlockedElements +{ + Q_OBJECT + +public: + explicit BlockedElementsWidget(QObject *manager, QWidget *parent = 0); + + void setBlockedElements(const QStringList &); + void setHidedElements(int); + +private Q_SLOTS: + void unblockElement(); + +private: + QObject *_manager; +}; + +#endif // BLOCKED_ELEMENTS_WIDGET_H diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index e954e7d3..a14f11f0 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -213,6 +213,9 @@ MainWindow::MainWindow() // Save session on window closing connect(this, SIGNAL(windowClosing()), rApp->sessionManager(), SLOT(saveSession())); + // Adblock Manager changed rules. Reload current page + connect(rApp->adblockManager(), SIGNAL(reloadCurrentPage()), m_view, SLOT(webReload())); + // setting up toolbars to NOT have context menu enabled setContextMenuPolicy(Qt::DefaultContextMenu); diff --git a/src/urlbar/urlbar.cpp b/src/urlbar/urlbar.cpp index 9ef51f47..8f5a10a3 100644 --- a/src/urlbar/urlbar.cpp +++ b/src/urlbar/urlbar.cpp @@ -405,7 +405,7 @@ void UrlBar::loadFinished() if (_tab->hasAdBlockedElements()) { IconButton *bt = addRightIcon(UrlBar::AdBlock); - connect(bt, SIGNAL(clicked(QPoint)), (QObject *) rApp->adblockManager(), SLOT(showBlockedItems())); + connect(bt, SIGNAL(clicked(QPoint)), (QObject *) rApp->adblockManager(), SLOT(showBlockedItemDialog())); } // we need to update urlbar after the right icon settings diff --git a/src/webpage.cpp b/src/webpage.cpp index 7ae7420d..2f4b5efc 100644 --- a/src/webpage.cpp +++ b/src/webpage.cpp @@ -445,6 +445,7 @@ void WebPage::handleUnsupportedContent(QNetworkReply *reply) void WebPage::loadStarted() { _hasAdBlockedElements = false; + rApp->adblockManager()->clearElementsLists(); } -- cgit v1.2.1