Javascript 我能否安全地依赖于本地文件中未定义的主机名(即导航到本地文件)?

Javascript 我能否安全地依赖于本地文件中未定义的主机名(即导航到本地文件)?,javascript,hostname,window.location,Javascript,Hostname,Window.location,我正在创建一个web扩展,它可以在每个页面上运行,但只能在某些上下文中运行。以下是isSupported()方法: //返回一个布尔值,如果域/页受支持,元素名匹配,则该值为true //支持的类型,并且内容被标记为可检查拼写 函数isSupported(节点、主机名){ const supportedNodeNames=['TEXTAREA','DIV'] const-supportedDomains=['mail.google.com','github.com'] if(node.spell

我正在创建一个web扩展,它可以在每个页面上运行,但只能在某些上下文中运行。以下是isSupported()方法:

//返回一个布尔值,如果域/页受支持,元素名匹配,则该值为true
//支持的类型,并且内容被标记为可检查拼写
函数isSupported(节点、主机名){
const supportedNodeNames=['TEXTAREA','DIV']
const-supportedDomains=['mail.google.com','github.com']
if(node.spellcheck&&node.isContentEditable){
if(node.nodeName==='TEXTAREA'){
返回真值
}
if(supportedNodeNames.contains(node.nodeName)和&supportedDomains.contains(hostname)){
返回真值
}
}
返回错误
}
不幸的是,当URI为
file:///home/username/github/multi-dict/test_page/test-page.html

我能否安全地依赖未定义的
window.location.hostname
,并允许扩展在运行时运行?我在和上查看了文档,但我不太清楚在什么样的上下文中主机名是未定义的

提前谢谢


*它实际上是一个空字符串,保留在读者/答案上下文的原始描述中。所以问题是-我可以安全地依赖于
window.location.hostname
吗?只有浏览器打开的本地文件才是空的-没有本地Web服务器在运行。

主机名
被定义为字符串(,),因此它不能有
未定义的值
。它是一个空字符串(
“”
),而不是
未定义的
,在我尝试过的每个浏览器(Chrome、Firefox、IE、Edge)上。如果您认为某些浏览器上的
未定义
,您可以进行错误检查:

if (location.hostname) {
    // It has a non-blank value
} else {
    // Its value is falsy (probably "", perhaps undefined)
}
但是我不认为它是未定义的。从:

主机名属性的getter必须运行以下步骤:

  • 如果此
    位置
    对象的相关
    文档
    为非空,且其原点与条目设置对象的原点不在同一原点域,则抛出“SecurityError”DomeException

  • 如果此
    位置
    对象的url主机为
    null
    返回空字符串。

  • 返回此
    位置
    对象的url的
    主机
    ,序列化

  • (我的重点)


    本地URL的主机是
    null
    ,因此第2步强调的部分适用。

    它真的是
    未定义的
    ,还是只是空字符串
    ?为什么不在本地主机上运行服务器呢?这几天真是太容易了…对什么安全?但不,我不相信这一点。(不能马上说什么可以破坏它——
    或者其他没有原创的东西?——但出于任何安全目的,它都非常不舒服。)本地主机上的服务器或者可能检查
    文件://
    似乎是更好的方向。嘿,我现在更新了标题,更清晰,很好。我的意思是安全的,就像主机名是一个空字符串,只有在访问本地文件的上下文中减去本地服务器。我的错误是,我应该检查值的类型-您是对的,即使只是将浏览器指向一个文件,它确实是一个字符串(在本例中是空的)。我现在已经更新了这个问题,希望它能更清楚一点——我想知道location.hostname对于本地服务的文件是否永远都是空的。接受了Ry的建议,我也在检查位置协议。@GrayedFox-这是我所知道的唯一一种使原点
    为空的情况,所以上面的第2步应该适用。但一定要看看协议(aka方案)。