electron/spec/api-session-spec.js

322 lines
9.8 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
2016-03-25 20:03:49 +00:00
const ipcRenderer = require('electron').ipcRenderer
const remote = require('electron').remote
2016-01-12 02:40:23 +00:00
2016-03-25 20:03:49 +00:00
const ipcMain = remote.ipcMain
const session = remote.session
const BrowserWindow = remote.BrowserWindow
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'
var partitionName = 'temp'
var protocolName = 'sp'
const tempProtocol = session.fromPartition(partitionName).protocol
const protocol = session.defaultSession.protocol
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-03-25 20:03:49 +00:00
describe('session.cookies', function () {
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-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-03-25 20:03:49 +00:00
describe('session.clearStorageData(options)', function () {
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-03-25 20:03:49 +00:00
describe('session will-download event', function () {
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()
})
})
})
})
describe('session.protocol', function () {
beforeEach(function () {
if (w != null) {
w.destroy()
}
w = new BrowserWindow({
show: false,
width: 400,
height: 400,
webPreferences: {
partition: partitionName
}
})
})
afterEach(function () {
if (w != null) {
w.destroy()
}
w = null
})
it('handles requests from a partition', function (done) {
var handler = function (error, callback) {
callback({
data: 'test'
})
}
tempProtocol.registerStringProtocol(protocolName, handler, function (error) {
if (error) {
return done(error)
}
protocol.isProtocolHandled(protocolName, function (result) {
assert.equal(result, false)
tempProtocol.isProtocolHandled(protocolName, function (result) {
assert.equal(result, true)
w.webContents.on('did-finish-load', function () {
done()
})
w.loadURL(protocolName + "://fake-host")
})
})
})
})
})
2016-03-25 20:03:49 +00:00
})