1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#if defined(ENABLE_TESTS)
# include "mozilla/ipc/UtilityProcessTest.h"
# include "mozilla/ipc/UtilityProcessManager.h"
# include "mozilla/dom/Promise.h"
# include "mozilla/ProcInfo.h"
namespace mozilla::ipc {
NS_IMETHODIMP
UtilityProcessTest::StartProcess(int32_t aUnknownActors, JSContext* aCx,
mozilla::dom::Promise** aOutPromise) {
NS_ENSURE_ARG(aOutPromise);
*aOutPromise = nullptr;
nsIGlobalObject* global = xpc::CurrentNativeGlobal(aCx);
if (NS_WARN_IF(!global)) {
return NS_ERROR_FAILURE;
}
ErrorResult erv;
RefPtr<dom::Promise> promise = dom::Promise::Create(global, erv);
if (NS_WARN_IF(erv.Failed())) {
return erv.StealNSResult();
}
RefPtr<UtilityProcessManager> utilityProc =
UtilityProcessManager::GetSingleton();
MOZ_ASSERT(utilityProc, "No UtilityprocessManager?");
utilityProc->LaunchProcess(SandboxingKind::GENERIC_UTILITY)
->Then(
GetCurrentSerialEventTarget(), __func__,
[promise, utilityProc, aUnknownActors]() {
Maybe<int32_t> utilityPid =
utilityProc->ProcessPid(SandboxingKind::GENERIC_UTILITY);
if (aUnknownActors > 0) {
RefPtr<UtilityProcessParent> utilityParent =
utilityProc->GetProcessParent(
SandboxingKind::GENERIC_UTILITY);
for (int32_t i = 0; i < aUnknownActors; i++) {
utilityProc->RegisterActor(utilityParent,
UtilityActorName::Unknown);
}
}
if (utilityPid.isSome()) {
promise->MaybeResolve(*utilityPid);
} else {
promise->MaybeReject(NS_ERROR_NOT_AVAILABLE);
}
},
[promise](nsresult aError) {
MOZ_ASSERT_UNREACHABLE(
"UtilityProcessTest; failure to get Utility process");
promise->MaybeReject(aError);
});
promise.forget(aOutPromise);
return NS_OK;
}
NS_IMETHODIMP
UtilityProcessTest::StopProcess() {
RefPtr<UtilityProcessManager> utilityProc =
UtilityProcessManager::GetSingleton();
MOZ_ASSERT(utilityProc, "No UtilityprocessManager?");
utilityProc->CleanShutdown(SandboxingKind::GENERIC_UTILITY);
Maybe<int32_t> utilityPid =
utilityProc->ProcessPid(SandboxingKind::GENERIC_UTILITY);
MOZ_RELEASE_ASSERT(utilityPid.isNothing(),
"Should not have a utility process PID anymore");
return NS_OK;
}
NS_IMETHODIMP
UtilityProcessTest::TestTelemetryProbes() {
RefPtr<UtilityProcessManager> utilityProc =
UtilityProcessManager::GetSingleton();
MOZ_ASSERT(utilityProc, "No UtilityprocessManager?");
for (RefPtr<UtilityProcessParent>& parent :
utilityProc->GetAllProcessesProcessParent()) {
Unused << parent->SendTestTelemetryProbes();
}
return NS_OK;
}
NS_IMPL_ISUPPORTS(UtilityProcessTest, nsIUtilityProcessTest)
} // namespace mozilla::ipc
#endif // defined(ENABLE_TESTS)
|