From 5d16257c2d2ed70b74583bd9bbf9f05e73ef994d Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sat, 30 Jan 2016 12:20:28 +0800 Subject: [PATCH 1/2] Fix "Object has been destroyed" error in "page-title-updated" event Close #4249. --- atom/browser/api/lib/browser-window.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/atom/browser/api/lib/browser-window.js b/atom/browser/api/lib/browser-window.js index b71c85a19103..a9649f853d75 100644 --- a/atom/browser/api/lib/browser-window.js +++ b/atom/browser/api/lib/browser-window.js @@ -55,14 +55,16 @@ BrowserWindow.prototype._init = function() { })(this)); // Change window title to page title. - this.webContents.on('page-title-updated', (function(_this) { - return function(event, title) { - _this.emit('page-title-updated', event, title); - if (!event.defaultPrevented) { - return _this.setTitle(title); - } - }; - })(this)); + this.webContents.on('page-title-updated', (event, title) => { + // The page-title-updated event is not emitted immediately (see #3645), so + // when the callback is called the BrowserWindow might have been closed. + if (this.isDestroyed()) + return; + // Route the event to BrowserWindow. + this.emit('page-title-updated', event, title); + if (!event.defaultPrevented) + this.setTitle(title); + }); // Sometimes the webContents doesn't get focus when window is shown, so we have // to force focusing on webContents in this case. The safest way is to focus it From 3f68b2f22780e830296602dc9feaac88aed80e8d Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sat, 30 Jan 2016 12:58:21 +0800 Subject: [PATCH 2/2] Check whether sender is destroyed before calling sender.send Fix #4279. --- atom/browser/lib/rpc-server.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/atom/browser/lib/rpc-server.js b/atom/browser/lib/rpc-server.js index b3e6ddc78322..2f2b739e4a14 100644 --- a/atom/browser/lib/rpc-server.js +++ b/atom/browser/lib/rpc-server.js @@ -162,12 +162,12 @@ var unwrapArgs = function(sender, args) { }); let callIntoRenderer = function(...args) { - if (rendererReleased) + if (rendererReleased || sender.isDestroyed()) throw new Error(`Attempting to call a function in a renderer window that has been closed or released. Function provided here: ${meta.location}.`); sender.send('ATOM_RENDERER_CALLBACK', meta.id, valueToMeta(sender, args)); }; v8Util.setDestructor(callIntoRenderer, function() { - if (!rendererReleased) + if (!rendererReleased && !sender.isDestroyed()) sender.send('ATOM_RENDERER_RELEASE_CALLBACK', meta.id); }); sender.callbacks.set(meta.id, callIntoRenderer);