From f0c11eadaa4b77a4e36130b014b62cd6200c8211 Mon Sep 17 00:00:00 2001 From: Andrea Diamantini Date: Sat, 28 Aug 2010 19:24:19 +0200 Subject: Switching to "KDE" icon cache. While this "brute force" change can be dangerous, it seems let everything work as expected (at least here). It also lets us to retrieve icons when sites are not visited (eg: search engines or old bookmarks) It also contains fixes & improvements for icons management in History & Bookmarks classes. More code to maintain, but more things working.Let's see what'll happen... --- src/CMakeLists.txt | 4 +- src/application.cpp | 39 ++------- src/application.h | 9 +- src/bookmarks/bookmarkprovider.cpp | 4 +- src/bookmarks/bookmarkstreemodel.cpp | 5 +- src/history/historymodels.cpp | 3 +- src/iconmanager.cpp | 154 +++++++++++++++++++++++++++++++++++ src/iconmanager.h | 61 ++++++++++++++ src/mainview.cpp | 6 +- src/mainwindow.cpp | 5 +- src/protocolhandler.cpp | 1 + src/search/searchengine.cpp | 10 ++- src/tabbar.cpp | 3 +- src/urlbar/listitem.cpp | 18 +++- src/urlbar/listitem.h | 2 + src/urlbar/rsswidget.cpp | 3 +- src/urlbar/urlbar.cpp | 19 ++++- src/urlbar/urlbar.h | 2 + src/webicon.cpp | 74 +++++++++++++++++ src/webicon.h | 58 +++++++++++++ src/webpage.cpp | 22 ++--- src/webpage.h | 1 + src/webtab.cpp | 6 -- src/webview.cpp | 3 +- 24 files changed, 439 insertions(+), 73 deletions(-) create mode 100644 src/iconmanager.cpp create mode 100644 src/iconmanager.h create mode 100644 src/webicon.cpp create mode 100644 src/webicon.h (limited to 'src') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 03c1e062..95995183 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -11,7 +11,7 @@ SET( rekonq_KDEINIT_SRCS clicktoflash.cpp filterurljob.cpp findbar.cpp - zoombar.cpp + iconmanager.cpp mainview.cpp mainwindow.cpp networkaccessmanager.cpp @@ -22,6 +22,7 @@ SET( rekonq_KDEINIT_SRCS sessionmanager.cpp tabbar.cpp walletbar.cpp + webicon.cpp webinspectorpanel.cpp webpage.cpp webpluginfactory.cpp @@ -29,6 +30,7 @@ SET( rekonq_KDEINIT_SRCS websnap.cpp webview.cpp webtab.cpp + zoombar.cpp #---------------------------------------- history/autosaver.cpp history/historymanager.cpp diff --git a/src/application.cpp b/src/application.cpp index df4c3d51..d66e290f 100644 --- a/src/application.cpp +++ b/src/application.cpp @@ -43,6 +43,7 @@ #include "sessionmanager.h" #include "adblockmanager.h" #include "opensearchmanager.h" +#include "iconmanager.h" #include "webview.h" #include "filterurljob.h" #include "tabbar.h" @@ -66,6 +67,7 @@ QWeakPointer Application::s_bookmarkProvider; QWeakPointer Application::s_sessionManager; QWeakPointer Application::s_adblockManager; QWeakPointer Application::s_opensearchManager; +QWeakPointer Application::s_iconManager; Application::Application() @@ -250,10 +252,6 @@ void Application::postLaunch() setWindowIcon(KIcon("rekonq")); - // set Icon Database Path to store "favicons" associated with web sites - QString directory = KStandardDirs::locateLocal("cache" , "" , true); - QWebSettings::setIconDatabasePath(directory); - Application::historyManager(); Application::sessionManager(); @@ -331,38 +329,13 @@ OpenSearchManager *Application::opensearchManager() } -KIcon Application::icon(const KUrl &url) +IconManager *Application::iconManager() { - // avoid infinite loop at startup - if (Application::instance()->mainWindowList().isEmpty()) - return KIcon("text-html"); - - // first things first.. - if (url.isEmpty()) - return KIcon("text-html"); - - QByteArray encodedUrl = url.toEncoded(); - // rekonq icons.. - if (encodedUrl == QByteArray("about:home")) - return KIcon("go-home"); - if (encodedUrl == QByteArray("about:closedTabs")) - return KIcon("tab-close"); - if (encodedUrl == QByteArray("about:history")) - return KIcon("view-history"); - if (encodedUrl == QByteArray("about:bookmarks")) - return KIcon("bookmarks"); - if (encodedUrl == QByteArray("about:favorites")) - return KIcon("emblem-favorite"); - if (encodedUrl == QByteArray("about:downloads")) - return KIcon("download"); - - KIcon icon = KIcon(QWebSettings::iconForUrl(url)); - if (icon.isNull()) + if (s_iconManager.isNull()) { - kDebug() << "null icon"; - icon = KIcon("text-html"); + s_iconManager = new IconManager(instance()); } - return icon; + return s_iconManager.data(); } diff --git a/src/application.h b/src/application.h index a08d883c..26f5cf74 100644 --- a/src/application.h +++ b/src/application.h @@ -52,6 +52,7 @@ class HistoryManager; class MainWindow; class SessionManager; class AdBlockManager; +class IconManager; class WebView; @@ -107,14 +108,13 @@ public: MainWindow *newMainWindow(bool withTab = true); MainWindowList mainWindowList(); - static KIcon icon(const KUrl &url); - static HistoryManager *historyManager(); static BookmarkProvider *bookmarkProvider(); static SessionManager *sessionManager(); static AdBlockManager *adblockManager(); static OpenSearchManager *opensearchManager(); - + static IconManager *iconManager(); + // DOWNLOADS MANAGEMENT METHODS void addDownload(const QString &srcUrl, const QString &destUrl); DownloadList downloads(); @@ -152,7 +152,8 @@ private: static QWeakPointer s_sessionManager; static QWeakPointer s_adblockManager; static QWeakPointer s_opensearchManager; - + static QWeakPointer s_iconManager; + MainWindowList m_mainWindows; }; diff --git a/src/bookmarks/bookmarkprovider.cpp b/src/bookmarks/bookmarkprovider.cpp index ec02ed31..3459108d 100644 --- a/src/bookmarks/bookmarkprovider.cpp +++ b/src/bookmarks/bookmarkprovider.cpp @@ -39,6 +39,7 @@ // KDE Includes #include #include +#include // Qt Includes #include @@ -230,7 +231,8 @@ void BookmarkProvider::fillBookmarkBar(BookmarkToolBar *toolBar) void BookmarkProvider::slotAddBookmark() { - rootGroup().addBookmark(bookmarkOwner()->currentTitle(), bookmarkOwner()->currentUrl()); + QString url = bookmarkOwner()->currentUrl(); + rootGroup().addBookmark(bookmarkOwner()->currentTitle(), url, KMimeType::favIconForUrl( KUrl(url) ) ); bookmarkManager()->emitChanged(); } diff --git a/src/bookmarks/bookmarkstreemodel.cpp b/src/bookmarks/bookmarkstreemodel.cpp index ee19daf1..ba106ca5 100644 --- a/src/bookmarks/bookmarkstreemodel.cpp +++ b/src/bookmarks/bookmarkstreemodel.cpp @@ -62,8 +62,11 @@ QVariant BtmItem::data(int role) const return m_kbm.text(); if (role == Qt::DecorationRole) + { + kDebug() << "BOOKMARK ICON: " << m_kbm.icon(); return KIcon(m_kbm.icon()); - + } + if (role == Qt::UserRole) return m_kbm.url(); diff --git a/src/history/historymodels.cpp b/src/history/historymodels.cpp index 9da755c5..a820db0f 100644 --- a/src/history/historymodels.cpp +++ b/src/history/historymodels.cpp @@ -35,6 +35,7 @@ // Local Includes #include "application.h" +#include "iconmanager.h" // KDE Includes #include @@ -144,7 +145,7 @@ QVariant HistoryModel::data(const QModelIndex &index, int role) const case Qt::DecorationRole: if (index.column() == 0) { - return Application::icon(item.url); + return Application::iconManager()->iconForUrl(item.url); } case Qt::ToolTipRole: QString tooltip = ""; diff --git a/src/iconmanager.cpp b/src/iconmanager.cpp new file mode 100644 index 00000000..694af6a5 --- /dev/null +++ b/src/iconmanager.cpp @@ -0,0 +1,154 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2010 by Andrea Diamantini +* +* +* 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 . +* +* ============================================================ */ + + +// Self Includes +#include "iconmanager.h" +#include "iconmanager.moc" + +// Local Includes +#include "application.h" +#include "webicon.h" + +// KDE Includes +#include +#include + +// Qt Includes +#include +#include +#include +#include +#include + + +IconManager::IconManager(QObject *parent) + : QObject(parent) +{ +} + + +IconManager::~IconManager() +{ +} + + +KIcon IconManager::iconForUrl(const KUrl &url) +{ + // first things first.. avoid infinite loop at startup + if (url.isEmpty() || Application::instance()->mainWindowList().isEmpty()) + return KIcon("text-html"); + + QByteArray encodedUrl = url.toEncoded(); + // rekonq icons.. + if (encodedUrl == QByteArray("about:home")) + return KIcon("go-home"); + if (encodedUrl == QByteArray("about:closedTabs")) + return KIcon("tab-close"); + if (encodedUrl == QByteArray("about:history")) + return KIcon("view-history"); + if (encodedUrl == QByteArray("about:bookmarks")) + return KIcon("bookmarks"); + if (encodedUrl == QByteArray("about:favorites")) + return KIcon("emblem-favorite"); + if (encodedUrl == QByteArray("about:downloads")) + return KIcon("download"); + + QString i = KMimeType::favIconForUrl(url); + QString faviconDir = KStandardDirs::locateLocal("cache" , "" , true); + if(!i.isEmpty()) + { + return KIcon(faviconDir + i); + } + kDebug() << "Icon NOT Found. returning text-html one"; + + return KIcon("text-html"); +} + + +void IconManager::provideIcon(QWebPage *page, const KUrl &url, bool notify) +{ + if(url.scheme() == QL1S("about")) + { + kDebug() << "URL: " << url << ". about scheme. Aborting..."; + return; + } + QUrl u(url.url()); + QString rootUrlString = u.toString( QUrl::RemovePassword + | QUrl::RemoveUserInfo + | QUrl::RemovePath + | QUrl::RemoveQuery + | QUrl::StripTrailingSlash); + + // check if icon exists + if(!KMimeType::favIconForUrl(url).isEmpty()) + { + kDebug() << "icon JUST present. Aborting..."; + if(notify) + emit iconChanged(); + return; + } + + // find ico url + KUrl iconUrl(rootUrlString + QL1S("/favicon.ico")); + + QWebElement root = page->mainFrame()->documentElement(); + QWebElement e = root.findFirst(QL1S("link[rel~=\"icon\"]")); + QString relUrlString = e.attribute(QL1S("href")); + if(relUrlString.isEmpty()) + { + e = root.findFirst(QL1S("link[rel~=\"shortcut icon\"]")); + relUrlString = e.attribute(QL1S("href")); + } + + if(!relUrlString.isEmpty()) + { + iconUrl = relUrlString.startsWith("http") + ? KUrl(relUrlString) + : KUrl(rootUrlString + relUrlString) ; + } + + kDebug() << "ICON URL: " << iconUrl; + + QString faviconDir = KStandardDirs::locateLocal("cache" , "favicons/" , true); + + int r = rootUrlString.indexOf(':'); + kDebug() << rootUrlString; + kDebug() << r; + + KUrl destUrl(faviconDir + rootUrlString.mid(r+3) + ".png"); + kDebug() << "DEST URL: " << destUrl; + + // download icon + KIO::Job *job = KIO::file_copy(iconUrl, destUrl, -1, KIO::HideProgressInfo); + if(notify) + connect(job, SIGNAL(result(KJob*)), this, SIGNAL(iconChanged())); +} + + +void IconManager::downloadIconFromUrl(const KUrl &url) +{ + new WebIcon(url, this); +} diff --git a/src/iconmanager.h b/src/iconmanager.h new file mode 100644 index 00000000..794e61bd --- /dev/null +++ b/src/iconmanager.h @@ -0,0 +1,61 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2010 by Andrea Diamantini +* +* +* 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 . +* +* ============================================================ */ + + +#ifndef ICON_MANAGER_H +#define ICON_MANAGER_H + +// Rekonq Includes +#include "rekonq_defines.h" + +// KDE Includes +#include +#include +#include + +// Qt Includes +#include + + +class REKONQ_TESTS_EXPORT IconManager : public QObject +{ + Q_OBJECT + +public: + IconManager(QObject *parent = 0); + virtual ~IconManager(); + + KIcon iconForUrl(const KUrl &url); + + void provideIcon(QWebPage *page, const KUrl &url, bool notify = true); + + void downloadIconFromUrl(const KUrl &url); + +Q_SIGNALS: + void iconChanged(); +}; + + +#endif // ICON_MANAGER_H diff --git a/src/mainview.cpp b/src/mainview.cpp index dc759c9e..75d98b39 100644 --- a/src/mainview.cpp +++ b/src/mainview.cpp @@ -38,6 +38,7 @@ #include "tabbar.h" #include "urlbar.h" #include "sessionmanager.h" +#include "iconmanager.h" // KDE Includes #include @@ -322,7 +323,6 @@ WebTab *MainView::newWebTab(bool focused) // connecting webview with mainview connect(tab->view(), SIGNAL(loadStarted()), this, SLOT(webViewLoadStarted())); connect(tab->view(), SIGNAL(loadFinished(bool)), this, SLOT(webViewLoadFinished(bool))); - connect(tab->view(), SIGNAL(iconChanged()), this, SLOT(webViewIconChanged())); connect(tab->view(), SIGNAL(titleChanged(const QString &)), this, SLOT(webViewTitleChanged(const QString &))); connect(tab->view(), SIGNAL(urlChanged(const QUrl &)), this, SLOT(webViewUrlChanged(const QUrl &))); @@ -576,7 +576,7 @@ void MainView::webViewIconChanged() int index = indexOf(view->parentWidget()); if (-1 != index) { - KIcon icon = Application::icon(view->url()); + KIcon icon = Application::iconManager()->iconForUrl(view->url()); QLabel *label = animatedLoading(index, false); QMovie *movie = label->movie(); delete movie; @@ -725,7 +725,7 @@ void MainView::detachTab(int index, MainWindow *toWindow) w = Application::instance()->newMainWindow(false); else w = toWindow; - w->mainView()->addTab(tab, Application::icon(u), label); + w->mainView()->addTab(tab, Application::iconManager()->iconForUrl(u), label); w->mainView()->widgetBar()->insertWidget(0, bar); w->mainView()->updateTabBar(); } diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 44cc6d59..5bacb699 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -50,6 +50,7 @@ #include "tabbar.h" #include "adblockmanager.h" #include "analyzerpanel.h" +#include "iconmanager.h" // Ui Includes #include "ui_cleardata.h" @@ -1233,7 +1234,7 @@ void MainWindow::aboutToShowBackMenu() QWebHistoryItem item = history->currentItem(); KAction *action = new KAction(this); action->setData(listCount + offset++); - KIcon icon = Application::icon(item.url()); + KIcon icon = Application::iconManager()->iconForUrl(item.url()); action->setIcon(icon); action->setText(item.title()); m_historyBackMenu->addAction(action); @@ -1244,7 +1245,7 @@ void MainWindow::aboutToShowBackMenu() QWebHistoryItem item = historyList.at(i); KAction *action = new KAction(this); action->setData(i + offset); - KIcon icon = Application::icon(item.url()); + KIcon icon = Application::iconManager()->iconForUrl(item.url()); action->setIcon(icon); action->setText(item.title()); m_historyBackMenu->addAction(action); diff --git a/src/protocolhandler.cpp b/src/protocolhandler.cpp index 5cc09f44..d52433bc 100644 --- a/src/protocolhandler.cpp +++ b/src/protocolhandler.cpp @@ -108,6 +108,7 @@ bool ProtocolHandler::preHandling(const QNetworkRequest &request, QWebFrame *fra return false; } + kDebug() << "EVALUATING JAVASCRIPT..."; QVariant result = frame->evaluateJavaScript(scriptSource); return true; } diff --git a/src/search/searchengine.cpp b/src/search/searchengine.cpp index 7065d55f..38f063a4 100644 --- a/src/search/searchengine.cpp +++ b/src/search/searchengine.cpp @@ -27,6 +27,8 @@ //local includes #include "searchengine.h" +#include "application.h" +#include "iconmanager.h" // Auto Includes #include "rekonq.h" @@ -59,7 +61,13 @@ void SearchEngine::reload() { service = KService::serviceByDesktopPath(QString("searchproviders/%1.desktop").arg(engine)); if (service) - favorites << service; + { + QUrl url = service->property("Query").toUrl(); + kDebug() << "ENGINE URL: " << url; + Application::iconManager()->downloadIconFromUrl(url); + + favorites << service; + } } m_favorites = favorites; diff --git a/src/tabbar.cpp b/src/tabbar.cpp index 98243e71..f4da2e54 100644 --- a/src/tabbar.cpp +++ b/src/tabbar.cpp @@ -39,6 +39,7 @@ #include "webtab.h" #include "websnap.h" #include "mainview.h" +#include "iconmanager.h" // KDE Includes #include @@ -379,7 +380,7 @@ void TabBar::setupHistoryActions() foreach (const HistoryItem &item, mv->recentlyClosedTabs()) { - KAction *a = new KAction(Application::icon(item.url), item.title, this); + KAction *a = new KAction(Application::iconManager()->iconForUrl(item.url), item.title, this); a->setData(item.url); connect(a, SIGNAL(triggered()), mv, SLOT(openClosedTab())); am->addAction(a); diff --git a/src/urlbar/listitem.cpp b/src/urlbar/listitem.cpp index 5bd2253f..6c09f9a5 100644 --- a/src/urlbar/listitem.cpp +++ b/src/urlbar/listitem.cpp @@ -37,6 +37,7 @@ #include "websnap.h" #include "completionwidget.h" #include "searchengine.h" +#include "iconmanager.h" // KDE Includes #include @@ -187,12 +188,20 @@ QLabel *TypeIconLabel::getIcon(QString icon) IconLabel::IconLabel(const QString &icon, QWidget *parent) : QLabel(parent) { - QPixmap pixmapIcon = Application::icon(KUrl(icon)).pixmap(16); + QPixmap pixmapIcon = Application::iconManager()->iconForUrl(KUrl(icon)).pixmap(16); setFixedSize(16, 16); setPixmap(pixmapIcon); } +IconLabel::IconLabel(const KIcon &icon, QWidget *parent) + : QLabel(parent) +{ + QPixmap pixmapIcon = icon.pixmap(16); + setFixedSize(16, 16); + setPixmap(pixmapIcon); +} + // --------------------------------------------------------------- @@ -294,7 +303,8 @@ SearchListItem::SearchListItem(const UrlSearchItem &item, const QString &text, Q m_url = SearchEngine::buildQuery(engine, query); - m_iconLabel = new IconLabel("edit-find", this); //TODO: get the default engine icon (will be easy in KDE SC 4.5) + KIcon icon = Application::iconManager()->iconForUrl( SearchEngine::defaultEngine()->property("Query").toUrl() ); + m_iconLabel = new IconLabel(icon, this); //TODO: get the default engine icon (will be easy in KDE SC 4.5) m_titleLabel = new TextLabel(searchItemTitle(engine->name(), query), query, this); m_engineBar = new EngineBar(engine, parent); @@ -328,7 +338,7 @@ QString SearchListItem::searchItemTitle(QString engine, QString text) void SearchListItem::changeSearchEngine(KService::Ptr engine) { m_titleLabel->setText(searchItemTitle(engine->name(), m_text)); - m_iconLabel->setPixmap(Application::icon(KUrl(engine->property("Query").toString())).pixmap(16)); + m_iconLabel->setPixmap( Application::iconManager()->iconForUrl(KUrl(engine->property("Query").toString())).pixmap(16) ); m_url = SearchEngine::buildQuery(engine, m_text); qobject_cast(parent())->setSearchEngine(engine); } @@ -371,7 +381,7 @@ KAction *EngineBar::newEngineAction(KService::Ptr engine, KService::Ptr selected KUrl url = KUrl( u.toString( QUrl::RemovePath | QUrl::RemoveQuery ) ); kDebug() << "Engine NAME: " << engine->name() << " URL: " << url; - KAction *a = new KAction(Application::icon(url), engine->name(), this); + KAction *a = new KAction(Application::iconManager()->iconForUrl(url), engine->name(), this); a->setCheckable(true); if (engine->desktopEntryName() == selectedEngine->desktopEntryName()) a->setChecked(true); a->setData(engine->entryPath()); diff --git a/src/urlbar/listitem.h b/src/urlbar/listitem.h index 06a02b80..37b22f47 100644 --- a/src/urlbar/listitem.h +++ b/src/urlbar/listitem.h @@ -37,6 +37,7 @@ // KDE Includes #include #include +#include // Qt Includes #include @@ -107,6 +108,7 @@ class IconLabel : public QLabel public: explicit IconLabel(const QString &icon, QWidget *parent = 0); + explicit IconLabel(const KIcon &icon, QWidget *parent = 0); }; diff --git a/src/urlbar/rsswidget.cpp b/src/urlbar/rsswidget.cpp index 6cd63b95..25587502 100644 --- a/src/urlbar/rsswidget.cpp +++ b/src/urlbar/rsswidget.cpp @@ -33,6 +33,7 @@ #include "mainwindow.h" #include "webtab.h" #include "webview.h" +#include "iconmanager.h" // KDE Includes #include @@ -75,7 +76,7 @@ RSSWidget::RSSWidget(const QMap< KUrl, QString > &map, QWidget *parent) m_agregators->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); m_agregators->addItem(KIcon("akregator"), QString("Akregator")); - m_agregators->addItem(Application::icon(KUrl("http://google.com/reader")), i18n("Google Reader")); + m_agregators->addItem(Application::iconManager()->iconForUrl(KUrl("http://google.com/reader")), i18n("Google Reader")); layout->addRow(agregator, m_agregators); diff --git a/src/urlbar/urlbar.cpp b/src/urlbar/urlbar.cpp index 65c0a213..0b966b74 100644 --- a/src/urlbar/urlbar.cpp +++ b/src/urlbar/urlbar.cpp @@ -43,6 +43,7 @@ #include "completionwidget.h" #include "bookmarkprovider.h" #include "bookmarkwidget.h" +#include "iconmanager.h" // KDE Includes #include @@ -110,7 +111,8 @@ UrlBar::UrlBar(QWidget *parent) connect(_tab->view(), SIGNAL(urlChanged(const QUrl &)), this, SLOT(setQUrl(const QUrl &))); connect(_tab->view(), SIGNAL(loadFinished(bool)), this, SLOT(loadFinished())); connect(_tab->view(), SIGNAL(loadStarted()), this, SLOT(clearRightIcons())); - + connect(_tab->view(), SIGNAL(iconChanged()), this, SLOT(refreshFavicon())); + // bookmark icon connect(Application::bookmarkProvider()->bookmarkManager(), SIGNAL(changed(const QString &, const QString &)), this, SLOT(onBookmarksChanged())); @@ -145,7 +147,7 @@ void UrlBar::setQUrl(const QUrl& url) clearFocus(); KLineEdit::setUrl(url); setCursorPosition(0); - _icon->setIcon(Application::icon(url)); + refreshFavicon(); } } @@ -494,3 +496,16 @@ void UrlBar::suggest() if(!_box.isNull()) _box.data()->suggestUrls( text() ); } + + +void UrlBar::refreshFavicon() +{ + kDebug() << "------------------ REFRESH ME!!! -------------"; +// if( u.scheme() == QL1S("about") ) +// { +// kDebug() << "ABOUT SCHEME..."; +// return; +// } + + _icon->setIcon(Application::iconManager()->iconForUrl(_tab->view()->url())); +} diff --git a/src/urlbar/urlbar.h b/src/urlbar/urlbar.h index 8808661b..6e05ea7e 100644 --- a/src/urlbar/urlbar.h +++ b/src/urlbar/urlbar.h @@ -108,6 +108,8 @@ private slots: void showBookmarkInfo(const QPoint &pos); void onBookmarksChanged(); + void refreshFavicon(); + protected: void paintEvent(QPaintEvent *event); void keyPressEvent(QKeyEvent *event); diff --git a/src/webicon.cpp b/src/webicon.cpp new file mode 100644 index 00000000..2aa35a41 --- /dev/null +++ b/src/webicon.cpp @@ -0,0 +1,74 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2010 by Andrea Diamantini +* +* +* 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 . +* +* ============================================================ */ + + +// Self Includes +#include "webicon.h" +#include "webicon.moc" + +// Local Includes +#include "application.h" +#include "iconmanager.h" + +// Qt Includes +#include +#include +#include +#include + + +WebIcon::WebIcon(const KUrl& url, QObject *parent) + : QObject(parent) + , m_url(url) +{ + m_page.settings()->setAttribute(QWebSettings::PluginsEnabled, false); + m_page.settings()->setAttribute(QWebSettings::JavascriptEnabled, false); + m_page.settings()->setAttribute(QWebSettings::PrivateBrowsingEnabled, true); + + connect(&m_page, SIGNAL(loadFinished(bool)), this, SLOT(saveIcon(bool))); + QTimer::singleShot(0, this, SLOT(load())); +} + + +WebIcon::~WebIcon() +{ + m_page.action(QWebPage::Stop)->trigger(); + m_page.deleteLater(); +} + + +void WebIcon::load() +{ + m_page.mainFrame()->load(m_url); +} + + +void WebIcon::saveIcon(bool b) +{ + if(b) + Application::iconManager()->provideIcon(&m_page, m_url, false); + + this->deleteLater(); +} diff --git a/src/webicon.h b/src/webicon.h new file mode 100644 index 00000000..d8b20e10 --- /dev/null +++ b/src/webicon.h @@ -0,0 +1,58 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2010 by Andrea Diamantini +* +* +* 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 . +* +* ============================================================ */ + + +#ifndef WEB_ICON_H +#define WEB_ICON_H + +// Rekonq Includes +#include "rekonq_defines.h" + +// KDE Includes +#include +#include + +// Qt Includes +#include + + +class REKONQ_TESTS_EXPORT WebIcon : public QObject +{ + Q_OBJECT + +public: + explicit WebIcon(const KUrl &url, QObject *parent = 0); + ~WebIcon(); + +private slots: + void load(); + void saveIcon(bool); + +private: + QWebPage m_page; + KUrl m_url; +}; + +#endif //WEB_ICON_H diff --git a/src/webpage.cpp b/src/webpage.cpp index 9167c96d..fbccbbe5 100644 --- a/src/webpage.cpp +++ b/src/webpage.cpp @@ -46,7 +46,7 @@ #include "networkaccessmanager.h" #include "adblockmanager.h" #include "urlbar.h" -//#include "websnap.h" +#include "iconmanager.h" #include "sslinfodialog_p.h" @@ -212,9 +212,12 @@ WebPage::WebPage(QWidget *parent) // ----- last stuffs connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(manageNetworkErrors(QNetworkReply*))); connect(this, SIGNAL(loadFinished(bool)), this, SLOT(loadFinished(bool))); + connect(this, SIGNAL(loadStarted()), this, SLOT(loadStarted())); // protocol handler signals connect(&_protHandler, SIGNAL(downloadUrl(const KUrl &)), this, SLOT(downloadUrl(const KUrl &))); + + connect(Application::iconManager(), SIGNAL(iconChanged()), mainFrame(), SIGNAL(iconChanged())); } @@ -473,10 +476,17 @@ void WebPage::handleUnsupportedContent(QNetworkReply *reply) } +void WebPage::loadStarted() +{ + Application::iconManager()->provideIcon(this, _loadingUrl); +} + + void WebPage::loadFinished(bool ok) { Q_UNUSED(ok); + Application::adblockManager()->applyHidingRules(this); QStringList list = ReKonfig::walletBlackList(); @@ -488,16 +498,6 @@ void WebPage::loadFinished(bool ok) { wallet()->fillFormData(mainFrame()); } - -/* this dead code is for try WebSnap::renderVisiblePagePreview() - if (ok) - { - QPixmap preview = WebSnap::renderVisiblePagePreview(*this); - QString path = WebSnap::imagePathFromUrl(mainFrame()->url().toString()); - QFile::remove(path); - preview.save(path); - } -*/ } diff --git a/src/webpage.h b/src/webpage.h index f3d201c2..f9f4d9bf 100644 --- a/src/webpage.h +++ b/src/webpage.h @@ -83,6 +83,7 @@ private slots: void handleUnsupportedContent(QNetworkReply *reply); void manageNetworkErrors(QNetworkReply *reply); void loadFinished(bool); + void loadStarted(); void showSSLInfo(QPoint); void updateImage(bool ok); diff --git a/src/webtab.cpp b/src/webtab.cpp index d5c5b478..2826123d 100644 --- a/src/webtab.cpp +++ b/src/webtab.cpp @@ -133,12 +133,6 @@ void WebTab::updateProgress(int p) void WebTab::loadFinished(bool) { m_progress = 0; - if(_walletBar.isNull()) - { - kDebug() << "OK, it's null"; - } - else - kDebug() << "NO, it's NOT null"; } diff --git a/src/webview.cpp b/src/webview.cpp index 49ca66df..2c800036 100644 --- a/src/webview.cpp +++ b/src/webview.cpp @@ -39,6 +39,7 @@ #include "bookmarkprovider.h" #include "searchengine.h" #include "websnap.h" +#include "iconmanager.h" // KDE Includes #include @@ -203,7 +204,7 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) foreach(KService::Ptr engine, SearchEngine::favorites()) { a = new KAction(engine->name(), this); - a->setIcon(Application::icon(SearchEngine::buildQuery(engine, ""))); + a->setIcon(Application::iconManager()->iconForUrl(SearchEngine::buildQuery(engine, ""))); a->setData(engine->entryPath()); connect(a, SIGNAL(triggered(bool)), this, SLOT(search())); searchMenu->addAction(a); -- cgit v1.2.1