--Boundary-00=_uYreC0OZPWWXOrw Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 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 --Boundary-00=_uYreC0OZPWWXOrw Content-Type: text/x-diff; charset="us-ascii"; name="kdebase.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="kdebase.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 @@ -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 + + 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 + +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 + + 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 +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 entryMap = mConfig->entryMap( mGroupname ); + QMap::ConstIterator it; + int num = mConfig->readNumEntry("Count",0); + for (int i=0; iinsertStringList( 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("

Konqueror Filter

"); +} 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; + +AdBlocK + +&konqueror; AdBlocK can be configured to replace or remove +images or frames from web pages that match a series of filters + +The setting Enable filters enables or +disables the use of filters. +If Hide filtered images 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. + +URL expressions to filter 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. + + + 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 @@ - + The Files &kdm; Uses for Configuration 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" << --Boundary-00=_uYreC0OZPWWXOrw Content-Type: text/x-diff; charset="us-ascii"; name="kdelibs.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="kdelibs.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 #include #include +#include /** * @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 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 entryMap = config->entryMap("Filter Settings"); + QMap::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::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 + + 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 * 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( 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 #include +#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 @@ + + 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; --Boundary-00=_uYreC0OZPWWXOrw--