[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kfm-devel
Subject:    Konqueror AdBlocK v6
From:       Ivor Hewitt <ivor () ivor ! org>
Date:       2005-05-06 0:11:25
Message-ID: 200505060111.26137.ivor () ivor ! org
[Download RAW message or body]

Current diff against SVN.
Includes import and export filters, and the addFilter now explicitly goes to 
khtmlrc.

Any objections/comments to this going in in its current form?

Many thanks,

-- 
Ivor Hewitt.
http://www.ivor.it - tech | http://www.ivor.org - hedge

["kdebase.diff" (text/x-diff)]

Index: kdebase/kcontrol/konqhtml/khtml_filter.desktop
===================================================================
--- kdebase/kcontrol/konqhtml/khtml_filter.desktop	(revision 0)
+++ kdebase/kcontrol/konqhtml/khtml_filter.desktop	(revision 0)
@@ -0,0 +1,15 @@
+[Desktop Entry]
+Encoding=UTF-8
+Type=Application
+DocPath=kcontrol/khtml/index.html#khtml-adblock
+Icon=filter
+Exec=kcmshell khtml_filter
+
+X-KDE-Library=konqhtml
+X-KDE-FactoryName=khtml_filter
+
+Name=AdBlocK filters
+
+Comment=Configure Konqueror AdBlocK filters
+
+Categories=Qt;KDE;X-KDE-settings-webbrowsing;
Index: kdebase/kcontrol/konqhtml/main.cpp
===================================================================
--- kdebase/kcontrol/konqhtml/main.cpp	(revision 409908)
+++ kdebase/kcontrol/konqhtml/main.cpp	(working copy)
@@ -35,6 +35,7 @@
 #include "pluginopts.h"
 #include "appearance.h"
 #include "htmlopts.h"
+#include "filteropts.h"
 
 #include "main.h"
 #include <kaboutdata.h>
@@ -66,7 +67,11 @@
 		return new KPluginOptions(c, "Java/JavaScript Settings", parent, name);
 	}
 
-
+        KDE_EXPORT KCModule *create_khtml_filter(QWidget *parent, const char *name )
+        {
+	    KConfig *c = new KConfig( "khtmlrc", false, false );
+            return new KCMFilter(c, "Filter Settings", parent, name);
+        }
 }
 
 
Index: kdebase/kcontrol/konqhtml/filteropts.h
===================================================================
--- kdebase/kcontrol/konqhtml/filteropts.h	(revision 0)
+++ kdebase/kcontrol/konqhtml/filteropts.h	(revision 0)
@@ -0,0 +1,72 @@
+/*
+  Copyright (C) 2005 Ivor Hewitt <ivor@ivor.org>
+
+  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) any later version.
+
+  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, write to the Free Software
+  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+*/
+#ifndef FILTEROPTS_H
+#define FILTEROPTS_H
+
+#include <kcmodule.h>
+
+class QListBox;
+class QPushButton;
+class QLineEdit;
+class QListBoxItem;
+class QCheckBox;
+
+class KConfig;
+
+class KCMFilter : public KCModule
+{
+    Q_OBJECT
+public:
+    KCMFilter( KConfig* config, QString group, QWidget* parent = 0, const char* name \
= 0 ); +    ~KCMFilter();
+    
+    void load();
+    void save();
+    void defaults();
+    QString quickHelp() const;
+    
+public slots:
+
+protected slots:
+    void insertFilter();
+    void updateFilter();
+    void removeFilter();
+    void slotItemSelected( QListBoxItem * item );
+    void slotEnableChecked();
+    void slotKillChecked();
+
+    void exportFilters();
+    void importFilters();
+
+private:
+    void updateButton();
+    QListBox *mListBox;
+    QLineEdit *mString;
+    QCheckBox *mEnableCheck;
+    QCheckBox *mKillCheck;
+    QPushButton *mInsertButton;
+    QPushButton *mUpdateButton;
+    QPushButton *mRemoveButton;
+    QPushButton *mImportButton;
+    QPushButton *mExportButton;
+
+    KConfig *mConfig;
+    QString mGroupname;
+};
+
+#endif
Index: kdebase/kcontrol/konqhtml/Makefile.am
===================================================================
--- kdebase/kcontrol/konqhtml/Makefile.am	(revision 409908)
+++ kdebase/kcontrol/konqhtml/Makefile.am	(working copy)
@@ -9,12 +9,13 @@
 			     javaopts.cpp pluginopts.cpp appearance.cpp \
 			     khttpoptdlg.cpp policydlg.cpp main.cpp \
 			     jspolicies.cpp nsconfigwidget.ui policies.cpp \
-			     domainlistview.cpp advancedTabOptions.ui
+			     domainlistview.cpp advancedTabOptions.ui \
+			     filteropts.cpp
 
 kcm_konqhtml_la_LDFLAGS  = $(all_libraries) -module -avoid-version -no-undefined
 kcm_konqhtml_la_LIBADD = -lkhtml -lkdeui
 
