diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 782e5893f459..52c6735dfff0 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -23,7 +23,22 @@ WebContents::WebContents(content::WebContents* web_contents) WebContents::~WebContents() { } +void WebContents::RenderViewDeleted(content::RenderViewHost*) { + base::ListValue args; + args.AppendInteger(GetProcessID()); + args.AppendInteger(GetRoutingID()); + Emit("render-view-deleted", args); +} + +void WebContents::RenderProcessGone(base::TerminationStatus status) { + Emit("crashed"); +} + void WebContents::WebContentsDestroyed(content::WebContents*) { + // The RenderViewDeleted is not called when the WebContents is destroyed + // directly. + RenderViewDeleted(web_contents_->GetRenderViewHost()); + web_contents_ = NULL; } diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index b15b604903ad..e9a22a00b720 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -39,6 +39,8 @@ class WebContents : public mate::EventEmitter, v8::Isolate* isolate) OVERRIDE; // content::WebContentsObserver implementations: + virtual void RenderViewDeleted(content::RenderViewHost*) OVERRIDE; + virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE; virtual void WebContentsDestroyed(content::WebContents*) OVERRIDE; private: diff --git a/atom/browser/api/atom_api_window.cc b/atom/browser/api/atom_api_window.cc index c0a9d1f58796..24bd64811e12 100644 --- a/atom/browser/api/atom_api_window.cc +++ b/atom/browser/api/atom_api_window.cc @@ -115,17 +115,6 @@ void Window::OnRendererResponsive() { Emit("responsive"); } -void Window::OnRenderViewDeleted(int process_id, int routing_id) { - base::ListValue args; - args.AppendInteger(process_id); - args.AppendInteger(routing_id); - Emit("render-view-deleted", args); -} - -void Window::OnRendererCrashed() { - Emit("crashed"); -} - // static mate::Wrappable* Window::New(mate::Arguments* args, const base::DictionaryValue& options) { @@ -425,8 +414,8 @@ void Window::BuildPrototype(v8::Isolate* isolate, .SetMethod("blurWebView", &Window::BlurWebView) .SetMethod("isWebViewFocused", &Window::IsWebViewFocused) .SetMethod("capturePage", &Window::CapturePage) - .SetMethod("getWebContents", &Window::GetWebContents) - .SetMethod("getDevToolsWebContents", &Window::GetDevToolsWebContents) + .SetMethod("_getWebContents", &Window::GetWebContents) + .SetMethod("_getDevToolsWebContents", &Window::GetDevToolsWebContents) .SetMethod("loadUrl", &Window::LoadURL) .SetMethod("canGoBack", &Window::CanGoBack) .SetMethod("canGoForward", &Window::CanGoForward) diff --git a/atom/browser/api/atom_api_window.h b/atom/browser/api/atom_api_window.h index d119f965724c..1cf9169a9f37 100644 --- a/atom/browser/api/atom_api_window.h +++ b/atom/browser/api/atom_api_window.h @@ -56,8 +56,6 @@ class Window : public mate::EventEmitter, virtual void OnWindowBlur() OVERRIDE; virtual void OnRendererUnresponsive() OVERRIDE; virtual void OnRendererResponsive() OVERRIDE; - virtual void OnRenderViewDeleted(int process_id, int routing_id) OVERRIDE; - virtual void OnRendererCrashed() OVERRIDE; private: // APIs for NativeWindow. diff --git a/atom/browser/api/lib/browser-window.coffee b/atom/browser/api/lib/browser-window.coffee index 04b0a6f4ea33..8db7680ad2e2 100644 --- a/atom/browser/api/lib/browser-window.coffee +++ b/atom/browser/api/lib/browser-window.coffee @@ -14,19 +14,13 @@ BrowserWindow::_init = -> menu = app.getApplicationMenu() @setMenu menu if menu? - # Define getter for webContents. - webContents = null - @__defineGetter__ 'webContents', -> - webContents ?= @getWebContents() - # Return null if webContents is destroyed. - webContents = null unless webContents?.isAlive() - webContents + @webContents = @getWebContents() - # And devToolsWebContents. + # Define getter for devToolsWebContents. devToolsWebContents = null @__defineGetter__ 'devToolsWebContents', -> if @isDevToolsOpened() - # Get the new devToolsWebContents if previous one has been destroyed, it + # Get a new devToolsWebContents if previous one has been destroyed, it # could happen when the devtools has been closed and then reopened. devToolsWebContents = null unless devToolsWebContents?.isAlive() devToolsWebContents ?= @getDevToolsWebContents() @@ -43,12 +37,23 @@ BrowserWindow::_init = -> # Tell the rpc server that a render view has been deleted and we need to # release all objects owned by it. - @on 'render-view-deleted', (event, processId, routingId) -> + @webContents.on 'render-view-deleted', (event, processId, routingId) -> process.emit 'ATOM_BROWSER_RELEASE_RENDER_VIEW', processId, routingId BrowserWindow::toggleDevTools = -> if @isDevToolsOpened() then @closeDevTools() else @openDevTools() +BrowserWindow::getWebContents = -> + webContents = @_getWebContents() + webContents.__proto__ = EventEmitter.prototype + webContents + +BrowserWindow::getDevToolsWebContents = -> + webContents = @_getDevToolsWebContents() + webContents.__proto__ = EventEmitter.prototype + webContents = null unless webContents.isAlive() + webContents + BrowserWindow::restart = -> @loadUrl(@getUrl()) diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index c695b6aaac64..8e1daa4dfa0b 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -300,14 +300,6 @@ void NativeWindow::DestroyWebContents() { if (!inspectable_web_contents_) return; - // The OnRenderViewDeleted is not called when the WebContents is destroyed - // directly (e.g. when closing the window), so we make sure it's always - // emitted to users by sending it before window is closed.. - FOR_EACH_OBSERVER(NativeWindowObserver, observers_, - OnRenderViewDeleted( - GetWebContents()->GetRenderProcessHost()->GetID(), - GetWebContents()->GetRoutingID())); - inspectable_web_contents_.reset(); } @@ -477,16 +469,6 @@ void NativeWindow::RendererResponsive(content::WebContents* source) { FOR_EACH_OBSERVER(NativeWindowObserver, observers_, OnRendererResponsive()); } -void NativeWindow::RenderViewDeleted(content::RenderViewHost* rvh) { - FOR_EACH_OBSERVER(NativeWindowObserver, observers_, - OnRenderViewDeleted(rvh->GetProcess()->GetID(), - rvh->GetRoutingID())); -} - -void NativeWindow::RenderProcessGone(base::TerminationStatus status) { - FOR_EACH_OBSERVER(NativeWindowObserver, observers_, OnRendererCrashed()); -} - void NativeWindow::BeforeUnloadFired(const base::TimeTicks& proceed_time) { // Do nothing, we override this method just to avoid compilation error since // there are two virtual functions named BeforeUnloadFired. diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index 7c97bfe28006..ba8beecb78eb 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -229,8 +229,6 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate, virtual void RendererResponsive(content::WebContents* source) OVERRIDE; // Implementations of content::WebContentsObserver. - virtual void RenderViewDeleted(content::RenderViewHost*) OVERRIDE; - virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE; virtual void BeforeUnloadFired(const base::TimeTicks& proceed_time) OVERRIDE; virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; diff --git a/atom/browser/native_window_observer.h b/atom/browser/native_window_observer.h index 5d697480050f..52700e5bfe65 100644 --- a/atom/browser/native_window_observer.h +++ b/atom/browser/native_window_observer.h @@ -34,12 +34,6 @@ class NativeWindowObserver { // Called when renderer recovers. virtual void OnRendererResponsive() {} - - // Called when a render view has been deleted. - virtual void OnRenderViewDeleted(int process_id, int routing_id) {} - - // Called when renderer has crashed. - virtual void OnRendererCrashed() {} }; } // namespace atom