Title: [86694] trunk/Source/WebKit2
Revision
86694
Author
[email protected]
Date
2011-05-17 12:00:51 -0700 (Tue, 17 May 2011)

Log Message

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.

Modified Paths

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 \
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to