-xdg_apps_DATA = khtml_behavior.desktop khtml_java_js.desktop khtml_fonts.desktop
+xdg_apps_DATA = khtml_behavior.desktop khtml_java_js.desktop khtml_fonts.desktop \
khtml_filter.desktop  
 messages: rc.cpp
 	$(XGETTEXT) *.cpp -o $(podir)/kcmkonqhtml.pot
Index: kdebase/kcontrol/konqhtml/filteropts.cpp
===================================================================
--- kdebase/kcontrol/konqhtml/filteropts.cpp	(revision 0)
+++ kdebase/kcontrol/konqhtml/filteropts.cpp	(revision 0)
@@ -0,0 +1,255 @@
+/*
+   Copyright (C) 2005 Ivor Hewitt <ivor@ivor.org>
+
+   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) any later version.
+
+   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, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+*/
+
+#include <kconfig.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kaboutdata.h>
+#include <kfiledialog.h>
+#include <dcopclient.h>
+
+#include <qlayout.h>
+#include <qlistbox.h>
+#include <qpushbutton.h>
+#include <qgroupbox.h>
+#include <qhbox.h>
+#include <qvbox.h>
+#include <qlineedit.h>
+#include <qlabel.h>
+#include <qcheckbox.h>
+
+#include "filteropts.h"
+#include "filteropts.moc"
+
+KCMFilter::KCMFilter(KConfig *config, QString group,
+                     QWidget *parent, const char *name )
+    : KCModule( parent, name ),
+      mConfig( config ),
+      mGroupname( group )
+{
+    setButtons(Default|Apply);
+    
+    QVBoxLayout *topLayout = new QVBoxLayout(this, 0, KDialog::spacingHint());
+
+    mEnableCheck = new QCheckBox(i18n("Enable filters"), this);
+    topLayout->addWidget( mEnableCheck );
+    
+    mKillCheck = new QCheckBox(i18n("Hide filtered images"), this);
+    topLayout->addWidget( mKillCheck );
+
+    QGroupBox *topBox = new QGroupBox( 1, Horizontal, i18n("URL expressions to \
filter"), this ); +    topLayout->addWidget( topBox );
+        
+    mListBox = new QListBox( topBox );
+    QLabel *label = new QLabel( i18n("Expression e.g. http://www.site.com/ad/*"), \
topBox); +    topLayout->addWidget(label);
+    mString = new QLineEdit( topBox );
+
+    QHBox *buttonBox = new QHBox( topBox );
+    buttonBox->setSpacing( KDialog::spacingHint() );
+
+    mInsertButton = new QPushButton( i18n("Insert"), buttonBox );
+    connect( mInsertButton, SIGNAL( clicked() ), SLOT( insertFilter() ) );
+    mUpdateButton = new QPushButton( i18n("Update"), buttonBox );
+    connect( mUpdateButton, SIGNAL( clicked() ), SLOT( updateFilter() ) );
+    mRemoveButton = new QPushButton( i18n("Remove"), buttonBox );
+    connect( mRemoveButton, SIGNAL( clicked() ), SLOT( removeFilter() ) );
+
+    mImportButton = new QPushButton(i18n("Import.."),buttonBox);
+    connect( mImportButton, SIGNAL( clicked() ), SLOT( importFilters() ) );
+    mExportButton = new QPushButton(i18n("Export.."),buttonBox);
+    connect( mExportButton, SIGNAL( clicked() ), SLOT( exportFilters() ) );
+
+    connect( mEnableCheck, SIGNAL( clicked()), this, SLOT( slotEnableChecked()));
+    connect( mKillCheck, SIGNAL( clicked()), this, SLOT( slotKillChecked()));
+    connect( mListBox, SIGNAL( selectionChanged ( QListBoxItem * )),this, SLOT( \
slotItemSelected( QListBoxItem *))); +
+    load();
+    updateButton();
+}
+
+KCMFilter::~KCMFilter()
+{
+    delete mConfig;
+}
+
+void KCMFilter::slotKillChecked()
+{
+    emit changed( true );
+}
+
+void KCMFilter::slotEnableChecked()
+{
+    updateButton();    
+    emit changed( true );
+}
+
+void KCMFilter::slotItemSelected( QListBoxItem * )
+{
+    int index = mListBox->currentItem();
+    if ( index >= 0 )
+    {
+        mString->setText(mListBox->text(index) );
+    }
+    updateButton();
+}
+
+void KCMFilter::updateButton()
+{
+    bool state = mEnableCheck->isChecked();
+    mUpdateButton->setEnabled(state && mListBox->selectedItem());
+    mRemoveButton->setEnabled(state && mListBox->selectedItem());
+    mInsertButton->setEnabled(state);
+    mListBox->setEnabled(state);
+}
+
+void KCMFilter::importFilters()
+{
+  QString inFile = KFileDialog::getOpenFileName();
+  if (inFile.length() > 0)
+  {
+    QFile f(inFile);
+    if ( f.open( IO_ReadOnly ) )
+    {
+      QTextStream ts( &f );
+      QStringList paths;
+      QString line;
+      while (!ts.atEnd())
+      {
+        line = ts.readLine();
+        if (!line.contains("[AdBlock]"))
+            paths.append(line);
+      }
+      f.close();
+
+      mListBox->insertStringList( paths );
+      emit changed(true);
+    }
+  }
+}
+
+void KCMFilter::exportFilters()
+{
+  QString outFile = KFileDialog::getSaveFileName();
+  if (outFile.length() > 0)
+  {
+    QFile f(outFile);
+    if ( f.open( IO_WriteOnly ) )
+    {
+      QTextStream ts( &f );
+      ts.setEncoding( QTextStream::UnicodeUTF8 );
+      ts << "[AdBlock]" << endl;
+    
+      uint i;
+      for( i = 0; i < mListBox->count(); ++i )
+        ts << mListBox->text(i) << endl;
+        
+      f.close(); 
+    }
+  }
+}
+
+void KCMFilter::defaults()
+{
+    mListBox->clear();
+    updateButton();
+}
+
+void KCMFilter::save()
+{
+    mConfig->deleteGroup(mGroupname);
+    mConfig->setGroup(mGroupname);
+
+    mConfig->writeEntry("Enabled",mEnableCheck->isChecked());
+    mConfig->writeEntry("Shrink",mKillCheck->isChecked());
+
+    uint i;
+    for( i = 0; i < mListBox->count(); ++i )
+    {
+        QString s = "Filter";
+        QString key = "Filter-" + QString::number(i);
+        mConfig->writeEntry(key, mListBox->text(i));
+    }
+    mConfig->writeEntry("Count",mListBox->count());
+
+    mConfig->sync();
+    DCOPClient::mainClient()->send("konqueror*","KonquerorIface","reparseConfiguration()",QByteArray());
 +
+}
+
+void KCMFilter::load()
+{
+    QStringList paths;
+
+    mConfig->setGroup( mGroupname );
+    mEnableCheck->setChecked( mConfig->readBoolEntry("Enabled",false));
+    mKillCheck->setChecked( mConfig->readBoolEntry("Shrink",false));
+    
+    QMap<QString,QString> entryMap = mConfig->entryMap( mGroupname );
+    QMap<QString,QString>::ConstIterator it;
+    int num = mConfig->readNumEntry("Count",0);
+    for (int i=0; i<num; ++i)
+    {
+        QString key = "Filter-" + QString::number(i);
+        it = entryMap.find(key);
+        if (it != entryMap.end())
+            paths.append(it.data());
+    }
+
+    mListBox->insertStringList( paths );
+}
+
+void KCMFilter::insertFilter()
+{
+    if ( !mString->text().isEmpty() )
+    {
+        mListBox->insertItem( mString->text() );
+        emit changed( true );
+    }
+    updateButton();
+}
+
+void KCMFilter::removeFilter()
+{
+    int index = mListBox->currentItem();
+    if ( index >= 0 )
+    {
+        mListBox->removeItem( index );
+        emit changed( true );
+    }
+    updateButton();
+}
+
+void KCMFilter::updateFilter()
+{
+    if ( !mString->text().isEmpty() )
+    {
+        int index = mListBox->currentItem();
+        if ( index >= 0 )
+        {
+            mListBox->changeItem( mString->text(), index );
+            emit changed( true );
+        }
+    }
+    updateButton();
+}
+
+QString KCMFilter::quickHelp() const
+{
+    return i18n("<h1>Konqueror Filter</h1>");
+}
Index: kdebase/doc/kcontrol/khtml/index.docbook
===================================================================
--- kdebase/doc/kcontrol/khtml/index.docbook	(revision 409908)
+++ kdebase/doc/kcontrol/khtml/index.docbook	(working copy)
@@ -320,6 +320,26 @@
 
 &nsplugins-kcontrol;
 
