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

messageviewer

  • sources
  • kde-4.12
  • kdepim
  • messageviewer
  • adblock
adblockblockableitemswidget.cpp
Go to the documentation of this file.
1 /*
2  Copyright (c) 2013 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 
23 #include <KLocale>
24 #include <KTreeWidgetSearchLine>
25 #include <KMenu>
26 #include <KConfigGroup>
27 #include <KStandardDirs>
28 #include <KRun>
29 
30 #include <QHeaderView>
31 #include <QTreeWidget>
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 
41 using namespace MessageViewer;
42 
43 AdBlockBlockableItemsWidget::AdBlockBlockableItemsWidget(QWidget *parent)
44  : QWidget(parent)
45 {
46  QVBoxLayout *lay = new QVBoxLayout;
47  setLayout(lay);
48  mListItems = new QTreeWidget;
49 
50  mListItems->setContextMenuPolicy(Qt::CustomContextMenu);
51  mListItems->setAlternatingRowColors(true);
52  mListItems->setRootIsDecorated(false);
53  connect(mListItems, SIGNAL(customContextMenuRequested(QPoint)),
54  this, SLOT(customContextMenuRequested(QPoint)));
55 
56  QStringList lst;
57  lst << i18n("Filter") << i18n("Address") << i18n("Type");
58  mListItems->setHeaderLabels(lst);
59 
60  KTreeWidgetSearchLine *searchLine = new KTreeWidgetSearchLine(this, mListItems);
61  searchLine->setPlaceholderText(i18n("Search..."));
62 
63  lay->addWidget(searchLine);
64  lay->addWidget(mListItems);
65 
66  KConfigGroup config( MessageViewer::GlobalSettings::self()->config(),"AdBlockHeaders");
67  mListItems->header()->restoreState(config.readEntry("HeaderState",QByteArray()));
68 }
69 
70 AdBlockBlockableItemsWidget::~AdBlockBlockableItemsWidget()
71 {
72  KConfigGroup groupHeader( MessageViewer::GlobalSettings::self()->config(),"AdBlockHeaders" );
73  groupHeader.writeEntry( "HeaderState", mListItems->header()->saveState());
74  groupHeader.sync();
75 }
76 
77 void AdBlockBlockableItemsWidget::setWebFrame(QWebFrame *frame)
78 {
79  mListItems->clear();
80  searchBlockableElement(frame);
81 }
82 
83 QString AdBlockBlockableItemsWidget::elementTypeToI18n(AdBlockBlockableItemsWidget::TypeElement type)
84 {
85  QString result;
86  switch(type) {
87  case AdBlockBlockableItemsWidget::Image:
88  result = i18n("Image");
89  break;
90  case AdBlockBlockableItemsWidget::Script:
91  result = i18n("Script");
92  break;
93  case AdBlockBlockableItemsWidget::StyleSheet:
94  result = i18n("Stylesheet");
95  break;
96  case AdBlockBlockableItemsWidget::Font:
97  result = i18n("Font");
98  break;
99  case AdBlockBlockableItemsWidget::Frame:
100  result = i18n("Frame");
101  break;
102  case AdBlockBlockableItemsWidget::XmlRequest:
103  result = i18n("XML Request");
104  break;
105  case AdBlockBlockableItemsWidget::Object:
106  result = i18n("Object");
107  break;
108  case AdBlockBlockableItemsWidget::Media:
109  result = i18n("Audio/Video");
110  break;
111  case AdBlockBlockableItemsWidget::Popup:
112  result = i18n("Popup window");
113  break;
114  case AdBlockBlockableItemsWidget::None:
115  default:
116  result = i18n("Unknown");
117  }
118  return result;
119 }
120 
121 QString AdBlockBlockableItemsWidget::elementType(AdBlockBlockableItemsWidget::TypeElement type)
122 {
123  QString result;
124  switch(type) {
125  case AdBlockBlockableItemsWidget::Image:
126  result = QLatin1String("image");
127  break;
128  case AdBlockBlockableItemsWidget::Script:
129  result = QLatin1String("script");
130  break;
131  case AdBlockBlockableItemsWidget::StyleSheet:
132  result = QLatin1String("stylesheet");
133  break;
134  case AdBlockBlockableItemsWidget::Font:
135  result = QLatin1String("font");
136  break;
137  case AdBlockBlockableItemsWidget::Frame:
138  result = QLatin1String("frame");
139  break;
140  case AdBlockBlockableItemsWidget::XmlRequest:
141  result = QLatin1String("xmlhttprequest");
142  break;
143  case AdBlockBlockableItemsWidget::Object:
144  result = QLatin1String("other");
145  break;
146  case AdBlockBlockableItemsWidget::Media:
147  result = QLatin1String("media");
148  break;
149  case AdBlockBlockableItemsWidget::Popup:
150  result = QLatin1String("popup");
151  break;
152  case AdBlockBlockableItemsWidget::None:
153  default:
154  qDebug()<<" unknown type "<<type;
155  }
156  return result;
157 }
158 
159 void AdBlockBlockableItemsWidget::adaptSrc(QString &src,const QString &hostName)
160 {
161  if (src.startsWith(QLatin1String("http://")) || src.startsWith(QLatin1String("https://")) ) {
162  //Nothing
163  } else if (src.startsWith(QLatin1String("//"))) {
164  src = QLatin1String("https:") + src;
165  } else if (src.startsWith(QLatin1Char('/'))){
166  src = QLatin1String("https://") + hostName + src;
167  } else {
168  src = QString();
169  }
170 }
171 
172 void AdBlockBlockableItemsWidget::searchBlockableElement(QWebFrame *frame)
173 {
174  const QUrl url = frame->requestedUrl();
175  const QString host = url.host();
176  const QWebElementCollection images = frame->findAllElements(QLatin1String("img"));
177  Q_FOREACH (const QWebElement &img, images) {
178  if (img.hasAttribute(QLatin1String("src"))) {
179  QString src = img.attribute(QLatin1String("src"));
180  if (src.isEmpty())
181  continue;
182  adaptSrc(src, host);
183  if (src.isEmpty())
184  continue;
185  QTreeWidgetItem *item = new QTreeWidgetItem(mListItems);
186  item->setText(Url, src);
187  item->setText(Type, elementTypeToI18n(AdBlockBlockableItemsWidget::Image));
188  item->setTextColor(FilterValue, Qt::red);
189  item->setData(Type, Element, Image);
190  }
191  }
192  const QWebElementCollection scripts = frame->findAllElements(QLatin1String("script"));
193  Q_FOREACH (const QWebElement &script, scripts) {
194  QString src = script.attribute(QLatin1String("src"));
195  if (src.isEmpty())
196  continue;
197  adaptSrc(src, host);
198  if (src.isEmpty())
199  continue;
200  QTreeWidgetItem *item = new QTreeWidgetItem(mListItems);
201  item->setText(Url, src);
202  item->setText(Type, elementTypeToI18n(AdBlockBlockableItemsWidget::Script));
203  item->setTextColor(FilterValue, Qt::red);
204  item->setData(Type, Element, Script);
205  }
206  foreach(QWebFrame *childFrame, frame->childFrames()) {
207  searchBlockableElement(childFrame);
208  }
209 }
210 
211 void AdBlockBlockableItemsWidget::customContextMenuRequested(const QPoint &)
212 {
213  QTreeWidgetItem *item = mListItems->currentItem();
214  if (!item)
215  return;
216 
217  KMenu menu;
218  menu.addAction(i18n("Copy url"),this,SLOT(slotCopyItem()));
219  if (!item->text(FilterValue).isEmpty())
220  menu.addAction(i18n("Copy filter"),this,SLOT(slotCopyFilterItem()));
221  menu.addAction(i18n("Block item..."),this,SLOT(slotBlockItem()));
222  menu.addSeparator();
223  menu.addAction(i18n("Open"), this, SLOT(slotOpenItem()));
224  if (!item->text(FilterValue).isEmpty()) {
225  menu.addSeparator();
226  menu.addAction(i18n("Remove filter"),this,SLOT(slotRemoveFilter()));
227  }
228  menu.exec(QCursor::pos());
229 }
230 
231 void AdBlockBlockableItemsWidget::slotCopyFilterItem()
232 {
233  QTreeWidgetItem *item = mListItems->currentItem();
234  if (!item)
235  return;
236  QClipboard *cb = QApplication::clipboard();
237  cb->setText(item->text(FilterValue), QClipboard::Clipboard);
238 }
239 
240 void AdBlockBlockableItemsWidget::slotOpenItem()
241 {
242  QTreeWidgetItem *item = mListItems->currentItem();
243  if (!item)
244  return;
245  const KUrl url(item->text(Url));
246  KRun *runner = new KRun( url, this ); // will delete itself
247  runner->setRunExecutables( false );
248 }
249 
250 void AdBlockBlockableItemsWidget::slotBlockItem()
251 {
252  QTreeWidgetItem *item = mListItems->currentItem();
253  if (!item)
254  return;
255 
256  QPointer<AdBlockCreateFilterDialog> dlg = new AdBlockCreateFilterDialog(this);
257  dlg->setPattern(static_cast<TypeElement>(item->data(Type, Element).toInt()), item->text(Url));
258  if (dlg->exec()) {
259  const QString filter = dlg->filter();
260  item->setText(FilterValue, filter);
261  }
262  delete dlg;
263 }
264 
265 void AdBlockBlockableItemsWidget::slotCopyItem()
266 {
267  QTreeWidgetItem *item = mListItems->currentItem();
268  if (!item)
269  return;
270  QClipboard *cb = QApplication::clipboard();
271  cb->setText(item->text(Url), QClipboard::Clipboard);
272 }
273 
274 void AdBlockBlockableItemsWidget::saveFilters()
275 {
276  const int numberOfElement(mListItems->topLevelItemCount());
277  QString filters;
278  for (int i = 0; i < numberOfElement; ++i) {
279  QTreeWidgetItem *item = mListItems->topLevelItem(i);
280  if (!item->text(FilterValue).isEmpty()) {
281  if (filters.isEmpty()) {
282  filters = item->text(FilterValue);
283  } else {
284  filters += QLatin1Char('\n') + item->text(FilterValue);
285  }
286  }
287  }
288 
289  if (filters.isEmpty())
290  return;
291 
292  const QString localRulesFilePath = KStandardDirs::locateLocal("appdata" , QLatin1String("adblockrules_local"));
293 
294  QFile ruleFile(localRulesFilePath);
295  if (!ruleFile.open(QFile::WriteOnly | QFile::Text)) {
296  kDebug() << "Unable to open rule file" << localRulesFilePath;
297  return;
298  }
299 
300  QTextStream out(&ruleFile);
301  out << filters;
302 
303  AdBlockManager::self()->reloadConfig();
304 }
305 
306 void AdBlockBlockableItemsWidget::slotRemoveFilter()
307 {
308  QTreeWidgetItem *item = mListItems->currentItem();
309  if (!item)
310  return;
311  item->setText(FilterValue, QString());
312 }
313 
314 #include "adblockblockableitemswidget.moc"
adblockblockableitemswidget.h
globalsettings.h
MessageViewer::AdBlockBlockableItemsWidget::Media
Definition: adblockblockableitemswidget.h:40
MessageViewer::AdBlockBlockableItemsWidget::setWebFrame
void setWebFrame(QWebFrame *frame)
Definition: adblockblockableitemswidget.cpp:77
QWidget
MessageViewer::AdBlockBlockableItemsWidget::saveFilters
void saveFilters()
Definition: adblockblockableitemswidget.cpp:274
MessageViewer::AdBlockBlockableItemsWidget::TypeElement
TypeElement
Definition: adblockblockableitemswidget.h:31
MessageViewer::AdBlockBlockableItemsWidget::elementTypeToI18n
static QString elementTypeToI18n(AdBlockBlockableItemsWidget::TypeElement type)
Definition: adblockblockableitemswidget.cpp:83
MessageViewer::AdBlockBlockableItemsWidget::StyleSheet
Definition: adblockblockableitemswidget.h:35
MessageViewer::AdBlockBlockableItemsWidget::Script
Definition: adblockblockableitemswidget.h:34
adblockmanager.h
MessageViewer::AdBlockBlockableItemsWidget::None
Definition: adblockblockableitemswidget.h:32
MessageViewer::AdBlockBlockableItemsWidget::AdBlockBlockableItemsWidget
AdBlockBlockableItemsWidget(QWidget *parent=0)
Definition: adblockblockableitemswidget.cpp:43
MessageViewer::AdBlockBlockableItemsWidget::Object
Definition: adblockblockableitemswidget.h:39
MessageViewer::GlobalSettings::self
static GlobalSettings * self()
Definition: globalsettings.cpp:34
MessageViewer::AdBlockBlockableItemsWidget::Frame
Definition: adblockblockableitemswidget.h:37
adblockcreatefilterdialog.h
MessageViewer::AdBlockBlockableItemsWidget::XmlRequest
Definition: adblockblockableitemswidget.h:38
MessageViewer::AdBlockManager::reloadConfig
void reloadConfig()
Definition: adblockmanager.cpp:94
MessageViewer::AdBlockManager::self
static AdBlockManager * self()
Entry point.
Definition: adblockmanager.cpp:55
type
const char * type
Definition: bodypartformatter.cpp:192
MessageViewer::AdBlockBlockableItemsWidget::Font
Definition: adblockblockableitemswidget.h:36
MessageViewer::AdBlockBlockableItemsWidget::Popup
Definition: adblockblockableitemswidget.h:41
MessageViewer::AdBlockBlockableItemsWidget::Image
Definition: adblockblockableitemswidget.h:33
MessageViewer::AdBlockBlockableItemsWidget::elementType
static QString elementType(AdBlockBlockableItemsWidget::TypeElement type)
Definition: adblockblockableitemswidget.cpp:121
MessageViewer::AdBlockBlockableItemsWidget::~AdBlockBlockableItemsWidget
~AdBlockBlockableItemsWidget()
Definition: adblockblockableitemswidget.cpp:70
MessageViewer::AdBlockCreateFilterDialog
Definition: adblockcreatefilterdialog.h:28
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:55:57 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

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