session
管理浏览器会话、Cookie、缓存、代理设置等。
进程:主进程
session
模块可用于创建新的 Session
对象。
您还可以通过 WebContents
的 session
属性,或者从 session
模块访问现有页面的 session
。
const { BrowserWindow } = require('electron')
const win = new BrowserWindow({ width: 800, height: 600 })
win.loadURL('https://github.com')
const ses = win.webContents.session
console.log(ses.getUserAgent())
方法
session
模块具有以下方法
session.fromPartition(partition[, options])
partition
字符串
返回 Session
- 一个来自 partition
字符串的会话实例。当存在具有相同 partition
的现有 Session
时,将返回该实例;否则,将创建一个新的 Session
实例并附带 options
。
如果 partition
以 persist:
开头,则页面将使用一个持久化会话,该会话可供应用程序中所有具有相同 partition
的页面使用。如果不存在 persist:
前缀,则页面将使用内存中的会话。如果 partition
为空,则将返回应用程序的默认会话。
要使用 options
创建 Session
,您必须确保具有该 partition
的 Session
之前从未被使用过。无法更改现有 Session
对象的 options
。
session.fromPath(path[, options])
path
string
返回 Session
- 一个来自 path
字符串指定的绝对路径的会话实例。当存在具有相同绝对路径的现有 Session
时,将返回该实例;否则,将创建一个新的 Session
实例并附带 options
。如果路径不是绝对路径,则调用会抛出错误。此外,如果提供空字符串,也会抛出错误。
要使用 options
创建 Session
,您必须确保具有该 path
的 Session
之前从未被使用过。无法更改现有 Session
对象的 options
。
属性
session
模块具有以下属性
session.defaultSession
一个 Session
对象,即应用程序的默认会话对象。
类:Session
获取和设置会话的属性。
进程:主进程
此类未从 'electron'
模块导出。它仅作为 Electron API 中其他方法的返回值可用。
您可以在 session
模块中创建 Session
对象
const { session } = require('electron')
const ses = session.fromPartition('persist:name')
console.log(ses.getUserAgent())
实例事件
Session
实例可用的事件如下
事件:'will-download'
返回
event
Eventitem
DownloadItemwebContents
WebContents
当 Electron 即将下载 item
时在 webContents
中发出。
调用 event.preventDefault()
将取消下载,并且 item
在进程的下一个 tick 中将不可用。
const { session } = require('electron')
session.defaultSession.on('will-download', (event, item, webContents) => {
event.preventDefault()
require('got')(item.getURL()).then((response) => {
require('node:fs').writeFileSync('/somewhere', response.body)
})
})
事件:'extension-loaded'
返回
event
Eventextension
Extension
在扩展加载后发出。每当将扩展添加到扩展的“已启用”集合时,都会发生这种情况。这包括
- 从
Session.loadExtension
加载的扩展。 - 重新加载的扩展
- 来自崩溃。
- 如果扩展请求了它(
chrome.runtime.reload()
)。
事件:'extension-unloaded'
返回
event
Eventextension
Extension
在扩展卸载后发出。当调用 Session.removeExtension
时会发生这种情况。
事件:'extension-ready'
返回
event
Eventextension
Extension
在扩展加载后发出,并且所有必要的浏览器状态已初始化以支持扩展的后台页面启动。
事件:'file-system-access-restricted'
返回
event
Eventdetails
Objectorigin
字符串 - 发起访问被阻止路径的源。isDirectory
布尔值 - 路径是目录还是非目录。path
字符串 - 尝试访问的被阻止路径。
callback
Functionaction
字符串 - 作为被阻止路径访问尝试的结果要执行的操作。allow
- 这将允许访问path
,即使它被限制。deny
- 这将阻止访问请求并触发AbortError
。tryAgain
- 这将打开一个新的文件选择器,允许用户选择另一个路径。
const { app, dialog, BrowserWindow, session } = require('electron')
async function createWindow () {
const mainWindow = new BrowserWindow()
await mainWindow.loadURL('https://buzzfeed.com')
session.defaultSession.on('file-system-access-restricted', async (e, details, callback) => {
const { origin, path } = details
const { response } = await dialog.showMessageBox({
message: `Are you sure you want ${origin} to open restricted path ${path}?`,
title: 'File System Access Restricted',
buttons: ['Choose a different folder', 'Allow', 'Cancel'],
cancelId: 2
})
if (response === 0) {
callback('tryAgain')
} else if (response === 1) {
callback('allow')
} else {
callback('deny')
}
})
mainWindow.webContents.executeJavaScript(`
window.showDirectoryPicker({
id: 'electron-demo',
mode: 'readwrite',
startIn: 'downloads',
}).catch(e => {
console.log(e)
})`, true
)
}
app.whenReady().then(() => {
createWindow()
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) createWindow()
})
})
app.on('window-all-closed', function () {
if (process.platform !== 'darwin') app.quit()
})
事件:'preconnect'
返回
event
EventpreconnectUrl
字符串 - 渲染器请求预连接的 URL。allowCredentials
布尔值 - 如果渲染器请求连接包含凭据,则为 true(有关更多详细信息,请参阅 规范)。
当渲染进程请求预连接到 URL 时发出,这通常是由于 资源提示。
事件:'spellcheck-dictionary-initialized'
返回
event
EventlanguageCode
字符串 - 字典文件的语言代码
当 hunspell 字典文件成功初始化时发出。这发生在文件下载之后。
事件:'spellcheck-dictionary-download-begin'
返回
event
EventlanguageCode
字符串 - 字典文件的语言代码
当 hunspell 字典文件开始下载时发出
事件:'spellcheck-dictionary-download-success'
返回
event
EventlanguageCode
字符串 - 字典文件的语言代码
当 hunspell 字典文件成功下载时发出
事件:'spellcheck-dictionary-download-failure'
返回
event
EventlanguageCode
字符串 - 字典文件的语言代码
当 hunspell 字典文件下载失败时发出。有关失败的详细信息,您应该收集 netlog 并检查下载请求。
事件:'select-hid-device'
返回
event
Eventdetails
ObjectdeviceList
HIDDevice[]frame
WebFrameMain | null - 触发此事件的框架。在框架导航或销毁后,可能为null
。
callback
FunctiondeviceId
字符串 | null (可选)
当调用 navigator.hid.requestDevice
时需要选择 HID 设备时发出。callback
应使用 deviceId
进行调用以进行选择;将没有参数传递给 callback
将取消请求。此外,通过使用 ses.setPermissionCheckHandler(handler)
和 ses.setDevicePermissionHandler(handler)
可以进一步管理 navigator.hid
的权限。
const { app, BrowserWindow } = require('electron')
let win = null
app.whenReady().then(() => {
win = new BrowserWindow()
win.webContents.session.setPermissionCheckHandler((webContents, permission, requestingOrigin, details) => {
if (permission === 'hid') {
// Add logic here to determine if permission should be given to allow HID selection
return true
}
return false
})
// Optionally, retrieve previously persisted devices from a persistent store
const grantedDevices = fetchGrantedDevices()
win.webContents.session.setDevicePermissionHandler((details) => {
if (new URL(details.origin).hostname === 'some-host' && details.deviceType === 'hid') {
if (details.device.vendorId === 123 && details.device.productId === 345) {
// Always allow this type of device (this allows skipping the call to `navigator.hid.requestDevice` first)
return true
}
// Search through the list of devices that have previously been granted permission
return grantedDevices.some((grantedDevice) => {
return grantedDevice.vendorId === details.device.vendorId &&
grantedDevice.productId === details.device.productId &&
grantedDevice.serialNumber && grantedDevice.serialNumber === details.device.serialNumber
})
}
return false
})
win.webContents.session.on('select-hid-device', (event, details, callback) => {
event.preventDefault()
const selectedDevice = details.deviceList.find((device) => {
return device.vendorId === 9025 && device.productId === 67
})
callback(selectedDevice?.deviceId)
})
})
事件:'hid-device-added'
返回
event
Eventdetails
Objectdevice
HIDDeviceframe
WebFrameMain | null - 触发此事件的框架。在框架导航或销毁后,可能为null
。
在调用 navigator.hid.requestDevice
并发出 select-hid-device
后发出,如果在新设备可用之前 select-hid-device
的回调被调用。此事件用于使用 UI 要求用户选择设备,以便 UI 可以更新为新添加的设备。
事件:'hid-device-removed'
返回
event
Eventdetails
Objectdevice
HIDDeviceframe
WebFrameMain | null - 触发此事件的框架。在框架导航或销毁后,可能为null
。
在调用 navigator.hid.requestDevice
并发出 select-hid-device
后发出,如果在新设备可用之前 select-hid-device
的回调被调用。此事件用于使用 UI 要求用户选择设备,以便 UI 可以更新以删除指定的设备。
事件:'hid-device-revoked'
返回
event
Eventdetails
Objectdevice
HIDDeviceorigin
字符串 (可选) - 设备已被撤销权限的源。
在调用 HIDDevice.forget()
后发出。此事件可用于在使用 setDevicePermissionHandler
时帮助维护权限的持久存储。
事件:'select-serial-port'
返回
event
EventportList
SerialPort[]webContents
WebContentscallback
FunctionportId
字符串
当调用 navigator.serial.requestPort
时需要选择串口时发出。callback
应使用 portId
进行调用以进行选择,将空字符串传递给 callback
将取消请求。此外,可以通过使用 ses.setPermissionCheckHandler(handler) 并指定 serial
权限来管理 navigator.serial
的权限。
const { app, BrowserWindow } = require('electron')
let win = null
app.whenReady().then(() => {
win = new BrowserWindow({
width: 800,
height: 600
})
win.webContents.session.setPermissionCheckHandler((webContents, permission, requestingOrigin, details) => {
if (permission === 'serial') {
// Add logic here to determine if permission should be given to allow serial selection
return true
}
return false
})
// Optionally, retrieve previously persisted devices from a persistent store
const grantedDevices = fetchGrantedDevices()
win.webContents.session.setDevicePermissionHandler((details) => {
if (new URL(details.origin).hostname === 'some-host' && details.deviceType === 'serial') {
if (details.device.vendorId === 123 && details.device.productId === 345) {
// Always allow this type of device (this allows skipping the call to `navigator.serial.requestPort` first)
return true
}
// Search through the list of devices that have previously been granted permission
return grantedDevices.some((grantedDevice) => {
return grantedDevice.vendorId === details.device.vendorId &&
grantedDevice.productId === details.device.productId &&
grantedDevice.serialNumber && grantedDevice.serialNumber === details.device.serialNumber
})
}
return false
})
win.webContents.session.on('select-serial-port', (event, portList, webContents, callback) => {
event.preventDefault()
const selectedPort = portList.find((device) => {
return device.vendorId === '9025' && device.productId === '67'
})
if (!selectedPort) {
callback('')
} else {
callback(selectedPort.portId)
}
})
})
事件:'serial-port-added'
返回
event
Eventport
SerialPortwebContents
WebContents
在调用 navigator.serial.requestPort
并发出 select-serial-port
后发出,如果在新串口可用之前 select-serial-port
的回调被调用。此事件用于使用 UI 要求用户选择设备,以便 UI 可以更新为新添加的设备。
事件:'serial-port-removed'
返回
event
Eventport
SerialPortwebContents
WebContents
在调用 navigator.serial.requestPort
并发出 select-serial-port
后发出,如果在新串口可用之前 select-serial-port
的回调被调用。此事件用于使用 UI 要求用户选择设备,以便 UI 可以更新以删除指定的设备。
事件:'serial-port-revoked'
返回
event
Eventdetails
Objectport
SerialPortframe
WebFrameMain | null - 触发此事件的框架。在框架导航或销毁后,可能为null
。origin
字符串 - 设备已被撤销权限的源。
在调用 SerialPort.forget()
后发出。此事件可用于在使用 setDevicePermissionHandler
时帮助维护权限的持久存储。
// Browser Process
const { app, BrowserWindow } = require('electron')
app.whenReady().then(() => {
const win = new BrowserWindow({
width: 800,
height: 600
})
win.webContents.session.on('serial-port-revoked', (event, details) => {
console.log(`Access revoked for serial device from origin ${details.origin}`)
})
})
// Renderer Process
const portConnect = async () => {
// Request a port.
const port = await navigator.serial.requestPort()
// Wait for the serial port to open.
await port.open({ baudRate: 9600 })
// ...later, revoke access to the serial port.
await port.forget()
}
事件:'select-usb-device'
返回
event
Eventdetails
ObjectdeviceList
USBDevice[]frame
WebFrameMain | null - 触发此事件的框架。在框架导航或销毁后,可能为null
。
callback
FunctiondeviceId
字符串 (可选)
当调用 navigator.usb.requestDevice
时需要选择 USB 设备时发出。callback
应使用 deviceId
进行调用以进行选择;将没有参数传递给 callback
将取消请求。此外,通过使用 ses.setPermissionCheckHandler(handler)
和 ses.setDevicePermissionHandler(handler)
可以进一步管理 navigator.usb
的权限。
const { app, BrowserWindow } = require('electron')
let win = null
app.whenReady().then(() => {
win = new BrowserWindow()
win.webContents.session.setPermissionCheckHandler((webContents, permission, requestingOrigin, details) => {
if (permission === 'usb') {
// Add logic here to determine if permission should be given to allow USB selection
return true
}
return false
})
// Optionally, retrieve previously persisted devices from a persistent store (fetchGrantedDevices needs to be implemented by developer to fetch persisted permissions)
const grantedDevices = fetchGrantedDevices()
win.webContents.session.setDevicePermissionHandler((details) => {
if (new URL(details.origin).hostname === 'some-host' && details.deviceType === 'usb') {
if (details.device.vendorId === 123 && details.device.productId === 345) {
// Always allow this type of device (this allows skipping the call to `navigator.usb.requestDevice` first)
return true
}
// Search through the list of devices that have previously been granted permission
return grantedDevices.some((grantedDevice) => {
return grantedDevice.vendorId === details.device.vendorId &&
grantedDevice.productId === details.device.productId &&
grantedDevice.serialNumber && grantedDevice.serialNumber === details.device.serialNumber
})
}
return false
})
win.webContents.session.on('select-usb-device', (event, details, callback) => {
event.preventDefault()
const selectedDevice = details.deviceList.find((device) => {
return device.vendorId === 9025 && device.productId === 67
})
if (selectedDevice) {
// Optionally, add this to the persisted devices (updateGrantedDevices needs to be implemented by developer to persist permissions)
grantedDevices.push(selectedDevice)
updateGrantedDevices(grantedDevices)
}
callback(selectedDevice?.deviceId)
})
})
事件:'usb-device-added'
返回
event
Eventdevice
USBDevicewebContents
WebContents
在调用 navigator.usb.requestDevice
并发出 select-usb-device
后发出,如果在新设备可用之前 select-usb-device
的回调被调用。此事件用于使用 UI 要求用户选择设备,以便 UI 可以更新为新添加的设备。
事件:'usb-device-removed'
返回
event
Eventdevice
USBDevicewebContents
WebContents
在调用 navigator.usb.requestDevice
并发出 select-usb-device
后发出,如果在新设备可用之前 select-usb-device
的回调被调用。此事件用于使用 UI 要求用户选择设备,以便 UI 可以更新以删除指定的设备。
事件:'usb-device-revoked'
返回
event
Eventdetails
Objectdevice
USBDeviceorigin
字符串 (可选) - 设备已被撤销权限的源。
在调用 USBDevice.forget()
后发出。此事件可用于在使用 setDevicePermissionHandler
时帮助维护权限的持久存储。
实例方法
Session
实例可用的方法如下
ses.getCacheSize()
返回 Promise<Integer>
- 会话的当前缓存大小(字节)。
ses.clearCache()
返回 Promise<void>
- 缓存清除操作完成后解析。
清除会话的 HTTP 缓存。
ses.clearStorageData([options])
返回 Promise<void>
- 存储数据清除后解析。
ses.flushStorageData()
将任何未写入的 DOMStorage 数据写入磁盘。
ses.setProxy(config)
config
ProxyConfig
返回 Promise<void>
- 代理设置过程完成时解析。
设置代理设置。
您可能需要 ses.closeAllConnections
来关闭当前正在进行的连接,以防止池化的套接字使用之前的代理被未来的请求重用。
ses.resolveHost(host, [options])
host
字符串 - 要解析的主机名。
返回 Promise<ResolvedHost> - 使用 host
的解析后的 IP 地址解析。
ses.resolveProxy(url)
url
URL
返回 Promise<string>
- 使用 url
的代理信息解析。
ses.forceReloadProxyConfig()
返回 Promise<void>
- 当代理服务的内部状态重置并重新应用最新的代理配置(如果可用)后解析。如果代理模式为 pac_script
,则将重新从 pacScript
获取 pac 脚本。
ses.setDownloadPath(path)
path
字符串 - 下载位置。
设置下载保存目录。默认情况下,下载目录将是相应应用程序文件夹下的 Downloads
。
ses.enableNetworkEmulation(options)
使用给定的配置为 session
模拟网络。
const win = new BrowserWindow()
// To emulate a GPRS connection with 50kbps throughput and 500 ms latency.
win.webContents.session.enableNetworkEmulation({
latency: 500,
downloadThroughput: 6400,
uploadThroughput: 6400
})
// To emulate a network outage.
win.webContents.session.enableNetworkEmulation({ offline: true })
ses.preconnect(options)
预连接到源的指定数量的套接字。
ses.closeAllConnections()
返回 Promise<void>
- 所有连接关闭后解析。
这将终止/失败所有当前正在进行的请求。
ses.fetch(input[, init])
input
字符串 | GlobalRequestinit
RequestInit & { bypassCustomProtocolHandlers?: boolean } (可选)
返回 Promise<GlobalResponse>
- 请参阅 Response。
发送一个请求,类似于渲染器中的 fetch()
工作方式,使用 Chrome 的网络堆栈。这与 Node 的 fetch()
不同,后者使用 Node.js 的 HTTP 堆栈。
示例
async function example () {
const response = await net.fetch('https://my.app')
if (response.ok) {
const body = await response.json()
// ... use the result.
}
}
另请参阅 net.fetch()
,这是一个方便的方法,用于从 默认会话 发出请求。
有关更多详细信息,请参阅 MDN 关于 fetch()
的文档。
限制
net.fetch()
不支持data:
或blob:
方案。integrity
选项的值将被忽略。- 返回的
Response
对象的.type
和.url
值不正确。
默认情况下,使用 net.fetch
发出的请求可以针对 自定义协议 和 file:
发出,并且如果存在 webRequest 处理程序,则会触发它们。当在 RequestInit 中设置了非标准的 bypassCustomProtocolHandlers
选项时,自定义协议处理程序将不会为该请求调用。这允许将拦截的请求转发给内置处理程序。在绕过自定义协议时,仍然会触发 webRequest 处理程序。
protocol.handle('https', (req) => {
if (req.url === 'https://my-app.com') {
return new Response('<body>my app</body>')
} else {
return net.fetch(req, { bypassCustomProtocolHandlers: true })
}
})
ses.disableNetworkEmulation()
禁用 session
中已激活的任何网络模拟。重置为原始网络配置。
ses.setCertificateVerifyProc(proc)
proc
函数 | nullrequest
对象hostname
字符串certificate
CertificatevalidatedCertificate
CertificateisIssuedByKnownRoot
布尔值 - 如果 Chromium 识别根 CA 为标准根,则为true
。如果不是,那么该证书可能是由本地安装了根的 MITM 代理生成的(例如,由公司代理)。如果verificationResult
不是OK
,则不应信任此项。verificationResult
字符串 - 如果证书受信任,则为OK
,否则为类似CERT_REVOKED
的错误。errorCode
整数 - 错误代码。
callback
FunctionverificationResult
整数 - 值可以是 此处 的证书错误代码之一。除了证书错误代码外,还可以使用以下特殊代码。0
- 表示成功并禁用证书透明度验证。-2
- 表示失败。-3
- 使用 chromium 的验证结果。
为 session
设置证书验证过程,每当请求服务器证书验证时,都会使用 proc(request, callback)
调用 proc
。调用 callback(0)
接受证书,调用 callback(-2)
拒绝证书。
调用 setCertificateVerifyProc(null)
将恢复到默认的证书验证过程。
const { BrowserWindow } = require('electron')
const win = new BrowserWindow()
win.webContents.session.setCertificateVerifyProc((request, callback) => {
const { hostname } = request
if (hostname === 'github.com') {
callback(0)
} else {
callback(-2)
}
})
注意:此过程的结果由网络服务缓存。
ses.setPermissionRequestHandler(handler)
handler
函数 | nullwebContents
WebContents - 请求权限的 WebContents。请注意,如果请求来自子框架,您应该使用requestingUrl
来检查请求源。permission
字符串 - 请求的权限类型。clipboard-read
- 请求访问剪贴板以进行读取。clipboard-sanitized-write
- 请求访问剪贴板以进行写入。display-capture
- 请求通过 屏幕捕获 API 捕获屏幕。fullscreen
- 请求通过 全屏 API 控制应用程序的全屏状态。geolocation
- 请求通过 地理定位 API 访问用户的位置idle-detection
- 请求通过 IdleDetector API 访问用户的空闲状态。media
- 请求访问媒体设备,如摄像头、麦克风和扬声器。mediaKeySystem
- 请求访问 DRM 保护的内容。midi
- 在 Web MIDI API 中请求 MIDI 访问。midiSysex
- 在 Web MIDI API 中请求使用系统独占消息。notifications
- 请求创建通知,并能够通过 通知 API 在用户系统托盘中显示它们pointerLock
- 请求通过 指针锁定 API 直接将鼠标移动解释为输入方法。这些请求似乎总是源自主框架。keyboardLock
- 请求通过 键盘锁定 API 捕获物理键盘的任何或所有按键。这些请求似乎总是源自主框架。openExternal
- 请求在外部应用程序中打开链接。speaker-selection
- 请求通过 speaker-selection 权限策略 枚举和选择音频输出设备。storage-access
- 允许在第三方上下文中加载的内容通过 Storage Access API 请求访问第三方 Cookie。top-level-storage-access
- 允许顶级站点代表来自同一相关网站集中的其他网站的嵌入式内容请求第三方 Cookie 访问,使用 Storage Access API。window-management
- 请求通过getScreenDetails
API 访问枚举屏幕。unknown
- 未知的权限请求。fileSystem
- 请求使用 文件系统 API 访问读取、写入和文件管理功能。
callback
FunctionpermissionGranted
布尔值 - 允许或拒绝权限。
details
PermissionRequest | FilesystemPermissionRequest | MediaAccessPermissionRequest | OpenExternalPermissionRequest - 有关正在请求的权限的附加信息。
设置处理程序,用于响应 session
的权限请求。调用 callback(true)
将允许权限,callback(false)
将拒绝权限。要清除处理程序,请调用 setPermissionRequestHandler(null)
。请注意,您还必须实现 setPermissionCheckHandler
才能获得完整的权限处理。大多数 Web API 会进行权限检查,然后在检查被拒绝时发出权限请求。
const { session } = require('electron')
session.fromPartition('some-partition').setPermissionRequestHandler((webContents, permission, callback) => {
if (webContents.getURL() === 'some-host' && permission === 'notifications') {
return callback(false) // denied.
}
callback(true)
})
ses.setPermissionCheckHandler(handler)
handler
Function<boolean> | nullwebContents
(WebContents | null) - 正在检查权限的 WebContents。请注意,如果请求来自子框架,您应该使用requestingUrl
来检查请求源。所有进行权限检查的跨域子框架都会将null
的 webContents 传递给此处理程序,而某些其他权限检查(如notifications
检查)将始终传递null
。您应该使用embeddingOrigin
和requestingOrigin
来确定拥有框架和请求框架的来源。permission
字符串 - 权限检查的类型。clipboard-read
- 请求访问剪贴板以进行读取。clipboard-sanitized-write
- 请求访问剪贴板以进行写入。geolocation
- 通过 地理定位 API 访问用户的地理位置数据fullscreen
- 通过 全屏 API 控制应用程序的全屏状态。hid
- 通过 WebHID API 访问 HID 协议以操作 HID 设备。idle-detection
- 通过 IdleDetector API 访问用户的空闲状态。media
- 访问媒体设备,如摄像头、麦克风和扬声器。mediaKeySystem
- 访问 DRM 保护的内容。midi
- 在 Web MIDI API 中启用 MIDI 访问。midiSysex
- 在 Web MIDI API 中使用系统独占消息。notifications
- 使用 通知 API 为用户配置和显示桌面通知。openExternal
- 在外部应用程序中打开链接。pointerLock
- 通过 指针锁定 API 直接将鼠标移动解释为输入方法。这些请求似乎总是源自主框架。serial
- 通过 Web Serial API 读取和写入串口设备。storage-access
- 允许在第三方上下文中加载的内容通过 Storage Access API 请求访问第三方 Cookie。top-level-storage-access
- 允许顶级站点代表来自同一相关网站集中的其他网站的嵌入式内容请求第三方 Cookie 访问,使用 Storage Access API。usb
- 通过 WebUSB API 将非标准通用串行总线 (USB) 兼容设备服务公开给 Web。deprecated-sync-clipboard-read
已弃用 - 请求访问以运行document.execCommand("paste")
requestingOrigin
字符串 - 权限检查的源 URLdetails
对象 - 某些属性仅对特定权限类型可用。embeddingOrigin
字符串 (可选) - 进行了权限检查的框架所在的嵌入式框架的来源。仅对跨域子框架设置权限检查。securityOrigin
字符串 (可选) -media
检查的安全来源。mediaType
字符串 (可选) - 请求的媒体访问类型,可以是video
、audio
或unknown
requestingUrl
字符串 (可选) - 请求框架加载的最后一个 URL。对于进行权限检查的跨域子框架,不提供此信息。isMainFrame
布尔值 - 发出请求的框架是否为主框架
设置处理程序,可用于响应 session
的权限检查。返回 true
将允许权限,返回 false
将拒绝权限。请注意,您还必须实现 setPermissionRequestHandler
才能获得完整的权限处理。大多数 Web API 会进行权限检查,然后在检查被拒绝时发出权限请求。要清除处理程序,请调用 setPermissionCheckHandler(null)
。
const { session } = require('electron')
const url = require('url')
session.fromPartition('some-partition').setPermissionCheckHandler((webContents, permission, requestingOrigin) => {
if (new URL(requestingOrigin).hostname === 'some-host' && permission === 'notifications') {
return true // granted
}
return false // denied
})
ses.setDisplayMediaRequestHandler(handler[, opts])
handler
函数 | nullrequest
对象frame
WebFrameMain | null - 请求媒体访问的框架。在框架导航或销毁后,可能为null
。securityOrigin
字符串 - 发起请求的页面的来源。它特定于发起请求的每个框架,并由其方案、主机和端口定义。videoRequested
布尔值 - 如果 Web 内容请求了视频流,则为 true。audioRequested
布尔值 - 如果 Web 内容请求了音频流,则为 true。userGesture
布尔值 - 在触发此请求时用户手势是否处于活动状态。
callback
Functionstreams
对象video
对象 | WebFrameMain (可选)id
字符串 - 要授予的流的 ID。这通常来自 DesktopCapturerSource 对象。name
字符串 - 要授予的流的名称。这通常来自 DesktopCapturerSource 对象。
audio
字符串 | WebFrameMain (可选) - 如果指定了字符串,可以是loopback
或loopbackWithMute
。指定环回设备将捕获系统音频,目前仅在 Windows 上受支持。如果指定了 WebFrameMain,将从该框架捕获音频。enableLocalEcho
布尔值 (可选) - 如果audio
是 WebFrameMain 并且此设置为true
,则本地播放音频将不会被静音(例如,使用MediaRecorder
记录设置为true
的WebFrameMain
将允许音频在录制时通过扬声器)。默认为false
。
opts
对象 (可选) macOS 实验性useSystemPicker
布尔值 - 如果使用可用的本机系统选择器,则为 true。默认为false
。 macOS 实验性
当 Web 内容请求通过 navigator.mediaDevices.getDisplayMedia
API 访问显示媒体时,将调用此处理程序。使用 desktopCapturer API 选择要授予访问权限的流。
useSystemPicker
允许应用程序使用系统选择器,而不是从 getSources
提供特定的视频源。此选项是实验性的,目前仅适用于 MacOS 15+。如果系统选择器可用且 useSystemPicker
设置为 true
,则不会调用处理程序。
const { session, desktopCapturer } = require('electron')
session.defaultSession.setDisplayMediaRequestHandler((request, callback) => {
desktopCapturer.getSources({ types: ['screen'] }).then((sources) => {
// Grant access to the first screen found.
callback({ video: sources[0] })
})
// Use the system picker if available.
// Note: this is currently experimental. If the system picker
// is available, it will be used and the media request handler
// will not be invoked.
}, { useSystemPicker: true })
将 WebFrameMain 对象作为视频或音频流传递将从该框架捕获视频或音频流。
const { session } = require('electron')
session.defaultSession.setDisplayMediaRequestHandler((request, callback) => {
// Allow the tab to capture itself.
callback({ video: request.frame })
})
传递 null
而不是函数会将处理程序重置为其默认状态。
ses.setDevicePermissionHandler(handler)
handler
Function<boolean> | nulldetails
ObjectdeviceType
字符串 - 请求权限的设备类型,可以是hid
、serial
或usb
。origin
字符串 - 设备权限检查的源 URL。device
HIDDevice | SerialPort | USBDevice - 请求权限的设备。
设置处理程序,可用于响应 session
的设备权限检查。返回 true
将允许设备并授予权限,返回 false
将拒绝权限。要清除处理程序,请调用 setDevicePermissionHandler(null)
。此处理程序可用于为设备提供默认权限,而无需首先调用设备权限(例如通过 navigator.hid.requestDevice
)。如果未定义此处理程序,则将使用通过设备选择(例如通过 navigator.hid.requestDevice
)授予的默认设备权限。此外,Electron 的默认行为是在内存中存储已授予的设备权限。如果需要长期存储,开发人员可以存储已授予的设备权限(例如在处理 select-hid-device
事件时),然后使用 setDevicePermissionHandler
从该存储中读取。
const { app, BrowserWindow } = require('electron')
let win = null
app.whenReady().then(() => {
win = new BrowserWindow()
win.webContents.session.setPermissionCheckHandler((webContents, permission, requestingOrigin, details) => {
if (permission === 'hid') {
// Add logic here to determine if permission should be given to allow HID selection
return true
} else if (permission === 'serial') {
// Add logic here to determine if permission should be given to allow serial port selection
} else if (permission === 'usb') {
// Add logic here to determine if permission should be given to allow USB device selection
}
return false
})
// Optionally, retrieve previously persisted devices from a persistent store
const grantedDevices = fetchGrantedDevices()
win.webContents.session.setDevicePermissionHandler((details) => {
if (new URL(details.origin).hostname === 'some-host' && details.deviceType === 'hid') {
if (details.device.vendorId === 123 && details.device.productId === 345) {
// Always allow this type of device (this allows skipping the call to `navigator.hid.requestDevice` first)
return true
}
// Search through the list of devices that have previously been granted permission
return grantedDevices.some((grantedDevice) => {
return grantedDevice.vendorId === details.device.vendorId &&
grantedDevice.productId === details.device.productId &&
grantedDevice.serialNumber && grantedDevice.serialNumber === details.device.serialNumber
})
} else if (details.deviceType === 'serial') {
if (details.device.vendorId === 123 && details.device.productId === 345) {
// Always allow this type of device (this allows skipping the call to `navigator.hid.requestDevice` first)
return true
}
}
return false
})
win.webContents.session.on('select-hid-device', (event, details, callback) => {
event.preventDefault()
const selectedDevice = details.deviceList.find((device) => {
return device.vendorId === 9025 && device.productId === 67
})
callback(selectedDevice?.deviceId)
})
})
ses.setUSBProtectedClassesHandler(handler)
handler
Function<string[]> | nulldetails
ObjectprotectedClasses
string[] - 受保护的 USB 类的当前列表。可能的类值包括audio
audio-video
hid
mass-storage
smart-card
video
wireless
设置处理程序,可用于覆盖哪些 USB 类受到保护。处理程序的返回值是一个字符串数组,其中包含应被视为受保护的 USB 类(例如,在渲染器中不可用)。处理程序中数组的有效值为
audio
audio-video
hid
mass-storage
smart-card
video
wireless
从处理程序返回一个空字符串数组将允许所有 USB 类;返回传入的数组将维护受保护 USB 类的默认列表(如果未定义处理程序,则这也是默认行为)。要清除处理程序,请调用 setUSBProtectedClassesHandler(null)
。
const { app, BrowserWindow } = require('electron')
let win = null
app.whenReady().then(() => {
win = new BrowserWindow()
win.webContents.session.setUSBProtectedClassesHandler((details) => {
// Allow all classes:
// return []
// Keep the current set of protected classes:
// return details.protectedClasses
// Selectively remove classes:
return details.protectedClasses.filter((usbClass) => {
// Exclude classes except for audio classes
return usbClass.indexOf('audio') === -1
})
})
})
ses.setBluetoothPairingHandler(handler)
Windows Linux
handler
函数 | nulldetails
ObjectdeviceId
字符串pairingKind
字符串 - 请求的配对提示的类型。以下值之一confirm
此提示要求确认是否应配对蓝牙设备。confirmPin
此提示要求确认提供的 PIN 是否与设备上显示的 PIN 匹配。providePin
此提示要求为设备提供 PIN。
frame
WebFrameMain | null - 触发此处理程序的框架。在框架导航或销毁后,可能为null
。pin
字符串 (可选) - 如果pairingKind
为confirmPin
,则要验证的 PIN 值。
callback
Functionresponse
对象confirmed
布尔值 - 如果对话框被取消,应传递false
。如果pairingKind
为confirm
或confirmPin
,此值应指示是否确认配对。如果pairingKind
为providePin
,则当提供值时,该值应为true
。pin
字符串 | null (可选) - 当pairingKind
为providePin
时,此值应为蓝牙设备所需的 PIN。
设置处理程序以响应蓝牙配对请求。此处理程序允许开发人员处理需要额外验证才能配对的设备。当未定义处理程序时,Linux 或 Windows 上任何需要额外验证的配对都将被自动取消。macOS 不需要处理程序,因为 macOS 会自动处理配对。要清除处理程序,请调用 setBluetoothPairingHandler(null)
。
const { app, BrowserWindow, session } = require('electron')
const path = require('node:path')
function createWindow () {
let bluetoothPinCallback = null
const mainWindow = new BrowserWindow({
webPreferences: {
preload: path.join(__dirname, 'preload.js')
}
})
mainWindow.webContents.session.setBluetoothPairingHandler((details, callback) => {
bluetoothPinCallback = callback
// Send a IPC message to the renderer to prompt the user to confirm the pairing.
// Note that this will require logic in the renderer to handle this message and
// display a prompt to the user.
mainWindow.webContents.send('bluetooth-pairing-request', details)
})
// Listen for an IPC message from the renderer to get the response for the Bluetooth pairing.
mainWindow.webContents.ipc.on('bluetooth-pairing-response', (event, response) => {
bluetoothPinCallback(response)
})
}
app.whenReady().then(() => {
createWindow()
})
ses.clearHostResolverCache()
返回 Promise<void>
- 操作完成时解析。
清除主机解析器缓存。
ses.allowNTLMCredentialsForDomains(domains)
domains
字符串 - 一个逗号分隔的服务器列表,这些服务器启用了集成身份验证。
动态设置是否始终为 HTTP NTLM 或 Negotiate 身份验证发送凭据。
const { session } = require('electron')
// consider any url ending with `example.com`, `foobar.com`, `baz`
// for integrated authentication.
session.defaultSession.allowNTLMCredentialsForDomains('*example.com, *foobar.com, *baz')
// consider all urls for integrated authentication.
session.defaultSession.allowNTLMCredentialsForDomains('*')
ses.setUserAgent(userAgent[, acceptLanguages])
userAgent
stringacceptLanguages
字符串 (可选)
为此会话覆盖 userAgent
和 acceptLanguages
。
acceptLanguages
必须是逗号分隔的有序语言代码列表,例如 "en-US,fr,de,ko,zh-CN,ja"
。
这不会影响现有的 WebContents
,并且每个 WebContents
都可以使用 webContents.setUserAgent
来覆盖会话范围的用户代理。
ses.isPersistent()
返回 boolean
- 此会话是否为持久化会话。BrowserWindow
的默认 webContents
会话是持久化的。从分区创建会话时,以 persist:
为前缀的会话将是持久化的,而其他会话将是临时的。
ses.getUserAgent()
返回 string
- 此会话的用户代理。
ses.setSSLConfig(config)
config
对象minVersion
字符串 (可选) - 可以是tls1
、tls1.1
、tls1.2
或tls1.3
。连接到远程服务器时允许的最低 SSL 版本。默认为tls1
。maxVersion
字符串 (可选) - 可以是tls1.2
或tls1.3
。连接到远程服务器时允许的最高 SSL 版本。默认为tls1.3
。disabledCipherSuites
整数[] (可选) - 除了 net 内置策略禁用的密码套件外,还应明确禁止使用的密码套件列表。支持的文字形式:0xAABB,其中 AA 是cipher_suite[0]
,BB 是cipher_suite[1]
,如 RFC 2246,第 7.4.1.2 节所定义。在此形式中无法识别但可解析的密码套件不会返回错误。例如,要禁用 TLS_RSA_WITH_RC4_128_MD5,请指定 0x0004,而要禁用 TLS_ECDH_ECDSA_WITH_RC4_128_SHA,请指定 0xC002。请注意,无法使用此机制禁用 TLSv1.3 密码。
设置会话的 SSL 配置。所有后续网络请求都将使用新配置。现有网络连接(如 WebSocket 连接)不会被终止,但池中的旧套接字不会被用于新连接。
ses.getBlobData(identifier)
identifier
字符串 - 有效的 UUID。
返回 Promise<Buffer>
- 使用 blob 数据解析。
ses.downloadURL(url[, options])
url
string
发起下载 url
处的资源。API 将生成一个 DownloadItem,可以通过 will-download 事件访问。
这不会执行与页面来源相关的任何安全检查,不像 webContents.downloadURL
。
ses.createInterruptedDownload(options)
允许从之前的 Session
恢复 cancelled
或 interrupted
的下载。API 将生成一个 DownloadItem,可以通过 will-download 事件访问。DownloadItem
不会关联任何 WebContents
,并且初始状态将是 interrupted
。仅当在 DownloadItem 上调用 resume
API 时,下载才会开始。
ses.clearAuthCache()
返回 Promise<void>
- 会话的 HTTP 身份验证缓存清除后解析。
ses.setPreloads(preloads)
已弃用
preloads
字符串[] - 到预加载脚本的绝对路径数组
添加脚本,这些脚本将在与此会话关联的所有 WebContents 上运行,就在常规 preload
脚本运行之前。
已弃用:使用新的 ses.registerPreloadScript
API。
ses.getPreloads()
已弃用
返回 string[]
已注册预加载脚本的路径数组。
已弃用:使用新的 ses.getPreloadScripts
API。这只会返回 frame
上下文类型的预加载脚本路径。
ses.registerPreloadScript(script)
script
PreloadScriptRegistration - 预加载脚本
注册预加载脚本,该脚本将在该会话的关联上下文中执行。对于 frame
上下文,这将在此 WebContents 的 Web 首选项中定义的任何预加载之前运行。
返回 string
- 注册的预加载脚本的 ID。
ses.unregisterPreloadScript(id)
id
字符串 - 预加载脚本 ID
注销脚本。
ses.getPreloadScripts()
返回 PreloadScript[]:已注册预加载脚本的路径数组。
ses.setCodeCachePath(path)
path
字符串 - 用于存储渲染器生成的 v8 JS 代码缓存的绝对路径。
设置用于为此会话存储渲染器生成的 JS 代码缓存 的目录。用户无需在调用此函数前创建目录,运行时将创建该目录(如果不存在),否则将使用现有目录。如果无法创建目录,则代码缓存将不起作用,并且所有与代码缓存相关的操作将在运行时静默失败。默认情况下,目录将是用户数据文件夹下的 Code Cache
。
请注意,默认情况下,代码缓存仅对 http(s) URL 启用;要为自定义协议启用代码缓存,在注册协议时必须指定 codeCache: true
和 standard: true
。
ses.clearCodeCaches(options)
返回 Promise<void>
- 代码缓存清除操作完成后解析。
ses.getSharedDictionaryUsageInfo()
返回 Promise<SharedDictionaryUsageInfo[]>
- Chromium 网络服务存储中的共享字典信息条目数组。
共享字典用于为通过线路发送的数据提供高级压缩,特别是 Brotli 和 ZStandard。您无需在 Electron 中调用任何共享字典 API 即可使用此高级 Web 功能,但如果您这样做,它们可以提供对解压缩期间使用的共享字典的更深入的控制和检查。
要获取特定共享字典条目的详细信息,请调用 getSharedDictionaryInfo(options)
。
ses.getSharedDictionaryInfo(options)
返回 Promise<SharedDictionaryInfo[]>
- Chromium 网络服务存储中的共享字典信息条目数组。
要获取所有现有共享字典的信息,请调用 getSharedDictionaryUsageInfo()
。
ses.clearSharedDictionaryCache()
返回 Promise<void>
- 内存和磁盘中的字典缓存清除后解析。
ses.clearSharedDictionaryCacheForIsolationKey(options)
返回 Promise<void>
- 为指定的隔离键清除内存和磁盘中的字典缓存后解析。
ses.setSpellCheckerEnabled(enable)
enable
boolean
设置是否启用内置拼写检查器。
ses.isSpellCheckerEnabled()
返回 boolean
- 内置拼写检查器是否已启用。
ses.setSpellCheckerLanguages(languages)
languages
字符串[] - 要为拼写检查器启用的语言代码数组。
内置拼写检查器不会自动检测用户键入的语言。为了使拼写检查器能够正确检查用户输入的单词,您必须调用此 API 并传入语言代码数组。您可以使用 ses.availableSpellCheckerLanguages
属性获取支持的语言代码列表。
在 macOS 上,将使用操作系统拼写检查器,它会自动检测您的语言。此 API 在 macOS 上不起作用。
ses.getSpellCheckerLanguages()
返回 string[]
- 拼写检查器已启用的语言代码数组。如果此列表为空,拼写检查器将回退使用 en-US
。默认情况下,在启动时,如果此设置为空列表,Electron 将尝试使用当前操作系统区域设置填充此设置。此设置会在重启后保留。
在 macOS 上,将使用操作系统拼写检查器,它有自己的语言列表。在 macOS 上,此 API 将返回已由操作系统配置的语言。
ses.setSpellCheckerDictionaryDownloadURL(url)
url
字符串 - Electron 从中下载 hunspell 字典的基 URL。
默认情况下,Electron 将从 Chromium CDN 下载 hunspell 字典。如果您想覆盖此行为,可以使用此 API 指向您自己托管的 hunspell 字典版本。我们会在每次发布时发布一个 hunspell_dictionaries.zip
文件,其中包含您需要在此处托管的文件。
文件服务器必须是不区分大小写的。如果无法做到这一点,您必须将每个文件上传两次:一次使用它在 ZIP 文件中的大小写,一次使用全小写的文件名。
如果 hunspell_dictionaries.zip
中存在的文件位于 https://example.com/dictionaries/language-code.bdic
,则您应使用 ses.setSpellCheckerDictionaryDownloadURL('https://example.com/dictionaries/')
调用此 API。请注意末尾的斜杠。字典的 URL 形式为 ${url}${filename}
。
在 macOS 上,将使用操作系统拼写检查器,因此我们不下载任何字典文件。此 API 在 macOS 上不起作用。
ses.listWordsInSpellCheckerDictionary()
返回 Promise<string[]>
- 应用自定义词典中的所有单词数组。在从磁盘加载完整个词典后解析。
ses.addWordToSpellCheckerDictionary(word)
word
string - 要添加到词典的单词
返回 boolean
- 单词是否已成功写入自定义词典。此 API 在非持久性(内存中)会话上不起作用。
在 macOS 和 Windows 上,此单词还将写入操作系统的自定义词典。
ses.removeWordFromSpellCheckerDictionary(word)
word
string - 要从词典中删除的单词
返回 boolean
- 单词是否已成功从自定义词典中删除。此 API 在非持久性(内存中)会话上不起作用。
在 macOS 和 Windows 上,此单词还将从操作系统的自定义词典中删除。
ses.loadExtension(path[, options])
已弃用
path
string - 包含未打包 Chrome 扩展的目录路径
返回 Promise<Extension>
- 扩展加载后解析。
如果扩展加载失败,此方法将引发异常。如果在安装扩展时出现警告(例如,如果扩展请求了 Electron 不支持的 API),则会将其记录到控制台。
请注意,Electron 不支持完整的 Chrome 扩展 API。有关支持情况的更多详细信息,请参阅 支持的扩展 API。
请注意,在 Electron 的早期版本中,加载的扩展程序将在应用程序下次运行时被记住。现在情况不再如此:如果您希望加载扩展程序,则必须在每次启动应用程序时调用 loadExtension
。
const { app, session } = require('electron')
const path = require('node:path')
app.whenReady().then(async () => {
await session.defaultSession.loadExtension(
path.join(__dirname, 'react-devtools'),
// allowFileAccess is required to load the devtools extension on file:// URLs.
{ allowFileAccess: true }
)
// Note that in order to use the React DevTools extension, you'll need to
// download and unzip a copy of the extension.
})
此 API 不支持加载打包的 (.crx) 扩展。
在发出 app
模块的 ready
事件之前,无法调用此 API。
不支持将扩展加载到内存中(非持久性)的会话中,否则会引发错误。
已弃用:请使用新的 ses.extensions.loadExtension
API。
ses.removeExtension(extensionId)
已弃用
extensionId
string - 要删除的扩展程序的 ID
卸载扩展程序。
在发出 app
模块的 ready
事件之前,无法调用此 API。
已弃用:请使用新的 ses.extensions.removeExtension
API。
ses.getExtension(extensionId)
已弃用
extensionId
string - 要查询的扩展程序的 ID
返回 Extension | null
- 具有给定 ID 的已加载扩展程序。
在发出 app
模块的 ready
事件之前,无法调用此 API。
已弃用:请使用新的 ses.extensions.getExtension
API。
ses.getAllExtensions()
已弃用
返回 Extension[]
- 所有已加载扩展程序的列表。
在发出 app
模块的 ready
事件之前,无法调用此 API。
已弃用:请使用新的 ses.extensions.getAllExtensions
API。
ses.getStoragePath()
返回 string | null
- 该会话在磁盘上持久化数据所在的绝对文件系统路径。对于内存会话,此函数返回 null
。
ses.clearData([options])
返回 Promise<void>
- 所有数据清除后解析。
清除各种不同类型的数据。
此方法清除的数据类型比 clearStorageData
方法更多,也更彻底。
Cookie 的存储范围比来源更广。在删除 Cookie 并按 origins
(或 excludeOrigins
)进行筛选时,Cookie 将在 可注册域 级别上删除。例如,清除 https://really.specific.origin.example.com/
的 Cookie 将最终清除 example.com
的所有 Cookie。清除 https://my.website.example.co.uk/
的 Cookie 将最终清除 example.co.uk
的所有 Cookie。
清除缓存数据也将清除共享字典缓存。这意味着用于压缩的任何字典在清除缓存后可能会重新加载。如果您希望清除共享字典缓存但保留其他缓存数据,则可以使用 clearSharedDictionaryCache
方法。
有关更多信息,请参阅 Chromium 的 BrowsingDataRemover
接口。
实例属性
以下属性在 Session
实例上可用
ses.availableSpellCheckerLanguages
只读
一个 string[]
数组,包含所有已知的可用拼写检查器语言。向 setSpellCheckerLanguages
API 提供不在此数组中的语言代码将导致错误。
ses.spellCheckerEnabled
一个 boolean
,指示内置拼写检查器是否已启用。
ses.storagePath
只读
一个 string | null
,指示该会话在磁盘上持久化数据所在的绝对文件系统路径。对于内存会话,此函数返回 null
。
ses.cookies
只读
此会话的 Cookies
对象。
ses.extensions
只读
此会话的 Extensions
对象。
ses.serviceWorkers
只读
此会话的 ServiceWorkers
对象。
ses.webRequest
只读
此会话的 WebRequest
对象。
ses.protocol
只读
此会话的 Protocol
对象。
const { app, session } = require('electron')
const path = require('node:path')
app.whenReady().then(() => {
const protocol = session.fromPartition('some-partition').protocol
if (!protocol.registerFileProtocol('atom', (request, callback) => {
const url = request.url.substr(7)
callback({ path: path.normalize(path.join(__dirname, url)) })
})) {
console.error('Failed to register protocol')
}
})
ses.netLog
只读
此会话的 NetLog
对象。
const { app, session } = require('electron')
app.whenReady().then(async () => {
const netLog = session.fromPartition('some-partition').netLog
netLog.startLogging('/path/to/net-log')
// After some network events
const path = await netLog.stopLogging()
console.log('Net-logs written to', path)
})