• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdepim API Reference
  • KDE Home
  • Contact Us
 

messageviewer

  • sources
  • kde-4.14
  • kdepim
  • messageviewer
  • adblock
adblockblockableitemswidget.cpp
Go to the documentation of this file.
1 /*
2  Copyright (c) 2013-2015 Montel Laurent <montel@kde.org>
3 
4  This program is free software; you can redistribute it and/or modify it
5  under the terms of the GNU General Public License, version 2, as
6  published by the Free Software Foundation.
7 
8  This program is distributed in the hope that it will be useful, but
9  WITHOUT ANY WARRANTY; without even the implied warranty of
10  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11  General Public License for more details.
12 
13  You should have received a copy of the GNU General Public License along
14  with this program; if not, write to the Free Software Foundation, Inc.,
15  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16 */
17 
18 #include "adblockblockableitemswidget.h"
19 #include "adblockcreatefilterdialog.h"
20 #include "settings/globalsettings.h"
21 #include "adblock/adblockmanager.h"
22 #include "pimcommon/widgets/customtreeview.h"
23 
24 #include <KLocalizedString>
25 #include <KTreeWidgetSearchLine>
26 #include <KMenu>
27 #include <KConfigGroup>
28 #include <KStandardDirs>
29 #include <KRun>
30 
31 #include <QHeaderView>
32 #include <QVBoxLayout>
33 #include <QWebFrame>
34 #include <QWebElement>
35 #include <QDebug>
36 #include <QPointer>
37 #include <QClipboard>
38 #include <QApplication>
39 #include <QFile>
40 #include <QPainter>
41 
42 using namespace MessageViewer;
43 
44 AdBlockBlockableItemsWidget::AdBlockBlockableItemsWidget(QWidget *parent)
45  : QWidget(parent)
46 {
47  QVBoxLayout *lay = new QVBoxLayout;
48  setLayout(lay);
49  mListItems = new PimCommon::CustomTreeView;
50  mListItems->setDefaultText(i18n("No blockable element found."));
51 
52  mListItems->setContextMenuPolicy(Qt::CustomContextMenu);
53  mListItems->setAlternatingRowColors(true);
54  mListItems->setRootIsDecorated(false);
55  connect(mListItems, SIGNAL(customContextMenuRequested(QPoint)),
56  this, SLOT(customContextMenuRequested(QPoint)));
57 
58  QStringList lst;
59  lst << i18n("Filter") << i18n("Address") << i18n("Type");
60  mListItems->setHeaderLabels(lst);
61 
62  KTreeWidgetSearchLine *searchLine = new KTreeWidgetSearchLine(this, mListItems);
63  searchLine->setTrapReturnKey(true);
64  searchLine->setPlaceholderText(i18n("Search..."));
65 
66  lay->addWidget(searchLine);
67  lay->addWidget(mListItems);
68 
69  KConfigGroup config( MessageViewer::GlobalSettings::self()->config(),"AdBlockHeaders");
70  mListItems->header()->restoreState(config.readEntry("HeaderState",QByteArray()));
71 }
72 
73 AdBlockBlockableItemsWidget::~AdBlockBlockableItemsWidget()
74 {
75  KConfigGroup groupHeader( MessageViewer::GlobalSettings::self()->config(),"AdBlockHeaders" );
76  groupHeader.writeEntry( "HeaderState", mListItems->header()->saveState());
77  groupHeader.sync();
78 }
79 
80 void AdBlockBlockableItemsWidget::setWebFrame(QWebFrame *frame)
81 {
82  mListItems->clear();
83  searchBlockableElement(frame);
84 }
85 
86 QString AdBlockBlockableItemsWidget::elementTypeToI18n(AdBlockBlockableItemsWidget::TypeElement type)
87 {
88  QString result;
89  switch(type) {
90  case AdBlockBlockableItemsWidget::Image:
91  result = i18n("Image");
92  break;
93  case AdBlockBlockableItemsWidget::Script:
94  result = i18n("Script");
95  break;
96  case AdBlockBlockableItemsWidget::StyleSheet:
97  result = i18n("Stylesheet");
98  break;
99  case AdBlockBlockableItemsWidget::Font:
100  result = i18n("Font");
101  break;
102  case AdBlockBlockableItemsWidget::Frame:
103  result = i18n("Frame");
104  break;
105  case AdBlockBlockableItemsWidget::XmlRequest:
106  result = i18n("XML Request");
107  break;
108  case AdBlockBlockableItemsWidget::Object:
109  result = i18n("Object");
110  break;
111  case AdBlockBlockableItemsWidget::Media:
112  result = i18n("Audio/Video");
113  break;
114  case AdBlockBlockableItemsWidget::Popup:
115  result = i18n("Popup window");
116  break;
117  case AdBlockBlockableItemsWidget::None:
118  default:
119  result = i18n("Unknown");
120  }
121  return result;
122 }
123 
124 QString AdBlockBlockableItemsWidget::elementType(AdBlockBlockableItemsWidget::TypeElement type)
125 {
126  QString result;
127  switch(type) {
128  case AdBlockBlockableItemsWidget::Image:
129  result = QLatin1String("image");
130  break;
131  case AdBlockBlockableItemsWidget::Script:
132  result = QLatin1String("script");
133  break;
134  case AdBlockBlockableItemsWidget::StyleSheet:
135  result = QLatin1String("stylesheet");
136  break;
137  case AdBlockBlockableItemsWidget::Font:
138  result = QLatin1String("font");
139  break;
140  case AdBlockBlockableItemsWidget::Frame:
141  result = QLatin1String("frame");
142  break;
143  case AdBlockBlockableItemsWidget::XmlRequest:
144  result = QLatin1String("xmlhttprequest");
145  break;
146  case AdBlockBlockableItemsWidget::Object:
147  result = QLatin1String("other");
148  break;
149  case AdBlockBlockableItemsWidget::Media:
150  result = QLatin1String("media");
151  break;
152  case AdBlockBlockableItemsWidget::Popup:
153  result = QLatin1String("popup");
154  break;
155  case AdBlockBlockableItemsWidget::None:
156  default:
157  qDebug()<<" unknown type "<<type;
158  }
159  return result;
160 }
161 
162 void AdBlockBlockableItemsWidget::adaptSrc(QString &src,const QString &hostName)
163 {
164  if (src.startsWith(QLatin1String("http://")) || src.startsWith(QLatin1String("https://")) ) {
165  //Nothing
166  } else if (src.startsWith(QLatin1String("//"))) {
167  src = QLatin1String("https:") + src;
168  } else if (src.startsWith(QLatin1Char('/'))){
169  src = QLatin1String("https://") + hostName + src;
170  } else {
171  src = QString();
172  }
173 }
174 
175 void AdBlockBlockableItemsWidget::searchBlockableElement(QWebFrame *frame)
176 {
177  const QUrl url = frame->requestedUrl();
178  const QString host = url.host();
179  const QWebElementCollection images = frame->findAllElements(QLatin1String("img"));
180  Q_FOREACH (const QWebElement &img, images) {
181  if (img.hasAttribute(QLatin1String("src"))) {
182  QString src = img.attribute(QLatin1String("src"));
183  if (src.isEmpty())
184  continue;
185  adaptSrc(src, host);
186  if (src.isEmpty())
187  continue;
188  QTreeWidgetItem *item = new QTreeWidgetItem(mListItems);
189  item->setText(Url, src);
190  item->setText(Type, elementTypeToI18n(AdBlockBlockableItemsWidget::Image));
191  item->setTextColor(FilterValue, Qt::red);
192  item->setData(Type, Element, Image);
193  }
194  }
195  const QWebElementCollection scripts = frame->findAllElements(QLatin1String("script"));
196  Q_FOREACH (const QWebElement &script, scripts) {
197  QString src = script.attribute(QLatin1String("src"));
198  if (src.isEmpty())
199  continue;
200  adaptSrc(src, host);
201  if (src.isEmpty())
202  continue;
203  QTreeWidgetItem *item = new QTreeWidgetItem(mListItems);
204  item->setText(Url, src);
205  item->setText(Type, elementTypeToI18n(AdBlockBlockableItemsWidget::Script));
206  item->setTextColor(FilterValue, Qt::red);
207  item->setData(Type, Element, Script);
208  }
209  foreach(QWebFrame *childFrame, frame->childFrames()) {
210  searchBlockableElement(childFrame);
211  }
212 }
213 
214 void AdBlockBlockableItemsWidget::customContextMenuRequested(const QPoint &)
215 {
216  QTreeWidgetItem *item = mListItems->currentItem();
217  if (!item)
218  return;
219 
220  KMenu menu;
221  menu.addAction(i18n("Copy url"),this,SLOT(slotCopyItem()));
222  if (!item->text(FilterValue).isEmpty())
223  menu.addAction(i18n("Copy filter"),this,SLOT(slotCopyFilterItem()));
224  menu.addAction(i18n("Block item..."),this,SLOT(slotBlockItem()));
225  menu.addSeparator();
226  menu.addAction(i18n("Open"), this, SLOT(slotOpenItem()));
227  if (!item->text(FilterValue).isEmpty()) {
228  menu.addSeparator();
229  menu.addAction(i18n("Remove filter"),this,SLOT(slotRemoveFilter()));
230  }
231  menu.exec(QCursor::pos());
232 }
233 
234 void AdBlockBlockableItemsWidget::slotCopyFilterItem()
235 {
236  QTreeWidgetItem *item = mListItems->currentItem();
237  if (!item)
238  return;
239  QClipboard *cb = QApplication::clipboard();
240  cb->setText(item->text(FilterValue), QClipboard::Clipboard);
241 }
242 
243 void AdBlockBlockableItemsWidget::slotOpenItem()
244 {
245  QTreeWidgetItem *item = mListItems->currentItem();
246  if (!item)
247  return;
248  const KUrl url(item->text(Url));
249  KRun *runner = new KRun( url, this ); // will delete itself
250  runner->setRunExecutables( false );
251 }
252 
253 void AdBlockBlockableItemsWidget::slotBlockItem()
254 {
255  QTreeWidgetItem *item = mListItems->currentItem();
256  if (!item)
257  return;
258 
259  QPointer<AdBlockCreateFilterDialog> dlg = new AdBlockCreateFilterDialog(this);
260  dlg->setPattern(static_cast<TypeElement>(item->data(Type, Element).toInt()), item->text(Url));
261  if (dlg->exec()) {
262  const QString filter = dlg->filter();
263  item->setText(FilterValue, filter);
264  }
265  delete dlg;
266 }
267 
268 void AdBlockBlockableItemsWidget::slotCopyItem()
269 {
270  QTreeWidgetItem *item = mListItems->currentItem();
271  if (!item)
272  return;
273  QClipboard *cb = QApplication::clipboard();
274  cb->setText(item->text(Url), QClipboard::Clipboard);
275 }
276 
277 void AdBlockBlockableItemsWidget::saveFilters()
278 {
279  const int numberOfElement(mListItems->topLevelItemCount());
280  QString filters;
281  for (int i = 0; i < numberOfElement; ++i) {
282  QTreeWidgetItem *item = mListItems->topLevelItem(i);
283  if (!item->text(FilterValue).isEmpty()) {
284  if (filters.isEmpty()) {
285  filters = item->text(FilterValue);
286  } else {
287  filters += QLatin1Char('\n') + item->text(FilterValue);
288  }
289  }
290  }
291 
292  if (filters.isEmpty())
293  return;
294 
295  const QString localRulesFilePath = KStandardDirs::locateLocal("appdata" , QLatin1String("adblockrules_local"));
296 
297  QFile ruleFile(localRulesFilePath);
298  if (!ruleFile.open(QFile::WriteOnly | QFile::Text)) {
299  kDebug() << "Unable to open rule file" << localRulesFilePath;
300  return;
301  }
302 
303  QTextStream out(&ruleFile);
304  out << filters;
305 
306  AdBlockManager::self()->reloadConfig();
307 }
308 
309 void AdBlockBlockableItemsWidget::slotRemoveFilter()
310 {
311  QTreeWidgetItem *item = mListItems->currentItem();
312  if (!item)
313  return;
314  item->setText(FilterValue, QString());
315 }
316 
adblockblockableitemswidget.h
globalsettings.h
QWidget
QTreeWidgetItem::setTextColor
void setTextColor(int column, const QColor &color)
QWebFrame
QByteArray
MessageViewer::AdBlockBlockableItemsWidget::Media
Definition: adblockblockableitemswidget.h:42
MessageViewer::AdBlockBlockableItemsWidget::setWebFrame
void setWebFrame(QWebFrame *frame)
Definition: adblockblockableitemswidget.cpp:80
QUrl::host
QString host() const
QPointer
MessageViewer::AdBlockBlockableItemsWidget::saveFilters
void saveFilters()
Definition: adblockblockableitemswidget.cpp:277
QTreeWidgetItem::setData
virtual void setData(int column, int role, const QVariant &value)
MessageViewer::AdBlockBlockableItemsWidget::TypeElement
TypeElement
Definition: adblockblockableitemswidget.h:33
QPoint
QTreeWidgetItem::data
virtual QVariant data(int column, int role) const
MessageViewer::AdBlockBlockableItemsWidget::elementTypeToI18n
static QString elementTypeToI18n(AdBlockBlockableItemsWidget::TypeElement type)
Definition: adblockblockableitemswidget.cpp:86
MessageViewer::AdBlockBlockableItemsWidget::StyleSheet
Definition: adblockblockableitemswidget.h:37
QFile
MessageViewer::AdBlockBlockableItemsWidget::Script
Definition: adblockblockableitemswidget.h:36
QTextStream
adblockmanager.h
MessageViewer::AdBlockBlockableItemsWidget::None
Definition: adblockblockableitemswidget.h:34
QClipboard
MessageViewer::AdBlockBlockableItemsWidget::AdBlockBlockableItemsWidget
AdBlockBlockableItemsWidget(QWidget *parent=0)
Definition: adblockblockableitemswidget.cpp:44
QWebElement::hasAttribute
bool hasAttribute(const QString &name) const
QBoxLayout::addWidget
void addWidget(QWidget *widget, int stretch, QFlags< Qt::AlignmentFlag > alignment)
QWidget::setLayout
void setLayout(QLayout *layout)
QVariant::toInt
int toInt(bool *ok) const
QApplication::clipboard
QClipboard * clipboard()
MessageViewer::AdBlockBlockableItemsWidget::Object
Definition: adblockblockableitemswidget.h:41
QWebElement
QString::isEmpty
bool isEmpty() const
MessageViewer::GlobalSettings::self
static GlobalSettings * self()
Definition: globalsettings.cpp:34
QString::startsWith
bool startsWith(const QString &s, Qt::CaseSensitivity cs) const
MessageViewer::AdBlockBlockableItemsWidget::Frame
Definition: adblockblockableitemswidget.h:39
adblockcreatefilterdialog.h
QWebFrame::requestedUrl
requestedUrl
QWebFrame::findAllElements
QWebElementCollection findAllElements(const QString &selectorQuery) const
QVBoxLayout
QString
QFile::open
virtual bool open(QFlags< QIODevice::OpenModeFlag > mode)
QStringList
MessageViewer::AdBlockBlockableItemsWidget::XmlRequest
Definition: adblockblockableitemswidget.h:40
QWebElement::attribute
QString attribute(const QString &name, const QString &defaultValue) const
QUrl
QLatin1Char
MessageViewer::AdBlockManager::reloadConfig
void reloadConfig()
Definition: adblockmanager.cpp:94
QWebFrame::childFrames
QList< QWebFrame * > childFrames() const
MessageViewer::AdBlockManager::self
static AdBlockManager * self()
Entry point.
Definition: adblockmanager.cpp:56
type
const char * type
Definition: bodypartformatter.cpp:192
MessageViewer::AdBlockBlockableItemsWidget::Font
Definition: adblockblockableitemswidget.h:38
QCursor::pos
QPoint pos()
QTreeWidgetItem
QLatin1String
MessageViewer::AdBlockBlockableItemsWidget::Popup
Definition: adblockblockableitemswidget.h:43
MessageViewer::AdBlockBlockableItemsWidget::Image
Definition: adblockblockableitemswidget.h:35
QTreeWidgetItem::setText
void setText(int column, const QString &text)
QClipboard::setText
void setText(const QString &text, Mode mode)
QtConcurrent::filter
QFuture< void > filter(Sequence &sequence, FilterFunction filterFunction)
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QTreeWidgetItem::text
QString text(int column) const
MessageViewer::AdBlockBlockableItemsWidget::elementType
static QString elementType(AdBlockBlockableItemsWidget::TypeElement type)
Definition: adblockblockableitemswidget.cpp:124
MessageViewer::AdBlockBlockableItemsWidget::~AdBlockBlockableItemsWidget
~AdBlockBlockableItemsWidget()
Definition: adblockblockableitemswidget.cpp:73
QWebElementCollection
MessageViewer::AdBlockCreateFilterDialog
Definition: adblockcreatefilterdialog.h:28
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:32:45 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

messageviewer

Skip menu "messageviewer"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer
  • pimprint

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal