Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* Any copyright is dedicated to the Public Domain.
"use strict";
ChromeUtils.defineESModuleGetters(this, {
ShellService: "moz-src:///browser/components/shell/ShellService.sys.mjs",
});
const BAREBONES_DESKTOP_ENTRY = `[Desktop Entry]
Version=1.5
Type=Application
Name=test_desktopEntryStatus.js test case
`;
let gHomeDir;
let gSystemDir;
const filename = what => `test_desktopEntryStatus_file_${what}.desktop`;
// GLib caches results for efficiency. Unfortunately, it doesn't really provide
// a way to invalidate that cache, aside from hoping that the file monitor
// picks up on it. Resolve this by setting up all of the desktop entries at the
// start, then doing checks, then exiting.
//
// (Some others are special-cased, namely absent and Hidden= checks.)
const kDesktopEntries = [
{
label: "visible",
content: BAREBONES_DESKTOP_ENTRY,
expected: Ci.nsIGNOMEShellService.DESKTOP_ENTRY_VISIBLE,
},
{
label: "nodisplay",
content: BAREBONES_DESKTOP_ENTRY + "NoDisplay=true\n",
expected: Ci.nsIGNOMEShellService.DESKTOP_ENTRY_INVISIBLE,
},
{
label: "onlyshowin-matching",
content: BAREBONES_DESKTOP_ENTRY + "OnlyShowIn=FirefoxOS\n",
expected: Ci.nsIGNOMEShellService.DESKTOP_ENTRY_VISIBLE,
},
{
label: "onlyshowin-notmatching",
content: BAREBONES_DESKTOP_ENTRY + "OnlyShowIn=another\n",
expected: Ci.nsIGNOMEShellService.DESKTOP_ENTRY_INVISIBLE,
},
{
label: "notshowin-matching",
content: BAREBONES_DESKTOP_ENTRY + "NotShowIn=FirefoxOS\n",
expected: Ci.nsIGNOMEShellService.DESKTOP_ENTRY_INVISIBLE,
},
{
label: "notshowin-notmatching",
content: BAREBONES_DESKTOP_ENTRY + "NotShowIn=another\n",
expected: Ci.nsIGNOMEShellService.DESKTOP_ENTRY_VISIBLE,
},
];
add_setup(async function setup() {
let unique = await IOUtils.createUniqueDirectory(
Services.dirsvc.get("TmpD", Ci.nsIFile).path,
"desktopEntryStatusTest"
);
let homeDir = PathUtils.join(unique, "data-home");
Services.env.set("XDG_DATA_HOME", homeDir);
gHomeDir = PathUtils.join(homeDir, "applications");
await IOUtils.makeDirectory(gHomeDir, { createAncestors: true });
let systemDir = PathUtils.join(unique, "data-system");
Services.env.set("XDG_DATA_DIRS", systemDir);
gSystemDir = PathUtils.join(systemDir, "applications");
await IOUtils.makeDirectory(gSystemDir, { createAncestors: true });
Services.env.set("XDG_CURRENT_DESKTOP", "FirefoxOS");
await IOUtils.writeUTF8(
PathUtils.join(gHomeDir, filename("deleted")),
BAREBONES_DESKTOP_ENTRY + "Hidden=true\n"
);
await IOUtils.writeUTF8(
PathUtils.join(gSystemDir, filename("deleted")),
BAREBONES_DESKTOP_ENTRY
);
for (const desktopEntry of kDesktopEntries) {
await IOUtils.writeUTF8(
PathUtils.join(gHomeDir, filename(desktopEntry.label + "-home")),
desktopEntry.content
);
await IOUtils.writeUTF8(
PathUtils.join(gSystemDir, filename(desktopEntry.label + "-system")),
desktopEntry.content
);
}
registerCleanupFunction(async () => {
return IOUtils.remove(unique, { recursive: true });
});
});
add_task(function test_desktopEntryStatus() {
Assert.equal(
ShellService.getDesktopEntryStatus(filename("absent")),
Ci.nsIGNOMEShellService.DESKTOP_ENTRY_ABSENT,
"A desktop entry that doesn't exist should be absent."
);
Assert.equal(
ShellService.getDesktopEntryStatus(filename("hidden")),
Ci.nsIGNOMEShellService.DESKTOP_ENTRY_ABSENT,
"A desktop entry shadowed by one with the Hidden= attribute should be absent."
);
for (const desktopEntry of kDesktopEntries) {
Assert.equal(
ShellService.getDesktopEntryStatus(
filename(desktopEntry.label + "-home")
),
desktopEntry.expected,
"Desktop entry matches when at the local level: " + desktopEntry.label
);
Assert.equal(
ShellService.getDesktopEntryStatus(
filename(desktopEntry.label + "-system")
),
desktopEntry.expected,
"Desktop entry matches when at the system level: " + desktopEntry.label
);
}
});