Emit("responsive");
}
+void Window::OnRenderViewDeleted() {
+ Emit("render-view-deleted");
+}
+
void Window::OnRendererCrashed() {
Emit("crashed");
}
virtual void OnWindowBlur() OVERRIDE;
virtual void OnRendererUnresponsive() OVERRIDE;
virtual void OnRendererResponsive() OVERRIDE;
+ virtual void OnRenderViewDeleted() OVERRIDE;
virtual void OnRendererCrashed() OVERRIDE;
private:
menu = app.getApplicationMenu()
@setMenu menu if menu?
+ # 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', ->
+ process.emit 'ATOM_BROWSER_RELEASE_RENDER_VIEW', @getProcessId(), @getRoutingId()
+
BrowserWindow::toggleDevTools = ->
if @isDevToolsOpened() then @closeDevTools() else @openDevTools()
ret = func.apply caller, args
event.returnValue = valueToMeta processId, routingId, ret
+# Send by BrowserWindow when its render view is deleted.
+process.on 'ATOM_BROWSER_RELEASE_RENDER_VIEW', (processId, routingId) ->
+ console.log 'ATOM_BROWSER_RELEASE_RENDER_VIEW', processId, routingId
+ objectsRegistry.clear processId, routingId
+
ipc.on 'ATOM_BROWSER_REQUIRE', (event, processId, routingId, module) ->
try
event.returnValue = valueToMeta processId, routingId, require(module)
catch e
event.returnValue = errorToMeta e
-ipc.on 'ATOM_BROWSER_RELEASE_RENDER_VIEW', (event, processId, routingId) ->
- objectsRegistry.clear processId, routingId
- event.returnValue = null
-
ipc.on 'ATOM_BROWSER_CURRENT_WINDOW', (event, processId, routingId) ->
try
BrowserWindow = require 'browser-window'
if (is_closed_)
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());
+
is_closed_ = true;
FOR_EACH_OBSERVER(NativeWindowObserver, observers_, OnWindowClosed());
return handled;
}
+void NativeWindow::RenderViewDeleted(content::RenderViewHost*) {
+ FOR_EACH_OBSERVER(NativeWindowObserver, observers_, OnRenderViewDeleted());
+}
+
void NativeWindow::RenderViewGone(base::TerminationStatus status) {
FOR_EACH_OBSERVER(NativeWindowObserver, observers_, OnRendererCrashed());
}
virtual void RendererResponsive(content::WebContents* source) OVERRIDE;
// Implementations of content::WebContentsObserver.
+ virtual void RenderViewDeleted(content::RenderViewHost*) OVERRIDE;
virtual void RenderViewGone(base::TerminationStatus status) OVERRIDE;
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
// Called when renderer recovers.
virtual void OnRendererResponsive() {}
+ // Called when a render view has been deleted.
+ virtual void OnRenderViewDeleted() {}
+
// Called when renderer has crashed.
virtual void OnRendererCrashed() {}
};
CallbacksRegistry = require 'callbacks-registry'
v8Util = process.atomBinding 'v8_util'
-currentContextExist = true
callbacksRegistry = new CallbacksRegistry
# Convert the arguments object into an array of meta data.
# Track delegate object's life time, and tell the browser to clean up
# when the object is GCed.
v8Util.setDestructor ret, ->
- return unless currentContextExist
ipc.sendChannel 'ATOM_BROWSER_DEREFERENCE', meta.storeId
# Remember object's id.
ipc.on 'ATOM_RENDERER_RELEASE_CALLBACK', (id) ->
callbacksRegistry.remove id
-# Release all resources of current render view when it's going to be unloaded.
-window.addEventListener 'unload', (event) ->
- currentContextExist = false
- ipc.sendChannelSync 'ATOM_BROWSER_RELEASE_RENDER_VIEW'
-
# Get remote module.
# (Just like node's require, the modules are cached permanently, note that this
# is safe leak since the object is not expected to get freed in browser)