Bug 1400154 - Preferences UI download option flicker r=jaws
MozReview-Commit-ID: AS45Pfv03eh
***
--- a/browser/components/preferences/in-content/main.js
+++ b/browser/components/preferences/in-content/main.js
@@ -2327,76 +2327,113 @@ var gMainPane = {
chooseFolder.disabled = !preference.value || preference.locked;
this.readCloudStorage().catch(Components.utils.reportError);
// don't override the preference's value in UI
return undefined;
},
/**
+ * Saves returned CloudStorage API getProviderIfInUse method promise and is
+ * used to get provider display name (See Bug 1357171).
+ */
+ _promiseProviderIfInUse: null,
+
+ /**
* Show/Hide the cloud storage radio button with provider name as label if
* cloud storage provider is in use.
* Select cloud storage radio button if browser.download.useDownloadDir is true
* and browser.download.folderList has value 3. Enables/disables the folder field
* and Browse button if cloud storage radio button is selected.
*
*/
async readCloudStorage() {
// Get preferred provider in use display name
- let providerDisplayName = await CloudStorage.getProviderIfInUse();
+ if (!this._promiseProviderIfInUse) {
+ this._promiseProviderIfInUse = CloudStorage.getProviderIfInUse();
+ }
+
+ let providerDisplayName = await this._promiseProviderIfInUse;
if (providerDisplayName) {
// Show cloud storage radio button with provider name in label
let saveToCloudRadio = document.getElementById("saveToCloud");
let cloudStrings = Services.strings.createBundle("resource://cloudstorage/preferences.properties");
saveToCloudRadio.label = cloudStrings.formatStringFromName("saveFilesToCloudStorage",
[providerDisplayName], 1);
saveToCloudRadio.hidden = false;
let useDownloadDirPref = document.getElementById("browser.download.useDownloadDir");
let folderListPref = document.getElementById("browser.download.folderList");
+ // If user has switched away from alwaysAsk radio option
+ // setting browser.download.useDownloadDir to true, check for
+ // _useDownloadDirOption to get id of radio option selected
+ // and set folderListPref with respective value
+ if (this._useDownloadDirOption) {
+ if (this._useDownloadDirOption === "saveToCloud") {
+ folderListPref.value = 3;
+ } else if (this._useDownloadDirOption === "saveTo") {
+ let currentDirPref = document.getElementById("browser.download.dir");
+ folderListPref.value = currentDirPref.value ? await this._folderToIndex(currentDirPref.value) : 1;
+ }
+ // Reset selected option
+ this._useDownloadDirOption = null;
+ }
+
// Check if useDownloadDir is true and folderListPref is set to Cloud Storage value 3
// before selecting cloudStorageradio button. Disable folder field and Browse button if
// 'Save to Cloud Storage Provider' radio option is selected
if (useDownloadDirPref.value && folderListPref.value === 3) {
document.getElementById("saveWhere").selectedItem = saveToCloudRadio;
document.getElementById("downloadFolder").disabled = true;
document.getElementById("chooseFolder").disabled = true;
}
}
},
/**
+ * Stores the id of selected downloads radio options 'saveTo' or 'saveToCloud'
+ * both having browser.download.useDownloadDir as true to support Cloud Storage
+ * (See Bug 1357171).
+ */
+ _useDownloadDirOption: null,
+
+ /**
* Handle clicks to 'Save To <custom path> or <system default downloads>' and
* 'Save to <cloud storage provider>' if cloud storage radio button is displayed in UI.
* Sets browser.download.folderList value and Enables/disables the folder field and Browse
* button based on option selected.
*/
handleSaveToCommand(event) {
return this.handleSaveToCommandTask(event).catch(Components.utils.reportError);
},
async handleSaveToCommandTask(event) {
if (event.target.id !== "saveToCloud" && event.target.id !== "saveTo") {
return;
}
// Check if Save To Cloud Storage Provider radio option is displayed in UI
// before continuing.
let saveToCloudRadio = document.getElementById("saveToCloud");
if (!saveToCloudRadio.hidden) {
+ // When switching between alwaysAsk and saveToCloud or saveTo radio options
+ // with useDownloadDirPref value as false, we should save selected option id
+ // in _useDownloadDirOption to be handled in readCloudStorage
+ let useDownloadDirPref = document.getElementById("browser.download.useDownloadDir");
+ if (!useDownloadDirPref.value) {
+ this._useDownloadDirOption = event.target.id;
+ return;
+ }
// When switching between SaveTo and SaveToCloud radio button
// with useDownloadDirPref value true, if selectedIndex is other than
// SaveTo radio button disable downloadFolder filefield and chooseFolder button
let saveWhere = document.getElementById("saveWhere");
- let useDownloadDirPref = document.getElementById("browser.download.useDownloadDir");
- if (useDownloadDirPref.value) {
- let downloadFolder = document.getElementById("downloadFolder");
- let chooseFolder = document.getElementById("chooseFolder");
- downloadFolder.disabled = saveWhere.selectedIndex || useDownloadDirPref.locked;
- chooseFolder.disabled = saveWhere.selectedIndex || useDownloadDirPref.locked;
- }
+ let downloadFolder = document.getElementById("downloadFolder");
+ let chooseFolder = document.getElementById("chooseFolder");
+ downloadFolder.disabled = saveWhere.selectedIndex || useDownloadDirPref.locked;
+ chooseFolder.disabled = saveWhere.selectedIndex || useDownloadDirPref.locked;
// Set folderListPref value depending on radio option
// selected. folderListPref should be set to 3 if Save To Cloud Storage Provider
// option is selected. If user switch back to 'Save To' custom path or system
// default Downloads, check pref 'browser.download.dir' before setting respective
// folderListPref value. If currentDirPref is unspecified folderList should
// default to 1
let folderListPref = document.getElementById("browser.download.folderList");