diff --git a/lib/common/init.js b/lib/common/init.js index d732352a30514..21d1ac1a930e7 100644 --- a/lib/common/init.js +++ b/lib/common/init.js @@ -1,4 +1,5 @@ const timers = require('timers') +const util = require('util') process.atomBinding = require('./atom-binding-setup')(process.binding, process.type) @@ -28,6 +29,12 @@ if (process.type === 'browser') { // recalculate the timeout in browser process. global.setTimeout = wrapWithActivateUvLoop(timers.setTimeout) global.setInterval = wrapWithActivateUvLoop(timers.setInterval) + + global.setTimeout[util.promisify.custom] = function (timeout) { + return new Promise(resolve => { + global.setTimeout(resolve, timeout) + }) + } } if (process.platform === 'win32') { diff --git a/spec/node-spec.js b/spec/node-spec.js index b87ed189633ad..9bb03494a56ff 100644 --- a/spec/node-spec.js +++ b/spec/node-spec.js @@ -179,6 +179,10 @@ describe('node feature', () => { it('can be scheduled in time', (done) => { remote.getGlobal('setTimeout')(done, 0) }) + + it('can be promisified', (done) => { + remote.getGlobal('setTimeoutPromisified')(0).then(done) + }) }) describe('setInterval called under Chromium event loop in browser process', () => { diff --git a/spec/static/main.js b/spec/static/main.js index d920426df3d95..2715e3f9a2071 100644 --- a/spec/static/main.js +++ b/spec/static/main.js @@ -79,6 +79,8 @@ ipcMain.on('echo', function (event, msg) { event.returnValue = msg }) +global.setTimeoutPromisified = util.promisify(setTimeout) + const coverage = new Coverage({ outputPath: path.join(__dirname, '..', '..', 'out', 'coverage') })