From 0a7a4c0d0a58bdc6cc3a060fb3a807c2fccd5686 Mon Sep 17 00:00:00 2001 From: Robo Date: Wed, 5 Aug 2015 17:20:23 +0530 Subject: [PATCH] webview: adding load-commit event --- atom/browser/lib/guest-view-manager.coffee | 1 + atom/browser/web_view_guest_delegate.cc | 8 ++++++++ atom/browser/web_view_guest_delegate.h | 3 +++ atom/renderer/lib/web-view/guest-view-internal.coffee | 2 ++ atom/renderer/lib/web-view/web-view-attributes.coffee | 2 +- atom/renderer/lib/web-view/web-view.coffee | 6 +++--- docs/api/web-view-tag.md | 9 +++++++++ 7 files changed, 27 insertions(+), 4 deletions(-) diff --git a/atom/browser/lib/guest-view-manager.coffee b/atom/browser/lib/guest-view-manager.coffee index 4385d389c39..971c15cb1b8 100644 --- a/atom/browser/lib/guest-view-manager.coffee +++ b/atom/browser/lib/guest-view-manager.coffee @@ -3,6 +3,7 @@ webContents = require 'web-contents' webViewManager = null # Doesn't exist in early initialization. supportedWebViewEvents = [ + 'load-commit' 'did-finish-load' 'did-fail-load' 'did-frame-finish-load' diff --git a/atom/browser/web_view_guest_delegate.cc b/atom/browser/web_view_guest_delegate.cc index 98fa72da22d..38f4da4c1f9 100644 --- a/atom/browser/web_view_guest_delegate.cc +++ b/atom/browser/web_view_guest_delegate.cc @@ -5,7 +5,9 @@ #include "atom/browser/web_view_guest_delegate.h" #include "atom/browser/api/atom_api_web_contents.h" +#include "atom/common/native_mate_converters/gurl_converter.h" #include "content/public/browser/guest_host.h" +#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/render_widget_host_view.h" @@ -128,6 +130,12 @@ void WebViewGuestDelegate::RenderViewReady() { render_view_host_view->SetBackgroundColor(SK_ColorTRANSPARENT); } +void WebViewGuestDelegate::DidCommitProvisionalLoadForFrame( + content::RenderFrameHost* render_frame_host, + const GURL& url, ui::PageTransition transition_type) { + api_web_contents_->Emit("load-commit", url, !render_frame_host->GetParent()); +} + void WebViewGuestDelegate::DidAttach(int guest_proxy_routing_id) { api_web_contents_->Emit("did-attach"); } diff --git a/atom/browser/web_view_guest_delegate.h b/atom/browser/web_view_guest_delegate.h index 267b5b248af..3312b46104a 100644 --- a/atom/browser/web_view_guest_delegate.h +++ b/atom/browser/web_view_guest_delegate.h @@ -59,6 +59,9 @@ class WebViewGuestDelegate : public content::BrowserPluginGuestDelegate, protected: // content::WebContentsObserver: void RenderViewReady() override; + void DidCommitProvisionalLoadForFrame( + content::RenderFrameHost* render_frame_host, + const GURL& url, ui::PageTransition transition_type) override; // content::BrowserPluginGuestDelegate: void DidAttach(int guest_proxy_routing_id) final; diff --git a/atom/renderer/lib/web-view/guest-view-internal.coffee b/atom/renderer/lib/web-view/guest-view-internal.coffee index b62418d146d..44db5e304db 100644 --- a/atom/renderer/lib/web-view/guest-view-internal.coffee +++ b/atom/renderer/lib/web-view/guest-view-internal.coffee @@ -4,6 +4,7 @@ webFrame = require 'web-frame' requestId = 0 WEB_VIEW_EVENTS = + 'load-commit': ['url', 'isMainFrame'] 'did-finish-load': [] 'did-fail-load': ['errorCode', 'errorDescription'] 'did-frame-finish-load': ['isMainFrame'] @@ -32,6 +33,7 @@ dispatchEvent = (webView, event, args...) -> for f, i in WEB_VIEW_EVENTS[event] domEvent[f] = args[i] webView.dispatchEvent domEvent + webView.onLoadCommit domEvent if event == 'load-commit' module.exports = registerEvents: (webView, viewInstanceId) -> diff --git a/atom/renderer/lib/web-view/web-view-attributes.coffee b/atom/renderer/lib/web-view/web-view-attributes.coffee index 82229aae57b..acca826a9e3 100644 --- a/atom/renderer/lib/web-view/web-view-attributes.coffee +++ b/atom/renderer/lib/web-view/web-view-attributes.coffee @@ -120,7 +120,7 @@ class SrcAttribute extends WebViewAttribute '' setValueIgnoreMutation: (value) -> - WebViewAttribute::setValueIgnoreMutation value + WebViewAttribute::setValueIgnoreMutation.call(this, value) # takeRecords() is needed to clear queued up src mutations. Without it, it # is possible for this change to get picked up asyncronously by src's # mutation observer |observer|, and then get handled even though we do not diff --git a/atom/renderer/lib/web-view/web-view.coffee b/atom/renderer/lib/web-view/web-view.coffee index eedee732938..35fbe17796f 100644 --- a/atom/renderer/lib/web-view/web-view.coffee +++ b/atom/renderer/lib/web-view/web-view.coffee @@ -157,10 +157,10 @@ class WebViewImpl enumerable: true # Updates state upon loadcommit. - onLoadCommit: (@baseUrlForDataUrl, @currentEntryIndex, @entryCount, @processId, url, isTopLevel) -> + onLoadCommit: (webViewEvent) -> oldValue = @webviewNode.getAttribute webViewConstants.ATTRIBUTE_SRC - newValue = url - if isTopLevel and (oldValue != newValue) + newValue = webViewEvent.url + if webViewEvent.isMainFrame and (oldValue != newValue) # Touching the src attribute triggers a navigation. To avoid # triggering a page reload on every guest-initiated navigation, # we do not handle this mutation diff --git a/docs/api/web-view-tag.md b/docs/api/web-view-tag.md index a74f5fb50c7..07d84324dd4 100644 --- a/docs/api/web-view-tag.md +++ b/docs/api/web-view-tag.md @@ -335,6 +335,15 @@ examples. ## DOM events +### load-commit + +* `url` String +* `isMainFrame` Boolean + +Fired when a load has committed. This includes navigation within the current +document as well as subframe document-level loads, but does not include +asynchronous resource loads. + ### did-finish-load Fired when the navigation is done, i.e. the spinner of the tab will stop