diff options
| -rw-r--r-- | CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | src/adblock/adblockmanager.cpp | 198 | ||||
| -rw-r--r-- | src/adblock/adblockmanager.h | 18 | ||||
| -rw-r--r-- | src/adblock/adblockrule.cpp | 6 | ||||
| -rw-r--r-- | src/adblock/adblockrule.h | 4 | ||||
| -rw-r--r-- | src/findbar.cpp | 1 | ||||
| -rw-r--r-- | src/mainwindow.cpp | 38 | ||||
| -rw-r--r-- | src/mainwindow.h | 6 | ||||
| -rw-r--r-- | src/networkaccessmanager.cpp | 35 | ||||
| -rw-r--r-- | src/rekonq.kcfg | 24 | ||||
| -rw-r--r-- | src/settings/adblockwidget.cpp | 190 | ||||
| -rw-r--r-- | src/settings/adblockwidget.h | 66 | ||||
| -rw-r--r-- | src/settings/networkwidget.cpp | 98 | ||||
| -rw-r--r-- | src/settings/networkwidget.h | 63 | ||||
| -rw-r--r-- | src/settings/settings_adblock.ui | 167 | ||||
| -rw-r--r-- | src/settings/settingsdialog.cpp | 68 | ||||
| -rw-r--r-- | src/tabbar.cpp | 9 | ||||
| -rw-r--r-- | src/webpage.cpp | 8 | 
19 files changed, 900 insertions, 104 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 65fc2cff..e31254c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ PROJECT( rekonq )  # Informations to update before to release this package.  # rekonq info -SET(REKONQ_VERSION "0.4.50" ) +SET(REKONQ_VERSION "0.4.52" )  configure_file(${CMAKE_CURRENT_SOURCE_DIR}/version.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/version.h ) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 00cfbf77..7d0c1639 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -34,6 +34,8 @@ SET( rekonq_KDEINIT_SRCS      rekonqpage/previewselectorbar.cpp      #----------------------------------------      settings/settingsdialog.cpp +    settings/adblockwidget.cpp +    settings/networkwidget.cpp      #----------------------------------------      bookmarks/bookmarksmanager.cpp      bookmarks/bookmarkspanel.cpp @@ -54,6 +56,7 @@ KDE4_ADD_UI_FILES( rekonq_KDEINIT_SRCS      settings/settings_tabs.ui      settings/settings_fonts.ui      settings/settings_webkit.ui +    settings/settings_adblock.ui      cleardata.ui   ) diff --git a/src/adblock/adblockmanager.cpp b/src/adblock/adblockmanager.cpp index 06f0d164..d2c2b013 100644 --- a/src/adblock/adblockmanager.cpp +++ b/src/adblock/adblockmanager.cpp @@ -28,6 +28,9 @@  #include "adblockmanager.h"  #include "adblockmanager.moc" +// Auto Includes +#include "rekonq.h" +  // Local Includes  #include "adblocknetworkreply.h"  #include "webpage.h" @@ -36,6 +39,7 @@  #include <KSharedConfig>  #include <KConfigGroup>  #include <KDebug> +#include <KIO/TransferJob>  // Qt Includes  #include <QUrl> @@ -46,8 +50,8 @@ AdBlockManager::AdBlockManager(QObject *parent)      : QObject(parent)      , _isAdblockEnabled(false)      , _isHideAdsEnabled(false) +    , _index(0)  { -    loadSettings();  } @@ -58,52 +62,78 @@ AdBlockManager::~AdBlockManager()  void AdBlockManager::loadSettings()  { -    KSharedConfig::Ptr config = KSharedConfig::openConfig("khtmlrc", KConfig::NoGlobals); -    KConfigGroup cg( config, "Filter Settings" ); +    _index = 0; +    _buffer.clear(); +     +    _whiteList.clear(); +    _blackList.clear(); +    _hideList.clear(); +     +    _isAdblockEnabled = ReKonfig::adBlockEnabled(); +    kDebug() << "ADBLOCK ENABLED = " << _isAdblockEnabled; +     +    // no need to load filters if adblock is not enabled :) +    if(!_isAdblockEnabled) +        return; +     +    // just to be sure.. +    _isHideAdsEnabled = ReKonfig::hideAdsEnabled(); +     +    // local settings +    KSharedConfig::Ptr config = KGlobal::config(); +    KConfigGroup rulesGroup( config, "rules" ); +    QStringList rules; +    rules = rulesGroup.readEntry( "local-rules" , QStringList() ); +    loadRules( rules ); -    if ( cg.exists() ) +    // ---------------------------------------------------------- +         +    QDateTime today = QDateTime::currentDateTime(); +    QDateTime lastUpdate = ReKonfig::lastUpdate();  //  the day of the implementation.. :) +    int days = ReKonfig::updateInterval(); +     +    if( today > lastUpdate.addDays( days ) )      { -        _isAdblockEnabled = cg.readEntry("Enabled", false); -        _isHideAdsEnabled = cg.readEntry("Shrink", false); +        ReKonfig::setLastUpdate( today ); +         +        updateNextSubscription(); +        return; +    } -        // no need to load filters if adblock is not enabled :) -        if(!_isAdblockEnabled) -            return; +    // else +    QStringList names = ReKonfig::subscriptionNames(); +    foreach(const QString &name, names) +    { +        rules = rulesGroup.readEntry( name + "-rules" , QStringList() ); +        loadRules(rules); +    } +} -        _whiteList.clear(); -        _blackList.clear(); -        _hideList.clear(); -         -        QMap<QString,QString> entryMap = cg.entryMap(); -        QMap<QString,QString>::ConstIterator it; -        for( it = entryMap.constBegin(); it != entryMap.constEnd(); ++it ) -        { -            QString name = it.key(); -            QString url = it.value(); -            if (name.startsWith(QLatin1String("Filter"))) +void AdBlockManager::loadRules(const QStringList &rules) +{ +    foreach(const QString &stringRule, rules) +    { +        // ! rules are comments +        if( !stringRule.startsWith('!') && !stringRule.startsWith('[') && !stringRule.isEmpty() ) +        {            +            // white rules +            if( stringRule.startsWith( QLatin1String("@@") ) )              { -                if(!url.startsWith('!')) -                {            -                    // white rules -                    if( url.startsWith( QLatin1String("@@") ) ) -                    { -                        AdBlockRule rule( url.mid(2) ); -                        _whiteList << rule; -                        continue; -                    } -                     -                    // hide (CSS) rules -                    if( url.startsWith( QLatin1String("##") ) ) -                    { -                        _hideList << url.mid(2); -                        continue; -                    } - -                    AdBlockRule rule( url ); -                    _blackList << rule; -                } +                AdBlockRule rule( stringRule.mid(2) ); +                _whiteList << rule; +                continue;              } +             +            // hide (CSS) rules +            if( stringRule.startsWith( QLatin1String("##") ) ) +            { +                _hideList << stringRule.mid(2); +                continue; +            } + +            AdBlockRule rule( stringRule ); +            _blackList << rule;          }      }  } @@ -125,7 +155,9 @@ QNetworkReply *AdBlockManager::block(const QNetworkRequest &request)      {          if(filter.match(urlString))          { -            kDebug() << "****ADBLOCK: WHITE RULE (@@) Matched: ***********" << urlString; +            kDebug() << "****ADBLOCK: WHITE RULE (@@) Matched: ***********"; +            kDebug() << "Filter exp: " << filter.pattern(); +            kDebug() << "UrlString:  " << urlString;              return 0;                  }      } @@ -135,7 +167,9 @@ QNetworkReply *AdBlockManager::block(const QNetworkRequest &request)      {          if(filter.match(urlString))          { -            kDebug() << "****ADBLOCK: BLACK RULE Matched: ***********" << urlString; +            kDebug() << "****ADBLOCK: BLACK RULE Matched: ***********"; +            kDebug() << "Filter exp: " << filter.pattern(); +            kDebug() << "UrlString:  " << urlString;              AdBlockNetworkReply *reply = new AdBlockNetworkReply(request, urlString, this);              return reply;                  } @@ -164,8 +198,88 @@ void AdBlockManager::applyHidingRules(WebPage *page)          foreach (QWebElement element, elements)           { +            kDebug() << "Hide element: " << element.localName();              element.setStyleProperty(QLatin1String("visibility"), QLatin1String("hidden"));              element.removeFromDocument();          }      }  } + + +void AdBlockManager::updateNextSubscription() +{ +    kDebug() << "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"; + +    QStringList subUrlStrings = ReKonfig::subscriptionUrls(); +     +    if( _index < subUrlStrings.size() ) +    { +        QString urlString = subUrlStrings.at(_index); +        kDebug() << "DOWNLOADING FROM " << urlString; +        KUrl subUrl = KUrl( urlString ); +         +        KIO::TransferJob* job = KIO::get( subUrl , KIO::Reload , KIO::HideProgressInfo );                                               +        connect(job, SIGNAL(data(KIO::Job*, const QByteArray&)), this, SLOT(subscriptionData(KIO::Job*, const QByteArray&)));                                                          +        connect(job, SIGNAL(result(KJob*)), this, SLOT(slotResult(KJob*))); +         +        return; +    } + +    _index = 0; +    _buffer.clear(); +} + + +void AdBlockManager::slotResult(KJob *job) +{ +    kDebug() << "SLOTRESULT"; +    if(job->error()) +        return; + +    QList<QByteArray> list = _buffer.split('\n'); +    QStringList ruleList; +    foreach(const QByteArray &ba, list) +    { +        kDebug() << ba; +        ruleList << QString(ba); +    } +    loadRules(ruleList); +    saveRules(ruleList); +     +    _index++; +     +    // last.. +    updateNextSubscription(); +} + + +void AdBlockManager::subscriptionData(KIO::Job* job, const QByteArray& data) +{ +    kDebug() << "subscriptionData"; +    Q_UNUSED(job) +     +    if (data.isEmpty()) +        return; +                                                                                           +    int oldSize = _buffer.size(); +    _buffer.resize( _buffer.size() + data.size() ); +    memcpy( _buffer.data() + oldSize, data.data(), data.size() );   +} + + +void AdBlockManager::saveRules(const QStringList &rules) +{ +    QStringList cleanedRules; +    foreach(const QString &r, rules) +    { +        if( !r.startsWith('!') && !r.startsWith('[') && !r.isEmpty() ) +            cleanedRules << r; +    } +     +    QStringList names = ReKonfig::subscriptionNames(); +    QString name = names.at(_index) + "-rules"; +     +    KSharedConfig::Ptr config = KGlobal::config(); +    KConfigGroup cg( config , "rules" ); +    cg.writeEntry( name, cleanedRules ); +} diff --git a/src/adblock/adblockmanager.h b/src/adblock/adblockmanager.h index d1bbe7ba..aac78e3b 100644 --- a/src/adblock/adblockmanager.h +++ b/src/adblock/adblockmanager.h @@ -112,6 +112,8 @@  #include <QObject>  #include <QNetworkReply>  #include <QStringList> +#include <QByteArray> +#include <KIO/Job>  // Forward Includes  class QNetworkRequest; @@ -129,9 +131,20 @@ public:      AdBlockManager(QObject *parent = 0);      ~AdBlockManager(); -    void loadSettings();      QNetworkReply *block(const QNetworkRequest &request);      void applyHidingRules(WebPage *page); + +public slots: +    void loadSettings(); + +private: +    void updateNextSubscription(); +    void saveRules(const QStringList &); +    void loadRules(const QStringList &); +     +private slots: +    void slotResult(KJob *); +    void subscriptionData(KIO::Job*, const QByteArray&);  private:      bool _isAdblockEnabled; @@ -140,6 +153,9 @@ private:      AdBlockRuleList _blackList;      AdBlockRuleList _whiteList;      QStringList _hideList; + +    int _index; +    QByteArray _buffer;  };  #endif diff --git a/src/adblock/adblockrule.cpp b/src/adblock/adblockrule.cpp index 25ca3678..c0c3fd5b 100644 --- a/src/adblock/adblockrule.cpp +++ b/src/adblock/adblockrule.cpp @@ -181,3 +181,9 @@ QString AdBlockRule::convertPatternToRegExp(const QString &wildcardPattern)      // Finally, return...      return pattern;  } + + +QString AdBlockRule::pattern() const +{ +    return m_regExp.pattern(); +} diff --git a/src/adblock/adblockrule.h b/src/adblock/adblockrule.h index 8f79d16e..ee4825d1 100644 --- a/src/adblock/adblockrule.h +++ b/src/adblock/adblockrule.h @@ -69,7 +69,9 @@ public:      AdBlockRule(const QString &filter);      bool match(const QString &encodedUrl) const; - +     +    QString pattern() const; +      private:          QString convertPatternToRegExp(const QString &wildcardPattern); diff --git a/src/findbar.cpp b/src/findbar.cpp index c97fd1f9..7cbe9d17 100644 --- a/src/findbar.cpp +++ b/src/findbar.cpp @@ -69,6 +69,7 @@ FindBar::FindBar(QWidget *parent)      hideButton->setAutoRaise(true);      hideButton->setIcon(KIcon("dialog-close"));      connect(hideButton, SIGNAL(clicked()), this, SLOT(hide())); +    connect(hideButton, SIGNAL(clicked()), window, SLOT(highlightAll()));      layout->addWidget(hideButton);      layout->setAlignment(hideButton, Qt::AlignLeft | Qt::AlignTop); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index b5df7acb..d15ce0c4 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -286,7 +286,8 @@ void MainWindow::setupActions()      fullScreenShortcut.setAlternate( Qt::Key_F11 );      a->setShortcut( fullScreenShortcut ); -    KStandardAction::home(this, SLOT(homePage()), actionCollection()); +    a = actionCollection()->addAction( KStandardAction::Home ); +    connect(a, SIGNAL(triggered(Qt::MouseButtons,Qt::KeyboardModifiers)), this, SLOT(homePage(Qt::MouseButtons)));      KStandardAction::preferences(this, SLOT(preferences()), actionCollection());      a = KStandardAction::redisplay(m_view, SLOT(webReload()), actionCollection()); @@ -345,14 +346,16 @@ void MainWindow::setupActions()      connect(a, SIGNAL(triggered(bool)), this, SLOT(clearPrivateData()));      // ========================= History related actions ============================== -    a = KStandardAction::back(this, SLOT(openPrevious()) , actionCollection()); +    a = actionCollection()->addAction( KStandardAction::Back ); +    connect(a, SIGNAL(triggered(Qt::MouseButtons,Qt::KeyboardModifiers)), this, SLOT(openPrevious(Qt::MouseButtons)));      m_historyBackMenu = new KMenu(this);      a->setMenu(m_historyBackMenu);      connect(m_historyBackMenu, SIGNAL(aboutToShow()), this, SLOT(aboutToShowBackMenu()));      connect(m_historyBackMenu, SIGNAL(triggered(QAction *)), this, SLOT(openActionUrl(QAction *))); -    KStandardAction::forward(this, SLOT(openNext()) , actionCollection()); +    a = actionCollection()->addAction( KStandardAction::Forward ); +    connect(a, SIGNAL(triggered(Qt::MouseButtons,Qt::KeyboardModifiers)), this, SLOT(openNext(Qt::MouseButtons)));      // ============================== General Tab Actions ====================================      a = new KAction(KIcon("tab-new"), i18n("New &Tab"), this); @@ -796,6 +799,8 @@ void MainWindow::findNext()          return;      } +    highlightAll(); +          QWebPage::FindFlags options = QWebPage::FindWrapsAroundDocument;      if (m_findBar->matchCase())          options |= QWebPage::FindCaseSensitively; @@ -949,9 +954,12 @@ void MainWindow::viewPageSource()  } -void MainWindow::homePage() +void MainWindow::homePage(Qt::MouseButtons btn)  { -    currentTab()->view()->load( QUrl(ReKonfig::homePage()) ); +    if(btn == Qt::MidButton) +        Application::instance()->loadUrl( KUrl(ReKonfig::homePage()), Rekonq::SettingOpenTab ); +    else +        currentTab()->view()->load( QUrl(ReKonfig::homePage()) );  } @@ -992,19 +1000,31 @@ void MainWindow::browserLoading(bool v)  } -void MainWindow::openPrevious() +void MainWindow::openPrevious(Qt::MouseButtons btn)  {      QWebHistory *history = currentTab()->view()->history();      if (history->canGoBack()) -        history->goToItem(history->backItem()); +    { +        KUrl back = history->backItem().url(); +        if(btn == Qt::MidButton) +            Application::instance()->loadUrl(back, Rekonq::SettingOpenTab); +        else +            Application::instance()->loadUrl(back); +    }  } -void MainWindow::openNext() +void MainWindow::openNext(Qt::MouseButtons btn)  {      QWebHistory *history = currentTab()->view()->history();      if (history->canGoForward()) -        history->goToItem(history->forwardItem()); +    { +        KUrl next = history->forwardItem().url(); +        if(btn == Qt::MidButton) +            Application::instance()->loadUrl(next, Rekonq::SettingOpenTab); +        else +            Application::instance()->loadUrl(next); +    }  } diff --git a/src/mainwindow.h b/src/mainwindow.h index e9da090d..4ccd7bf3 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -87,7 +87,7 @@ private:      void setupPanels();  public slots: -    void homePage(); +    void homePage(Qt::MouseButtons = Qt::LeftButton);      /**       * Notifies a message in a popup @@ -122,8 +122,8 @@ private slots:      void updateWindowTitle(const QString &title = QString());      // history related -    void openPrevious(); -    void openNext(); +    void openPrevious(Qt::MouseButtons = Qt::LeftButton); +    void openNext(Qt::MouseButtons = Qt::LeftButton);      // Find Action slots      void find(const QString &); diff --git a/src/networkaccessmanager.cpp b/src/networkaccessmanager.cpp index e6dd6d85..77597cef 100644 --- a/src/networkaccessmanager.cpp +++ b/src/networkaccessmanager.cpp @@ -42,12 +42,41 @@ NetworkAccessManager::NetworkAccessManager(QObject *parent)  QNetworkReply *NetworkAccessManager::createRequest(Operation op, const QNetworkRequest &req, QIODevice *outgoingData)  { -    // Adblock -    if (op == QNetworkAccessManager::GetOperation) +    QNetworkReply *reply = 0; +     +    switch(op)      { -        QNetworkReply *reply = Application::adblockManager()->block(req); +    case QNetworkAccessManager::HeadOperation: +        kDebug() << "HEAD OPERATION"; +        if(outgoingData) +        { +            QByteArray outgoingDataByteArray = outgoingData->peek(1024 * 1024); +            kDebug() << outgoingDataByteArray; +        } +        break; +     +    case QNetworkAccessManager::GetOperation: +        kDebug() << "GET OPERATION"; +        reply = Application::adblockManager()->block(req);          if (reply)              return reply; +        break; +     +    case QNetworkAccessManager::PutOperation: +        kDebug() << "PUT OPERATION"; +        break; +     +    case QNetworkAccessManager::PostOperation: +        kDebug() << "POST OPERATION"; +        break; +     +    case QNetworkAccessManager::DeleteOperation: +        kDebug() << "DELETE OPERATION"; +        break; +         +    default: +        kDebug() << "UNKNOWN OPERATION"; +        break;      }      return AccessManager::createRequest(op,req,outgoingData); diff --git a/src/rekonq.kcfg b/src/rekonq.kcfg index bbf20ac1..42ace3d3 100644 --- a/src/rekonq.kcfg +++ b/src/rekonq.kcfg @@ -7,6 +7,7 @@  <!-- Includes -->  <include>QtWebKit</include> +<include>QDateTime</include>  <include>KUrl</include>  <kcfgfile name="rekonqrc" /> @@ -151,4 +152,27 @@          </entry>      </group> + +<!-- AdBlock Settings --> +    <group name="AdBlock"> +        <entry name="adBlockEnabled" type="Bool"> +            <default>true</default> +        </entry> +        <entry name="hideAdsEnabled" type="Bool"> +            <default>true</default> +        </entry> +        <entry name="subscriptionNames" type="StringList"> +            <default>easylist</default> +        </entry> +        <entry name="subscriptionUrls" type="StringList"> +            <default>https://easylist-downloads.adblockplus.org/easylist.txt</default> +        </entry> +        <entry name="lastUpdate" type="DateTime"> +            <default>QDateTime(QDate(2009,03,13))</default> +        </entry> +        <entry name="updateInterval" type="Int"> +            <default>7</default> +        </entry> +    </group> +  </kcfg> diff --git a/src/settings/adblockwidget.cpp b/src/settings/adblockwidget.cpp new file mode 100644 index 00000000..8aac3e8c --- /dev/null +++ b/src/settings/adblockwidget.cpp @@ -0,0 +1,190 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2010 by Andrea Diamantini <adjam7 at gmail dot com> +* +* +* 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) version 3 or any later version +* accepted by the membership of KDE e.V. (or its successor approved +* by the membership of KDE e.V.), which shall act as a proxy +* defined in Section 14 of version 3 of the license. +* +* 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, see <http://www.gnu.org/licenses/>. +* +* ============================================================ */ + + +// Self Includes +#include "adblockwidget.h" +#include "adblockwidget.moc" + +// Auto Includes +#include "rekonq.h" + +// KDE Includes +#include <KSharedConfig> +#include <KIcon> +#include <KDebug> + +// Qt Includes +#include <QString> +#include <QWhatsThis> +#include <QListWidgetItem> + + +AdBlockWidget::AdBlockWidget(QWidget *parent) +    : QWidget(parent) +    , _changed(false) +{ +    setupUi(this); +     +    hintLabel->setText( i18n("<qt>Filter expression (e.g. <tt>http://www.example.com/ad/*</tt>, <a href=\"filterhelp\">more information</a>):") ); +    connect( hintLabel, SIGNAL(linkActivated(const QString &)), this, SLOT(slotInfoLinkActivated(const QString &)) ); +  +    listWidget->setSortingEnabled(true); +    listWidget->setSelectionMode(QAbstractItemView::SingleSelection); +     +    searchLine->setListWidget(listWidget); +     +    insertButton->setIcon( KIcon("list-add") ); +    connect( insertButton, SIGNAL( clicked() ), this, SLOT( insertRule() ) ); +             +    removeButton->setIcon( KIcon("list-remove") ); +    connect( removeButton, SIGNAL( clicked() ), this, SLOT( removeRule() ) ); +     +    load(); +     +    // emit changed signal +    connect( insertButton,       SIGNAL( clicked() ),           this, SLOT( hasChanged() ) ); +    connect( removeButton,       SIGNAL( clicked() ),           this, SLOT( hasChanged() ) ); +    connect( checkEnableAdblock, SIGNAL( stateChanged(int) ),   this, SLOT( hasChanged() ) ); +    connect( checkHideAds,       SIGNAL( stateChanged(int) ),   this, SLOT( hasChanged() ) ); +    connect( spinBox,            SIGNAL( valueChanged(int) ),   this, SLOT( hasChanged() ) ); +} + + +void AdBlockWidget::slotInfoLinkActivated(const QString &url) +{ +    Q_UNUSED(url) +     +    QString hintHelpString = i18n("<qt><p>Enter an expression to filter. Filters can be defined as either:" +                                  "<ul><li>a shell-style wildcard, e.g. <tt>http://www.example.com/ads*</tt>, the wildcards <tt>*?[]</tt> may be used</li>" +                                  "<li>a full regular expression by surrounding the string with '<tt>/</tt>', e.g. <tt>/\\/(ad|banner)\\./</tt></li></ul>" +                                  "<p>Any filter string can be preceded by '<tt>@@</tt>' to whitelist (allow) any matching URL, " +                                  "which takes priority over any blacklist (blocking) filter."); + +    QWhatsThis::showText( QCursor::pos(), hintHelpString ); +} + + +void AdBlockWidget::insertRule() +{ +    QString rule = addFilterLineEdit->text(); +    if(rule.isEmpty()) +        return; +     +    listWidget->addItem( rule ); +    addFilterLineEdit->clear(); +} + + +void AdBlockWidget::removeRule() +{ +        listWidget->takeItem( listWidget->currentRow() );     +} + + +void AdBlockWidget::load() +{ +    bool isAdBlockEnabled = ReKonfig::adBlockEnabled(); +    checkEnableAdblock->setChecked(isAdBlockEnabled); +     +    bool areImageFiltered = ReKonfig::hideAdsEnabled(); +    checkHideAds->setChecked(areImageFiltered); +     +    int days = ReKonfig::updateInterval(); +    spinBox->setValue( days ); +     +    QStringList subscriptions = ReKonfig::subscriptionNames(); + +    // load automatic rules +    foreach(QString sub, subscriptions) +    { +        QTreeWidgetItem *subItem = new QTreeWidgetItem(treeWidget); +        subItem->setText(0, sub); +        loadRules(subItem); +    } +     +    // load local rules +    KSharedConfig::Ptr config = KGlobal::config(); +    KConfigGroup localGroup( config, "rules" ); +    QStringList rules = localGroup.readEntry( "local-rules" , QStringList() ); +    foreach(const QString &rule, rules) +    { +        listWidget->addItem( rule ); +    } +} + + +void AdBlockWidget::loadRules(QTreeWidgetItem *item) +{ +    KSharedConfig::Ptr config = KGlobal::config(); +    KConfigGroup localGroup( config, "rules" ); +     +    QString str = item->text(0) + "-rules"; +    kDebug() << str; +    QStringList rules = localGroup.readEntry( str , QStringList() ); +     +    foreach(const QString &rule, rules) +    { +        QTreeWidgetItem *subItem = new QTreeWidgetItem(item); +        subItem->setText(0, rule); +    } +} + + +void AdBlockWidget::save() +{ +    int n; + +    // local rules +    KSharedConfig::Ptr config = KGlobal::config(); +    KConfigGroup localGroup( config , "rules" ); +    +    QStringList localRules; +     +    n = listWidget->count(); +    for(int i = 0; i < n; ++i) +    { +        QListWidgetItem *item = listWidget->takeItem(i); +        localRules << item->text(); +    } +    localGroup.writeEntry( "local-rules" , localRules ); + +    ReKonfig::setAdBlockEnabled( checkEnableAdblock->isChecked() ); +    ReKonfig::setHideAdsEnabled( checkHideAds->isChecked() ); +    ReKonfig::setUpdateInterval( spinBox->value() ); +} + + +void AdBlockWidget::hasChanged() +{ +    _changed = true; +    emit changed(true); +} + + +bool AdBlockWidget::changed() +{ +    return _changed; +} diff --git a/src/settings/adblockwidget.h b/src/settings/adblockwidget.h new file mode 100644 index 00000000..7e641f3e --- /dev/null +++ b/src/settings/adblockwidget.h @@ -0,0 +1,66 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2010 by Andrea Diamantini <adjam7 at gmail dot com> +* +* +* 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) version 3 or any later version +* accepted by the membership of KDE e.V. (or its successor approved +* by the membership of KDE e.V.), which shall act as a proxy +* defined in Section 14 of version 3 of the license. +* +* 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, see <http://www.gnu.org/licenses/>. +* +* ============================================================ */ + + +#ifndef ADBLOCK_WIDGET_H +#define ADBLOCK_WIDGET_H + + +// Ui Includes +#include "ui_settings_adblock.h" + +// Qt Includes +#include <QWidget> +#include <QTreeWidgetItem> + + +class AdBlockWidget : public QWidget, private Ui::adblock +{ +Q_OBJECT + +public: +    AdBlockWidget(QWidget *parent = 0); +     +    void save(); +    bool changed(); +     +signals: +    void changed(bool); +     +private slots: +    void hasChanged(); +     +    void slotInfoLinkActivated(const QString &); +    void insertRule(); +    void removeRule(); + +private: +    void load(); +    void loadRules(QTreeWidgetItem *item); + +    bool _changed; +}; + +#endif // ADBLOCK_WIDGET_H diff --git a/src/settings/networkwidget.cpp b/src/settings/networkwidget.cpp new file mode 100644 index 00000000..2f5948cf --- /dev/null +++ b/src/settings/networkwidget.cpp @@ -0,0 +1,98 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2010 by Andrea Diamantini <adjam7 at gmail dot com> +* +* +* 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) version 3 or any later version +* accepted by the membership of KDE e.V. (or its successor approved +* by the membership of KDE e.V.), which shall act as a proxy +* defined in Section 14 of version 3 of the license. +* +* 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, see <http://www.gnu.org/licenses/>. +* +* ============================================================ */ + + +// Self Includes +#include "networkwidget.h" +#include "networkwidget.moc" + +// KDE Includes +#include <KTabWidget> +#include <KCModuleInfo> +#include <KDebug> + +// Qt Includes +#include <QVBoxLayout> + + +NetworkWidget::NetworkWidget(QWidget *parent) +    : QWidget(parent) +    , _cacheModule(0) +    , _cookiesModule(0) +    , _proxyModule(0) +    , _changed(false) +{ +    QVBoxLayout *l = new QVBoxLayout(this); +    l->setMargin(0); +    l->setSpacing(0); +     +    KTabWidget *tabWidget = new KTabWidget(this); +    l->addWidget(tabWidget); + +    KCModuleInfo cacheInfo("cache.desktop");                                                                               +    _cacheModule = new KCModuleProxy(cacheInfo,parent); +    tabWidget->addTab( _cacheModule, i18n(cacheInfo.moduleName().toLocal8Bit()) ); +     +    KCModuleInfo cookiesInfo("cookies.desktop"); +    _cookiesModule = new KCModuleProxy(cookiesInfo,parent); +    tabWidget->addTab( _cookiesModule, i18n(cookiesInfo.moduleName().toLocal8Bit()) );                               +                                                                                                                       +    KCModuleInfo proxyInfo("proxy.desktop");                                                                               +    _proxyModule = new KCModuleProxy(proxyInfo,parent); +    tabWidget->addTab( _proxyModule, i18n(proxyInfo.moduleName().toLocal8Bit()) ); + +    connect(_cacheModule,   SIGNAL( changed(bool) ), this, SLOT( hasChanged() ) ); +    connect(_cookiesModule, SIGNAL( changed(bool) ), this, SLOT( hasChanged() ) ); +    connect(_proxyModule,   SIGNAL( changed(bool) ), this, SLOT( hasChanged() ) ); +} + + +NetworkWidget::~NetworkWidget() +{ +    delete _cacheModule; +    delete _cookiesModule; +    delete _proxyModule; +} + + +void NetworkWidget::save() +{ +    _cookiesModule->save(); +    _proxyModule->save(); +    _cacheModule->save(); +} + + +void NetworkWidget::hasChanged() +{ +    _changed = true; +    emit changed(true); +} + + +bool NetworkWidget::changed() +{ +    return _changed; +} diff --git a/src/settings/networkwidget.h b/src/settings/networkwidget.h new file mode 100644 index 00000000..efdd1807 --- /dev/null +++ b/src/settings/networkwidget.h @@ -0,0 +1,63 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2010 by Andrea Diamantini <adjam7 at gmail dot com> +* +* +* 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) version 3 or any later version +* accepted by the membership of KDE e.V. (or its successor approved +* by the membership of KDE e.V.), which shall act as a proxy +* defined in Section 14 of version 3 of the license. +* +* 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, see <http://www.gnu.org/licenses/>. +* +* ============================================================ */ + + +#ifndef NETWORK_WIDGET_H +#define NETWORK_WIDGET_H + + +// KDE Includes +#include <KCModuleProxy> + +// Qt Includes +#include <QWidget> + + +class NetworkWidget : public QWidget +{ +Q_OBJECT + +public: +    NetworkWidget(QWidget *parent = 0); +    ~NetworkWidget(); +        +    void save(); +    bool changed(); + +signals: +    void changed(bool); + +private slots: +    void hasChanged(); +     +private: +    KCModuleProxy *_cacheModule; +    KCModuleProxy *_cookiesModule; +    KCModuleProxy *_proxyModule; + +    bool _changed; +}; + +#endif // NETWORK_WIDGET_H diff --git a/src/settings/settings_adblock.ui b/src/settings/settings_adblock.ui new file mode 100644 index 00000000..445431c5 --- /dev/null +++ b/src/settings/settings_adblock.ui @@ -0,0 +1,167 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>adblock</class> + <widget class="QWidget" name="adblock"> +  <property name="geometry"> +   <rect> +    <x>0</x> +    <y>0</y> +    <width>601</width> +    <height>507</height> +   </rect> +  </property> +  <property name="windowTitle"> +   <string>Form</string> +  </property> +  <layout class="QVBoxLayout" name="verticalLayout"> +   <item> +    <widget class="QCheckBox" name="checkEnableAdblock"> +     <property name="text"> +      <string>&Enable AdBlock</string> +     </property> +    </widget> +   </item> +   <item> +    <widget class="QCheckBox" name="checkHideAds"> +     <property name="text"> +      <string>&Hide filtered Elements</string> +     </property> +    </widget> +   </item> +   <item> +    <widget class="KTabWidget" name="tabWidget"> +     <property name="toolTip"> +      <string/> +     </property> +     <property name="currentIndex"> +      <number>0</number> +     </property> +     <widget class="QWidget" name="tab_3"> +      <attribute name="title"> +       <string>Automatic Filters</string> +      </attribute> +      <layout class="QVBoxLayout" name="verticalLayout_3"> +       <item> +        <widget class="QTreeWidget" name="treeWidget"> +         <column> +          <property name="text"> +           <string notr="true">1</string> +          </property> +         </column> +        </widget> +       </item> +       <item> +        <layout class="QHBoxLayout" name="horizontalLayout_3"> +         <item> +          <widget class="QLabel" name="label_3"> +           <property name="text"> +            <string>Automatic update interval:</string> +           </property> +          </widget> +         </item> +         <item> +          <widget class="QSpinBox" name="spinBox"> +           <property name="value"> +            <number>7</number> +           </property> +          </widget> +         </item> +         <item> +          <spacer name="horizontalSpacer"> +           <property name="orientation"> +            <enum>Qt::Horizontal</enum> +           </property> +           <property name="sizeHint" stdset="0"> +            <size> +             <width>40</width> +             <height>20</height> +            </size> +           </property> +          </spacer> +         </item> +        </layout> +       </item> +      </layout> +     </widget> +     <widget class="QWidget" name="tab"> +      <attribute name="title"> +       <string>Manual Filters</string> +      </attribute> +      <layout class="QVBoxLayout" name="verticalLayout_2"> +       <item> +        <layout class="QHBoxLayout" name="horizontalLayout"> +         <item> +          <widget class="QLabel" name="label"> +           <property name="text"> +            <string>Search:</string> +           </property> +          </widget> +         </item> +         <item> +          <widget class="KListWidgetSearchLine" name="searchLine"/> +         </item> +        </layout> +       </item> +       <item> +        <widget class="KListWidget" name="listWidget"/> +       </item> +       <item> +        <widget class="QLabel" name="hintLabel"> +         <property name="text"> +          <string>TextLabel</string> +         </property> +        </widget> +       </item> +       <item> +        <layout class="QHBoxLayout" name="horizontalLayout_2"> +         <item> +          <widget class="KLineEdit" name="addFilterLineEdit"/> +         </item> +         <item> +          <widget class="QToolButton" name="insertButton"> +           <property name="text"> +            <string>...</string> +           </property> +          </widget> +         </item> +         <item> +          <widget class="QToolButton" name="removeButton"> +           <property name="text"> +            <string>...</string> +           </property> +          </widget> +         </item> +        </layout> +       </item> +      </layout> +     </widget> +    </widget> +   </item> +  </layout> + </widget> + <customwidgets> +  <customwidget> +   <class>KListWidget</class> +   <extends>QListWidget</extends> +   <header>klistwidget.h</header> +  </customwidget> +  <customwidget> +   <class>KLineEdit</class> +   <extends>QLineEdit</extends> +   <header>klineedit.h</header> +  </customwidget> +  <customwidget> +   <class>KTabWidget</class> +   <extends>QTabWidget</extends> +   <header>ktabwidget.h</header> +   <container>1</container> +  </customwidget> +  <customwidget> +   <class>KListWidgetSearchLine</class> +   <extends>KLineEdit</extends> +   <header>klistwidgetsearchline.h</header> +  </customwidget> + </customwidgets> + <resources/> + <connections/> +</ui> diff --git a/src/settings/settingsdialog.cpp b/src/settings/settingsdialog.cpp index e7a9d1e8..08d5ca6e 100644 --- a/src/settings/settingsdialog.cpp +++ b/src/settings/settingsdialog.cpp @@ -36,6 +36,8 @@  #include "application.h"  #include "mainwindow.h"  #include "webtab.h" +#include "adblockwidget.h" +#include "networkwidget.h"  //Ui Includes  #include "ui_settings_general.h" @@ -63,12 +65,12 @@ private:      Ui::tabs tabsUi;      Ui::fonts fontsUi;      Ui::webkit webkitUi; + +    AdBlockWidget *adBlockWidg; +    NetworkWidget *networkWidg; -    KCModuleProxy *proxyModule;      KCModuleProxy *ebrowsingModule; -    KCModuleProxy *cookiesModule; -    KCModuleProxy *cacheModule; -    KCModuleProxy *adblockModule; +      KShortcutsEditor *shortcutsEditor;      Private(SettingsDialog *parent); @@ -99,21 +101,6 @@ Private::Private(SettingsDialog *parent)      widget->layout()->setMargin(0);      pageItem = parent->addPage(widget , i18n("Fonts"));      pageItem->setIcon(KIcon("preferences-desktop-font")); - -    KCModuleInfo cookiesInfo("cookies.desktop"); -    cookiesModule = new KCModuleProxy(cookiesInfo,parent); -    pageItem = parent->addPage(cookiesModule, i18n(cookiesInfo.moduleName().toLocal8Bit())); -    pageItem->setIcon(KIcon(cookiesInfo.icon())); - -    KCModuleInfo proxyInfo("proxy.desktop"); -    proxyModule = new KCModuleProxy(proxyInfo,parent); -    pageItem = parent->addPage(proxyModule, i18n(proxyInfo.moduleName().toLocal8Bit())); -    pageItem->setIcon(KIcon(proxyInfo.icon())); - -    KCModuleInfo cacheInfo("cache.desktop"); -    cacheModule = new KCModuleProxy(cacheInfo,parent); -    pageItem = parent->addPage(cacheModule, i18n(cacheInfo.moduleName().toLocal8Bit())); -    pageItem->setIcon(KIcon(cacheInfo.icon()));      widget = new QWidget;      webkitUi.setupUi(widget); @@ -123,10 +110,15 @@ Private::Private(SettingsDialog *parent)      KIcon webkitIcon = KIcon(QIcon(webkitIconPath));      pageItem->setIcon(webkitIcon); -    KCModuleInfo adblockInfo("khtml_filter.desktop"); -    adblockModule = new KCModuleProxy(adblockInfo,parent); -    pageItem = parent->addPage(adblockModule, i18n(adblockInfo.moduleName().toLocal8Bit())); -    pageItem->setIcon(KIcon(adblockInfo.icon())); +    networkWidg = new NetworkWidget(parent); +    networkWidg->layout()->setMargin(0); +    pageItem = parent->addPage(networkWidg , i18n("Network")); +    pageItem->setIcon( KIcon("preferences-system-network") ); +     +    adBlockWidg = new AdBlockWidget(parent); +    adBlockWidg->layout()->setMargin(0); +    pageItem = parent->addPage(adBlockWidg , i18n("Ad Block")); +    pageItem->setIcon( KIcon("preferences-web-browser-adblock") );      shortcutsEditor = new KShortcutsEditor(Application::instance()->mainWindow()->actionCollection(), parent);      pageItem = parent->addPage(shortcutsEditor , i18n("Shortcuts")); @@ -137,7 +129,7 @@ Private::Private(SettingsDialog *parent)      pageItem = parent->addPage(ebrowsingModule, i18n(ebrowsingInfo.moduleName().toLocal8Bit()));      pageItem->setIcon(KIcon(ebrowsingInfo.icon())); -    // WARNING remember wheh changing here that the smaller netbooks +    // WARNING remember wheh changing here that the smallest netbooks      // have a 1024x576 resolution. So DON'T bother that limits!!      parent->setMinimumSize(700,525);      } @@ -158,16 +150,16 @@ SettingsDialog::SettingsDialog(QWidget *parent)      connect(d->generalUi.setHomeToCurrentPageButton, SIGNAL(clicked()), this, SLOT(setHomeToCurrentPage())); +    // update buttons +    connect(d->adBlockWidg,     SIGNAL(changed(bool)), this, SLOT(updateButtons())); +    connect(d->networkWidg,     SIGNAL(changed(bool)), this, SLOT(updateButtons()));      connect(d->ebrowsingModule, SIGNAL(changed(bool)), this, SLOT(updateButtons())); -    connect(d->cookiesModule, SIGNAL(changed(bool)), this, SLOT(updateButtons())); -    connect(d->proxyModule, SIGNAL(changed(bool)), this, SLOT(updateButtons())); -    connect(d->cacheModule, SIGNAL(changed(bool)), this, SLOT(updateButtons())); -    connect(d->adblockModule, SIGNAL(changed(bool)), this, SLOT(updateButtons())); -    connect(d->shortcutsEditor, SIGNAL(keyChange()), this, SLOT(updateButtons())); -         +    connect(d->shortcutsEditor, SIGNAL(keyChange()),   this, SLOT(updateButtons())); +     +    // save settings      connect(this, SIGNAL(applyClicked()), this, SLOT(saveSettings())); -    connect(this, SIGNAL(okClicked()), this, SLOT(saveSettings())); +    connect(this, SIGNAL(okClicked()),    this, SLOT(saveSettings()));      setWebSettingsToolTips();  } @@ -209,22 +201,18 @@ void SettingsDialog::saveSettings()  {      ReKonfig::self()->writeConfig();      d->ebrowsingModule->save(); -    d->cookiesModule->save(); -    d->proxyModule->save(); -    d->cacheModule->save();      d->shortcutsEditor->save(); -    d->adblockModule->save(); +    d->adBlockWidg->save(); +    d->networkWidg->save();  }  bool SettingsDialog::hasChanged()  {      return KConfigDialog::hasChanged()  -            || d->ebrowsingModule->changed()             -            || d->cookiesModule->changed() -            || d->proxyModule->changed() -            || d->cacheModule->changed() -            || d->adblockModule->changed() +            || d->adBlockWidg->changed() +            || d->networkWidg->changed() +            || d->ebrowsingModule->changed()              || d->shortcutsEditor->isModified();              ;  } diff --git a/src/tabbar.cpp b/src/tabbar.cpp index 80782116..44972548 100644 --- a/src/tabbar.cpp +++ b/src/tabbar.cpp @@ -244,6 +244,15 @@ void TabBar::leaveEvent(QEvent *event)  void TabBar::mousePressEvent(QMouseEvent *event)  { +    if (ReKonfig::alwaysShowTabPreviews()) +    { +        if ( !m_previewPopup.isNull() ) +        { +            m_previewPopup.data()->hide(); +        } +        m_currentTabPreview = -1; +    } +      // just close tab on middle mouse click      if (event->button() == Qt::MidButton)          return; diff --git a/src/webpage.cpp b/src/webpage.cpp index f1591cee..4caf5a83 100644 --- a/src/webpage.cpp +++ b/src/webpage.cpp @@ -352,15 +352,15 @@ void WebPage::downloadAllContentsWithKGet()      QWebElementCollection images = mainFrame()->documentElement().findAll("img");      foreach(QWebElement img, images)      { -	relativeUrl.setEncodedUrl(img.attribute("src").toUtf8(),KUrl::TolerantMode);  -	contents << baseUrl.resolved(relativeUrl).toString(); +        relativeUrl.setEncodedUrl(img.attribute("src").toUtf8(),KUrl::TolerantMode);  +        contents << baseUrl.resolved(relativeUrl).toString();      }      QWebElementCollection links = mainFrame()->documentElement().findAll("a");      foreach(QWebElement link, links)      { -	relativeUrl.setEncodedUrl(link.attribute("href").toUtf8(),KUrl::TolerantMode);  -	contents << baseUrl.resolved(relativeUrl).toString(); +        relativeUrl.setEncodedUrl(link.attribute("href").toUtf8(),KUrl::TolerantMode);  +        contents << baseUrl.resolved(relativeUrl).toString();      }      if(!QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.kget"))  | 
