From 9956dde6c82f2f7a3b28d8143492db9b18336ed2 Mon Sep 17 00:00:00 2001 From: Andreas Farre Date: Fri, 27 Jan 2023 09:17:16 +0000 Subject: [PATCH] Bug 1812035 - Fix broken about:memory tests. r=smaug Tests for about:memory doesn't know about utility processes. Make sure to hide the utility process reporter when needed, and count the number of living processes, also when needed. Differential Revision: https://phabricator.services.mozilla.com/D167662 --- dom/base/ChromeUtils.cpp | 6 ++++++ dom/base/ChromeUtils.h | 2 ++ dom/chrome-webidl/ChromeUtils.webidl | 6 ++++++ ipc/glue/UtilityProcessManager.h | 3 ++- .../aboutmemory/tests/test_aboutmemory5.xhtml | 2 +- .../aboutmemory/tests/test_memoryReporters.xhtml | 2 +- .../tests/test_memoryReporters2.xhtml | 4 ++-- xpcom/base/nsMemoryReporterManager.cpp | 16 +++++++++------- 8 files changed, 29 insertions(+), 12 deletions(-) diff --git a/dom/base/ChromeUtils.cpp b/dom/base/ChromeUtils.cpp index 8f58ddf397ef..fffabcf6aa5d 100644 --- a/dom/base/ChromeUtils.cpp +++ b/dom/base/ChromeUtils.cpp @@ -1762,4 +1762,10 @@ bool ChromeUtils::IsDarkBackground(GlobalObject&, Element& aElement) { double ChromeUtils::DateNow(GlobalObject&) { return JS_Now() / 1000.0; } +/* static */ +unsigned ChromeUtils::AliveUtilityProcesses(const GlobalObject&) { + const auto& utilityProcessManager = + mozilla::ipc::UtilityProcessManager::GetIfExists(); + return utilityProcessManager ? utilityProcessManager->AliveProcesses() : 0; +} } // namespace mozilla::dom diff --git a/dom/base/ChromeUtils.h b/dom/base/ChromeUtils.h index 464cd9cd9992..cd30c0e8ca77 100644 --- a/dom/base/ChromeUtils.h +++ b/dom/base/ChromeUtils.h @@ -284,6 +284,8 @@ class ChromeUtils { static bool IsDarkBackground(GlobalObject&, Element&); static double DateNow(GlobalObject&); + + static unsigned AliveUtilityProcesses(const GlobalObject&); }; } // namespace dom diff --git a/dom/chrome-webidl/ChromeUtils.webidl b/dom/chrome-webidl/ChromeUtils.webidl index f8f0b02ee7c3..109d61bb5673 100644 --- a/dom/chrome-webidl/ChromeUtils.webidl +++ b/dom/chrome-webidl/ChromeUtils.webidl @@ -653,6 +653,12 @@ partial namespace ChromeUtils { * Returns whether the background of the element is dark. */ boolean isDarkBackground(Element element); + + /** + * The number of currently alive utility processes. + */ + [ChromeOnly] + readonly attribute unsigned long aliveUtilityProcesses; }; /* diff --git a/ipc/glue/UtilityProcessManager.h b/ipc/glue/UtilityProcessManager.h index 70c763546c66..edf534d35966 100644 --- a/ipc/glue/UtilityProcessManager.h +++ b/ipc/glue/UtilityProcessManager.h @@ -130,6 +130,8 @@ class UtilityProcessManager final : public UtilityProcessHost::Listener { // Shutdown all utility processes void CleanShutdownAllProcesses(); + uint16_t AliveProcesses(); + private: ~UtilityProcessManager(); @@ -196,7 +198,6 @@ class UtilityProcessManager final : public UtilityProcessHost::Listener { RefPtr GetProcess(SandboxingKind); bool NoMoreProcesses(); - uint16_t AliveProcesses(); }; } // namespace ipc diff --git a/toolkit/components/aboutmemory/tests/test_aboutmemory5.xhtml b/toolkit/components/aboutmemory/tests/test_aboutmemory5.xhtml index dcec9620aa7e..a5cb757a9431 100644 --- a/toolkit/components/aboutmemory/tests/test_aboutmemory5.xhtml +++ b/toolkit/components/aboutmemory/tests/test_aboutmemory5.xhtml @@ -132,7 +132,7 @@ socketProcessRunning = 1; } - let m2 = (vsizes.length == (4 + socketProcessRunning) && + let m2 = (vsizes.length == (4 + socketProcessRunning + ChromeUtils.aliveUtilityProcesses) && endOfBrowsers.length == 3); ok(m2, "three content processes present in loaded data"); good = good && !!m2; diff --git a/toolkit/components/aboutmemory/tests/test_memoryReporters.xhtml b/toolkit/components/aboutmemory/tests/test_memoryReporters.xhtml index 1f563eec5b53..6abf47b8c375 100644 --- a/toolkit/components/aboutmemory/tests/test_memoryReporters.xhtml +++ b/toolkit/components/aboutmemory/tests/test_memoryReporters.xhtml @@ -230,7 +230,7 @@ if (SpecialPowers.Services.io.socketProcessLaunched) { socketProcessRunning = 1; } - ok(aAmounts.length == (1 + socketProcessRunning), + is(aAmounts.length, (1 + socketProcessRunning + ChromeUtils.aliveUtilityProcesses), aName + " has " + aAmounts.length + " report"); let n = aAmounts[0]; if (!aCanBeUnreasonable) { diff --git a/toolkit/components/aboutmemory/tests/test_memoryReporters2.xhtml b/toolkit/components/aboutmemory/tests/test_memoryReporters2.xhtml index d457c15164ca..3475687db2e0 100644 --- a/toolkit/components/aboutmemory/tests/test_memoryReporters2.xhtml +++ b/toolkit/components/aboutmemory/tests/test_memoryReporters2.xhtml @@ -22,7 +22,7 @@ socketProcessRunning = 1; } let numToOpen = 3; - const expectedNumRemotes = numToOpen + socketProcessRunning; + const expectedNumRemotes = numToOpen + socketProcessRunning + ChromeUtils.aliveUtilityProcesses; let numReady = 0; // Create some remote processes, and set up message-passing so that @@ -89,7 +89,7 @@ } else { ok(processes[i].startsWith("Browser (") || processes[i].startsWith("Web Content (") || (processes[i].startsWith("Socket (") && socketProcessRunning) - || processes[i].startsWith("web ("), + || processes[i].startsWith("web (") || processes[i].startsWith("Utility ("), "correct non-empty process name prefix: " + processes[i]); numNonEmptyProcesses++; } diff --git a/xpcom/base/nsMemoryReporterManager.cpp b/xpcom/base/nsMemoryReporterManager.cpp index 064ba4e0b88a..58b7bce261de 100644 --- a/xpcom/base/nsMemoryReporterManager.cpp +++ b/xpcom/base/nsMemoryReporterManager.cpp @@ -1870,13 +1870,15 @@ nsresult nsMemoryReporterManager::StartGettingReports() { } } - if (RefPtr utility = - UtilityProcessManager::GetIfExists()) { - for (RefPtr& parent : - utility->GetAllProcessesProcessParent()) { - if (RefPtr proc = - utility->GetProcessMemoryReporter(parent)) { - s->mChildrenPending.AppendElement(proc.forget()); + if (!IsRegistrationBlocked()) { + if (RefPtr utility = + UtilityProcessManager::GetIfExists()) { + for (RefPtr& parent : + utility->GetAllProcessesProcessParent()) { + if (RefPtr proc = + utility->GetProcessMemoryReporter(parent)) { + s->mChildrenPending.AppendElement(proc.forget()); + } } } }