From cfdca61ad9351e8218becc87651f8c35a07434d6 Mon Sep 17 00:00:00 2001 From: Jeremy Apthorp Date: Wed, 28 Nov 2018 17:50:41 -0800 Subject: [PATCH] more tests --- spec/api-web-contents-spec.js | 91 +++++++++++++++++++++++++++++------ 1 file changed, 76 insertions(+), 15 deletions(-) diff --git a/spec/api-web-contents-spec.js b/spec/api-web-contents-spec.js index ed8e61aa86314..17517ddd73ec5 100644 --- a/spec/api-web-contents-spec.js +++ b/spec/api-web-contents-spec.js @@ -41,16 +41,29 @@ describe('webContents module', () => { describe('loadURL() promise API', () => { it('resolves when done loading', async () => { - await w.loadURL('about:blank') - // assert: no timeout, no exception. + await expect(w.loadURL('about:blank')).to.eventually.be.fulfilled }) it('resolves when done loading a file URL', async () => { - await w.loadFile(path.join(fixtures, 'pages', 'base-page.html')) - // assert: no timeout, no exception. + await expect(w.loadFile(path.join(fixtures, 'pages', 'base-page.html'))).to.eventually.be.fulfilled }) it('rejects when failing to load a file URL', async () => { + await expect(w.loadURL('file:non-existent')).to.eventually.be.rejected + .and.have.property('code', 'ERR_FILE_NOT_FOUND') + }) + + it('rejects when loading fails due to DNS not resolved', async () => { + await expect(w.loadURL('https://err.name.not.resolved')).to.eventually.be.rejected + .and.have.property('code', 'ERR_NAME_NOT_RESOLVED') + }) + + it('rejects when navigation is cancelled due to a bad scheme', async () => { + await expect(w.loadURL('bad-scheme://foo')).to.eventually.be.rejected + .and.have.property('code', 'ERR_FAILED') + }) + + it('sets appropriate error information on rejection', async () => { let err try { await w.loadURL('file:non-existent') @@ -63,17 +76,65 @@ describe('webContents module', () => { expect(err.url).to.eql(process.platform === 'win32' ? 'file://non-existent/' : 'file:///non-existent') }) - it('rejects when loading fails due to DNS not resolved', async () => { - let err - try { - await w.loadURL('https://err.name.not.resolved') - } catch (e) { - err = e - } - expect(err).not.to.be.undefined() - expect(err.code).to.eql('ERR_NAME_NOT_RESOLVED') - expect(err.errno).to.eql(-105) - expect(err.url).to.eql('https://err.name.not.resolved/') + it('rejects if the load is aborted', async () => { + const s = http.createServer((req, res) => { /* never complete the request */ }) + await new Promise(resolve => s.listen(0, '127.0.0.1', resolve)) + const { port } = s.address() + const p = expect(w.loadURL(`http://127.0.0.1:${port}`)).to.eventually.be.rejectedWith(Error, /ERR_ABORTED/) + // load a different file before the first load completes, causing the + // first load to be aborted. + await w.loadFile(path.join(fixtures, 'pages', 'base-page.html')) + await p + s.close() + }) + + it("doesn't reject when a subframe fails to load", async () => { + let resp = null + const s = http.createServer((req, res) => { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.write('') + resp = res + // don't end the response yet + }) + await new Promise(resolve => s.listen(0, '127.0.0.1', resolve)) + const { port } = s.address() + const p = new Promise(resolve => { + w.webContents.on('did-fail-load', (event, errorCode, errorDescription, validatedURL, isMainFrame, frameProcessId, frameRoutingId) => { + if (!isMainFrame) { + resolve() + } + }) + }) + const main = w.loadURL(`http://127.0.0.1:${port}`) + await p + resp.end() + await main + s.close() + }) + + it("doesn't resolve when a subframe loads", async () => { + let resp = null + const s = http.createServer((req, res) => { + res.writeHead(200, { 'Content-Type': 'text/html' }) + res.write('') + resp = res + // don't end the response yet + }) + await new Promise(resolve => s.listen(0, '127.0.0.1', resolve)) + const { port } = s.address() + const p = new Promise(resolve => { + w.webContents.on('did-frame-finish-load', (event, errorCode, errorDescription, validatedURL, isMainFrame, frameProcessId, frameRoutingId) => { + if (!isMainFrame) { + resolve() + } + }) + }) + const main = w.loadURL(`http://127.0.0.1:${port}`) + await p + resp.destroy() // cause the main request to fail + await expect(main).to.eventually.be.rejected + .and.have.property('errno', -355) // ERR_INCOMPLETE_CHUNKED_ENCODING + s.close() }) })