test: move some BrowserWindow specs to the main runner (#18551)

This commit is contained in:
Jeremy Apthorp 2019-06-03 15:10:58 -07:00 committed by GitHub
parent cf628d9287
commit 901cdb22e3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 564 additions and 442 deletions

View file

@ -113,374 +113,6 @@ describe('BrowserWindow module', () => {
afterEach(closeTheWindow)
describe('BrowserWindow constructor', () => {
it('allows passing void 0 as the webContents', async () => {
await openTheWindow({
webContents: void 0
})
})
})
describe('BrowserWindow.close()', () => {
let server
before((done) => {
server = http.createServer((request, response) => {
switch (request.url) {
case '/404':
response.statusCode = '404'
response.end()
break
case '/301':
response.statusCode = '301'
response.setHeader('Location', '/200')
response.end()
break
case '/200':
response.statusCode = '200'
response.end('hello')
break
case '/title':
response.statusCode = '200'
response.end('<title>Hello</title>')
break
default:
done('unsupported endpoint')
}
}).listen(0, '127.0.0.1', () => {
server.url = 'http://127.0.0.1:' + server.address().port
done()
})
})
after(() => {
server.close()
server = null
})
it('should emit unload handler', (done) => {
w.webContents.once('did-finish-load', () => { w.close() })
w.once('closed', () => {
const test = path.join(fixtures, 'api', 'unload')
const content = fs.readFileSync(test)
fs.unlinkSync(test)
expect(String(content)).to.equal('unload')
done()
})
w.loadFile(path.join(fixtures, 'api', 'unload.html'))
})
it('should emit beforeunload handler', (done) => {
w.once('onbeforeunload', () => { done() })
w.webContents.once('did-finish-load', () => { w.close() })
w.loadFile(path.join(fixtures, 'api', 'beforeunload-false.html'))
})
it('should not crash when invoked synchronously inside navigation observer', (done) => {
const events = [
{ name: 'did-start-loading', url: `${server.url}/200` },
{ name: 'dom-ready', url: `${server.url}/200` },
{ name: 'page-title-updated', url: `${server.url}/title` },
{ name: 'did-stop-loading', url: `${server.url}/200` },
{ name: 'did-finish-load', url: `${server.url}/200` },
{ name: 'did-frame-finish-load', url: `${server.url}/200` },
{ name: 'did-fail-load', url: `${server.url}/404` }
]
const responseEvent = 'window-webContents-destroyed'
function * genNavigationEvent () {
let eventOptions = null
while ((eventOptions = events.shift()) && events.length) {
const w = new BrowserWindow({ show: false })
eventOptions.id = w.id
eventOptions.responseEvent = responseEvent
ipcRenderer.send('test-webcontents-navigation-observer', eventOptions)
yield 1
}
}
const gen = genNavigationEvent()
ipcRenderer.on(responseEvent, () => {
if (!gen.next().value) done()
})
gen.next()
})
})
describe('window.close()', () => {
it('should emit unload handler', (done) => {
w.once('closed', () => {
const test = path.join(fixtures, 'api', 'close')
const content = fs.readFileSync(test)
fs.unlinkSync(test)
expect(String(content)).to.equal('close')
done()
})
w.loadFile(path.join(fixtures, 'api', 'close.html'))
})
it('should emit beforeunload handler', (done) => {
w.once('onbeforeunload', () => { done() })
w.loadFile(path.join(fixtures, 'api', 'close-beforeunload-false.html'))
})
})
describe('BrowserWindow.destroy()', () => {
it('prevents users to access methods of webContents', () => {
const contents = w.webContents
w.destroy()
expect(() => {
contents.getProcessId()
}).to.throw('Object has been destroyed')
})
it('should not crash when destroying windows with pending events', (done) => {
const responseEvent = 'destroy-test-completed'
ipcRenderer.on(responseEvent, () => done())
ipcRenderer.send('test-browserwindow-destroy', { responseEvent })
})
})
describe('BrowserWindow.loadURL(url)', () => {
it('should emit did-start-loading event', (done) => {
w.webContents.on('did-start-loading', () => { done() })
w.loadURL('about:blank')
})
it('should emit ready-to-show event', (done) => {
w.on('ready-to-show', () => { done() })
w.loadURL('about:blank')
})
it('should emit did-fail-load event for files that do not exist', (done) => {
w.webContents.on('did-fail-load', (event, code, desc, url, isMainFrame) => {
expect(code).to.equal(-6)
expect(desc).to.equal('ERR_FILE_NOT_FOUND')
expect(isMainFrame).to.be.true()
done()
})
w.loadURL('file://a.txt')
})
it('should emit did-fail-load event for invalid URL', (done) => {
w.webContents.on('did-fail-load', (event, code, desc, url, isMainFrame) => {
expect(desc).to.equal('ERR_INVALID_URL')
expect(code).to.equal(-300)
expect(isMainFrame).to.be.true()
done()
})
w.loadURL('http://example:port')
})
it('should set `mainFrame = false` on did-fail-load events in iframes', (done) => {
w.webContents.on('did-fail-load', (event, code, desc, url, isMainFrame) => {
expect(isMainFrame).to.be.false()
done()
})
w.loadFile(path.join(fixtures, 'api', 'did-fail-load-iframe.html'))
})
it('does not crash in did-fail-provisional-load handler', (done) => {
w.webContents.once('did-fail-provisional-load', () => {
w.loadURL('http://127.0.0.1:11111')
done()
})
w.loadURL('http://127.0.0.1:11111')
})
it('should emit did-fail-load event for URL exceeding character limit', (done) => {
w.webContents.on('did-fail-load', (event, code, desc, url, isMainFrame) => {
expect(desc).to.equal('ERR_INVALID_URL')
expect(code).to.equal(-300)
expect(isMainFrame).to.be.true()
done()
})
const data = Buffer.alloc(2 * 1024 * 1024).toString('base64')
w.loadURL(`data:image/png;base64,${data}`)
})
it('should return a promise', () => {
const p = w.loadURL('about:blank')
expect(p).to.have.property('then')
})
it('should return a promise that resolves', async () => {
expect(w.loadURL('about:blank')).to.eventually.be.fulfilled()
})
it('should return a promise that rejects on a load failure', async () => {
const data = Buffer.alloc(2 * 1024 * 1024).toString('base64')
const p = w.loadURL(`data:image/png;base64,${data}`)
await expect(p).to.eventually.be.rejected()
})
it('should return a promise that resolves even if pushState occurs during navigation', async () => {
const data = Buffer.alloc(2 * 1024 * 1024).toString('base64')
const p = w.loadURL('data:text/html,<script>window.history.pushState({}, "/foo")</script>')
await expect(p).to.eventually.be.fulfilled()
})
describe('POST navigations', () => {
afterEach(() => { w.webContents.session.webRequest.onBeforeSendHeaders(null) })
it('supports specifying POST data', async () => {
await w.loadURL(server.url, { postData: postData })
})
it('sets the content type header on URL encoded forms', async () => {
await w.loadURL(server.url)
const requestDetails = new Promise(resolve => {
w.webContents.session.webRequest.onBeforeSendHeaders((details, callback) => {
resolve(details)
})
})
w.webContents.executeJavaScript(`
form = document.createElement('form')
document.body.appendChild(form)
form.method = 'POST'
form.target = '_blank'
form.submit()
`)
const details = await requestDetails
expect(details.requestHeaders['content-type']).to.equal('application/x-www-form-urlencoded')
})
it('sets the content type header on multi part forms', async () => {
await w.loadURL(server.url)
const requestDetails = new Promise(resolve => {
w.webContents.session.webRequest.onBeforeSendHeaders((details, callback) => {
resolve(details)
})
})
w.webContents.executeJavaScript(`
form = document.createElement('form')
document.body.appendChild(form)
form.method = 'POST'
form.target = '_blank'
form.enctype = 'multipart/form-data'
file = document.createElement('input')
file.type = 'file'
file.name = 'file'
form.appendChild(file)
form.submit()
`)
const details = await requestDetails
expect(details.requestHeaders['content-type'].startsWith('multipart/form-data; boundary=----WebKitFormBoundary')).to.be.true()
})
})
it('should support support base url for data urls', (done) => {
ipcMain.once('answer', (event, test) => {
expect(test).to.equal('test')
done()
})
w.loadURL('data:text/html,<script src="loaded-from-dataurl.js"></script>', { baseURLForDataURL: `file://${path.join(fixtures, 'api')}${path.sep}` })
})
})
describe('will-navigate event', () => {
it('allows the window to be closed from the event listener', (done) => {
ipcRenderer.send('close-on-will-navigate', w.id)
ipcRenderer.once('closed-on-will-navigate', () => { done() })
w.loadFile(path.join(fixtures, 'pages', 'will-navigate.html'))
})
})
describe('will-redirect event', () => {
it('is emitted on redirects', (done) => {
w.webContents.on('will-redirect', (event, url) => {
done()
})
w.loadURL(`${server.url}/302`)
})
it('is emitted after will-navigate on redirects', (done) => {
let navigateCalled = false
w.webContents.on('will-navigate', () => {
navigateCalled = true
})
w.webContents.on('will-redirect', (event, url) => {
expect(navigateCalled).to.equal(true, 'should have called will-navigate first')
done()
})
w.loadURL(`${server.url}/navigate-302`)
})
it('is emitted before did-stop-loading on redirects', (done) => {
let stopCalled = false
w.webContents.on('did-stop-loading', () => {
stopCalled = true
})
w.webContents.on('will-redirect', (event, url) => {
expect(stopCalled).to.equal(false, 'should not have called did-stop-loading first')
done()
})
w.loadURL(`${server.url}/302`)
})
it('allows the window to be closed from the event listener', (done) => {
ipcRenderer.send('close-on-will-redirect', w.id)
ipcRenderer.once('closed-on-will-redirect', () => { done() })
w.loadURL(`${server.url}/302`)
})
it.skip('can be prevented', (done) => {
ipcRenderer.send('prevent-will-redirect', w.id)
w.webContents.on('will-navigate', (e, url) => {
expect(url).to.equal(`${server.url}/302`)
})
w.webContents.on('did-stop-loading', () => {
expect(w.webContents.getURL()).to.equal(
`${server.url}/navigate-302`,
'url should not have changed after navigation event'
)
done()
})
w.webContents.on('will-redirect', (e, url) => {
expect(url).to.equal(`${server.url}/200`)
})
w.loadURL(`${server.url}/navigate-302`)
})
})
describe('BrowserWindow.show()', () => {
before(function () {
if (isCI) {
this.skip()
}
})
it('should focus on window', () => {
w.show()
expect(w.isFocused()).to.be.true()
})
it('should make the window visible', () => {
w.show()
expect(w.isVisible()).to.be.true()
})
it('emits when window is shown', (done) => {
w.once('show', () => {
expect(w.isVisible()).to.be.true()
done()
})
w.show()
})
})
describe('BrowserWindow.hide()', () => {
before(function () {
if (isCI) {
this.skip()
}
})
it('should defocus on window', () => {
w.hide()
expect(w.isFocused()).to.be.false()
})
it('should make the window not visible', () => {
w.show()
w.hide()
expect(w.isVisible()).to.be.false()
})
it('emits when window is hidden', (done) => {
w.show()
w.once('hide', () => {
expect(w.isVisible()).to.be.false()
done()
})
w.hide()
})
})
describe('BrowserWindow.showInactive()', () => {
it('should not focus on window', () => {
w.showInactive()