Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: os == 'linux' && os_version == '18.04' && asan OR os == 'linux' && os_version == '18.04' && tsan OR win11_2009 && asan
- Manifest: browser/components/preferences/tests/browser.toml
/* Any copyright is dedicated to the Public Domain.
"use strict";
let { TelemetryTestUtils } = ChromeUtils.importESModule(
);
const { MockFilePicker } = SpecialPowers;
add_task(async function testSelectDownloadDir() {
// Setup
const tempDirPath = await IOUtils.createUniqueDirectory(
PathUtils.tempDir,
"test_downloads"
);
const tempDir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
tempDir.initWithPath(tempDirPath);
const downloadsDirPath = await Downloads.getSystemDownloadsDirectory();
const downloadsDir = new FileUtils.File(downloadsDirPath);
await SpecialPowers.pushPrefEnv({
set: [
["browser.download.folderList", 1],
["browser.download.dir", downloadsDirPath],
],
});
// Open preferences pane
await openPreferencesViaOpenPreferencesAPI("general", {
leaveOpen: true,
});
let win = gBrowser.selectedBrowser.contentWindow;
let doc = gBrowser.contentDocument;
await doc.l10n.ready;
let inputFolder = doc.getElementById("chooseFolder");
let button = inputFolder.chooseFolderButtonEl;
button.scrollIntoView({ block: "center" });
// Get Downloads folder details
const [downloadsFolderName] = await doc.l10n.formatValues([
{ id: "downloads-folder-name" },
]);
let downloadsDirLeafName;
try {
downloadsDirLeafName = downloadsDir.leafName;
} catch (ex) {
/* ignored */
}
let downloadsFolderDisplayValue =
downloadsDirLeafName == downloadsFolderName
? downloadsFolderName
: `\u2066${downloadsDirPath}\u2069`;
// Initialize file picker
MockFilePicker.init(window.browsingContext);
MockFilePicker.returnValue = MockFilePicker.returnOK;
function mockFilePickerWithDirectory(dir) {
return new Promise(resolve => {
MockFilePicker.showCallback = () => {
ok(true, `FilePicker shown for ${dir.path}`);
MockFilePicker.setFiles([dir]);
resolve();
};
});
}
async function selectDirectory(dir) {
const pickerPromise = mockFilePickerWithDirectory(dir);
const changeEvent = BrowserTestUtils.waitForEvent(inputFolder, "change");
EventUtils.synthesizeMouseAtCenter(button, {}, win);
await pickerPromise;
await changeEvent;
await inputFolder.updateComplete;
await TestUtils.waitForTick();
}
// Check initial state
is(
inputFolder.value,
downloadsDirPath,
"Initial input folder value is set to the Downloads folder path"
);
is(
inputFolder.displayValue,
downloadsFolderDisplayValue,
"Initial display value of the input folder is set to Downloads"
);
// Select temp dir
await selectDirectory(tempDir);
is(
inputFolder.value,
tempDirPath,
"Input folder value is set to the temporary folder path"
);
ok(
inputFolder.displayValue.includes("test_downloads"),
"Input folder displayValue is set to the temporary folder path"
);
// Assert telemetry after first interaction
TelemetryTestUtils.assertKeyedScalar(
TelemetryTestUtils.getProcessScalars("parent", true, false),
"browser.ui.interaction.preferences_paneGeneral",
"chooseFolder",
1
);
// Select Downloads again
await selectDirectory(downloadsDir);
is(
inputFolder.value,
downloadsDirPath,
"Input folder value is set to the Downloads folder path"
);
is(
inputFolder.displayValue,
downloadsFolderDisplayValue,
"Display value of the input folder is set to Downloads"
);
// Reassert telemetry
TelemetryTestUtils.assertKeyedScalar(
TelemetryTestUtils.getProcessScalars("parent", true, true),
"browser.ui.interaction.preferences_paneGeneral",
"chooseFolder",
2
);
// Cleanup
MockFilePicker.cleanup();
await IOUtils.remove(tempDirPath, { recursive: true });
BrowserTestUtils.removeTab(gBrowser.selectedTab);
});