electron/spec/api-session-spec.js

346 lines
11 KiB
JavaScript
Raw Normal View History

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
const {ipcRenderer, remote} = require('electron')
const {ipcMain, session, webContents, 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-03-25 20:03:49 +00:00
var fixtures = path.resolve(__dirname, 'fixtures')
var w = null
var url = 'http://127.0.0.1'
2016-03-25 20:03:49 +00:00
beforeEach(function () {
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-03-25 20:03:49 +00:00
afterEach(function () {
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(''))
})
})
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')
})
})
})
})
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-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-07-12 13:25:09 +00:00
describe('will-download event', function () {
2016-03-25 20:03:49 +00:00
var w = null
2016-03-25 20:03:49 +00:00
beforeEach(function () {
w = new BrowserWindow({
show: false,
width: 400,
height: 400
2016-03-25 20:03:49 +00:00
})
})
2016-03-25 20:03:49 +00:00
afterEach(function () {
w.destroy()
})
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) {
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-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-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-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()
})
var assertDownload = function (event, state, url, mimeType, receivedBytes, totalBytes, disposition, filename, port) {
assert.equal(state, 'completed')
assert.equal(filename, 'mock.pdf')
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-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)
ipcRenderer.once('download-done', function (event, state, url, mimeType, receivedBytes, totalBytes, disposition, filename) {
assertDownload(event, state, url, mimeType, receivedBytes, totalBytes, disposition, filename, port)
done()
})
})
})
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 + '/')
})
ipcRenderer.once('download-done', function (event, state, url, mimeType, receivedBytes, totalBytes, disposition, filename) {
assertDownload(event, state, url, mimeType, receivedBytes, totalBytes, disposition, filename, port)
document.body.removeChild(webview)
done()
})
document.body.appendChild(webview)
})
})
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-07-12 13:25:09 +00:00
describe('ses.protocol', function () {
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) {
callback({data: 'test', mimeType: 'text/html'})
}
beforeEach(function (done) {
if (w != null) w.destroy()
w = new BrowserWindow({
show: false,
webPreferences: {
partition: partitionName
}
})
partitionProtocol.registerStringProtocol(protocolName, handler, function (error) {
2016-06-29 16:37:10 +00:00
done(error != null ? error : undefined)
})
})
afterEach(function (done) {
partitionProtocol.unregisterProtocol(protocolName, () => done())
})
it('does not affect defaultSession', function (done) {
protocol.isProtocolHandled(protocolName, function (result) {
assert.equal(result, false)
partitionProtocol.isProtocolHandled(protocolName, function (result) {
assert.equal(result, true)
done()
})
})
})
xit('handles requests from partition', function (done) {
w.webContents.on('did-finish-load', function () {
done()
})
w.loadURL(`${protocolName}://fake-host`)
})
})
2016-03-25 20:03:49 +00:00
})