This commit is contained in:
Jeremy Apthorp 2019-08-27 14:55:19 -07:00 коммит произвёл GitHub
Родитель 4b8e1588b4
Коммит bdc84d0bfb
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
5 изменённых файлов: 87 добавлений и 72 удалений

Просмотреть файл

@ -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",

5
spec-main/ambient.d.ts поставляемый
Просмотреть файл

@ -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);
});
}

Просмотреть файл

@ -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"