+<sect2 id="kbrowse-adblock">
+<title>AdBlocK</title>
+
+<para>&konqueror; AdBlocK can be configured to replace or remove
+images or frames from web pages that match a series of filters</para>
+
+<para>The setting <guilabel>Enable filters</guilabel> enables or
+disables the use of filters.</para>
+<para>If <guilabel>Hide filtered images</guilabel> is enabled then
+blocked images are completely removed from the page and the space they
+occupied is reclaimed. If the option is disabled then a placeholder
+image is used where images are filtered.</para>
+
+<para><guilabel>URL expressions to filter</guilabel> is a list of
+URLs that will be compared against image and frame names to decide
+on fitlering actions. The wildcards can be given as filename style
+regular expressions.</para>
+
+</sect2>
+
 </sect1>
 
 </article>
Index: kdebase/doc/kdm/kdmrc-ref.docbook
===================================================================
--- kdebase/doc/kdm/kdmrc-ref.docbook	(revision 409908)
+++ kdebase/doc/kdm/kdmrc-ref.docbook	(working copy)
@@ -1,4 +1,4 @@
-<!-- generated from /home/ossi/src/kde/head/kdebase/kdm/config.def - DO NOT EDIT! \
--> +<!-- generated from ../../kdm/config.def - DO NOT EDIT! -->
 
 <chapter id="kdm-files">
 <title>The Files &kdm; Uses for Configuration</title>
Index: kdebase/konqueror/konq_factory.cc
===================================================================
--- kdebase/konqueror/konq_factory.cc	(revision 409908)
+++ kdebase/konqueror/konq_factory.cc	(working copy)
@@ -212,7 +212,7 @@
                         KONQUEROR_VERSION,
                         I18N_NOOP("Web browser, file manager, ..."),
                         KAboutData::License_GPL,
