Diff
Modified: trunk/Source/WebKit2/ChangeLog (86693 => 86694)
--- trunk/Source/WebKit2/ChangeLog 2011-05-17 19:00:37 UTC (rev 86693)
+++ trunk/Source/WebKit2/ChangeLog 2011-05-17 19:00:51 UTC (rev 86694)
@@ -1,3 +1,35 @@
+2011-05-17 Andreas Kling <[email protected]>
+
+ Reviewed by Kenneth Rohde Christiansen.
+
+ [Qt][WK2] Initial support for favicons.
+ https://bugs.webkit.org/show_bug.cgi?id=58937
+
+ Add the following API to QWKContext:
+
+ - void setIconDatabasePath(QString)
+ - void iconChangedForPageURL(QUrl) [signal]
+ - QIcon iconForPageURL(QUrl)
+
+ This is mostly analogous to the QWebSettings/QWebFrame icon API we had in WebKit1.
+
+ * UIProcess/API/qt/ClientImpl.h: Added WKIconDatabaseClient methods.
+
+ * UIProcess/API/qt/ClientImpl.cpp:
+ (toQWKContext): Helper to cast from "void* clientInfo" to a QWKContext*.
+ (qt_wk_didChangeIconForPageURL): Emits QWKContext::iconChangedForPageURL(QUrl).
+ (qt_wk_didRemoveAllIcons): Stub.
+
+ * UIProcess/API/qt/qwkcontext.h:
+ * UIProcess/API/qt/qwkcontext_p.h:
+ * UIProcess/API/qt/qwkcontext.cpp:
+ (QWKContextPrivate::QWKContextPrivate): Set up and register a WKIconDatabaseClient.
+ (QWKContext::QWKContext): Minor refactor to avoid code duplication in constructors.
+ (QWKContext::setIconDatabasePath): Exactly what it sounds like.
+ (QWKContext::iconForPageURL): Retrieves the favicon for a given page URL as a QIcon.
+
+ * WebKit2API.pri: Add WKIconDatabase.cpp and WKIconDatabase.h to build.
+
2011-05-17 Brady Eidson <[email protected]>
Reviewed by Anders Carlsson.
Modified: trunk/Source/WebKit2/UIProcess/API/qt/ClientImpl.cpp (86693 => 86694)
--- trunk/Source/WebKit2/UIProcess/API/qt/ClientImpl.cpp 2011-05-17 19:00:37 UTC (rev 86693)
+++ trunk/Source/WebKit2/UIProcess/API/qt/ClientImpl.cpp 2011-05-17 19:00:51 UTC (rev 86694)
@@ -24,6 +24,7 @@
#include "WKAPICast.h"
#include "WKStringQt.h"
#include "WKURLQt.h"
+#include <qwkcontext.h>
#include <qwkpage.h>
#include <qwkpage_p.h>
#include <WKFrame.h>
@@ -31,6 +32,13 @@
using namespace WebKit;
+static QWKContext* toQWKContext(const void* clientInfo)
+{
+ if (clientInfo)
+ return reinterpret_cast<QWKContext*>(const_cast<void*>(clientInfo));
+ return 0;
+}
+
static QWKPage* toQWKPage(const void* clientInfo)
{
if (clientInfo)
@@ -188,3 +196,13 @@
emit toQWKPage(clientInfo)->urlChanged(qUrl);
QWKPagePrivate::get(toQWKPage(clientInfo))->updateNavigationActions();
}
+
+void qt_wk_didChangeIconForPageURL(WKIconDatabaseRef iconDatabase, WKURLRef pageURL, const void* clientInfo)
+{
+ QUrl qUrl = WKURLCopyQUrl(pageURL);
+ emit toQWKContext(clientInfo)->iconChangedForPageURL(qUrl);
+}
+
+void qt_wk_didRemoveAllIcons(WKIconDatabaseRef iconDatabase, const void* clientInfo)
+{
+}
Modified: trunk/Source/WebKit2/UIProcess/API/qt/ClientImpl.h (86693 => 86694)
--- trunk/Source/WebKit2/UIProcess/API/qt/ClientImpl.h 2011-05-17 19:00:37 UTC (rev 86693)
+++ trunk/Source/WebKit2/UIProcess/API/qt/ClientImpl.h 2011-05-17 19:00:51 UTC (rev 86694)
@@ -53,6 +53,10 @@
void qt_wk_runJavaScriptAlert(WKPageRef page, WKStringRef alertText, WKFrameRef frame, const void* clientInfo);
void qt_wk_setStatusText(WKPageRef page, WKStringRef text, const void *clientInfo);
+// IconDatabase client.
+void qt_wk_didChangeIconForPageURL(WKIconDatabaseRef, WKURLRef, const void* clientInfo);
+void qt_wk_didRemoveAllIcons(WKIconDatabaseRef, const void* clientInfo);
+
#ifdef __cplusplus
}
#endif
Modified: trunk/Source/WebKit2/UIProcess/API/qt/qwkcontext.cpp (86693 => 86694)
--- trunk/Source/WebKit2/UIProcess/API/qt/qwkcontext.cpp 2011-05-17 19:00:37 UTC (rev 86693)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qwkcontext.cpp 2011-05-17 19:00:51 UTC (rev 86694)
@@ -22,7 +22,14 @@
#include "qwkcontext.h"
#include "qwkcontext_p.h"
+#include "ClientImpl.h"
+#include "IconDatabase.h"
+#include <QDir>
+#include <QPixmap>
+#include <QUrl>
+#include "WebIconDatabase.h"
#include "WebPlatformStrategies.h"
+#include "WKIconDatabase.h"
using namespace WebKit;
@@ -36,33 +43,65 @@
initialized = true;
}
-QWKContextPrivate::QWKContextPrivate(QWKContext* qq)
+QWKContextPrivate::QWKContextPrivate(QWKContext* qq, WebContext* webContext)
: q(qq)
{
+ if (!webContext)
+ context = WebContext::create(String());
+ else
+ context = webContext;
+
initializePlatformStrategiesIfNeeded();
+
+ WKIconDatabaseClient iconDatabaseClient = {
+ 0, // version
+ qq, // clientInfo
+ qt_wk_didChangeIconForPageURL,
+ qt_wk_didRemoveAllIcons
+ };
+
+ WKIconDatabaseSetIconDatabaseClient(toAPI(context->iconDatabase()), &iconDatabaseClient);
}
QWKContextPrivate::~QWKContextPrivate()
-{
-}
+{ }
QWKContext::QWKContext(QObject* parent)
: QObject(parent)
, d(new QWKContextPrivate(this))
-{
- d->context = WebContext::create(String());
-}
+{ }
QWKContext::QWKContext(WKContextRef contextRef, QObject* parent)
: QObject(parent)
- , d(new QWKContextPrivate(this))
-{
- d->context = toImpl(contextRef);
-}
+ , d(new QWKContextPrivate(this, toImpl(contextRef)))
+{ }
QWKContext::~QWKContext()
{
delete d;
}
+void QWKContext::setIconDatabasePath(const QString& path)
+{
+ // FIXME: There is currently no way to disable the icon database once it's enabled.
+ QFileInfo info(path);
+ if (info.isDir() && info.isWritable()) {
+ QString databasePath = path + QDir::separator() + QString(WebCore::IconDatabase::defaultDatabaseFilename());
+ d->context->setIconDatabasePath(databasePath);
+ }
+}
+
+QIcon QWKContext::iconForPageURL(const QUrl& pageURL) const
+{
+ RefPtr<WebCore::Image> image = d->context->iconDatabase()->imageForPageURL(pageURL.toString());
+ if (!image)
+ return QIcon();
+
+ QPixmap* nativeImage = image->nativeImageForCurrentFrame();
+ if (!nativeImage)
+ return QIcon();
+
+ return QIcon(*nativeImage);
+}
+
#include "moc_qwkcontext.cpp"
Modified: trunk/Source/WebKit2/UIProcess/API/qt/qwkcontext.h (86693 => 86694)
--- trunk/Source/WebKit2/UIProcess/API/qt/qwkcontext.h 2011-05-17 19:00:37 UTC (rev 86693)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qwkcontext.h 2011-05-17 19:00:51 UTC (rev 86694)
@@ -24,6 +24,8 @@
#include <QObject>
#include <WebKit2/WKContext.h>
+class QIcon;
+class QUrl;
class QWKContextPrivate;
class QWEBKIT_EXPORT QWKContext : public QObject {
@@ -35,6 +37,12 @@
// Bridge from the C API
QWKContext(WKContextRef contextRef, QObject* parent = 0);
+ void setIconDatabasePath(const QString&);
+ QIcon iconForPageURL(const QUrl&) const;
+
+public:
+ Q_SIGNAL void iconChangedForPageURL(const QUrl&);
+
private:
QWKContextPrivate* d;
Modified: trunk/Source/WebKit2/UIProcess/API/qt/qwkcontext_p.h (86693 => 86694)
--- trunk/Source/WebKit2/UIProcess/API/qt/qwkcontext_p.h 2011-05-17 19:00:37 UTC (rev 86693)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qwkcontext_p.h 2011-05-17 19:00:51 UTC (rev 86694)
@@ -26,7 +26,7 @@
class QWKContextPrivate {
public:
- QWKContextPrivate(QWKContext*);
+ QWKContextPrivate(QWKContext*, WebKit::WebContext* = 0);
~QWKContextPrivate();
QWKContext* q;
Modified: trunk/Source/WebKit2/WebKit2API.pri (86693 => 86694)
--- trunk/Source/WebKit2/WebKit2API.pri 2011-05-17 19:00:37 UTC (rev 86693)
+++ trunk/Source/WebKit2/WebKit2API.pri 2011-05-17 19:00:51 UTC (rev 86694)
@@ -31,6 +31,7 @@
$$SOURCE_DIR/WebKit2/UIProcess/API/C/WKGeolocationManager.cpp \
$$SOURCE_DIR/WebKit2/UIProcess/API/C/WKGeolocationPermissionRequest.cpp \
$$SOURCE_DIR/WebKit2/UIProcess/API/C/WKGeolocationPosition.cpp \
+ $$SOURCE_DIR/WebKit2/UIProcess/API/C/WKIconDatabase.cpp \
$$SOURCE_DIR/WebKit2/UIProcess/API/C/WKInspector.cpp \
$$SOURCE_DIR/WebKit2/UIProcess/API/C/WKOpenPanelParameters.cpp \
$$SOURCE_DIR/WebKit2/UIProcess/API/C/WKOpenPanelResultListener.cpp \
@@ -103,6 +104,7 @@
$$SOURCE_DIR/WebKit2/UIProcess/API/C/WKGeolocationManager.h \
$$SOURCE_DIR/WebKit2/UIProcess/API/C/WKGeolocationPermissionRequest.h \
$$SOURCE_DIR/WebKit2/UIProcess/API/C/WKGeolocationPosition.h \
+ $$SOURCE_DIR/WebKit2/UIProcess/API/C/WKIconDatabase.h \
$$SOURCE_DIR/WebKit2/UIProcess/API/C/WKInspector.h \
$$SOURCE_DIR/WebKit2/UIProcess/API/C/WKOpenPanelParameters.h \
$$SOURCE_DIR/WebKit2/UIProcess/API/C/WKOpenPanelResultListener.h \