From a266acf8defbe86c8c008f9385d07ad8b285e555 Mon Sep 17 00:00:00 2001 From: Alexandre Lissy Date: Sat, 25 Feb 2023 00:58:05 +0000 Subject: [PATCH] Bug 1818465 - Add test to ensure Utility Actor Names always reflected in about:processes r=florian,nika Differential Revision: https://phabricator.services.mozilla.com/D170753 --- dom/base/ChromeUtils.cpp | 10 +++++ dom/base/ChromeUtils.h | 3 ++ dom/chrome-webidl/ChromeUtils.webidl | 8 ++++ .../aboutprocesses/content/aboutProcesses.js | 29 ++++++++------ .../aboutprocesses/tests/browser/browser.ini | 1 + .../browser_aboutprocesses_utility_actors.js | 46 ++++++++++++++++++++++ 6 files changed, 85 insertions(+), 12 deletions(-) create mode 100644 toolkit/components/aboutprocesses/tests/browser/browser_aboutprocesses_utility_actors.js diff --git a/dom/base/ChromeUtils.cpp b/dom/base/ChromeUtils.cpp index 8ca21f800a8f..484cf38b62a4 100644 --- a/dom/base/ChromeUtils.cpp +++ b/dom/base/ChromeUtils.cpp @@ -1744,4 +1744,14 @@ unsigned ChromeUtils::AliveUtilityProcesses(const GlobalObject&) { mozilla::ipc::UtilityProcessManager::GetIfExists(); return utilityProcessManager ? utilityProcessManager->AliveProcesses() : 0; } + +/* static */ +void ChromeUtils::GetAllPossibleUtilityActorNames(GlobalObject& aGlobal, + nsTArray& aNames) { + aNames.Clear(); + for (size_t i = 0; i < WebIDLUtilityActorNameValues::Count; ++i) { + auto idlName = static_cast(i); + aNames.AppendElement(WebIDLUtilityActorNameValues::GetString(idlName)); + } +} } // namespace mozilla::dom diff --git a/dom/base/ChromeUtils.h b/dom/base/ChromeUtils.h index 9b570d9d92b4..f7a650e08267 100644 --- a/dom/base/ChromeUtils.h +++ b/dom/base/ChromeUtils.h @@ -288,6 +288,9 @@ class ChromeUtils { static void EnsureJSOracleStarted(GlobalObject&); static unsigned AliveUtilityProcesses(const GlobalObject&); + + static void GetAllPossibleUtilityActorNames(GlobalObject& aGlobal, + nsTArray& aNames); }; } // namespace dom diff --git a/dom/chrome-webidl/ChromeUtils.webidl b/dom/chrome-webidl/ChromeUtils.webidl index f1ad106dd3ef..77f1c3ac9333 100644 --- a/dom/chrome-webidl/ChromeUtils.webidl +++ b/dom/chrome-webidl/ChromeUtils.webidl @@ -664,6 +664,14 @@ partial namespace ChromeUtils { */ [ChromeOnly] readonly attribute unsigned long aliveUtilityProcesses; + + /** + * Get a list of all possible Utility process Actor Names ; mostly useful to + * perform testing and ensure about:processes display is sound and misses no + * actor name. + */ + [ChromeOnly] + sequence getAllPossibleUtilityActorNames(); }; /* diff --git a/toolkit/components/aboutprocesses/content/aboutProcesses.js b/toolkit/components/aboutprocesses/content/aboutProcesses.js index f3f71bf8d9a3..ccba2eec441b 100644 --- a/toolkit/components/aboutprocesses/content/aboutProcesses.js +++ b/toolkit/components/aboutprocesses/content/aboutProcesses.js @@ -861,19 +861,9 @@ var View = { } }, - displayUtilityActorRow(data, parent) { - const cellCount = 2; - // The actor name is expected to be unique within a given utility process. - let rowId = "u:" + parent.pid + data.actorName; - let row = this._getOrCreateRow(rowId, cellCount); - row.actor = data; - row.className = "actor"; - - // Column: name - let nameCell = row.firstChild; + utilityActorNameToFluentName(actorName) { let fluentName; - let fluentArgs = {}; - switch (data.actorName) { + switch (actorName) { case "audioDecoder_Generic": fluentName = "about-processes-utility-actor-audio-decoder-generic"; break; @@ -894,6 +884,21 @@ var View = { fluentName = "about-processes-utility-actor-unknown"; break; } + return fluentName; + }, + + displayUtilityActorRow(data, parent) { + const cellCount = 2; + // The actor name is expected to be unique within a given utility process. + let rowId = "u:" + parent.pid + data.actorName; + let row = this._getOrCreateRow(rowId, cellCount); + row.actor = data; + row.className = "actor"; + + // Column: name + let nameCell = row.firstChild; + let fluentName = this.utilityActorNameToFluentName(data.actorName); + let fluentArgs = {}; this._fillCell(nameCell, { fluentName, fluentArgs, diff --git a/toolkit/components/aboutprocesses/tests/browser/browser.ini b/toolkit/components/aboutprocesses/tests/browser/browser.ini index a1069969ada2..83f50ef208cf 100644 --- a/toolkit/components/aboutprocesses/tests/browser/browser.ini +++ b/toolkit/components/aboutprocesses/tests/browser/browser.ini @@ -16,3 +16,4 @@ https_first_disabled = true [browser_aboutprocesses_selection.js] [browser_aboutprocesses_twisty.js] [browser_aboutprocesses_shortcut.js] +[browser_aboutprocesses_utility_actors.js] diff --git a/toolkit/components/aboutprocesses/tests/browser/browser_aboutprocesses_utility_actors.js b/toolkit/components/aboutprocesses/tests/browser/browser_aboutprocesses_utility_actors.js new file mode 100644 index 000000000000..e33940e7b784 --- /dev/null +++ b/toolkit/components/aboutprocesses/tests/browser/browser_aboutprocesses_utility_actors.js @@ -0,0 +1,46 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +// Test about:processes preparation of utility actor names. +add_task(async function testUtilityActorNames() { + await BrowserTestUtils.withNewTab( + { + gBrowser, + opening: "about:processes", + waitForLoad: true, + }, + browser => { + const View = browser.contentWindow.View; + const unknownActorName = "unknown"; + const kDontExistFluentName = View.utilityActorNameToFluentName( + "i-dont-exist" + ); + const unknownFluentName = View.utilityActorNameToFluentName( + unknownActorName + ); + + Assert.equal( + unknownFluentName, + kDontExistFluentName, + "Anything is unknown" + ); + + for (let actorName of ChromeUtils.getAllPossibleUtilityActorNames()) { + const fluentName = View.utilityActorNameToFluentName(actorName); + if (actorName === unknownActorName) { + Assert.ok( + fluentName === unknownFluentName, + `Actor name ${actorName} is expected unknown ${fluentName}` + ); + } else { + Assert.ok( + fluentName !== unknownFluentName, + `Actor name ${actorName} is known ${fluentName}` + ); + } + } + } + ); +}); -- 2.11.4.GIT