-                        I18N_NOOP("(c) 1999-2004, The Konqueror developers"),
+                        I18N_NOOP("(c) 1999-2005, The Konqueror developers"),
                         0,
                         I18N_NOOP("http://konqueror.kde.org") );
     s_aboutData->addAuthor( "David Faure", I18N_NOOP("developer (framework, parts, \
JavaScript, I/O lib) and maintainer"), "faure@kde.org" ); @@ -248,6 +248,7 @@
     s_aboutData->addAuthor( "Torsten Rahn", I18N_NOOP("graphics/icons"), \
                "torsten@kde.org" );
     s_aboutData->addAuthor( "Torben Weis", I18N_NOOP("kfm author"), "weis@kde.org" \
                );
     s_aboutData->addAuthor( "Joseph Wenninger", I18N_NOOP("developer (navigation \
panel framework)"),"jowenn@kde.org"); +    s_aboutData->addAuthor( "Ivor Hewitt", \
I18N_NOOP("developer (AdBlock filter)"),"ivor@ivor.org");  }
   return s_aboutData;
 }
Index: kdebase/konqueror/konq_mainwindow.cc
===================================================================
--- kdebase/konqueror/konq_mainwindow.cc	(revision 409908)
+++ kdebase/konqueror/konq_mainwindow.cc	(working copy)
@@ -3688,6 +3688,7 @@
   m_configureModules << "kde-filebehavior.desktop" << "kde-fileappearance.desktop" \
<<  "kde-filepreviews.desktop" << "kde-filetypes.desktop" <<
       "kde-khtml_behavior.desktop" << "kde-khtml_java_js.desktop" <<
+      "kde-khtml_filter.desktop" <<
       "kde-khtml_fonts.desktop" << "kde-ebrowsing.desktop" <<
       "kde-kcmhistory.desktop" << "kde-cookies.desktop" <<
       "kde-cache.desktop" << "kde-proxy.desktop" << "kde-kcmcss.desktop" <<


["kdelibs.diff" (text/x-diff)]

Index: kdelibs/khtml/khtml_settings.cc
===================================================================
--- kdelibs/khtml/khtml_settings.cc	(revision 409908)
+++ kdelibs/khtml/khtml_settings.cc	(working copy)
@@ -27,6 +27,7 @@
 #include <klocale.h>
 #include <kdebug.h>
 #include <qregexp.h>
