URL 解析器¶
警告
为了确保线程安全,URI 对象的所有对象和接口都必须是不可变的。如果您正在实现新的 URI 类型,请确保该类型的任何公共方法都不会更改 URL。
定义¶
URI - 统一资源标识符
URL - 统一资源定位符
这两个术语在整个代码库中可以互换使用,并且本质上表示相同的东西 - 一串表示特定资源的字符。
动机¶
虽然我们可以简单地传递字符串并将其留给最终的使用者处理,但这会给使用者带来负担,并且可能效率低下。相反,我们尽快将字符串解析为 nsIURI 对象,并在函数调用中传递该对象。这允许使用者轻松地仅提取他们感兴趣的字符串部分(例如,主机名或路径)。
接口¶
-
这是 URI 解析中最重要的接口。它包含一系列只读属性,使用者可以使用这些属性从 URI 中提取信息。
-
定义 URI 路径的结构(目录、文件名、文件基本名称、文件扩展名)
-
具有类型为
nsIFile
的 file 属性用于本地协议访问
nsIURI
表示的文件
-
用于表示图标。包含其他属性,例如 URL 的大小和 contentType 或状态。
-
用于表示 JAR(zip 归档文件)文件中的资源。
例如
jar:http://www.example.com/blue.jar!/ocean.html
表示位于可通过 HTTP 从 example.com 获取的blue.jar
归档文件内的/ocean.html
资源。
-
定义了一些用于确定 URL 类型常量标志。没有其他属性。
-
定义
innerURI
和innermostURI
。innermostURI
只是一个辅助工具 - 也可以通过重复遍历innerURI
直到属性不再 QIs 到 nsINestedURI 来获取它。
-
实现此接口的对象将具有一个
getSensitiveInfoHiddenSpec()
方法,该方法返回 URI 的规范,其中敏感信息(例如密码)被*
符号替换。
接口图¶
变异¶
为了确保线程安全,nsIURI 的所有实现都必须是不可变的。要更改 URI,使用者必须调用 nsIURI.mutate()
,它返回一个 nsIMutator
。 nsIMutator
有一些 setter 方法,可用于更改具体对象上的属性。完成对对象的更改后,使用者将调用 nsIMutator.finalize()
以获得不可变的 nsIURI
。
-
此接口包含一系列 setter,可用于变异和/或构造
nsIURI
其他接口¶
-
允许我们将 URL 对象序列化和反序列化为字符串以进行持久存储(例如会话恢复)。
实现¶
-
覆盖 nsStandardURL::GetFile 以提供 nsIFile 解析。
这允许我们将诸如
resource://gre/actors/RemotePageChild.sys.mjs
之类的 URL 映射到磁盘上的实际文件。
-
用于表示图标 URL
-
用于通常没有授权(用户名、密码、主机、端口)的简单 URI
-
例如
view-source:http://example.com/path
通常只有嵌套 URI 的额外方案是相关的(例如
view-source:
)大多数 getter/setter 都委托给 innerURI
-
类似于 nsSimpleNestedURI,但具有一个额外的
mBaseURI
成员,允许我们将基本 URI 正确传播到 about:blank`
-
用于 javascript blob
类似于 nsSimpleURI,但也具有 revoked 字段。
-
此类包装了由
rust-url
crate 解析的对象。虽然尚未默认启用,但由于该解析器中存在一些小错误,因此计划最终将此实现用于所有没有自己的 URL 解析器的未知协议。
-
用于表示 javascript 代码(例如
javascript:alert('hello')
)
-
用于表示 JAR 文件中的资源。