2016-03-25 20:03:49 +00:00
|
|
|
const assert = require('assert')
|
|
|
|
const http = require('http')
|
|
|
|
const path = require('path')
|
|
|
|
const fs = require('fs')
|
2016-01-12 02:40:23 +00:00
|
|
|
|
2016-07-12 13:38:50 +00:00
|
|
|
const {ipcRenderer, remote} = require('electron')
|
2016-07-13 04:34:19 +00:00
|
|
|
const {ipcMain, session, BrowserWindow} = remote
|
2016-01-12 02:40:23 +00:00
|
|
|
|
2016-03-25 20:03:49 +00:00
|
|
|
describe('session module', function () {
|
|
|
|
this.timeout(10000)
|
2016-02-17 01:09:41 +00:00
|
|
|
|
2016-03-25 20:03:49 +00:00
|
|
|
var fixtures = path.resolve(__dirname, 'fixtures')
|
|
|
|
var w = null
|
|
|
|
var url = 'http://127.0.0.1'
|
2016-02-17 01:09:41 +00:00
|
|
|
|
2016-03-25 20:03:49 +00:00
|
|
|
beforeEach(function () {
|
2016-06-08 14:31:27 +00:00
|
|
|
if (w != null) {
|
|
|
|
w.destroy()
|
|
|
|
}
|
2016-02-17 01:39:11 +00:00
|
|
|
w = new BrowserWindow({
|
2016-01-12 02:40:23 +00:00
|
|
|
show: false,
|
|
|
|
width: 400,
|
|
|
|
height: 400
|
2016-03-25 20:03:49 +00:00
|
|
|
})
|
|
|
|
})
|
2016-02-17 01:09:41 +00:00
|
|
|
|
2016-03-25 20:03:49 +00:00
|
|
|
afterEach(function () {
|
2016-06-08 14:31:27 +00:00
|
|
|
if (w != null) {
|
|
|
|
w.destroy()
|
|
|
|
}
|
|
|
|
w = null
|
2016-03-25 20:03:49 +00:00
|
|
|
})
|
2016-01-13 09:19:53 +00:00
|
|
|
|
2016-07-12 13:24:09 +00:00
|
|
|
describe('session.defaultSession', function () {
|
|
|
|
it('returns the default session', function () {
|
|
|
|
assert.equal(session.defaultSession, session.fromPartition(''))
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2016-07-12 13:38:50 +00:00
|
|
|
describe('session.fromPartition(partition, options)', function () {
|
|
|
|
it('returns existing session with same partition', function () {
|
|
|
|
assert.equal(session.fromPartition('test'), session.fromPartition('test'))
|
|
|
|
})
|
|
|
|
|
|
|
|
it('created session is ref-counted', function () {
|
|
|
|
const partition = 'test2'
|
|
|
|
const userAgent = 'test-agent'
|
|
|
|
const ses1 = session.fromPartition(partition)
|
|
|
|
ses1.setUserAgent(userAgent)
|
|
|
|
assert.equal(ses1.getUserAgent(), userAgent)
|
|
|
|
ses1.destroy()
|
|
|
|
const ses2 = session.fromPartition(partition)
|
|
|
|
assert.notEqual(ses2.getUserAgent(), userAgent)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2016-07-12 13:25:09 +00:00
|
|
|
describe('ses.cookies', function () {
|
2016-03-25 20:03:49 +00:00
|
|
|
it('should get cookies', function (done) {
|
|
|
|
var server = http.createServer(function (req, res) {
|
|
|
|
res.setHeader('Set-Cookie', ['0=0'])
|
|
|
|
res.end('finished')
|
|
|
|
server.close()
|
|
|
|
})
|
|
|
|
server.listen(0, '127.0.0.1', function () {
|
|
|
|
var port = server.address().port
|
|
|
|
w.loadURL(url + ':' + port)
|
|
|
|
w.webContents.on('did-finish-load', function () {
|
2016-02-17 01:39:11 +00:00
|
|
|
w.webContents.session.cookies.get({
|
2016-01-13 09:19:53 +00:00
|
|
|
url: url
|
2016-03-25 20:03:49 +00:00
|
|
|
}, function (error, list) {
|
|
|
|
var cookie, i, len
|
2016-01-13 09:19:53 +00:00
|
|
|
if (error) {
|
2016-03-25 20:03:49 +00:00
|
|
|
return done(error)
|
2016-01-13 09:19:53 +00:00
|
|
|
}
|
|
|
|
for (i = 0, len = list.length; i < len; i++) {
|
2016-03-25 20:03:49 +00:00
|
|
|
cookie = list[i]
|
2016-01-13 09:19:53 +00:00
|
|
|
if (cookie.name === '0') {
|
|
|
|
if (cookie.value === '0') {
|
2016-03-25 20:03:49 +00:00
|
|
|
return done()
|
2016-01-13 09:19:53 +00:00
|
|
|
} else {
|
2016-03-25 20:03:49 +00:00
|
|
|
return done('cookie value is ' + cookie.value + ' while expecting 0')
|
2016-01-13 09:19:53 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-03-25 20:03:49 +00:00
|
|
|
done('Can not find cookie')
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
2016-02-17 01:09:41 +00:00
|
|
|
|
2016-06-29 01:44:00 +00:00
|
|
|
it('calls back with an error when setting a cookie with missing required fields', function (done) {
|
|
|
|
session.defaultSession.cookies.set({
|
|
|
|
url: '',
|
|
|
|
name: '1',
|
|
|
|
value: '1'
|
|
|
|
}, function (error) {
|
|
|
|
assert.equal(error.message, 'Setting cookie failed')
|
|
|
|
done()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2016-03-25 20:03:49 +00:00
|
|
|
it('should over-write the existent cookie', function (done) {
|
2016-02-17 01:39:11 +00:00
|
|
|
session.defaultSession.cookies.set({
|
2016-01-13 09:19:53 +00:00
|
|
|
url: url,
|
|
|
|
name: '1',
|
|
|
|
value: '1'
|
2016-03-25 20:03:49 +00:00
|
|
|
}, function (error) {
|
2016-01-13 09:19:53 +00:00
|
|
|
if (error) {
|
2016-03-25 20:03:49 +00:00
|
|
|
return done(error)
|
2016-01-13 09:19:53 +00:00
|
|
|
}
|
2016-02-17 01:39:11 +00:00
|
|
|
session.defaultSession.cookies.get({
|
2016-01-12 02:40:23 +00:00
|
|
|
url: url
|
2016-03-25 20:03:49 +00:00
|
|
|
}, function (error, list) {
|
|
|
|
var cookie, i, len
|
2016-01-12 02:40:23 +00:00
|
|
|
if (error) {
|
2016-03-25 20:03:49 +00:00
|
|
|
return done(error)
|
2016-01-12 02:40:23 +00:00
|
|
|
}
|
|
|
|
for (i = 0, len = list.length; i < len; i++) {
|
2016-03-25 20:03:49 +00:00
|
|
|
cookie = list[i]
|
2016-01-13 09:19:53 +00:00
|
|
|
if (cookie.name === '1') {
|
|
|
|
if (cookie.value === '1') {
|
2016-03-25 20:03:49 +00:00
|
|
|
return done()
|
2016-01-12 02:40:23 +00:00
|
|
|
} else {
|
2016-03-25 20:03:49 +00:00
|
|
|
return done('cookie value is ' + cookie.value + ' while expecting 1')
|
2016-01-12 02:40:23 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-03-25 20:03:49 +00:00
|
|
|
done('Can not find cookie')
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
2016-02-17 01:09:41 +00:00
|
|
|
|
2016-03-25 20:03:49 +00:00
|
|
|
it('should remove cookies', function (done) {
|
2016-02-17 01:39:11 +00:00
|
|
|
session.defaultSession.cookies.set({
|
2016-01-13 09:19:53 +00:00
|
|
|
url: url,
|
|
|
|
name: '2',
|
|
|
|
value: '2'
|
2016-03-25 20:03:49 +00:00
|
|
|
}, function (error) {
|
2016-01-12 02:40:23 +00:00
|
|
|
if (error) {
|
2016-03-25 20:03:49 +00:00
|
|
|
return done(error)
|
2016-01-12 02:40:23 +00:00
|
|
|
}
|
2016-03-25 20:03:49 +00:00
|
|
|
session.defaultSession.cookies.remove(url, '2', function () {
|
2016-02-17 01:39:11 +00:00
|
|
|
session.defaultSession.cookies.get({
|
2016-01-13 09:19:53 +00:00
|
|
|
url: url
|
2016-03-25 20:03:49 +00:00
|
|
|
}, function (error, list) {
|
|
|
|
var cookie, i, len
|
2016-01-13 09:19:53 +00:00
|
|
|
if (error) {
|
2016-03-25 20:03:49 +00:00
|
|
|
return done(error)
|
2016-01-12 02:40:23 +00:00
|
|
|
}
|
2016-01-13 09:19:53 +00:00
|
|
|
for (i = 0, len = list.length; i < len; i++) {
|
2016-03-25 20:03:49 +00:00
|
|
|
cookie = list[i]
|
2016-01-13 09:19:53 +00:00
|
|
|
if (cookie.name === '2') {
|
2016-03-25 20:03:49 +00:00
|
|
|
return done('Cookie not deleted')
|
2016-01-13 09:19:53 +00:00
|
|
|
}
|
2016-01-12 02:40:23 +00:00
|
|
|
}
|
2016-03-25 20:03:49 +00:00
|
|
|
done()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
2016-01-13 09:19:53 +00:00
|
|
|
|
2016-07-12 13:25:09 +00:00
|
|
|
describe('ses.clearStorageData(options)', function () {
|
2016-03-25 20:03:49 +00:00
|
|
|
fixtures = path.resolve(__dirname, 'fixtures')
|
|
|
|
it('clears localstorage data', function (done) {
|
|
|
|
ipcMain.on('count', function (event, count) {
|
|
|
|
ipcMain.removeAllListeners('count')
|
|
|
|
assert(!count)
|
|
|
|
done()
|
|
|
|
})
|
|
|
|
w.loadURL('file://' + path.join(fixtures, 'api', 'localstorage.html'))
|
|
|
|
w.webContents.on('did-finish-load', function () {
|
2016-02-17 17:27:25 +00:00
|
|
|
var options = {
|
2016-03-25 20:03:49 +00:00
|
|
|
origin: 'file://',
|
2016-01-12 02:40:23 +00:00
|
|
|
storages: ['localstorage'],
|
|
|
|
quotas: ['persistent']
|
2016-03-25 20:03:49 +00:00
|
|
|
}
|
|
|
|
w.webContents.session.clearStorageData(options, function () {
|
|
|
|
w.webContents.send('getcount')
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
2016-02-02 10:24:51 +00:00
|
|
|
|
2016-07-12 13:25:09 +00:00
|
|
|
describe('will-download event', function () {
|
2016-03-25 20:03:49 +00:00
|
|
|
var w = null
|
2016-02-02 10:24:51 +00:00
|
|
|
|
2016-03-25 20:03:49 +00:00
|
|
|
beforeEach(function () {
|
2016-02-02 10:24:51 +00:00
|
|
|
w = new BrowserWindow({
|
|
|
|
show: false,
|
|
|
|
width: 400,
|
|
|
|
height: 400
|
2016-03-25 20:03:49 +00:00
|
|
|
})
|
|
|
|
})
|
2016-02-17 01:09:41 +00:00
|
|
|
|
2016-03-25 20:03:49 +00:00
|
|
|
afterEach(function () {
|
|
|
|
w.destroy()
|
|
|
|
})
|
2016-02-02 10:24:51 +00:00
|
|
|
|
2016-03-25 20:03:49 +00:00
|
|
|
it('can cancel default download behavior', function (done) {
|
|
|
|
const mockFile = new Buffer(1024)
|
|
|
|
const contentDisposition = 'inline; filename="mockFile.txt"'
|
|
|
|
const downloadServer = http.createServer(function (req, res) {
|
2016-02-02 10:24:51 +00:00
|
|
|
res.writeHead(200, {
|
|
|
|
'Content-Length': mockFile.length,
|
|
|
|
'Content-Type': 'application/plain',
|
|
|
|
'Content-Disposition': contentDisposition
|
2016-03-25 20:03:49 +00:00
|
|
|
})
|
|
|
|
res.end(mockFile)
|
|
|
|
downloadServer.close()
|
|
|
|
})
|
2016-02-02 10:24:51 +00:00
|
|
|
|
2016-03-25 20:03:49 +00:00
|
|
|
downloadServer.listen(0, '127.0.0.1', function () {
|
|
|
|
const port = downloadServer.address().port
|
|
|
|
const url = 'http://127.0.0.1:' + port + '/'
|
2016-02-02 10:24:51 +00:00
|
|
|
|
2016-03-25 20:03:49 +00:00
|
|
|
ipcRenderer.sendSync('set-download-option', false, true)
|
|
|
|
w.loadURL(url)
|
|
|
|
ipcRenderer.once('download-error', function (event, downloadUrl, filename, error) {
|
|
|
|
assert.equal(downloadUrl, url)
|
|
|
|
assert.equal(filename, 'mockFile.txt')
|
|
|
|
assert.equal(error, 'Object has been destroyed')
|
|
|
|
done()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
2016-02-02 10:24:51 +00:00
|
|
|
|
2016-03-25 20:03:49 +00:00
|
|
|
describe('DownloadItem', function () {
|
|
|
|
var mockPDF = new Buffer(1024 * 1024 * 5)
|
|
|
|
var contentDisposition = 'inline; filename="mock.pdf"'
|
|
|
|
var downloadFilePath = path.join(fixtures, 'mock.pdf')
|
|
|
|
var downloadServer = http.createServer(function (req, res) {
|
2016-01-12 02:40:23 +00:00
|
|
|
res.writeHead(200, {
|
|
|
|
'Content-Length': mockPDF.length,
|
|
|
|
'Content-Type': 'application/pdf',
|
|
|
|
'Content-Disposition': contentDisposition
|
2016-03-25 20:03:49 +00:00
|
|
|
})
|
|
|
|
res.end(mockPDF)
|
|
|
|
downloadServer.close()
|
|
|
|
})
|
2016-07-28 00:52:36 +00:00
|
|
|
var assertDownload = function (event, state, url, mimeType, receivedBytes, totalBytes, disposition, filename, port, savePath) {
|
2016-03-25 20:03:49 +00:00
|
|
|
assert.equal(state, 'completed')
|
|
|
|
assert.equal(filename, 'mock.pdf')
|
2016-07-28 00:52:36 +00:00
|
|
|
assert.equal(savePath, path.join(__dirname, 'fixtures', 'mock.pdf'))
|
2016-03-25 20:03:49 +00:00
|
|
|
assert.equal(url, 'http://127.0.0.1:' + port + '/')
|
|
|
|
assert.equal(mimeType, 'application/pdf')
|
|
|
|
assert.equal(receivedBytes, mockPDF.length)
|
|
|
|
assert.equal(totalBytes, mockPDF.length)
|
|
|
|
assert.equal(disposition, contentDisposition)
|
|
|
|
assert(fs.existsSync(downloadFilePath))
|
|
|
|
fs.unlinkSync(downloadFilePath)
|
|
|
|
}
|
2016-02-17 01:09:41 +00:00
|
|
|
|
2016-03-25 20:03:49 +00:00
|
|
|
it('can download using BrowserWindow.loadURL', function (done) {
|
|
|
|
downloadServer.listen(0, '127.0.0.1', function () {
|
|
|
|
var port = downloadServer.address().port
|
|
|
|
ipcRenderer.sendSync('set-download-option', false, false)
|
|
|
|
w.loadURL(url + ':' + port)
|
2016-07-28 00:52:36 +00:00
|
|
|
ipcRenderer.once('download-done', function (event, state, url, mimeType, receivedBytes, totalBytes, disposition, filename, savePath) {
|
|
|
|
assertDownload(event, state, url, mimeType, receivedBytes, totalBytes, disposition, filename, port, savePath)
|
2016-03-25 20:03:49 +00:00
|
|
|
done()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
2016-02-17 01:09:41 +00:00
|
|
|
|
2016-03-25 20:03:49 +00:00
|
|
|
it('can download using WebView.downloadURL', function (done) {
|
|
|
|
downloadServer.listen(0, '127.0.0.1', function () {
|
|
|
|
var port = downloadServer.address().port
|
|
|
|
ipcRenderer.sendSync('set-download-option', false, false)
|
2016-03-28 23:19:18 +00:00
|
|
|
var webview = new WebView()
|
2016-03-25 20:03:49 +00:00
|
|
|
webview.src = 'file://' + fixtures + '/api/blank.html'
|
|
|
|
webview.addEventListener('did-finish-load', function () {
|
|
|
|
webview.downloadURL(url + ':' + port + '/')
|
|
|
|
})
|
2016-07-28 00:52:36 +00:00
|
|
|
ipcRenderer.once('download-done', function (event, state, url, mimeType, receivedBytes, totalBytes, disposition, filename, savePath) {
|
|
|
|
assertDownload(event, state, url, mimeType, receivedBytes, totalBytes, disposition, filename, port, savePath)
|
2016-03-25 20:03:49 +00:00
|
|
|
document.body.removeChild(webview)
|
|
|
|
done()
|
|
|
|
})
|
|
|
|
document.body.appendChild(webview)
|
|
|
|
})
|
|
|
|
})
|
2016-02-17 01:09:41 +00:00
|
|
|
|
2016-03-25 20:03:49 +00:00
|
|
|
it('can cancel download', function (done) {
|
|
|
|
downloadServer.listen(0, '127.0.0.1', function () {
|
|
|
|
var port = downloadServer.address().port
|
|
|
|
ipcRenderer.sendSync('set-download-option', true, false)
|
|
|
|
w.loadURL(url + ':' + port + '/')
|
|
|
|
ipcRenderer.once('download-done', function (event, state, url, mimeType, receivedBytes, totalBytes, disposition, filename) {
|
|
|
|
assert.equal(state, 'cancelled')
|
|
|
|
assert.equal(filename, 'mock.pdf')
|
|
|
|
assert.equal(mimeType, 'application/pdf')
|
|
|
|
assert.equal(receivedBytes, 0)
|
|
|
|
assert.equal(totalBytes, mockPDF.length)
|
|
|
|
assert.equal(disposition, contentDisposition)
|
|
|
|
done()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
2016-06-08 14:31:27 +00:00
|
|
|
|
2016-07-12 13:25:09 +00:00
|
|
|
describe('ses.protocol', function () {
|
2016-06-23 04:11:19 +00:00
|
|
|
const partitionName = 'temp'
|
|
|
|
const protocolName = 'sp'
|
|
|
|
const partitionProtocol = session.fromPartition(partitionName).protocol
|
|
|
|
const protocol = session.defaultSession.protocol
|
2016-06-29 16:42:12 +00:00
|
|
|
const handler = function (ignoredError, callback) {
|
2016-06-23 04:29:18 +00:00
|
|
|
callback({data: 'test', mimeType: 'text/html'})
|
2016-06-23 04:11:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
beforeEach(function (done) {
|
|
|
|
if (w != null) w.destroy()
|
2016-06-08 14:31:27 +00:00
|
|
|
w = new BrowserWindow({
|
|
|
|
show: false,
|
|
|
|
webPreferences: {
|
|
|
|
partition: partitionName
|
|
|
|
}
|
|
|
|
})
|
2016-06-23 04:11:19 +00:00
|
|
|
partitionProtocol.registerStringProtocol(protocolName, handler, function (error) {
|
2016-06-29 16:37:10 +00:00
|
|
|
done(error != null ? error : undefined)
|
2016-06-23 04:11:19 +00:00
|
|
|
})
|
2016-06-08 14:31:27 +00:00
|
|
|
})
|
|
|
|
|
2016-06-15 12:12:06 +00:00
|
|
|
afterEach(function (done) {
|
|
|
|
partitionProtocol.unregisterProtocol(protocolName, () => done())
|
|
|
|
})
|
|
|
|
|
2016-06-23 04:14:33 +00:00
|
|
|
it('does not affect defaultSession', function (done) {
|
2016-06-23 04:11:19 +00:00
|
|
|
protocol.isProtocolHandled(protocolName, function (result) {
|
|
|
|
assert.equal(result, false)
|
|
|
|
partitionProtocol.isProtocolHandled(protocolName, function (result) {
|
|
|
|
assert.equal(result, true)
|
2016-06-23 04:14:33 +00:00
|
|
|
done()
|
2016-06-08 14:31:27 +00:00
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
2016-06-23 04:14:33 +00:00
|
|
|
|
2016-07-01 13:24:30 +00:00
|
|
|
xit('handles requests from partition', function (done) {
|
2016-06-23 04:14:33 +00:00
|
|
|
w.webContents.on('did-finish-load', function () {
|
|
|
|
done()
|
|
|
|
})
|
|
|
|
w.loadURL(`${protocolName}://fake-host`)
|
|
|
|
})
|
2016-06-08 14:31:27 +00:00
|
|
|
})
|
2016-07-21 04:31:08 +00:00
|
|
|
|
|
|
|
describe('ses.setProxy(options, callback)', function () {
|
|
|
|
it('allows configuring proxy settings', function (done) {
|
|
|
|
const config = {
|
|
|
|
proxyRules: 'http=myproxy:80'
|
|
|
|
}
|
|
|
|
session.defaultSession.setProxy(config, function () {
|
|
|
|
session.defaultSession.resolveProxy('http://localhost', function (proxy) {
|
|
|
|
assert.equal(proxy, 'PROXY myproxy:80')
|
|
|
|
done()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
it('allows bypassing proxy settings', function (done) {
|
|
|
|
const config = {
|
|
|
|
proxyRules: 'http=myproxy:80',
|
|
|
|
proxyBypassRules: '<local>'
|
|
|
|
}
|
|
|
|
session.defaultSession.setProxy(config, function () {
|
|
|
|
session.defaultSession.resolveProxy('http://localhost', function (proxy) {
|
|
|
|
assert.equal(proxy, 'DIRECT')
|
|
|
|
done()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
2016-03-25 20:03:49 +00:00
|
|
|
})
|