+#include <qvaluevector.h>
 
 /**
  * @internal
@@ -79,6 +80,8 @@
     bool m_follow_system_colors : 1;
     bool m_allowTabulation : 1;
     bool m_autoSpellCheck : 1;
+    bool m_adFilterEnabled : 1;
+    bool m_hideAdsEnabled : 1;
 
     // the virtual global "domain"
     KPerDomainSettings global;
@@ -99,7 +102,8 @@
     PolicyMap domainPolicy;
     QStringList fonts;
     QStringList defaultFonts;
-    
+
+    QValueVector<QRegExp> adFilters;
     QValueList< QPair< QString, QChar > > m_fallbackAccessKeysAssignments;
 };
 
@@ -306,6 +310,32 @@
         d->m_bBackRightClick = config->readBoolEntry( "BackRightClick", false );
   }
 
+  if (reset || config->hasGroup("Filter Settings"))
+  {
+      config->setGroup( "Filter Settings" );
+      d->m_adFilterEnabled = config->readBoolEntry("Enabled", false);
+      d->m_hideAdsEnabled = config->readBoolEntry("Shrink", false);
+
+      d->adFilters.clear();
+
+      QMap<QString,QString> entryMap = config->entryMap("Filter Settings");
+      QMap<QString,QString>::ConstIterator it;
+      d->adFilters.reserve(entryMap.count());
+      for( it = entryMap.constBegin(); it != entryMap.constEnd(); ++it ) 
+      {
+          QString name = it.key();
+          QString value = it.data();
+
+          if (name.startsWith("Filter"))
+          {
+              QRegExp rx(value);
+              rx.setWildcard(TRUE);
+              d->adFilters.append(rx);
+          }
+      }
+  }
+
+
   if (reset || config->hasGroup("HTML Settings"))
   {
     config->setGroup( "HTML Settings" );
@@ -642,6 +672,48 @@
   return d->m_bBackRightClick;
 }
 
+bool KHTMLSettings::isAdFilterEnabled() const
+{
+    return d->m_adFilterEnabled;
+}
+
+bool KHTMLSettings::isHideAdsEnabled() const
+{
+    return d->m_hideAdsEnabled;
+}
+
+bool KHTMLSettings::isAdFiltered( const QString &url ) const
+{
+    if (d->m_adFilterEnabled)
+    {
+        QValueVector<QRegExp>::iterator it;
+        for (it=d->adFilters.begin(); it != d->adFilters.end(); ++it)
+        {
+            if ((*it).search(url) != -1)
+            {
+                kdDebug( 6080 ) << "Filtered: " << url << endl;
+                return true;
+            }
+        }        
+    }
+    return false;
+}
+void KHTMLSettings::addAdFilter( const QString &url )
+{   
+    KConfig config( "khtmlrc", false, false );
+    config.setGroup( "Filter Settings" );
+
+    int last=config.readNumEntry("Count",0);
+    QString key = "Filter-" + QString::number(last);
+    config.writeEntry(key, url);
+    config.writeEntry("Count",last+1);
+    config.sync();
+
+    QRegExp rx(url);
+    rx.setWildcard(TRUE);
+    d->adFilters.append(rx);
+}   
+
 bool KHTMLSettings::isJavaEnabled( const QString& hostname )
 {
   return lookup_hostname_policy(d,hostname.lower()).m_bEnableJava;
Index: kdelibs/khtml/khtml_settings.h
===================================================================
--- kdelibs/khtml/khtml_settings.h	(revision 409908)
+++ kdelibs/khtml/khtml_settings.h	(working copy)
@@ -168,6 +168,13 @@
     bool isJavaScriptDebugEnabled( const QString& hostname = QString::null );
     bool isJavaScriptErrorReportingEnabled( const QString& hostname = QString::null \
) const;  bool isPluginsEnabled( const QString& hostname = QString::null );
+
+    // AdBlocK Filtering
+    bool isAdFiltered( const QString &url ) const;
+    bool isAdFilterEnabled() const;
+    bool isHideAdsEnabled() const;
+    void addAdFilter( const QString &url );
+
     KJSWindowOpenPolicy windowOpenPolicy( const QString& hostname = QString::null ) \
                const;
     KJSWindowMovePolicy windowMovePolicy( const QString& hostname = QString::null ) \
                const;
     KJSWindowResizePolicy windowResizePolicy( const QString& hostname = \
                QString::null ) const;
Index: kdelibs/khtml/khtml_ext.h
===================================================================
--- kdelibs/khtml/khtml_ext.h	(revision 409908)
+++ kdelibs/khtml/khtml_ext.h	(working copy)
@@ -139,6 +139,9 @@
   void slotFrameInWindow();
   void slotFrameInTop();
   void slotFrameInTab();
+  void slotBlockImage();
+  void slotBlockHost();
+
 private:
   class KHTMLPopupGUIClientPrivate;
   KHTMLPopupGUIClientPrivate *d;
Index: kdelibs/khtml/ChangeLog
===================================================================
--- kdelibs/khtml/ChangeLog	(revision 409908)
+++ kdelibs/khtml/ChangeLog	(working copy)
@@ -1,3 +1,15 @@
+2005-05-05  Ivor Hewitt <ivor@ivor.org>
+
+        fix #15848: First implementation of AdBlocK.
+
+        * khtml_ext.{cpp,h}: Add Blockimage to context popup menu
+        * khtml_popupmenu.rc: ditto
+        * khtml_settings.{cc,h}: Add adFilter settings and helper functions
+        * html/htmlparser.cpp: Strip blocked IMG tags
+        * misc/loader.{cpp,h}: Return replacement blocked images and refuse to load \
blocked scripts. +        * misc/blocked_icon.{cpp,png}: Image for above
+        * xml/dom_docimpl.cpp: isURLAllowed returns false for blocked URL's
+
 2005-05-02  David Faure  <faure@kde.org>
 
         * ecma/kjs_html.cpp (HTMLCollectionProtoFunc::tryCall): Support for
Index: kdelibs/khtml/misc/blocked_icon.cpp
===================================================================
--- kdelibs/khtml/misc/blocked_icon.cpp	(revision 0)
+++ kdelibs/khtml/misc/blocked_icon.cpp	(revision 0)
@@ -0,0 +1,41 @@
+static const unsigned int blocked_icon_len = 599;
+
+static const unsigned char blocked_icon_data[] = {
+0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
+0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x08,0x06,0x00,0x00,0x00,0xaa,0x69,0x71,
+0xde,0x00,0x00,0x00,0x06,0x62,0x4b,0x47,0x44,0x00,0xff,0x00,0xff,0x00,0xff,0xa0,
+0xbd,0xa7,0x93,0x00,0x00,0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0b,0x13,0x00,
+0x00,0x0b,0x13,0x01,0x00,0x9a,0x9c,0x18,0x00,0x00,0x01,0xf7,0x49,0x44,0x41,0x54,
+0x78,0xda,0xed,0x9b,0xd1,0x8e,0x84,0x30,0x08,0x45,0x07,0xb2,0x3f,0x36,0x5f,0xbe,
+0x9f,0xc6,0x3e,0xb9,0x31,0xc6,0x28,0x70,0x01,0x21,0xd5,0xe7,0xc9,0x94,0x73,0x4a,
+0x5b,0xac,0x2d,0x89,0xc8,0x67,0xe5,0x87,0x3f,0x8b,0x3f,0xcb,0x0b,0xf8,0xa9,0x6c,
+0x8c,0x88,0x7e,0xb5,0xbf,0x15,0x91,0x6f,0x49,0x4c,0x99,0x73,0xc0,0x11,0xd8,0xd2,
+0x12,0x15,0x09,0x49,0x11,0xb0,0x81,0x47,0xfe,0x33,0x25,0x89,0x08,0x15,0x90,0x01,
+0x9e,0x2d,0x22,0x44,0x40,0x05,0x78,0x96,0x08,0x48,0xc0,0x13,0xe0,0xd1,0x22,0x78,
+0x32,0xfc,0xbe,0x7d,0xcb,0x0a,0x03,0x0b,0x20,0xa2,0x5f,0x69,0x00,0xbf,0x97,0x20,
+0x4e,0x09,0xe6,0x21,0xb0,0xc1,0xa3,0x29,0xab,0xe9,0x55,0xef,0xff,0x5b,0x86,0x83,
+0x49,0x80,0x17,0x9e,0x8c,0xeb,0xf9,0xbe,0x27,0x25,0x59,0x82,0x5a,0x80,0x15,0xde,
+0x0a,0x1d,0x2d,0x43,0x2b,0x41,0x25,0xc0,0x0b,0x1f,0x59,0xb4,0x78,0xb2,0x4f,0x23,
+0xe1,0x56,0x80,0x65,0xb6,0x4f,0xab,0xd6,0xc0,0xa1,0x77,0x15,0x8f,0x6a,0x15,0x98,
+0x08,0xaf,0x8d,0x9b,0x23,0x1a,0xef,0x08,0xbf,0x97,0x70,0xb5,0x3c,0xc2,0xfb,0x01,
+0x9d,0xe1,0xa1,0x42,0x48,0x13,0xc0,0x14,0xf8,0xab,0x2c,0x80,0x33,0xa0,0x03,0x3c,
+0x45,0x67,0x80,0xb6,0xf7,0xbb,0xc0,0x8b,0xc8,0x97,0x9c,0x59,0xc0,0xc8,0xb8,0xef,
+0x02,0x8f,0xc4,0xc5,0xde,0x40,0xba,0x15,0x39,0x9a,0x78,0xce,0xb2,0xe0,0xf1,0x5d,
+0xe1,0xac,0x0a,0x2f,0xed,0x75,0x38,0xb2,0xf1,0x68,0x78,0xcd,0x5c,0x10,0xbe,0x0a,
+0x4c,0xed,0xf9,0x53,0x01,0x55,0xc5,0xc7,0x93,0xf0,0xc7,0x79,0x80,0xab,0x83,0xc8,
+0x86,0xb7,0x0e,0x03,0x5e,0x31,0xed,0x1f,0x11,0xd0,0x11,0xbe,0x4c,0x40,0x57,0xf8,
+0x12,0x01,0x9d,0xe1,0xd3,0x05,0x74,0x87,0x4f,0x15,0x30,0x01,0x3e,0x4d,0xc0,0x14,
+0xf8,0x14,0x01,0x93,0xe0,0xcd,0x02,0xee,0xf6,0xd7,0x3a,0xc0,0x5b,0x63,0x60,0xf4,
+0x65,0x62,0x5a,0xcf,0x1f,0xdb,0xe4,0x15,0xd3,0x1e,0x9a,0x03,0x8e,0xc3,0xa0,0x13,
+0xbc,0x27,0x16,0x5e,0xb5,0xe7,0xff,0xe3,0x39,0xfb,0x34,0x76,0x07,0x46,0xbb,0x6c,
+0xe8,0x02,0xaf,0xf9,0x84,0x77,0xd6,0xbe,0xeb,0x9c,0x60,0xf6,0x27,0x6b,0xe4,0x5d,
+0x3f,0x64,0x0e,0x40,0x56,0x83,0x27,0xe0,0x91,0x6d,0xfc,0xfc,0x97,0xa1,0x02,0xf8,
+0x94,0x55,0x20,0x22,0x0b,0xaa,0xe0,0x91,0x8f,0x38,0x3c,0xbd,0xe7,0xd1,0x3d,0xcc,
+0x4b,0x01,0xde,0x2c,0xe8,0x04,0x7f,0x17,0x0b,0x6b,0x81,0xa6,0xc2,0xbb,0xea,0x00,
+0xb4,0xe0,0xc9,0x3a,0x23,0x64,0x4d,0xf9,0x90,0x33,0x42,0xa8,0x04,0x54,0x44,0x8b,
+0x53,0x62,0x48,0xe9,0xeb,0x91,0xd1,0xf2,0x9c,0x20,0x2a,0xc1,0x32,0x2e,0xdb,0x9e,
+0x14,0x8d,0x92,0xd0,0x69,0xe9,0x75,0xd5,0x01,0xdb,0xf2,0x48,0x8d,0xc0,0xbd,0xab,
+0x8f,0xbb,0x10,0xda,0x1a,0xa3,0x06,0xf0,0xc8,0x44,0xfb,0xde,0x18,0x79,0xef,0x0c,
+0xbd,0xb7,0xc6,0xde,0x7b,0x83,0x75,0xe3,0x76,0xb5,0x9b,0xa3,0x13,0x9e,0xe5,0x2f,
+0x4f,0xff,0x01,0x14,0x87,0xe1,0xb6,0x01,0xbb,0x79,0x86,0x00,0x00,0x00,0x00,0x49,
+0x45,0x4e,0x44,0xae,0x42,0x60,0x82};
Index: kdelibs/khtml/misc/loader.h
===================================================================
--- kdelibs/khtml/misc/loader.h	(revision 409908)
+++ kdelibs/khtml/misc/loader.h	(working copy)
@@ -110,6 +110,7 @@
             m_deleted = false;
             m_free = false;
             m_hadError = false;
+            m_wasBlocked = false;
             m_prev = m_next = 0;
 	}
         virtual ~CachedObject();
@@ -171,6 +172,7 @@
         bool m_loading : 1;
         bool m_free : 1;
 	bool m_hadError : 1;
+	bool m_wasBlocked : 1;
 
     private:
         bool allowInLRUList() const { return canDelete() && !m_free && status() != \
Persistent; } @@ -265,6 +267,7 @@
 
         bool isTransparent() const { return isFullyTransparent; }
         bool isErrorImage() const { return m_hadError; }
+        bool isBlockedImage() const { return m_wasBlocked; }
         const QString& suggestedFilename() const { return m_suggestedFilename; }
         void setSuggestedFilename( const QString& s ) { m_suggestedFilename = s;  }
 #ifdef IMAGE_TITLES
@@ -474,6 +477,7 @@
 
     	static QPixmap *nullPixmap;
         static QPixmap *brokenPixmap;
+        static QPixmap *blockedPixmap;
         static int cacheSize;
 
         static void removeCacheEntry( CachedObject *object );
Index: kdelibs/khtml/misc/blocked_icon.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: kdelibs/khtml/misc/blocked_icon.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Index: kdelibs/khtml/misc/loader.cpp
===================================================================
--- kdelibs/khtml/misc/loader.cpp	(revision 409908)
+++ kdelibs/khtml/misc/loader.cpp	(working copy)
@@ -78,6 +78,8 @@
 #include "css/css_stylesheetimpl.h"
 #include "xml/dom_docimpl.h"
 
+#include "blocked_icon.cpp"
+
 using namespace khtml;
 using namespace DOM;
 
@@ -214,6 +216,7 @@
     ah += "*/*;q=0.1";
     setAccept( ah );
     m_hadError = false;
