test: tsify session spec (#19604)
This commit is contained in:
Родитель
4b8e1588b4
Коммит
bdc84d0bfb
|
@ -139,9 +139,9 @@ Writes any unwritten DOMStorage data to disk.
|
|||
#### `ses.setProxy(config)`
|
||||
|
||||
* `config` Object
|
||||
* `pacScript` String - The URL associated with the PAC file.
|
||||
* `proxyRules` String - Rules indicating which proxies to use.
|
||||
* `proxyBypassRules` String - Rules indicating which URLs should
|
||||
* `pacScript` String (optional) - The URL associated with the PAC file.
|
||||
* `proxyRules` String (optional) - Rules indicating which proxies to use.
|
||||
* `proxyBypassRules` String (optional) - Rules indicating which URLs should
|
||||
bypass the proxy settings.
|
||||
|
||||
Returns `Promise<void>` - Resolves when the proxy setting process is complete.
|
||||
|
@ -267,7 +267,7 @@ the original network configuration.
|
|||
|
||||
#### `ses.setCertificateVerifyProc(proc)`
|
||||
|
||||
* `proc` Function
|
||||
* `proc` Function | null
|
||||
* `request` Object
|
||||
* `hostname` String
|
||||
* `certificate` [Certificate](structures/certificate.md)
|
||||
|
@ -416,8 +416,8 @@ Returns `Promise<Buffer>` - resolves with blob data.
|
|||
* `mimeType` String (optional)
|
||||
* `offset` Integer - Start range for the download.
|
||||
* `length` Integer - Total length of the download.
|
||||
* `lastModified` String - Last-Modified header value.
|
||||
* `eTag` String - ETag header value.
|
||||
* `lastModified` String (optional) - Last-Modified header value.
|
||||
* `eTag` String (optional) - ETag header value.
|
||||
* `startTime` Double (optional) - Time when download was started in
|
||||
number of seconds since UNIX epoch.
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
"@electron/typescript-definitions": "^8.6.1",
|
||||
"@octokit/rest": "^16.3.2",
|
||||
"@primer/octicons": "^9.1.1",
|
||||
"@types/basic-auth": "^1.1.2",
|
||||
"@types/chai": "^4.1.7",
|
||||
"@types/chai-as-promised": "^7.1.0",
|
||||
"@types/dirty-chai": "^2.0.0",
|
||||
|
@ -15,6 +16,7 @@
|
|||
"@types/fs-extra": "^5.0.5",
|
||||
"@types/mocha": "^5.2.6",
|
||||
"@types/node": "^12.0.10",
|
||||
"@types/send": "^0.14.5",
|
||||
"@types/split": "^1.0.0",
|
||||
"@types/webpack": "^4.4.32",
|
||||
"@types/webpack-env": "^1.13.9",
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
declare var isCI: boolean;
|
||||
declare var standardScheme: string;
|
||||
|
||||
declare namespace Electron {
|
||||
interface Menu {
|
||||
|
@ -17,6 +18,10 @@ declare namespace Electron {
|
|||
getOwnerBrowserWindow(): BrowserWindow;
|
||||
}
|
||||
|
||||
interface Session {
|
||||
destroy(): void;
|
||||
}
|
||||
|
||||
// Experimental views API
|
||||
class TopLevelWindow {
|
||||
constructor(args: {show: boolean})
|
||||
|
|
|
@ -1,23 +1,22 @@
|
|||
const chai = require('chai')
|
||||
const http = require('http')
|
||||
const https = require('https')
|
||||
const path = require('path')
|
||||
const fs = require('fs')
|
||||
const send = require('send')
|
||||
const auth = require('basic-auth')
|
||||
const ChildProcess = require('child_process')
|
||||
const { closeWindow } = require('./window-helpers')
|
||||
const { emittedOnce } = require('./events-helpers')
|
||||
|
||||
const { session, BrowserWindow, net, ipcMain } = require('electron')
|
||||
const { expect } = chai
|
||||
import { expect } from 'chai'
|
||||
import * as http from 'http'
|
||||
import * as https from 'https'
|
||||
import * as path from 'path'
|
||||
import * as fs from 'fs'
|
||||
import * as ChildProcess from 'child_process'
|
||||
import { session, BrowserWindow, net, ipcMain, Session } from 'electron'
|
||||
import * as send from 'send'
|
||||
import * as auth from 'basic-auth'
|
||||
import { closeWindow } from './window-helpers'
|
||||
import { emittedOnce } from './events-helpers'
|
||||
import { AddressInfo } from 'net';
|
||||
|
||||
/* The whole session API doesn't use standard callbacks */
|
||||
/* eslint-disable standard/no-callback-literal */
|
||||
|
||||
describe('session module', () => {
|
||||
const fixtures = path.resolve(__dirname, '..', 'spec', 'fixtures')
|
||||
let w = null
|
||||
let w: BrowserWindow
|
||||
const url = 'http://127.0.0.1'
|
||||
|
||||
beforeEach(() => {
|
||||
|
@ -33,7 +32,7 @@ describe('session module', () => {
|
|||
})
|
||||
|
||||
afterEach(() => {
|
||||
return closeWindow(w).then(() => { w = null })
|
||||
return closeWindow(w).then(() => { w = null as any })
|
||||
})
|
||||
|
||||
describe('session.defaultSession', () => {
|
||||
|
@ -59,15 +58,15 @@ describe('session module', () => {
|
|||
expect(ses2.getUserAgent()).to.not.equal(userAgent)
|
||||
})
|
||||
|
||||
it('created session is ref-counted', () => {
|
||||
it.skip('created session is ref-counted', () => {
|
||||
const partition = 'test2'
|
||||
const userAgent = 'test-agent'
|
||||
const ses1 = session.fromPartition(partition)
|
||||
ses1.userAgent = userAgent
|
||||
expect(ses1.userAgent).to.equal(userAgent)
|
||||
ses1.setUserAgent(userAgent)
|
||||
expect(ses1.getUserAgent()).to.equal(userAgent)
|
||||
ses1.destroy()
|
||||
const ses2 = session.fromPartition(partition)
|
||||
expect(ses2.userAgent).to.not.equal(userAgent)
|
||||
expect(ses2.getUserAgent()).to.not.equal(userAgent)
|
||||
})
|
||||
})
|
||||
|
||||
|
@ -82,7 +81,7 @@ describe('session module', () => {
|
|||
server.close()
|
||||
})
|
||||
await new Promise(resolve => server.listen(0, '127.0.0.1', resolve))
|
||||
const { port } = server.address()
|
||||
const { port } = server.address() as AddressInfo
|
||||
await w.loadURL(`${url}:${port}`)
|
||||
const list = await w.webContents.session.cookies.get({ url })
|
||||
const cookie = list.find(cookie => cookie.name === name)
|
||||
|
@ -144,7 +143,6 @@ describe('session module', () => {
|
|||
|
||||
it.skip('should set cookie for standard scheme', async () => {
|
||||
const { cookies } = session.defaultSession
|
||||
const standardScheme = global.standardScheme
|
||||
const domain = 'fake-host'
|
||||
const url = `${standardScheme}://${domain}`
|
||||
const name = 'custom'
|
||||
|
@ -160,12 +158,9 @@ describe('session module', () => {
|
|||
})
|
||||
|
||||
it('emits a changed event when a cookie is added or removed', async () => {
|
||||
const changes = []
|
||||
|
||||
const { cookies } = session.fromPartition('cookies-changed')
|
||||
const name = 'foo'
|
||||
const value = 'bar'
|
||||
const listener = (event, cookie, cause, removed) => { changes.push({ cookie, cause, removed }) }
|
||||
|
||||
const a = emittedOnce(cookies, 'changed')
|
||||
await cookies.set({ url, name, value, expirationDate: (+new Date()) / 1000 + 120 })
|
||||
|
@ -200,7 +195,7 @@ describe('session module', () => {
|
|||
it('should survive an app restart for persistent partition', async () => {
|
||||
const appPath = path.join(fixtures, 'api', 'cookie-app')
|
||||
|
||||
const runAppWithPhase = (phase) => {
|
||||
const runAppWithPhase = (phase: string) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
let output = ''
|
||||
|
||||
|
@ -253,10 +248,10 @@ describe('session module', () => {
|
|||
})
|
||||
await new Promise(resolve => downloadServer.listen(0, '127.0.0.1', resolve))
|
||||
|
||||
const port = downloadServer.address().port
|
||||
const port = (downloadServer.address() as AddressInfo).port
|
||||
const url = `http://127.0.0.1:${port}/`
|
||||
|
||||
const downloadPrevented = new Promise(resolve => {
|
||||
const downloadPrevented: Promise<Electron.DownloadItem> = new Promise(resolve => {
|
||||
w.webContents.session.once('will-download', function (e, item) {
|
||||
e.preventDefault()
|
||||
resolve(item)
|
||||
|
@ -274,9 +269,9 @@ describe('session module', () => {
|
|||
describe('ses.protocol', () => {
|
||||
const partitionName = 'temp'
|
||||
const protocolName = 'sp'
|
||||
let customSession = null
|
||||
let customSession: Session
|
||||
const protocol = session.defaultSession.protocol
|
||||
const handler = (ignoredError, callback) => {
|
||||
const handler = (ignoredError: any, callback: Function) => {
|
||||
callback({ data: `<script>require('electron').ipcRenderer.send('hello')</script>`, mimeType: 'text/html' })
|
||||
}
|
||||
|
||||
|
@ -295,7 +290,7 @@ describe('session module', () => {
|
|||
|
||||
afterEach(async () => {
|
||||
await customSession.protocol.unregisterProtocol(protocolName)
|
||||
customSession = null
|
||||
customSession = null as any
|
||||
})
|
||||
|
||||
it('does not affect defaultSession', async () => {
|
||||
|
@ -313,8 +308,8 @@ describe('session module', () => {
|
|||
})
|
||||
|
||||
describe('ses.setProxy(options)', () => {
|
||||
let server = null
|
||||
let customSession = null
|
||||
let server: http.Server
|
||||
let customSession: Electron.Session
|
||||
|
||||
beforeEach(async () => {
|
||||
customSession = session.fromPartition('proxyconfig')
|
||||
|
@ -365,7 +360,7 @@ describe('session module', () => {
|
|||
res.end(pac)
|
||||
})
|
||||
await new Promise(resolve => server.listen(0, '127.0.0.1', resolve))
|
||||
const config = { pacScript: `http://127.0.0.1:${server.address().port}` }
|
||||
const config = { pacScript: `http://127.0.0.1:${(server.address() as AddressInfo).port}` }
|
||||
await customSession.setProxy(config)
|
||||
const proxy = await customSession.resolveProxy('https://google.com')
|
||||
expect(proxy).to.equal('PROXY myproxy:8132')
|
||||
|
@ -409,7 +404,7 @@ describe('session module', () => {
|
|||
} else if (request.method === 'POST') {
|
||||
const uuid = request.uploadData[1].blobUUID
|
||||
expect(uuid).to.be.a('string')
|
||||
session.defaultSession.getBlobData(uuid).then(result => {
|
||||
session.defaultSession.getBlobData(uuid!).then(result => {
|
||||
expect(result.toString()).to.equal(postData)
|
||||
done()
|
||||
})
|
||||
|
@ -421,8 +416,8 @@ describe('session module', () => {
|
|||
})
|
||||
})
|
||||
|
||||
describe('ses.setCertificateVerifyProc(callback)', (done) => {
|
||||
let server = null
|
||||
describe('ses.setCertificateVerifyProc(callback)', () => {
|
||||
let server: http.Server
|
||||
|
||||
beforeEach((done) => {
|
||||
const certPath = path.join(fixtures, 'certificates')
|
||||
|
@ -456,7 +451,7 @@ describe('session module', () => {
|
|||
callback(0)
|
||||
})
|
||||
|
||||
await w.loadURL(`https://127.0.0.1:${server.address().port}`)
|
||||
await w.loadURL(`https://127.0.0.1:${(server.address() as AddressInfo).port}`)
|
||||
expect(w.webContents.getTitle()).to.equal('hello')
|
||||
})
|
||||
|
||||
|
@ -476,7 +471,7 @@ describe('session module', () => {
|
|||
callback(-2)
|
||||
})
|
||||
|
||||
const url = `https://127.0.0.1:${server.address().port}`
|
||||
const url = `https://127.0.0.1:${(server.address() as AddressInfo).port}`
|
||||
await expect(w.loadURL(url)).to.eventually.be.rejectedWith(/ERR_FAILED/)
|
||||
expect(w.webContents.getTitle()).to.equal(url)
|
||||
})
|
||||
|
@ -488,7 +483,7 @@ describe('session module', () => {
|
|||
callback(-2)
|
||||
})
|
||||
|
||||
const url = `https://127.0.0.1:${server.address().port}`
|
||||
const url = `https://127.0.0.1:${(server.address() as AddressInfo).port}`
|
||||
await expect(w.loadURL(url), 'first load').to.eventually.be.rejectedWith(/ERR_FAILED/)
|
||||
await emittedOnce(w.webContents, 'did-stop-loading')
|
||||
await expect(w.loadURL(url + '/test'), 'second load').to.eventually.be.rejectedWith(/ERR_FAILED/)
|
||||
|
@ -511,7 +506,7 @@ describe('session module', () => {
|
|||
}
|
||||
})
|
||||
server.listen(0, '127.0.0.1', () => {
|
||||
const port = server.address().port
|
||||
const port = (server.address() as AddressInfo).port
|
||||
function issueLoginRequest (attempt = 1) {
|
||||
if (attempt > 2) {
|
||||
server.close()
|
||||
|
@ -529,7 +524,6 @@ describe('session module', () => {
|
|||
})
|
||||
request.on('response', (response) => {
|
||||
let data = ''
|
||||
response.pause()
|
||||
response.on('data', (chunk) => {
|
||||
data += chunk
|
||||
})
|
||||
|
@ -539,11 +533,10 @@ describe('session module', () => {
|
|||
issueLoginRequest(attempt)
|
||||
})
|
||||
})
|
||||
response.on('error', (error) => { done(error) })
|
||||
response.resume()
|
||||
})
|
||||
response.on('error', (error: any) => { done(error) })
|
||||
});
|
||||
// Internal api to bypass cache for testing.
|
||||
request.urlRequest._setLoadFlags(1 << 1)
|
||||
(request as any).urlRequest._setLoadFlags(1 << 1)
|
||||
request.end()
|
||||
}
|
||||
issueLoginRequest()
|
||||
|
@ -556,11 +549,10 @@ describe('session module', () => {
|
|||
const downloadFilePath = path.join(__dirname, '..', 'fixtures', 'mock.pdf')
|
||||
const protocolName = 'custom-dl'
|
||||
const contentDisposition = 'inline; filename="mock.pdf"'
|
||||
let address = null
|
||||
let downloadServer = null
|
||||
let address: AddressInfo
|
||||
let downloadServer: http.Server
|
||||
before(async () => {
|
||||
downloadServer = http.createServer((req, res) => {
|
||||
address = downloadServer.address()
|
||||
res.writeHead(200, {
|
||||
'Content-Length': mockPDF.length,
|
||||
'Content-Type': 'application/pdf',
|
||||
|
@ -569,15 +561,16 @@ describe('session module', () => {
|
|||
res.end(mockPDF)
|
||||
})
|
||||
await new Promise(resolve => downloadServer.listen(0, '127.0.0.1', resolve))
|
||||
address = downloadServer.address() as AddressInfo
|
||||
})
|
||||
after(async () => {
|
||||
await new Promise(resolve => downloadServer.close(resolve))
|
||||
})
|
||||
|
||||
const isPathEqual = (path1, path2) => {
|
||||
const isPathEqual = (path1: string, path2: string) => {
|
||||
return path.relative(path1, path2) === ''
|
||||
}
|
||||
const assertDownload = (state, item, isCustom = false) => {
|
||||
const assertDownload = (state: string, item: Electron.DownloadItem, isCustom = false) => {
|
||||
expect(state).to.equal('completed')
|
||||
expect(item.getFilename()).to.equal('mock.pdf')
|
||||
expect(path.isAbsolute(item.savePath)).to.equal(true)
|
||||
|
@ -596,7 +589,7 @@ describe('session module', () => {
|
|||
}
|
||||
|
||||
it('can download using WebContents.downloadURL', (done) => {
|
||||
const port = downloadServer.address().port
|
||||
const port = address.port
|
||||
w.webContents.session.once('will-download', function (e, item) {
|
||||
item.savePath = downloadFilePath
|
||||
item.on('done', function (e, state) {
|
||||
|
@ -609,8 +602,8 @@ describe('session module', () => {
|
|||
|
||||
it('can download from custom protocols using WebContents.downloadURL', (done) => {
|
||||
const protocol = session.defaultSession.protocol
|
||||
const port = downloadServer.address().port
|
||||
const handler = (ignoredError, callback) => {
|
||||
const port = address.port
|
||||
const handler = (ignoredError: any, callback: Function) => {
|
||||
callback({ url: `${url}:${port}` })
|
||||
}
|
||||
protocol.registerHttpProtocol(protocolName, handler, (error) => {
|
||||
|
@ -627,17 +620,17 @@ describe('session module', () => {
|
|||
})
|
||||
|
||||
it('can download using WebView.downloadURL', async () => {
|
||||
const port = downloadServer.address().port
|
||||
const port = address.port
|
||||
await w.loadURL('about:blank')
|
||||
function webviewDownload({fixtures, url, port}) {
|
||||
const webview = new WebView()
|
||||
function webviewDownload({fixtures, url, port}: {fixtures: string, url: string, port: string}) {
|
||||
const webview = new (window as any).WebView()
|
||||
webview.addEventListener('did-finish-load', () => {
|
||||
webview.downloadURL(`${url}:${port}/`)
|
||||
})
|
||||
webview.src = `file://${fixtures}/api/blank.html`
|
||||
document.body.appendChild(webview)
|
||||
}
|
||||
const done = new Promise(resolve => {
|
||||
const done: Promise<[string, Electron.DownloadItem]> = new Promise(resolve => {
|
||||
w.webContents.session.once('will-download', function (e, item) {
|
||||
item.savePath = downloadFilePath
|
||||
item.on('done', function (e, state) {
|
||||
|
@ -651,7 +644,7 @@ describe('session module', () => {
|
|||
})
|
||||
|
||||
it('can cancel download', (done) => {
|
||||
const port = downloadServer.address().port
|
||||
const port = address.port
|
||||
w.webContents.session.once('will-download', function (e, item) {
|
||||
item.savePath = downloadFilePath
|
||||
item.on('done', function (e, state) {
|
||||
|
@ -675,7 +668,7 @@ describe('session module', () => {
|
|||
return done()
|
||||
}
|
||||
|
||||
const port = downloadServer.address().port
|
||||
const port = address.port
|
||||
w.webContents.session.once('will-download', function (e, item) {
|
||||
item.savePath = downloadFilePath
|
||||
item.on('done', function (e, state) {
|
||||
|
@ -689,7 +682,7 @@ describe('session module', () => {
|
|||
|
||||
it('can set options for the save dialog', (done) => {
|
||||
const filePath = path.join(__dirname, 'fixtures', 'mock.pdf')
|
||||
const port = downloadServer.address().port
|
||||
const port = address.port
|
||||
const options = {
|
||||
window: null,
|
||||
title: 'title',
|
||||
|
@ -762,13 +755,13 @@ describe('session module', () => {
|
|||
const downloadFilePath = path.join(fixtures, 'logo.png')
|
||||
const rangeServer = http.createServer((req, res) => {
|
||||
const options = { root: fixtures }
|
||||
send(req, req.url, options)
|
||||
.on('error', (error) => { done(error) }).pipe(res)
|
||||
send(req, req.url!, options)
|
||||
.on('error', (error: any) => { throw error }).pipe(res)
|
||||
})
|
||||
try {
|
||||
await new Promise(resolve => rangeServer.listen(0, '127.0.0.1', resolve))
|
||||
const port = rangeServer.address().port
|
||||
const downloadCancelled = new Promise((resolve) => {
|
||||
const port = (rangeServer.address() as AddressInfo).port
|
||||
const downloadCancelled: Promise<Electron.DownloadItem> = new Promise((resolve) => {
|
||||
w.webContents.session.once('will-download', function (e, item) {
|
||||
item.setSavePath(downloadFilePath)
|
||||
item.on('done', function (e, state) {
|
||||
|
@ -791,7 +784,7 @@ describe('session module', () => {
|
|||
lastModified: item.getLastModifiedTime(),
|
||||
eTag: item.getETag(),
|
||||
}
|
||||
const downloadResumed = new Promise((resolve) => {
|
||||
const downloadResumed: Promise<Electron.DownloadItem> = new Promise((resolve) => {
|
||||
w.webContents.session.once('will-download', function (e, item) {
|
||||
expect(item.getState()).to.equal('interrupted')
|
||||
item.setSavePath(downloadFilePath)
|
||||
|
@ -840,7 +833,7 @@ describe('session module', () => {
|
|||
const result = emittedOnce(require('electron').ipcMain, 'message')
|
||||
|
||||
function remote() {
|
||||
navigator.requestMIDIAccess({sysex: true}).then(() => {}, (err) => {
|
||||
(navigator as any).requestMIDIAccess({sysex: true}).then(() => {}, (err: any) => {
|
||||
require('electron').ipcRenderer.send('message', err.name);
|
||||
});
|
||||
}
|
15
yarn.lock
15
yarn.lock
|
@ -141,6 +141,13 @@
|
|||
resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a"
|
||||
integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==
|
||||
|
||||
"@types/basic-auth@^1.1.2":
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/@types/basic-auth/-/basic-auth-1.1.2.tgz#810fbded879f14327fc1d3413bdb92cfe9e24f73"
|
||||
integrity sha512-NzkkcC+gkkILWaBi3+/z/3do6Ybk6TWeTqV5zCVXmG2KaBoT5YqlJvfqP44HCyDA+Cu58pp7uKAxy/G58se/TA==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/body-parser@*":
|
||||
version "1.17.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c"
|
||||
|
@ -254,6 +261,14 @@
|
|||
resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c"
|
||||
integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==
|
||||
|
||||
"@types/send@^0.14.5":
|
||||
version "0.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@types/send/-/send-0.14.5.tgz#653f7d25b93c3f7f51a8994addaf8a229de022a7"
|
||||
integrity sha512-0mwoiK3DXXBu0GIfo+jBv4Wo5s1AcsxdpdwNUtflKm99VEMvmBPJ+/NBNRZy2R5JEYfWL/u4nAHuTUTA3wFecQ==
|
||||
dependencies:
|
||||
"@types/mime" "*"
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/serve-static@*":
|
||||
version "1.13.2"
|
||||
resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48"
|
||||
|
|
Загрузка…
Ссылка в новой задаче