webview: will-navigate and page-favicon-set navigation events
authordeepak1556 <hop2deep@gmail.com>
Fri, 17 Apr 2015 19:55:31 +0000 (01:25 +0530)
committerdeepak1556 <hop2deep@gmail.com>
Sat, 25 Apr 2015 04:20:28 +0000 (09:50 +0530)
atom/browser/api/atom_api_web_contents.cc
atom/browser/api/atom_api_web_contents.h
atom/browser/lib/guest-view-manager.coffee
atom/renderer/lib/web-view/guest-view-internal.coffee
atom/renderer/lib/web-view/web-view-attributes.coffee
docs/api/browser-window.md
docs/api/web-view-tag.md
spec/fixtures/pages/a.html
spec/webview-spec.coffee

index 95e99cf..dd69a4e 100644 (file)
@@ -256,6 +256,19 @@ void WebContents::TitleWasSet(content::NavigationEntry* entry,
   Emit("page-title-set", entry->GetTitle(), explicit_set);
 }
 
+void WebContents::DidUpdateFaviconURL(
+    const std::vector<content::FaviconURL>& urls) {
+  std::set<GURL> 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)
index 2578c5c..384cf29 100644 (file)
@@ -6,10 +6,13 @@
 #define ATOM_BROWSER_API_ATOM_API_WEB_CONTENTS_H_
 
 #include <string>
+#include <vector>
+#include <set>
 
 #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<content::FaviconURL>& urls) override;
 
   // content::BrowserPluginGuestDelegate:
   void DidAttach(int guest_proxy_routing_id) final;
index 51fb942..a949617 100644 (file)
@@ -16,6 +16,7 @@ supportedWebViewEvents = [
   'crashed'
   'destroyed'
   'page-title-set'
+  'page-favicon-set'
 ]
 
 nextInstanceId = 0
index 3454910..19cca6a 100644 (file)
@@ -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]?
index e4b5dcb..eb801eb 100644 (file)
@@ -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
index cb6f907..62eeb33 100644 (file)
@@ -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
index f8e5cf8..b7572ee 100644 (file)
@@ -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
index a471ad2..568973a 100644 (file)
@@ -1,4 +1,6 @@
 <html>
+<link rel="icon" type="image/png" href="/favicon.png"/>
+<link rel="icon" type="image/png" href="http://test.com/favicon.png"/>
 <body>
 <script type="text/javascript" charset="utf-8">
   console.log('a');
index 55ca8dc..3ac34fd 100644 (file)
@@ -151,3 +151,21 @@ describe '<webview> tag', ->
         done()
       webview.src = "file://#{fixtures}/pages/a.html"
       document.body.appendChild webview
+
+  describe 'will-navigate event', ->
+    it 'is emitted before navigation', (done) ->
+      webview.addEventListener 'will-navigate', (e) ->
+        e.preventDefault()
+        assert.equal webview.src, ''
+        done()
+      webview.src = "file://#{fixtures}/pages/a.html"
+      document.body.appendChild webview
+
+  describe 'page-favicon-set event', ->
+    it 'emits when favicon is set', (done) ->
+      webview.addEventListener 'page-favicon-set', (e) ->
+        assert.equal e.favicons.length, 2
+        assert.equal e.favicons[0], 'file:///favicon.png'
+        done()
+      webview.src = "file://#{fixtures}/pages/a.html"
+      document.body.appendChild webview