+    m_wasBlocked = false;
     m_err = 0;
     // load the file
     Cache::loader()->load(dl, this, false);
@@ -447,6 +450,18 @@
     imgSource = 0;
     setAccept( acceptHeader );
     m_showAnimations = dl->showAnimations();
+
+
+    if ( KHTMLFactory::defaultHTMLSettings()->isAdFiltered(url.string()))
+    {
+        m_wasBlocked=true;
+        if ( !Cache::blockedPixmap )
+        {
+            Cache::blockedPixmap = new QPixmap();
+            Cache::blockedPixmap->loadFromData(blocked_icon_data, blocked_icon_len);
+        }
+        CachedObject::finish();
+    }
 }
 
 CachedImage::~CachedImage()
@@ -497,7 +512,7 @@
     if (r.isNull()) return r;
 
     // no error indication for background images
-    if(m_hadError) return *Cache::nullPixmap;
+    if(m_hadError||m_wasBlocked) return *Cache::nullPixmap;
 
     bool isvalid = newc.isValid();
     QSize s(pixmap_size());
@@ -588,6 +603,9 @@
     if(m_hadError)
         return *Cache::brokenPixmap;
 
+    if(m_wasBlocked)
+        return *Cache::blockedPixmap;
+
     if(m)
     {
         if(m->framePixmap().size() != m->getValidRect().size())
@@ -616,12 +634,14 @@
 
 QSize CachedImage::pixmap_size() const
 {
+    if (m_wasBlocked) return Cache::blockedPixmap->size();
     return (m_hadError ? Cache::brokenPixmap->size() : m ? m->framePixmap().size() : \
( p ? p->size() : QSize()));  }
 
 
 QRect CachedImage::valid_rect() const
 {
+    if (m_wasBlocked) return Cache::blockedPixmap->rect();
     return (m_hadError ? Cache::brokenPixmap->rect() : m ? m->getValidRect() : ( p ? \
p->rect() : QRect()) );  }
 
@@ -980,7 +1000,8 @@
 CachedScript *DocLoader::requestScript( const DOM::DOMString &url, const QString& \
charset)  {
     DOCLOADER_SECCHECK(true);
-    if ( ! KHTMLFactory::defaultHTMLSettings()->isJavaScriptEnabled(fullURL.host()) \
) +    if ( ! KHTMLFactory::defaultHTMLSettings()->isJavaScriptEnabled(fullURL.host()) \
|| +           KHTMLFactory::defaultHTMLSettings()->isAdFiltered(fullURL.url()))
 	return 0L;
 
     CachedScript* s = Cache::requestObject<CachedScript, CachedObject::Script>( \
this, fullURL, 0 ); @@ -1245,6 +1266,7 @@
 
 QPixmap *Cache::nullPixmap;
 QPixmap *Cache::brokenPixmap;
+QPixmap *Cache::blockedPixmap;
 
 void Cache::init()
 {
@@ -1288,6 +1310,7 @@
     delete cache; cache = 0;
     delete nullPixmap; nullPixmap = 0;
     delete brokenPixmap; brokenPixmap = 0;
+    delete blockedPixmap; blockedPixmap = 0;
     delete m_loader;  m_loader = 0;
     delete docloader; docloader = 0;
     delete freeList; freeList = 0;
Index: kdelibs/khtml/khtml_ext.cpp
===================================================================
--- kdelibs/khtml/khtml_ext.cpp	(revision 409908)
+++ kdelibs/khtml/khtml_ext.cpp	(working copy)
@@ -61,6 +61,8 @@
 #include <kdesktopfile.h>
 #include <kmultipledrag.h>
 
+#include "khtml_factory.h"
+
 #include "dom/dom_element.h"
 #include "misc/htmltags.h"
 
@@ -555,6 +557,19 @@
     QString name = KStringHandler::csqueeze(d->m_imageURL.fileName()+d->m_imageURL.query(), \
25);  new KAction( i18n( "View Image (%1)" ).arg(d->m_suggestedFilename.isEmpty() ? \
name.replace("&", "&&") : d->m_suggestedFilename.replace("&", "&&")), 0, this, SLOT( \
slotViewImage() ),  actionCollection(), "viewimage" );
+
+    if (KHTMLFactory::defaultHTMLSettings()->isAdFilterEnabled())
+    {
+      new KAction( i18n( "Block Image" ), 0, this, SLOT( slotBlockImage() ),
+                   actionCollection(), "blockimage" );
+      
+      if (!d->m_imageURL.host().isEmpty() &&
+          !d->m_imageURL.protocol().isEmpty())
+      {                
+        new KAction( i18n( "Block Images from (%1)" ).arg(d->m_imageURL.host()), 0, \
this, SLOT( slotBlockHost() ), +                     actionCollection(), "blockhost" \
); +      }
+    }
   }
 
   setXML( doc );
@@ -598,6 +613,17 @@
   saveURL( d->m_khtml->widget(), i18n( "Save Image As" ), d->m_imageURL, metaData, \
QString::null, 0, d->m_suggestedFilename );  }
 
+void KHTMLPopupGUIClient::slotBlockHost()
+{
+    QString name=d->m_imageURL.protocol()+"://"+d->m_imageURL.host()+"/*";
+    KHTMLFactory::defaultHTMLSettings()->addAdFilter( name );
+}
+
+void KHTMLPopupGUIClient::slotBlockImage()
+{
+    KHTMLFactory::defaultHTMLSettings()->addAdFilter( d->m_imageURL.url() );
+}
+
 void KHTMLPopupGUIClient::slotCopyLinkLocation()
 {
   KURL safeURL(d->m_url);
Index: kdelibs/khtml/khtml_popupmenu.rc
===================================================================
--- kdelibs/khtml/khtml_popupmenu.rc	(revision 409908)
+++ kdelibs/khtml/khtml_popupmenu.rc	(working copy)
@@ -24,6 +24,8 @@
  <Action name="copyimage" />
  <Action name="copyimagelocation" />
  <Action name="viewimage" />
+ <Action name="blockimage" />
+ <Action name="blockhost" />
  <Separator weakSeparator="1" />
  <Action name="stopanimations" />
  <Separator weakSeparator="1" />
Index: kdelibs/khtml/html/htmlparser.cpp
===================================================================
--- kdelibs/khtml/html/htmlparser.cpp	(revision 409908)
+++ kdelibs/khtml/html/htmlparser.cpp	(working copy)
@@ -47,8 +47,10 @@
 #include "html/htmltokenizer.h"
 #include "khtmlview.h"
 #include "khtml_part.h"
+#include "khtml_factory.h"
 #include "css/cssproperties.h"
 #include "css/cssvalues.h"
+#include "css/csshelper.h"
 
 #include "rendering/render_object.h"
 
@@ -935,8 +937,16 @@
 
 // images
     case ID_IMG:
+        if (KHTMLFactory::defaultHTMLSettings()->isAdFilterEnabled()&&
+            KHTMLFactory::defaultHTMLSettings()->isHideAdsEnabled())
+        {
+            QString url = doc()->completeURL( \
khtml::parseURL(t->attrs->getValue(ATTR_SRC)).string() ); +            if \
(KHTMLFactory::defaultHTMLSettings()->isAdFiltered(url)) +                return 0;
+        }
         n = new HTMLImageElementImpl(document, form);
         break;
+
     case ID_MAP:
         map = new HTMLMapElementImpl(document);
         n = map;
Index: kdelibs/khtml/xml/dom_docimpl.cpp
===================================================================
--- kdelibs/khtml/xml/dom_docimpl.cpp	(revision 409908)
+++ kdelibs/khtml/xml/dom_docimpl.cpp	(working copy)
@@ -2124,6 +2124,9 @@
     KURL newURL(completeURL(url));
     newURL.setRef(QString::null);
 
+    if (KHTMLFactory::defaultHTMLSettings()->isAdFiltered(url))
+        return false;
+            
     // Prohibit non-file URLs if we are asked to.
     if (!thisPart || thisPart->onlyLocalReferences() && newURL.protocol() != "file" \
&& newURL.protocol() != "data")  return false;



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic