[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