diff --git a/examples/quick/quicknanobrowser/quickwindow.qml b/examples/quick/quicknanobrowser/quickwindow.qml index bec301e6d11f241bedb706867afa2802c7dd759e..7ec4fc02169e1f25443a3ed8822444fccd731f7b 100644 --- a/examples/quick/quicknanobrowser/quickwindow.qml +++ b/examples/quick/quicknanobrowser/quickwindow.qml @@ -82,6 +82,10 @@ ApplicationWindow { iconSource: webEngineView.loading ? "icons/process-stop.png" : "icons/view-refresh.png" onClicked: webEngineView.reload() } + Image { + id: faviconImage + width: 16; height: 16 + } TextField { id: addressBar focus: true @@ -99,5 +103,6 @@ ApplicationWindow { url: utils.initialUrl() onUrlChanged: addressBar.text = url + onIconChanged: faviconImage.source = url } } diff --git a/lib/quick/qquickwebengineview.cpp b/lib/quick/qquickwebengineview.cpp index 708a7ecb6c18a5e58b97e8bf83968e36027cc4bc..aa942c017041785ab18175aafcc858f0a59a0aff 100644 --- a/lib/quick/qquickwebengineview.cpp +++ b/lib/quick/qquickwebengineview.cpp @@ -74,6 +74,13 @@ void QQuickWebEngineViewPrivate::urlChanged(const QUrl &url) Q_EMIT q->urlChanged(); } +void QQuickWebEngineViewPrivate::iconChanged(const QUrl &url) +{ + Q_Q(QQuickWebEngineView); + icon = url; + Q_EMIT q->iconChanged(); +} + void QQuickWebEngineViewPrivate::loadingStateChanged() { Q_Q(QQuickWebEngineView); @@ -127,6 +134,12 @@ void QQuickWebEngineView::setUrl(const QUrl& url) d->adapter->load(url); } +QUrl QQuickWebEngineView::icon() const +{ + Q_D(const QQuickWebEngineView); + return d->icon; +} + void QQuickWebEngineView::goBack() { Q_D(QQuickWebEngineView); diff --git a/lib/quick/qquickwebengineview_p.h b/lib/quick/qquickwebengineview_p.h index faeb234a12295e21ed438b74c3ed3d33614b5073..1c3e27732cec1ddf0ff71aaddb2a915e81911c3c 100644 --- a/lib/quick/qquickwebengineview_p.h +++ b/lib/quick/qquickwebengineview_p.h @@ -51,6 +51,7 @@ class QQuickWebEngineViewPrivate; class QQuickWebEngineView : public QQuickItem { Q_OBJECT Q_PROPERTY(QUrl url READ url WRITE setUrl NOTIFY urlChanged) + Q_PROPERTY(QUrl icon READ icon NOTIFY iconChanged) Q_PROPERTY(bool loading READ isLoading NOTIFY loadingStateChanged) Q_PROPERTY(QString title READ title NOTIFY titleChanged) Q_PROPERTY(bool canGoBack READ canGoBack NOTIFY loadingStateChanged) @@ -62,6 +63,7 @@ public: QUrl url() const; void setUrl(const QUrl&); + QUrl icon() const; bool isLoading() const; QString title() const; bool canGoBack() const; @@ -76,6 +78,7 @@ public Q_SLOTS: Q_SIGNALS: void titleChanged(); void urlChanged(); + void iconChanged(); void loadingStateChanged(); protected: diff --git a/lib/quick/qquickwebengineview_p_p.h b/lib/quick/qquickwebengineview_p_p.h index 9831fa0f363ca62c2482b5cf9c0b611414bf5a4e..38621b44d85cc35c3a28810a55be6065fda0a11b 100644 --- a/lib/quick/qquickwebengineview_p_p.h +++ b/lib/quick/qquickwebengineview_p_p.h @@ -61,6 +61,7 @@ public: virtual RenderWidgetHostViewQtDelegate* CreateRenderWidgetHostViewQtDelegate(CompositingMode mode) Q_DECL_OVERRIDE; virtual void titleChanged(const QString&) Q_DECL_OVERRIDE; virtual void urlChanged(const QUrl&) Q_DECL_OVERRIDE; + virtual void iconChanged(const QUrl&) Q_DECL_OVERRIDE; virtual void loadingStateChanged() Q_DECL_OVERRIDE; virtual QRectF viewportRect() const Q_DECL_OVERRIDE; virtual void loadFinished(bool success) Q_DECL_OVERRIDE; @@ -68,6 +69,7 @@ public: virtual void adoptNewWindow(WebContentsAdapter *newWebContents, WindowOpenDisposition disposition) Q_DECL_OVERRIDE; QExplicitlySharedDataPointer<WebContentsAdapter> adapter; + QUrl icon; }; QT_END_NAMESPACE diff --git a/lib/web_contents_adapter_client.h b/lib/web_contents_adapter_client.h index b0ab502c8ac215af0109f32d7aef4ae6225b8770..ea6e5a666ecaf6f67263bb0cbb8e09b75d4258bd 100644 --- a/lib/web_contents_adapter_client.h +++ b/lib/web_contents_adapter_client.h @@ -80,6 +80,7 @@ public: virtual RenderWidgetHostViewQtDelegate* CreateRenderWidgetHostViewQtDelegate(CompositingMode mode) = 0; virtual void titleChanged(const QString&) = 0; virtual void urlChanged(const QUrl&) = 0; + virtual void iconChanged(const QUrl&) = 0; virtual void loadingStateChanged() = 0; virtual QRectF viewportRect() const = 0; virtual void loadFinished(bool success) = 0; diff --git a/lib/web_contents_delegate_qt.cpp b/lib/web_contents_delegate_qt.cpp index e64649aeacebb5a8f4188dd9ef5e23e5fe509ab9..12a00481c494f49521bfd8d9527d8d6ac27c4527 100644 --- a/lib/web_contents_delegate_qt.cpp +++ b/lib/web_contents_delegate_qt.cpp @@ -48,6 +48,7 @@ #include "content/public/browser/render_view_host.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/invalidate_type.h" +#include "content/public/common/favicon_url.h" WebContentsDelegateQt::WebContentsDelegateQt(content::WebContents *webContents, WebContentsAdapterClient *adapterClient) : m_viewClient(adapterClient) @@ -96,3 +97,14 @@ void WebContentsDelegateQt::DidFinishLoad(int64 frame_id, const GURL &validated_ if (is_main_frame) m_viewClient->loadFinished(true); } + +void WebContentsDelegateQt::DidUpdateFaviconURL(int32 page_id, const std::vector<content::FaviconURL>& candidates) +{ + Q_UNUSED(page_id) + Q_FOREACH (content::FaviconURL candidate, candidates) { + if (candidate.icon_type == content::FaviconURL::FAVICON && !candidate.icon_url.is_empty()) { + m_viewClient->iconChanged(toQt(candidate.icon_url)); + break; + } + } +} diff --git a/lib/web_contents_delegate_qt.h b/lib/web_contents_delegate_qt.h index e56800571aa29c21a7588caa0664e9f41c266a0c..629fd5c6c35b690e5df5efb287d0a26b1a1c30ea 100644 --- a/lib/web_contents_delegate_qt.h +++ b/lib/web_contents_delegate_qt.h @@ -64,6 +64,7 @@ public: virtual void LoadingStateChanged(content::WebContents* source); virtual void DidFailLoad(int64 frame_id, const GURL &validated_url, bool is_main_frame, int error_code, const string16 &error_description, content::RenderViewHost *render_view_host); virtual void DidFinishLoad(int64 frame_id, const GURL &validated_url, bool is_main_frame, content::RenderViewHost *render_view_host); + virtual void DidUpdateFaviconURL(int32 page_id, const std::vector<content::FaviconURL>& candidates); private: WebContentsAdapterClient *m_viewClient; diff --git a/lib/widgets/Api/qwebenginepage.cpp b/lib/widgets/Api/qwebenginepage.cpp index ee02383683dd73b78816cfc18639d0a64d50c309..ab3b1e675d382f106d9d19161846142cb94f78ab 100644 --- a/lib/widgets/Api/qwebenginepage.cpp +++ b/lib/widgets/Api/qwebenginepage.cpp @@ -69,6 +69,11 @@ void QWebEnginePagePrivate::urlChanged(const QUrl &url) Q_EMIT q->urlChanged(url); } +void QWebEnginePagePrivate::iconChanged(const QUrl &url) +{ + Q_UNUSED(url) +} + void QWebEnginePagePrivate::loadingStateChanged() { Q_Q(QWebEnginePage); diff --git a/lib/widgets/Api/qwebenginepage_p.h b/lib/widgets/Api/qwebenginepage_p.h index 22066b5bce759645ea30e7aa052ce8019ceb4fbc..ad1de0047edaf57cb25a28a05397489fd02aab4b 100644 --- a/lib/widgets/Api/qwebenginepage_p.h +++ b/lib/widgets/Api/qwebenginepage_p.h @@ -67,6 +67,7 @@ public: virtual RenderWidgetHostViewQtDelegate* CreateRenderWidgetHostViewQtDelegate(CompositingMode mode) Q_DECL_OVERRIDE; virtual void titleChanged(const QString&) Q_DECL_OVERRIDE; virtual void urlChanged(const QUrl&) Q_DECL_OVERRIDE; + virtual void iconChanged(const QUrl&) Q_DECL_OVERRIDE; virtual void loadingStateChanged() Q_DECL_OVERRIDE; virtual QRectF viewportRect() const Q_DECL_OVERRIDE; virtual void loadFinished(bool success) Q_DECL_OVERRIDE;