diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 95e99cf5648b..e6ec82405261 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -4,6 +4,8 @@ #include "atom/browser/api/atom_api_web_contents.h" +#include + #include "atom/browser/atom_browser_context.h" #include "atom/browser/native_window.h" #include "atom/browser/web_dialog_helper.h" @@ -11,10 +13,12 @@ #include "atom/common/api/api_messages.h" #include "atom/common/native_mate_converters/gfx_converter.h" #include "atom/common/native_mate_converters/gurl_converter.h" +#include "atom/common/native_mate_converters/image_converter.h" #include "atom/common/native_mate_converters/string16_converter.h" #include "atom/common/native_mate_converters/value_converter.h" #include "base/strings/utf_string_conversions.h" #include "brightray/browser/inspectable_web_contents.h" +#include "content/public/browser/favicon_status.h" #include "content/public/browser/navigation_details.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/render_frame_host.h" @@ -256,6 +260,19 @@ void WebContents::TitleWasSet(content::NavigationEntry* entry, Emit("page-title-set", entry->GetTitle(), explicit_set); } +void WebContents::DidUpdateFaviconURL( + const std::vector& urls) { + std::set unique_urls; + for (auto iter = urls.begin(); iter != urls.end(); ++iter) { + if (iter->icon_type != content::FaviconURL::FAVICON) + continue; + const GURL& url = iter->icon_url; + if (url.is_valid()) + unique_urls.insert(url); + } + Emit("page-favicon-updated", unique_urls); +} + bool WebContents::OnMessageReceived(const IPC::Message& message) { bool handled = true; IPC_BEGIN_MESSAGE_MAP(WebContents, message) @@ -379,6 +396,13 @@ base::string16 WebContents::GetTitle() const { return web_contents()->GetTitle(); } +gfx::Image WebContents::GetFavicon() const { + auto entry = web_contents()->GetController().GetLastCommittedEntry(); + if (!entry) + return gfx::Image(); + return entry->GetFavicon().image; +} + bool WebContents::IsLoading() const { return web_contents()->IsLoading(); } @@ -570,6 +594,7 @@ mate::ObjectTemplateBuilder WebContents::GetObjectTemplateBuilder( .SetMethod("_loadUrl", &WebContents::LoadURL) .SetMethod("getUrl", &WebContents::GetURL) .SetMethod("getTitle", &WebContents::GetTitle) + .SetMethod("getFavicon", &WebContents::GetFavicon) .SetMethod("isLoading", &WebContents::IsLoading) .SetMethod("isWaitingForResponse", &WebContents::IsWaitingForResponse) .SetMethod("stop", &WebContents::Stop) diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index 2578c5c2a418..ea05715e58c7 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -6,13 +6,16 @@ #define ATOM_BROWSER_API_ATOM_API_WEB_CONTENTS_H_ #include +#include #include "atom/browser/api/event_emitter.h" #include "brightray/browser/default_web_contents_delegate.h" #include "content/public/browser/browser_plugin_guest_delegate.h" +#include "content/public/common/favicon_url.h" #include "content/public/browser/web_contents_delegate.h" #include "content/public/browser/web_contents_observer.h" #include "native_mate/handle.h" +#include "ui/gfx/image/image.h" namespace brightray { class InspectableWebContents; @@ -46,6 +49,7 @@ class WebContents : public mate::EventEmitter, void LoadURL(const GURL& url, const mate::Dictionary& options); GURL GetURL() const; base::string16 GetTitle() const; + gfx::Image GetFavicon() const; bool IsLoading() const; bool IsWaitingForResponse() const; void Stop(); @@ -175,6 +179,8 @@ class WebContents : public mate::EventEmitter, void NavigationEntryCommitted( const content::LoadCommittedDetails& load_details) override; void TitleWasSet(content::NavigationEntry* entry, bool explicit_set) override; + void DidUpdateFaviconURL( + const std::vector& urls) override; // content::BrowserPluginGuestDelegate: void DidAttach(int guest_proxy_routing_id) final; diff --git a/atom/browser/lib/guest-view-manager.coffee b/atom/browser/lib/guest-view-manager.coffee index 51fb9424670f..6fc70131decb 100644 --- a/atom/browser/lib/guest-view-manager.coffee +++ b/atom/browser/lib/guest-view-manager.coffee @@ -16,6 +16,7 @@ supportedWebViewEvents = [ 'crashed' 'destroyed' 'page-title-set' + 'page-favicon-updated' ] nextInstanceId = 0 diff --git a/atom/renderer/lib/web-view/guest-view-internal.coffee b/atom/renderer/lib/web-view/guest-view-internal.coffee index 345491030147..402bb5c7fa00 100644 --- a/atom/renderer/lib/web-view/guest-view-internal.coffee +++ b/atom/renderer/lib/web-view/guest-view-internal.coffee @@ -18,6 +18,7 @@ WEB_VIEW_EVENTS = 'crashed': [] 'destroyed': [] 'page-title-set': ['title', 'explicitSet'] + 'page-favicon-updated': ['favicons'] dispatchEvent = (webView, event, args...) -> throw new Error("Unkown event #{event}") unless WEB_VIEW_EVENTS[event]? diff --git a/atom/renderer/lib/web-view/web-view.coffee b/atom/renderer/lib/web-view/web-view.coffee index 3058863f7b52..38c9e761f3db 100644 --- a/atom/renderer/lib/web-view/web-view.coffee +++ b/atom/renderer/lib/web-view/web-view.coffee @@ -276,6 +276,13 @@ registerWebViewElement = -> remote.getGuestWebContents(internal.guestInstanceId)[m] args... proto[m] = createHandler m for m in methods + # Return dataUrl instead of nativeImage. + proto.getFavicon = (args...) -> + internal = v8Util.getHiddenValue this, 'internal' + return unless internal + favicon = remote.getGuestWebContents(internal.guestInstanceId)['getFavicon'] args... + favicon.toDataUrl() + window.WebView = webFrame.registerEmbedderCustomElement 'webview', prototype: proto diff --git a/docs/api/browser-window.md b/docs/api/browser-window.md index cb6f9076c793..8e6262e9275a 100644 --- a/docs/api/browser-window.md +++ b/docs/api/browser-window.md @@ -662,6 +662,13 @@ Emitted when details regarding a requested resource is available. Emitted when a redirect was received while requesting a resource. +### Event: 'page-favicon-updated' + +* `event` Event +* `favicons` Array - Array of Urls + +Emitted when page receives favicon urls. + ### Event: 'new-window' * `event` Event @@ -713,6 +720,10 @@ Returns URL of current web page. Returns the title of web page. +### WebContents.getFavicon() + +Returns the favicon of web page as [NativeImage](native-image.md). + ### WebContents.isLoading() Returns whether web page is still loading resources. diff --git a/docs/api/web-view-tag.md b/docs/api/web-view-tag.md index f8e5cf86f717..ca8c024ccc47 100644 --- a/docs/api/web-view-tag.md +++ b/docs/api/web-view-tag.md @@ -130,6 +130,10 @@ Returns URL of guest page. Returns the title of guest page. +### ``.getFavicon() + +Returns the favicon of guest page as dataUrl. + ### ``.isLoading() Returns whether guest page is still loading resources. @@ -330,6 +334,12 @@ Fired when a redirect was received while requesting a resource. Fired when page title is set during navigation. `explicitSet` is false when title is synthesised from file url. +### page-favicon-updated + +* `favicons` Array - Array of Urls + +Fired when page receives favicon urls. + ### console-message * `level` Integer diff --git a/spec/fixtures/pages/a.html b/spec/fixtures/pages/a.html index a471ad292d87..568973aed1cf 100644 --- a/spec/fixtures/pages/a.html +++ b/spec/fixtures/pages/a.html @@ -1,4 +1,6 @@ + +