实用程序进程¶
警告
截至 2022 年 1 月,此进程正在进行大量开发,许多内容可能会发生变化。文档可能并不总是像预期的那样准确。如果您打算添加新的实用程序,请咨询 #ipc 频道。
实用程序进程用于提供一种简单的方法来实现 IPC 参与者,并具有一些更具体的沙盒属性,在您不需要或不希望处理添加全新进程类型带来的额外复杂性,但只需要应用不同的沙盒策略的情况下。要实现这样的参与者,您需要遵循与实现 EmptyUtil 中可见的简单示例类似的一些步骤。
定义一个新的 IPC 参与者,例如
PEmptyUtil
,它允许子进程通过GetSomeString()
将一些字符串传递给父进程。在
PUtilityProcess
定义中,公开一个新的子级方法,例如StartEmptyUtilService(Endpoint<PEmptyUtilChild>)
。实现
EmptyUtilChild
和EmptyUtilParent
类,这两个类都派生自它们的PEmptyUtilXX
。如果您希望或需要从不同的线程运行内容,可以查看UtilityProcessGenericActor
。确保两者都被引用计数。
在
UtilityProcessManager
上公开您的新服务,并使用一个执行启动进程的繁重操作的方法,您可以从示例中的StartEmptyUtil()
获取灵感。理想情况下,此启动方法应依赖于 StartUtility()。
要使用上面提到的
StartUtility()
,请确保您提供了一个nsresult BindToUtilityProcess(RefPtr<UtilityProcessParent> aUtilityParent)
。通常,它应该负责创建一组端点并执行Bind()
以设置 IPC。您可以查看 Utility AudioDecoder 的一些示例。为了在
about:processes
中正确显示面向用户的展示,您还需要通过方法UtilityActorName GetActorName() { return UtilityActorName::EmptyUtil; }
提供参与者名称。
在 enum WebIDLUtilityActorName 中 添加成员。
在
UtilityProcess
的子端内部处理StartEmptyUtilService
的接收,在RecvStartEmptyUtilService()
中。在
UtilityProcessChild::ActorDestroy
中,释放您在RecvStartEmptyUtilService()
中存储的任何资源的引用。这可能包括对EmptyUtilChild
的引用。特定的沙盒要求可以通过跟踪
SandboxingKind
来实现,它从 UtilityProcessSandboxing 头文件 开始。尝试并确保您至少添加了一些新参与者的
gtest
覆盖范围,例如 现有的 gtest 中所示。还应确保在以下位置进行实际的沙盒测试:
SandboxTest
以启动您的新进程,https://searchfox.org/mozilla-central/source/security/sandbox/common/test/SandboxTest.cpp
SandboxTestingChildTests
以定义测试 https://searchfox.org/mozilla-central/source/security/sandbox/common/test/SandboxTestingChildTests.h
SandboxTestingChild
以运行您的测试 https://searchfox.org/mozilla-central/source/security/sandbox/common/test/SandboxTestingChild.cpp