Skip to content
This repository was archived by the owner on Jan 4, 2019. It is now read-only.

Commit cca3034

Browse files
committed
call close instead of destroy on tab remove
fix brave/browser-laptop#4699 auditors: @bbondy @jonathansampson
1 parent a079c99 commit cca3034

File tree

4 files changed

+25
-17
lines changed

4 files changed

+25
-17
lines changed

atom/browser/api/atom_api_web_contents.cc

+1
Original file line numberDiff line numberDiff line change
@@ -2044,6 +2044,7 @@ void WebContents::BuildPrototype(v8::Isolate* isolate,
20442044
.SetMethod("executeScriptInTab", &WebContents::ExecuteScriptInTab)
20452045
.SetMethod("setTabValues", &WebContents::SetTabValues)
20462046
#endif
2047+
.SetMethod("close", &WebContents::CloseContents)
20472048
.SetMethod("autofillSelect", &WebContents::AutofillSelect)
20482049
.SetMethod("autofillPopupHidden", &WebContents::AutofillPopupHidden)
20492050
.SetProperty("session", &WebContents::Session)

atom/common/api/resources/tabs_bindings.js

+10-8
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,12 @@ var bindings = {
166166

167167
remove: function (tabIds, cb) {
168168
var responseId = ++id
169-
cb && ipc.once('chrome-tabs-remove-response-' + responseId, function (evt) {
170-
cb()
169+
cb && ipc.once('chrome-tabs-remove-response-' + responseId, function (evt, error) {
170+
if (error) {
171+
lastError.run('tabs.remove', error, '', cb)
172+
} else {
173+
cb()
174+
}
171175
})
172176
ipc.send('chrome-tabs-remove', responseId, tabIds)
173177
},
@@ -189,12 +193,10 @@ var bindings = {
189193
throw 'executeScript: must specify tab id'
190194
}
191195
cb && ipc.once('chrome-tabs-execute-script-response-' + responseId, function (evt, error, on_url, results) {
192-
try {
193-
if (error)
194-
lastError.set('tabs.executeScript', error, null, chrome);
195-
cb(results);
196-
} finally {
197-
lastError.clear(chrome);
196+
if (error) {
197+
lastError.run('tabs.executeScript', error, '', cb, results)
198+
} else {
199+
cb(results)
198200
}
199201
})
200202
ipc.send('chrome-tabs-execute-script', responseId, extensionId, tabId, details)

lib/browser/api/extensions.js

+12-8
Original file line numberDiff line numberDiff line change
@@ -245,17 +245,16 @@ var createTab = function (createProperties, sender, responseId) {
245245
}
246246

247247
var removeTabs = function (tabIds) {
248-
Array(tabIds).forEach((tabId) => {
248+
for (let tabId of tabIds) {
249249
var webContents = getWebContentsForTab(tabId)
250250
if (webContents) {
251251
if (webContents.isGuest()) {
252-
webContents.destroy()
253-
} else {
254-
var win = BrowserWindow.fromWebContents(webContents)
255-
win && win.close()
252+
webContents.close(webContents)
256253
}
254+
} else {
255+
return 'No tab with id: ' + tabId
257256
}
258-
})
257+
}
259258
}
260259

261260
var updateTab = function (tabId, updateProperties) {
@@ -437,8 +436,13 @@ ipcMain.on('chrome-tabs-create', function (evt, responseId, createProperties) {
437436
})
438437

439438
ipcMain.on('chrome-tabs-remove', function (evt, responseId, tabIds) {
440-
removeTabs(tabIds)
441-
evt.sender.send('chrome-tabs-remove-' + responseId)
439+
let senderTabId = evt.sender.getId()
440+
tabIds = Array.isArray(tabIds) ? tabIds : [tabIds]
441+
let error = removeTabs(tabIds)
442+
// only send the response if the sender tab was not removed
443+
if (tabIds.indexOf(senderTabId) === -1) {
444+
evt.sender.send('chrome-tabs-remove-response-' + responseId, error)
445+
}
442446
})
443447

444448
ipcMain.on('chrome-tabs-get-current', function (evt, responseId) {

lib/renderer/web-view/web-view.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,8 @@ var registerWebViewElement = function () {
447447
'zoomReset',
448448
'getZoomPercent',
449449
'enablePreferredSizeMode',
450-
'getPreferredSize'
450+
'getPreferredSize',
451+
'close'
451452
]
452453
nonblockMethods = [
453454
'insertCSS',

0 commit comments

Comments
 (0)