我可以安全地依赖仅对本地文件未定义的主机名(即导航到本地文件)吗?
Can I safely rely on hostname only ever being undefined for local files (i.e. navigating to a local file)?
我正在创建一个 运行 每个页面上的网络扩展,但仅在特定上下文中有效。这是 isSupported() 方法:
// return a boolean value that is true if the domain/page is supported, element name matches
// supported types, and content is marked as spell checkable
function isSupported (node, hostname) {
const supportedNodeNames = ['TEXTAREA', 'DIV']
const supportedDomains = ['mail.google.com', 'github.com']
if (node.spellcheck && node.isContentEditable) {
if (node.nodeName === 'TEXTAREA') {
return true
}
if (supportedNodeNames.contains(node.nodeName) && supportedDomains.contains(hostname)) {
return true
}
}
return false
}
不幸的是,此代码在我的本地测试页面上停止了来自 运行ning 的扩展,即当 URI 为 file:///home/username/github/multi-dict/test_page/test-page.html
时
我可以安全地依赖 window.location.hostname
未定义* 并允许扩展到 运行 吗?我在 MDN and the spec 查看了文档,但我不太清楚在什么确切的上下文中主机名是未定义的。
提前致谢!
*它实际上是一个空字符串,留在 reader/answer 上下文的原始描述中。所以问题是 - 我是否可以安全地依赖 window.location.hostname
只对浏览器打开的本地文件为空 - 没有本地网络服务器 运行ning.
hostname
被定义为 字符串 (MDN, spec),因此它不能具有值 undefined
。在我尝试过的每个浏览器(Chrome、Firefox、IE、Edge)上,它都是一个空字符串 (""
),而不是 undefined
。如果你认为它在某些浏览器上是 undefined
,你可以做一个错误的检查:
if (location.hostname) {
// It has a non-blank value
} else {
// Its value is falsy (probably "", perhaps undefined)
}
但我认为永远不会 undefined
。来自 spec:
The hostname attribute's getter must run these steps:
If this Location
object's relevant Document
is non-null and its origin is not same origin-domain with the entry settings object's origin, then throw a "SecurityError" DOMException.
If this Location
object's url's host is null
, return the empty string.
Return this Location
object's url's host
, serialized.
(我的重点)
本地 URL 的主机是 null
,因此步骤 2 中强调的部分适用。
我正在创建一个 运行 每个页面上的网络扩展,但仅在特定上下文中有效。这是 isSupported() 方法:
// return a boolean value that is true if the domain/page is supported, element name matches
// supported types, and content is marked as spell checkable
function isSupported (node, hostname) {
const supportedNodeNames = ['TEXTAREA', 'DIV']
const supportedDomains = ['mail.google.com', 'github.com']
if (node.spellcheck && node.isContentEditable) {
if (node.nodeName === 'TEXTAREA') {
return true
}
if (supportedNodeNames.contains(node.nodeName) && supportedDomains.contains(hostname)) {
return true
}
}
return false
}
不幸的是,此代码在我的本地测试页面上停止了来自 运行ning 的扩展,即当 URI 为 file:///home/username/github/multi-dict/test_page/test-page.html
我可以安全地依赖 window.location.hostname
未定义* 并允许扩展到 运行 吗?我在 MDN and the spec 查看了文档,但我不太清楚在什么确切的上下文中主机名是未定义的。
提前致谢!
*它实际上是一个空字符串,留在 reader/answer 上下文的原始描述中。所以问题是 - 我是否可以安全地依赖 window.location.hostname
只对浏览器打开的本地文件为空 - 没有本地网络服务器 运行ning.
hostname
被定义为 字符串 (MDN, spec),因此它不能具有值 undefined
。在我尝试过的每个浏览器(Chrome、Firefox、IE、Edge)上,它都是一个空字符串 (""
),而不是 undefined
。如果你认为它在某些浏览器上是 undefined
,你可以做一个错误的检查:
if (location.hostname) {
// It has a non-blank value
} else {
// Its value is falsy (probably "", perhaps undefined)
}
但我认为永远不会 undefined
。来自 spec:
The hostname attribute's getter must run these steps:
If this
Location
object's relevantDocument
is non-null and its origin is not same origin-domain with the entry settings object's origin, then throw a "SecurityError" DOMException.If this
Location
object's url's host isnull
, return the empty string.Return this
Location
object's url'shost
, serialized.
(我的重点)
本地 URL 的主机是 null
,因此步骤 2 中强调的部分适用。