From 9b585458c1283f8b78b298ee98662d492d84f559 Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Sat, 18 Apr 2015 01:25:31 +0530 Subject: [PATCH] webview: will-navigate and page-favicon-set navigation events --- atom/browser/api/atom_api_web_contents.cc | 13 +++++++++++++ atom/browser/api/atom_api_web_contents.h | 5 +++++ atom/browser/lib/guest-view-manager.coffee | 1 + atom/renderer/lib/web-view/guest-view-internal.coffee | 1 + atom/renderer/lib/web-view/web-view-attributes.coffee | 15 ++++++++++++--- docs/api/browser-window.md | 7 +++++++ docs/api/web-view-tag.md | 13 +++++++++++++ spec/fixtures/pages/a.html | 2 ++ spec/webview-spec.coffee | 18 ++++++++++++++++++ 9 files changed, 72 insertions(+), 3 deletions(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 95e99cf..dd69a4e 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -256,6 +256,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-set", unique_urls); +} + bool WebContents::OnMessageReceived(const IPC::Message& message) { bool handled = true; IPC_BEGIN_MESSAGE_MAP(WebContents, message) diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index 2578c5c..384cf29 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -6,10 +6,13 @@ #define ATOM_BROWSER_API_ATOM_API_WEB_CONTENTS_H_ #include +#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" @@ -175,6 +178,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 51fb942..a949617 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-set' ] 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 3454910..19cca6a 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-set': ['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-attributes.coffee b/atom/renderer/lib/web-view/web-view-attributes.coffee index e4b5dcb..eb801eb 100644 --- a/atom/renderer/lib/web-view/web-view-attributes.coffee +++ b/atom/renderer/lib/web-view/web-view-attributes.coffee @@ -154,6 +154,14 @@ class SrcAttribute extends WebViewAttribute not @.getValue() return + domEvent = new Event('will-navigate') + domEvent['url'] = @getValue() + domEvent.cancelable = true + self = @ + domEvent.preventDefault = () -> + self.setValueIgnoreMutation '' + @webViewImpl.webviewNode.dispatchEvent domEvent + unless @webViewImpl.guestInstanceId? if @webViewImpl.beforeFirstNavigation @webViewImpl.beforeFirstNavigation = false @@ -161,9 +169,10 @@ class SrcAttribute extends WebViewAttribute return # Navigate to |this.src|. - httpreferrer = @webViewImpl.attributes[webViewConstants.ATTRIBUTE_HTTPREFERRER].getValue() - urlOptions = if httpreferrer then {httpreferrer} else {} - remote.getGuestWebContents(@webViewImpl.guestInstanceId).loadUrl @getValue(), urlOptions + if @getValue() + httpreferrer = @webViewImpl.attributes[webViewConstants.ATTRIBUTE_HTTPREFERRER].getValue() + urlOptions = if httpreferrer then {httpreferrer} else {} + remote.getGuestWebContents(@webViewImpl.guestInstanceId).loadUrl @getValue(), urlOptions # Attribute specifies HTTP referrer. class HttpReferrerAttribute extends WebViewAttribute diff --git a/docs/api/browser-window.md b/docs/api/browser-window.md index cb6f907..62eeb33 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-set' + +* `event` Event +* `favicons` [String] + +Emitted when page receives favicon urls. + ### Event: 'new-window' * `event` Event diff --git a/docs/api/web-view-tag.md b/docs/api/web-view-tag.md index f8e5cf8..b7572ee 100644 --- a/docs/api/web-view-tag.md +++ b/docs/api/web-view-tag.md @@ -275,6 +275,13 @@ examples. ## DOM events +### will-navigate + +* `url` String + +Fired when view is about to navigate , calling `event.preventDefault()` will +cancel the navigation. + ### did-finish-load Fired when the navigation is done, i.e. the spinner of the tab will stop @@ -330,6 +337,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-set + +* `favicons` [String] + +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 a471ad2..568973a 100644 --- a/spec/fixtures/pages/a.html +++ b/spec/fixtures/pages/a.html @@ -1,4 +1,6 @@ + +