Bug 1400154 - Preferences UI download option flicker r=jaws draft
authorPunam <pdahiya@mozilla.com>
Mon, 13 Nov 2017 16:44:41 -0800
changeset 697452 9fd3bc233f007e157c4031ff4440d5acc52d4593
parent 697451 a14612501cb6c198ed7f1e318a79f0452dcdaf01
child 740124 52d5b3bdaaa2784e82b1a6590b58076a12d2465f
push id89006
push userbmo:pdahiya@mozilla.com
push dateTue, 14 Nov 2017 01:53:52 +0000
reviewersjaws
bugs1400154
milestone59.0a1
Bug 1400154 - Preferences UI download option flicker r=jaws MozReview-Commit-ID: AS45Pfv03eh ***
browser/components/preferences/in-content/main.js
--- 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");