URL 解析器

警告

为了确保线程安全,URI 对象的所有对象和接口都必须是不可变的。如果您正在实现新的 URI 类型,请确保该类型的任何公共方法都不会更改 URL。

定义

  • URI - 统一资源标识符

  • URL - 统一资源定位符

这两个术语在整个代码库中可以互换使用,并且本质上表示相同的东西 - 一串表示特定资源的字符。

动机

虽然我们可以简单地传递字符串并将其留给最终的使用者处理,但这会给使用者带来负担,并且可能效率低下。相反,我们尽快将字符串解析为 nsIURI 对象,并在函数调用中传递该对象。这允许使用者轻松地仅提取他们感兴趣的字符串部分(例如,主机名或路径)。

接口

  • nsIURI

    • 这是 URI 解析中最重要的接口。它包含一系列只读属性,使用者可以使用这些属性从 URI 中提取信息。

  • nsIURL

    • 定义 URI 路径的结构(目录、文件名、文件基本名称、文件扩展名)

  • nsIFileURL

    • 具有类型为 nsIFile 的 file 属性

    • 用于本地协议访问 nsIURI 表示的文件

  • nsIMozIconURI

    • 用于表示图标。包含其他属性,例如 URL 的大小和 contentType 或状态。

  • nsIJARURI

    • 用于表示 JAR(zip 归档文件)文件中的资源。

    • 例如 jar:http://www.example.com/blue.jar!/ocean.html 表示位于可通过 HTTP 从 example.com 获取的 blue.jar 归档文件内的 /ocean.html 资源。

  • nsIStandardURL

    • 定义了一些用于确定 URL 类型常量标志。没有其他属性。

  • nsINestedURI

    • 定义 innerURIinnermostURI

    • innermostURI 只是一个辅助工具 - 也可以通过重复遍历 innerURI 直到属性不再 QIs 到 nsINestedURI 来获取它。

  • nsISensitiveInfoHiddenURI

    • 实现此接口的对象将具有一个 getSensitiveInfoHiddenSpec() 方法,该方法返回 URI 的规范,其中敏感信息(例如密码)被 * 符号替换。

接口图

classDiagram nsISupports <-- nsIURI nsIURI <-- nsIURL nsIURL <-- nsIFileURL nsIURI <-- nsIMozIconURI nsIURL <-- nsIJARURI nsISupports <-- nsIStandardURL nsISupports <-- nsINestedURI nsISupports <-- nsISensitiveInfoHiddenURI

变异

为了确保线程安全,nsIURI 的所有实现都必须是不可变的。要更改 URI,使用者必须调用 nsIURI.mutate(),它返回一个 nsIMutatornsIMutator 有一些 setter 方法,可用于更改具体对象上的属性。完成对对象的更改后,使用者将调用 nsIMutator.finalize() 以获得不可变的 nsIURI

  • nsIURIMutator

    • 此接口包含一系列 setter,可用于变异和/或构造 nsIURI

其他接口

  • nsISerializable

    • 允许我们将 URL 对象序列化和反序列化为字符串以进行持久存储(例如会话恢复)。

实现

  • nsStandardURL

  • SubstitutingURL

    • 覆盖 nsStandardURL::GetFile 以提供 nsIFile 解析。

    • 这允许我们将诸如 resource://gre/actors/RemotePageChild.sys.mjs 之类的 URL 映射到磁盘上的实际文件。

  • nsMozIconURI

    • 用于表示图标 URL

  • nsSimpleURI

    • 用于通常没有授权(用户名、密码、主机、端口)的简单 URI

  • nsSimpleNestedURI

    • 例如 view-source:http://example.com/path

    • 通常只有嵌套 URI 的额外方案是相关的(例如 view-source:

    • 大多数 getter/setter 都委托给 innerURI

  • nsNestedAboutURI

    • 类似于 nsSimpleNestedURI,但具有一个额外的 mBaseURI 成员,允许我们将基本 URI 正确传播到 about:blank`

  • BlobURL

    • 用于 javascript blob

    • 类似于 nsSimpleURI,但也具有 revoked 字段。

  • DefaultURI

    • 此类包装了由 rust-url crate 解析的对象。

    • 虽然尚未默认启用,但由于该解析器中存在一些小错误,因此计划最终将此实现用于所有没有自己的 URL 解析器的未知协议

  • nsJSURI

    • 用于表示 javascript 代码(例如 javascript:alert('hello')

  • nsJARURI

    • 用于表示 JAR 文件中的资源。

实现图

classDiagram nsSimpleURI o-- BlobURL nsIMozIconURI o-- nsMozIconURI nsIFileURL o-- nsStandardURL nsIStandardURL o-- nsStandardURL nsISensitiveInfoHiddenURI o-- nsStandardURL nsStandardURL o-- SubstitutingURL nsIURI o-- nsSimpleURI nsSimpleURI o-- nsSimpleNestedURI nsSimpleNestedURI o-- nsNestedAboutURI nsIURI o-- DefaultURI nsSimpleURI o-- nsJSURI nsINestedURI o-- nsJARURI nsIJARURI o-- nsJARURI

类和接口图

classDiagram nsISupports <-- nsIURI nsIURI <-- nsIURL nsIURL <-- nsIFileURL nsIURI <-- nsIMozIconURI nsIURL <-- nsIJARURI nsISupports <-- nsIStandardURL nsISupports <-- nsINestedURI nsISupports <-- nsISensitiveInfoHiddenURI %% classes nsSimpleURI o-- BlobURL nsSimpleURI o-- nsJSURI nsIMozIconURI o-- nsMozIconURI nsIFileURL o-- nsStandardURL nsIStandardURL o-- nsStandardURL nsISensitiveInfoHiddenURI o-- nsStandardURL nsStandardURL o-- SubstitutingURL nsIURI o-- nsSimpleURI nsINestedURI o-- nsJARURI nsIJARURI o-- nsJARURI nsSimpleURI o-- nsSimpleNestedURI nsSimpleNestedURI o-- nsNestedAboutURI nsIURI o-- DefaultURI