const { expect } = require('chai') const { webFrame } = require('electron') describe('webFrame module', function () { it('top is self for top frame', () => { expect(webFrame.top.context).to.equal(webFrame.context) }) it('opener is null for top frame', () => { expect(webFrame.opener).to.be.null() }) it('firstChild is null for top frame', () => { expect(webFrame.firstChild).to.be.null() }) it('getFrameForSelector() does not crash when not found', () => { expect(webFrame.getFrameForSelector('unexist-selector')).to.be.null() }) it('findFrameByName() does not crash when not found', () => { expect(webFrame.findFrameByName('unexist-name')).to.be.null() }) it('findFrameByRoutingId() does not crash when not found', () => { expect(webFrame.findFrameByRoutingId(-1)).to.be.null() }) describe('executeJavaScript', () => { let childFrameElement, childFrame before(() => { childFrameElement = document.createElement('iframe') document.body.appendChild(childFrameElement) childFrame = webFrame.firstChild }) after(() => { childFrameElement.remove() }) it('executeJavaScript() yields results via a promise and a sync callback', done => { let callbackResult, callbackError childFrame .executeJavaScript('1 + 1', (result, error) => { callbackResult = result callbackError = error }) .then( promiseResult => { expect(promiseResult).to.equal(2) done() }, promiseError => { done(promiseError) } ) expect(callbackResult).to.equal(2) expect(callbackError).to.be.undefined() }) it('executeJavaScriptInIsolatedWorld() yields results via a promise and a sync callback', done => { let callbackResult, callbackError childFrame .executeJavaScriptInIsolatedWorld(999, [{ code: '1 + 1' }], (result, error) => { callbackResult = result callbackError = error }) .then( promiseResult => { expect(promiseResult).to.equal(2) done() }, promiseError => { done(promiseError) } ) expect(callbackResult).to.equal(2) expect(callbackError).to.be.undefined() }) it('executeJavaScript() yields errors via a promise and a sync callback', done => { let callbackResult, callbackError childFrame .executeJavaScript('thisShouldProduceAnError()', (result, error) => { callbackResult = result callbackError = error }) .then( promiseResult => { done(new Error('error is expected')) }, promiseError => { expect(promiseError).to.be.an('error') done() } ) expect(callbackResult).to.be.undefined() expect(callbackError).to.be.an('error') }) // executeJavaScriptInIsolatedWorld is failing to detect exec errors and is neither // rejecting nor passing the error to the callback. This predates the reintroduction // of the callback so will not be fixed as part of the callback PR // if/when this is fixed the test can be uncommented. // // it('executeJavaScriptInIsolatedWorld() yields errors via a promise and a sync callback', done => { // let callbackResult, callbackError // // childFrame // .executeJavaScriptInIsolatedWorld(999, [{ code: 'thisShouldProduceAnError()' }], (result, error) => { // callbackResult = result // callbackError = error // }) // .then( // promiseResult => { // done(new Error('error is expected')) // }, // promiseError => { // expect(promiseError).to.be.an('error') // done() // } // ) // // expect(callbackResult).to.be.undefined() // expect(callbackError).to.be.an('error') // }) it('executeJavaScript(InIsolatedWorld) can be used without a callback', async () => { expect(await webFrame.executeJavaScript('1 + 1')).to.equal(2) expect(await webFrame.executeJavaScriptInIsolatedWorld(999, [{ code: '1 + 1' }])).to.equal(2) }) }) })