动态标准 — 最后更新于 2024年9月12日
Navigator
对象所有当前引擎均支持。
Navigator
的实例表示用户代理(客户端)的身份和状态。它们还充当一个通用全局对象,各种 API 在本规范和其他规范中都位于该对象下。
[Exposed =Window ]
interface Navigator {
// objects implementing this interface also implement the interfaces given below
};
Navigator includes NavigatorID ;
Navigator includes NavigatorLanguage ;
Navigator includes NavigatorOnLine ;
Navigator includes NavigatorContentUtils ;
Navigator includes NavigatorCookies ;
Navigator includes NavigatorPlugins ;
Navigator includes NavigatorConcurrentHardware ;
这些接口混合被单独定义,以便WorkerNavigator
可以重用Navigator
接口的部分内容。
每个Window
都有一个关联的 Navigator
,它是一个Navigator
对象。在创建Window
对象时,其关联的 Navigator
必须设置为在Window
对象的相关领域中创建的一个新的Navigator
对象。
所有当前引擎均支持。
navigator
和clientInformation
获取器步骤是返回自身的关联的 Navigator
。
interface mixin NavigatorID {
readonly attribute DOMString appCodeName ; // constant "Mozilla"
readonly attribute DOMString appName ; // constant "Netscape"
readonly attribute DOMString appVersion ;
readonly attribute DOMString platform ;
readonly attribute DOMString product ; // constant "Gecko"
[Exposed =Window ] readonly attribute DOMString productSub ;
readonly attribute DOMString userAgent ;
[Exposed =Window ] readonly attribute DOMString vendor ;
[Exposed =Window ] readonly attribute DOMString vendorSub ; // constant ""
};
在某些情况下,尽管整个行业付出了最大的努力,但网络浏览器仍然存在错误和限制,网页作者被迫绕过这些问题。
本节定义了一组属性,可用于从脚本中确定正在使用的用户代理类型,以便解决这些问题。
用户代理具有navigator 兼容模式,该模式为 Chrome、Gecko 或 WebKit 之一。
navigator 兼容模式 将NavigatorID
混合限制为属性值的组合以及taintEnabled()
和oscpu
的存在,这些属性值和存在情况已知与现有网络内容兼容。
客户端检测应始终限于检测已知的当前版本;应始终假设未来的版本和未知的版本完全兼容。
self.navigator.appCodeName
返回字符串“Mozilla
”。
self.navigator.appName
返回字符串“Netscape
”。
self.navigator.appVersion
返回浏览器的版本。
self.navigator.platform
返回平台的名称。
self.navigator.product
返回字符串“Gecko
”。
window.navigator.productSub
返回字符串“20030107
”或字符串“20100101
”。
self.navigator.userAgent
所有当前引擎均支持。
所有当前引擎均支持。
返回完整的 `User-Agent
` 标头。
window.navigator.vendor
返回空字符串、字符串“Apple Computer, Inc.
”或字符串“Google Inc.
”。
window.navigator.vendorSub
返回空字符串。
appCodeName
必须返回字符串“Mozilla
”。
appName
必须返回字符串“Netscape
”。
appVersion
必须返回以“5.0 (
”开头的适当字符串,如下所示
令 trail 为 默认 `User-Agent
` 值 中“Mozilla/
”前缀之后的子字符串。
返回 trail。
如果 trail 以“5.0 (Windows
”开头,则返回“5.0 (Windows)
”。
否则,返回 trail 的前缀,直到但不包括第一个 U+003B (;),并与字符 U+0029 右括号连接。例如,“5.0 (Macintosh)
”、“5.0 (Android 10)
”或“5.0 (X11)
”。
platform
必须返回一个字符串,表示浏览器正在执行的平台(例如“MacIntel
”、“Win32
”、“Linux x86_64
”、“Linux armv81
”),或者出于隐私和兼容性考虑,返回另一个平台上通常返回的字符串。
product
必须返回字符串“Gecko
”。
productSub
必须从以下列表中返回适当的字符串
字符串“20030107
”。
字符串“20100101
”。
userAgent
必须返回默认 `User-Agent
` 值。
vendor
必须从以下列表中返回适当的字符串
字符串“Google Inc.
”。
空字符串。
字符串“Apple Computer, Inc.
”。
vendorSub
必须返回空字符串。
如果navigator 兼容模式 为 Gecko,则用户代理还必须支持以下部分接口
partial interface mixin NavigatorID {
[Exposed =Window ] boolean taintEnabled (); // constant false
[Exposed =Window ] readonly attribute DOMString oscpu ;
};
taintEnabled()
方法必须返回 false。
oscpu
属性的获取器必须返回空字符串或一个表示浏览器正在执行的平台的字符串,例如“Windows NT 10.0; Win64; x64
”、“Linux x86_64
”。
此 API 中任何因用户而异的信息都可用于分析用户。事实上,如果提供了足够此类信息,实际上可以唯一识别用户。因此,强烈建议用户代理实现者在此 API 中包含尽可能少的信息。
interface mixin NavigatorLanguage {
readonly attribute DOMString language ;
readonly attribute FrozenArray <DOMString > languages ;
};
self.navigator.language
所有当前引擎均支持。
所有当前引擎均支持。
返回一个表示用户首选语言的语言标签。
self.navigator.languages
所有当前引擎均支持。
所有当前引擎均支持。
返回一个包含用户首选语言的语言标签数组,最首选的语言排在首位。
最首选的语言是由 navigator.language
返回的。
当用户代理对用户首选语言的理解发生变化时,会在 Window
或 WorkerGlobalScope
对象上触发 languagechange
事件。
language
languages
必须返回一个 冻结数组,包含有效的 BCP 47 语言标签,表示一个或多个 合理的语言,或用户首选的语言,按偏好顺序排列,最首选的语言排在首位。在用户代理需要返回不同的值或以不同顺序返回值之前,必须返回相同的对象。 [BCP47]
每当用户代理需要使 navigator.languages
属性(属于 Window
或 WorkerGlobalScope
对象 global)返回一组新的语言标签时,用户代理必须在给定 global 的 DOM 操作任务源 上 排队一个全局任务,以在 global 上 触发一个名为 languagechange
的事件,并在该任务开始执行之前等待,然后才能真正返回新值。
为了确定 合理的语言,用户代理应牢记以下几点
en-US
”值;如果服务的所有用户都使用相同的值,则可以降低彼此区分用户可能性。
为了避免引入任何更多指纹向量,用户代理应为此函数中定义的 API 使用与 HTTP `Accept-Language
` 标头相同的列表。
interface mixin NavigatorOnLine {
readonly attribute boolean onLine ;
};
self.navigator.onLine
所有当前引擎均支持。
所有当前引擎均支持。
如果用户代理确定处于脱机状态(与网络断开连接),则返回 false。如果用户代理可能在线,则返回 true。
onLine
属性必须返回 false,如果用户代理在用户点击链接或脚本请求远程页面(或知道此类尝试将失败)时不会联系网络,否则必须返回 true。
当 navigator.onLine
属性(属于 Window
或 WorkerGlobalScope
global)返回的值从 true 变为 false 时,用户代理必须在给定 global 的 网络任务源 上 排队一个全局任务,以在 global 上 触发一个名为 offline
的事件。
另一方面,当 navigator.onLine
属性(属于 Window
或 WorkerGlobalScope
global)返回的值从 false 变为 true 时,用户代理必须在给定 global 的 网络任务源 上 排队一个全局任务,以在 Window
或 WorkerGlobalScope
对象上 触发一个名为 online
的事件。
此属性本质上不可靠。计算机可以连接到网络,但没有互联网访问权限。
在此示例中,当浏览器上线和下线时,指示器会更新。
<!DOCTYPE HTML>
< html lang = "en" >
< head >
< title > Online status</ title >
< script >
function updateIndicator() {
document. getElementById( 'indicator' ). textContent = navigator. onLine ? 'online' : 'offline' ;
}
</ script >
</ head >
< body onload = "updateIndicator()" ononline = "updateIndicator()" onoffline = "updateIndicator()" >
< p > The network is: < span id = "indicator" > (state unknown)</ span >
</ body >
</ html >
registerProtocolHandler()
方法Navigator/registerProtocolHandler
interface mixin NavigatorContentUtils {
[SecureContext ] undefined registerProtocolHandler (DOMString scheme , USVString url );
[SecureContext ] undefined unregisterProtocolHandler (DOMString scheme , USVString url );
};
window.navigator.registerProtocolHandler(scheme, url)
为 scheme 在 url 处注册一个处理程序。例如,在线电话消息服务可以将自身注册为 sms:
方案的处理程序,以便如果用户点击此类链接,则可以让他们有机会使用该网站。 [SMS]
url 中的字符串“%s
”用作占位符,用于放置要处理的内容的 URL。
如果用户代理阻止注册,则会抛出一个 "SecurityError
" DOMException
(例如,尝试注册为“http
”的处理程序时可能会发生这种情况)。
如果 url 中缺少字符串“%s
”,则会抛出一个 "SyntaxError
" DOMException
。
window.navigator.unregisterProtocolHandler(scheme, url)
Navigator/unregisterProtocolHandler
仅在一个引擎中支持。
取消注册由参数给定的处理程序。
如果用户代理阻止取消注册,则会抛出一个 "SecurityError
" DOMException
(例如,使用无效方案时可能会发生这种情况)。
如果 url 中缺少字符串“%s
”,则会抛出一个 "SyntaxError
" DOMException
。
registerProtocolHandler(scheme, url)
方法的步骤如下
令 (normalizedScheme,normalizedURLString) 为使用 scheme、url 和 this 的 相关设置对象 运行 规范化协议处理程序参数 的结果。
并行:为 normalizedScheme 和 normalizedURLString 注册协议处理程序。用户代理可以在描述的约束范围内随意执行任何操作。例如,用户代理可以提示用户并提供机会将站点添加到处理程序的简短列表中,或将其设为默认处理程序,或取消请求。用户代理还可以静默收集信息,仅在与用户相关时提供。
用户代理应跟踪哪些站点已注册处理程序(即使用户已拒绝此类注册),以便不会反复提示用户使用相同的请求。
如果registerProtocolHandler()
自动化模式 的当前 相关全局对象 的关联的 Document
不是 "none
",则用户代理应首先验证它是否处于自动化上下文中(参见WebDriver 的安全注意事项)。然后,用户代理应绕过以上信息通信和用户同意收集,并根据registerProtocolHandler()
自动化模式 的值执行以下操作。
autoAccept
"假装用户已查看注册详细信息并接受了请求。
autoReject
"假装用户已查看注册详细信息并拒绝了请求。
当用户代理使用此处理程序 处理URL inputURL 时
根据inputURL 和空字符串设置用户名。
根据inputURL 和空字符串设置密码。
令 inputURLString 为 inputURL 的序列化结果。
令 encodedURL 为使用组件百分比编码集 对 inputURLString 进行UTF-8 百分比编码的结果。
令 handlerURLString 为 normalizedURLString。
将 handlerURLString 中第一个 "%s
" 实例替换为 encodedURL。
令 resultURL 为解析 handlerURLString 的结果。
如果用户访问过 https://example.com/
网站并进行了以下调用
navigator. registerProtocolHandler( 'web+soup' , 'soup?url=%s' )
…然后,在很久以后,当访问 https://www.example.net/
时,点击了一个类似于以下内容的链接
< a href = "web+soup:chicken-kïwi" > Download our Chicken Kïwi soup!</ a >
…那么 UA 可能会导航到以下 URL
https://example.com/soup?url=web+soup:chicken-k%C3%AFwi
然后,此站点可以对 soup 执行任何操作(合成它并将其发送给用户,或执行任何其他操作)。
这并没有定义何时使用处理程序。在某种程度上,跨文档导航的处理模型 定义了一些相关的情况,但通常用户代理可以在任何它们原本会考虑将方案传递给原生插件或辅助应用程序的地方使用此信息。
unregisterProtocolHandler(scheme, url)
方法的步骤如下
令 (normalizedScheme, normalizedURLString) 为使用 scheme、url 和当前 相关设置对象 运行规范化协议处理程序参数 的结果。
并行:取消注册由 normalizedScheme 和 normalizedURLString 描述的处理程序。
要规范化协议处理程序参数,给定一个字符串 scheme、一个字符串 url 和一个环境设置对象 environment,执行以下步骤
将 scheme 设置为 scheme,并转换为 ASCII 小写。
如果 scheme 既不是安全列表中的方案,也不是以 "web+
" 后跟一个或多个ASCII 小写字母 开头的字符串,则抛出一个"SecurityError
" DOMException
。
这意味着在 scheme 中包含冒号(如 "mailto:
")将抛出错误。
以下方案是安全列表中的方案
bitcoin
ftp
ftps
geo
im
irc
ircs
magnet
mailto
matrix
mms
news
nntp
openpgp4fpr
sftp
sip
sms
smsto
ssh
tel
urn
webcal
wtai
xmpp
此列表可能会更改。如果有需要添加的方案,请发送反馈。
如果 url 不包含 "%s
",则抛出一个"SyntaxError
" DOMException
。
令 urlRecord 为给定 url 并相对于 environment 运行URL 编码解析 的结果。
如果 urlRecord 为失败,则抛出一个"SyntaxError
" DOMException
。
如果 %s
占位符位于 URL 的主机或端口中,则强制执行此情况。
如果 urlRecord 的方案 不是HTTP(S) 方案,或者 urlRecord 的来源 与 environment 的来源不同源,则抛出一个"SecurityError
" DOMException
。
断言:给定 urlRecord 运行URL 是否可能值得信赖? 的结果为 "Potentially Trustworthy
"。
由于规范化协议处理程序参数 在安全上下文中运行,因此这由同源条件暗示。
返回 (scheme, urlRecord)。
根据定义,urlRecord 的序列化结果不是有效的 URL 字符串,因为它包含字符串 "%s
",该字符串不是 URL 中的有效组件。
自定义方案处理程序可能会带来一些问题,特别是隐私问题。
劫持所有 Web 使用。 用户代理不应允许其正常运行的关键方案(例如HTTP(S) 方案)通过第三方站点重定向。这将允许轻松跟踪用户的活动,并允许收集用户信息,即使在安全连接中也是如此。
劫持默认值。 强烈建议用户代理不要自动更改任何默认值,因为这可能会导致用户将数据发送到用户未预期的远程主机。新注册的处理程序绝不应自动导致使用这些站点。
注册垃圾邮件。 用户代理应考虑站点可能会尝试注册大量处理程序的可能性,这些处理程序可能来自多个域(例如,通过一系列每个域都注册一个 web+spam:
处理程序的页面进行重定向——类似的做法多年来一直被色情网站滥用其他 Web 浏览器功能)。用户代理应优雅地处理此类恶意尝试,保护用户。
恶意处理程序元数据。 用户代理应防范针对其界面中嵌入的字符串的典型攻击,例如确保此类字符串中的标记或转义字符不会执行,正确处理空字节,过长的字符串不会导致崩溃或缓冲区溢出,等等。
泄露私人数据。 网页作者可能会使用被视为私人的 URL 数据来引用自定义方案处理程序。他们可能会这样做的预期是,用户选择的处理程序指向组织内部的页面,从而确保敏感数据不会暴露给第三方。但是,用户可能已注册了一个指向外部站点的处理程序,从而导致数据泄露给该第三方。实现者可能希望考虑允许管理员在某些子域、内容类型或方案上禁用自定义处理程序。
界面干扰。 用户代理应准备好处理方法中故意设置的长参数。例如,如果公开的用户界面由一个“接受”按钮和一个“拒绝”按钮组成,“接受”绑定包含处理程序的名称,那么重要的是,长名称不会导致“拒绝”按钮被推离屏幕。
每个Document
都有一个registerProtocolHandler()
自动化模式。它默认为 "none
",但也可以是 "autoAccept
" 或 "autoReject
"。
为了用户代理自动化和网站测试的目的,本标准定义了设置 RPH 注册模式 WebDriver 扩展命令。它指示用户代理将Document
置于一种模式下,在这种模式下,它将自动模拟用户接受或拒绝注册确认提示对话框。
HTTP 方法 | URI 模板 |
---|---|
`POST ` | /session/{session id}/custom-handlers/set-mode
|
远程端步骤如下
如果 parameters 不是一个 JSON 对象,则返回一个带有 WebDriver 错误 和 WebDriver 错误代码 无效参数 的错误。
令 mode 为从 parameters 中 获取名为 "mode
" 的属性的结果。
如果 mode 不是 "autoAccept
"、"autoReject
" 或 "none
",则返回一个带有 WebDriver 错误 和 WebDriver 错误代码 无效参数 的错误。
将 document 的 registerProtocolHandler()
自动化模式 设置为 mode。
返回带有数据 null 的 成功。
interface mixin NavigatorCookies {
readonly attribute boolean cookieEnabled ;
};
window.navigator.cookieEnabled
所有当前引擎均支持。
如果设置 Cookie 将被忽略,则返回 false,否则返回 true。
如果用户代理尝试根据 HTTP 状态管理机制 处理 Cookie,则 cookieEnabled
属性必须返回 true;如果用户代理忽略 Cookie 更改请求,则返回 false。 [COOKIES]
window.navigator.pdfViewerEnabled
如果用户代理支持在 导航 到 PDF 文件时内联查看 PDF 文件,则返回 true,否则返回 false。在后一种情况下,PDF 文件将由 外部软件 处理。
interface mixin NavigatorPlugins {
[SameObject ] readonly attribute PluginArray plugins ;
[SameObject ] readonly attribute MimeTypeArray mimeTypes ;
boolean javaEnabled ();
readonly attribute boolean pdfViewerEnabled ;
};
[Exposed =Window ,
LegacyUnenumerableNamedProperties ]
interface PluginArray {
undefined refresh ();
readonly attribute unsigned long length ;
getter Plugin ? item (unsigned long index );
getter Plugin ? namedItem (DOMString name );
};
[Exposed =Window ,
LegacyUnenumerableNamedProperties ]
interface MimeTypeArray {
readonly attribute unsigned long length ;
getter MimeType ? item (unsigned long index );
getter MimeType ? namedItem (DOMString name );
};
[Exposed =Window ,
LegacyUnenumerableNamedProperties ]
interface Plugin {
readonly attribute DOMString name ;
readonly attribute DOMString description ;
readonly attribute DOMString filename ;
readonly attribute unsigned long length ;
getter MimeType ? item (unsigned long index );
getter MimeType ? namedItem (DOMString name );
};
[Exposed =Window ]
interface MimeType {
readonly attribute DOMString type ;
readonly attribute DOMString description ;
readonly attribute DOMString suffixes ;
readonly attribute Plugin enabledPlugin ;
};
尽管如今可以通过 navigator.pdfViewerEnabled
检测 PDF 查看器支持,但出于历史原因,存在许多复杂且相互交织的接口提供了相同的功能,而遗留代码依赖于这些接口。本节同时指定了简单的现代变体和复杂的传统变体。
每个用户代理都有一个 PDF 查看器支持 布尔值,其值是 实现定义的(并且可能根据用户偏好而有所不同)。
此值还会影响 导航 处理模型。
每个 Window
对象都有一个 PDF 查看器插件对象 列表。如果用户代理的 PDF 查看器支持 为 false,则它是空列表。否则,它是一个包含五个 Plugin
对象的列表,其 名称 分别为
PDF Viewer
"Chrome PDF Viewer
"Chromium PDF Viewer
"Microsoft Edge PDF Viewer
"WebKit built-in PDF
"上述列表的值构成 PDF 查看器插件名称 列表。
这些名称是根据网站历史上搜索内容的证据选择的,因此,为了保持与现有内容的兼容性,用户代理需要公开这些名称。它们按字母顺序排列。"PDF Viewer
" 名称插入第 0 个位置,以便 enabledPlugin
获取器可以指向一个通用插件名称。
每个 Window
对象都有一个 PDF 查看器 MIME 类型对象 列表。如果用户代理的 PDF 查看器支持 为 false,则它是空列表。否则,它是一个包含两个 MimeType
对象的列表,其 类型 分别为
application/pdf
"text/pdf
"上述列表的值构成 PDF 查看器 MIME 类型 列表。
每个 NavigatorPlugins
对象都有一个 插件数组,它是一个新的 PluginArray
,以及一个 MIME 类型数组,它是一个新的 MimeTypeArray
。
NavigatorPlugins
混合的 plugins
获取器步骤是返回 其 的 插件数组。
NavigatorPlugins
混合的 mimeTypes
获取器步骤是返回 其 的 MIME 类型数组。
NavigatorPlugins
混合的 javaEnabled()
方法步骤是返回 false。
所有当前引擎均支持。
NavigatorPlugins
混合的 pdfViewerEnabled
获取器步骤是返回用户代理的 PDF 查看器支持。
PluginArray
接口 支持命名属性。如果用户代理的 PDF 查看器支持 为 true,则它们是 PDF 查看器插件名称。否则,它们是空列表。
PluginArray
接口的 namedItem(name)
方法步骤为
PluginArray
接口 支持索引属性。 支持的属性索引 是 其 的 相关全局对象 的 PDF 查看器插件对象 的 索引。
PluginArray
接口的 item(index)
方法步骤为
令 plugins 为 其 的 相关全局对象 的 PDF 查看器插件对象。
如果 index < plugins 的 大小,则返回 plugins[index]。
返回 null。
PluginArray
接口的 length
获取器步骤是返回 其 的 相关全局对象 的 PDF 查看器插件对象 的 大小。
PluginArray
接口的 refresh()
方法步骤是不执行任何操作。
MimeTypeArray
接口 支持命名属性。如果用户代理的 PDF 查看器支持 为 true,则它们是 PDF 查看器 MIME 类型。否则,它们是空列表。
MimeTypeArray
接口的 namedItem(name)
方法步骤为
对于 其 的 相关全局对象 的 PDF 查看器 MIME 类型对象 的每个 MimeType
mimeType:如果 mimeType 的 类型 是 name,则返回 mimeType。
返回 null。
MimeTypeArray
接口 支持索引属性。 支持的属性索引 是 其 的 相关全局对象 的 PDF 查看器 MIME 类型对象 的 索引。
MimeTypeArray
接口的 item(index)
方法的步骤如下:
令 mimeTypes 为 this 的 相关全局对象 的 PDF 查看器 MIME 类型对象。
如果 index < mimeTypes 的 大小,则返回 mimeTypes[index]。
返回 null。
MimeTypeArray
接口的 length
获取器步骤是返回 this 的 相关全局对象 的 PDF 查看器 MIME 类型对象 的 大小。
每个 Plugin
对象都有一个 名称,该名称在创建对象时设置。
Plugin
接口的 name
获取器步骤是返回 this 的 名称。
Plugin
接口的 description
获取器步骤是返回 "Portable Document Format
"。
Plugin
接口的 filename
获取器步骤是返回 "internal-pdf-viewer
"。
Plugin
接口 支持命名属性。如果用户代理的 PDF 查看器已支持 为 true,则它们是 PDF 查看器 MIME 类型。否则,它们是空列表。
Plugin
接口的 namedItem(name)
方法的步骤如下:
对于每个 MimeType
mimeType 的 this 的 相关全局对象 的 PDF 查看器 MIME 类型对象:如果 mimeType 的 类型 为 name,则返回 mimeType。
返回 null。
Plugin
接口 支持索引属性。 支持的属性索引 是 索引 的 this 的 相关全局对象 的 PDF 查看器 MIME 类型对象。
Plugin
接口的 item(index)
方法的步骤如下:
令 mimeTypes 为 this 的 相关全局对象 的 PDF 查看器 MIME 类型对象。
如果 index < mimeType 的 大小,则返回 mimeTypes[index]。
返回 null。
Plugin
接口的 length
获取器步骤是返回 this 的 相关全局对象 的 PDF 查看器 MIME 类型对象 的 大小。
每个 MimeType
对象都有一个 类型,该类型在创建对象时设置。
MimeType
接口的 type
获取器步骤是返回 this 的 类型。
MimeType
接口的 description
获取器步骤是返回 "Portable Document Format
"。
MimeType
接口的 suffixes
获取器步骤是返回 "pdf
"。
MimeType
接口的 enabledPlugin
获取器步骤是返回 this 的 相关全局对象 的 PDF 查看器插件对象[0](即通用的 "PDF Viewer
")。