forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			163 lines
		
	
	
	
		
			5.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			163 lines
		
	
	
	
		
			5.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* Any copyright is dedicated to the Public Domain.
 | |
|  * http://creativecommons.org/publicdomain/zero/1.0/ */
 | |
| 
 | |
| "use strict";
 | |
| 
 | |
| var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
 | |
| ChromeUtils.import("resource://gre/modules/AppConstants.jsm");
 | |
| ChromeUtils.defineModuleGetter(
 | |
|   this,
 | |
|   "CloudStorage",
 | |
|   "resource://gre/modules/CloudStorage.jsm"
 | |
| );
 | |
| ChromeUtils.defineModuleGetter(
 | |
|   this,
 | |
|   "FileUtils",
 | |
|   "resource://gre/modules/FileUtils.jsm"
 | |
| );
 | |
| 
 | |
| const DROPBOX_DOWNLOAD_FOLDER = "Dropbox";
 | |
| const CLOUD_SERVICES_PREF = "cloud.services.";
 | |
| 
 | |
| function create_subdir(dir, subdirname) {
 | |
|   let subdir = dir.clone();
 | |
|   subdir.append(subdirname);
 | |
|   if (subdir.exists()) {
 | |
|     subdir.remove(true);
 | |
|   }
 | |
|   subdir.create(Ci.nsIFile.DIRECTORY_TYPE, 0o755);
 | |
|   return subdir;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Replaces a directory service entry with a given nsIFile.
 | |
|  */
 | |
| function registerFakePath(key, folderName) {
 | |
|   let dirsvc = Services.dirsvc.QueryInterface(Ci.nsIProperties);
 | |
| 
 | |
|   // Create a directory inside the profile and register it as key
 | |
|   let profD = dirsvc.get("ProfD", Ci.nsIFile);
 | |
|   // create a subdir just to keep our files out of the way
 | |
|   let file = create_subdir(profD, folderName);
 | |
| 
 | |
|   let originalFile;
 | |
|   try {
 | |
|     // If a file is already provided save it and undefine, otherwise set will
 | |
|     // throw for persistent entries (ones that are cached).
 | |
|     originalFile = dirsvc.get(key, Ci.nsIFile);
 | |
|     dirsvc.undefine(key);
 | |
|   } catch (e) {
 | |
|     // dirsvc.get will throw if nothing provides for the key and dirsvc.undefine
 | |
|     // will throw if it's not a persistent entry, in either case we don't want
 | |
|     // to set the original file in cleanup.
 | |
|     originalFile = undefined;
 | |
|   }
 | |
| 
 | |
|   dirsvc.set(key, file);
 | |
|   registerCleanupFunction(() => {
 | |
|     dirsvc.undefine(key);
 | |
|     if (originalFile) {
 | |
|       dirsvc.set(key, originalFile);
 | |
|     }
 | |
|   });
 | |
| }
 | |
| 
 | |
| async function mock_dropbox() {
 | |
|   // Mock Dropbox Download folder in Home directory
 | |
|   let downloadFolder = FileUtils.getFile("Home", [
 | |
|     DROPBOX_DOWNLOAD_FOLDER,
 | |
|     "Downloads",
 | |
|   ]);
 | |
|   if (!downloadFolder.exists()) {
 | |
|     downloadFolder.create(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY);
 | |
|   }
 | |
|   console.log(downloadFolder.path);
 | |
| 
 | |
|   registerCleanupFunction(() => {
 | |
|     if (downloadFolder.exists()) {
 | |
|       downloadFolder.remove(true);
 | |
|     }
 | |
|   });
 | |
| }
 | |
| 
 | |
| add_task(async function setup() {
 | |
|   // Create mock Dropbox download folder for cloudstorage API
 | |
|   // Set prefs required to display second radio option
 | |
|   // 'Save to Dropbox' under Downloads
 | |
|   let folderName = "CloudStorage";
 | |
|   registerFakePath("Home", folderName);
 | |
|   await mock_dropbox();
 | |
|   await SpecialPowers.pushPrefEnv({
 | |
|     set: [
 | |
|       [CLOUD_SERVICES_PREF + "api.enabled", true],
 | |
|       [CLOUD_SERVICES_PREF + "storage.key", "Dropbox"],
 | |
|     ],
 | |
|   });
 | |
| });
 | |
| 
 | |
| add_task(async function test_initProvider() {
 | |
|   // Get preferred provider key
 | |
|   let preferredProvider = await CloudStorage.getPreferredProvider();
 | |
|   is(preferredProvider, "Dropbox", "Cloud Storage preferred provider key");
 | |
| 
 | |
|   let isInitialized = await CloudStorage.init();
 | |
|   is(isInitialized, true, "Providers Metadata successfully initialized");
 | |
| 
 | |
|   // Get preferred provider in use display name
 | |
|   let providerDisplayName = await CloudStorage.getProviderIfInUse();
 | |
|   is(
 | |
|     providerDisplayName,
 | |
|     "Dropbox",
 | |
|     "Cloud Storage preferred provider display name"
 | |
|   );
 | |
| });
 | |
| 
 | |
| add_task(async function() {
 | |
|   await openPreferencesViaOpenPreferencesAPI("general", { leaveOpen: true });
 | |
|   let doc = gBrowser.selectedBrowser.contentDocument;
 | |
|   let saveWhereOptions = doc.getElementById("saveWhere");
 | |
|   let saveToCloud = doc.getElementById("saveToCloud");
 | |
|   is(saveWhereOptions.itemCount, 3, "Radio options count");
 | |
|   is_element_visible(saveToCloud, "Save to Dropbox option is visible");
 | |
| 
 | |
|   let saveTo = doc.getElementById("saveTo");
 | |
|   ok(saveTo.selected, "Ensure first option is selected by default");
 | |
|   is(
 | |
|     Services.prefs.getIntPref("browser.download.folderList"),
 | |
|     1,
 | |
|     "Set to system downloadsfolder as the default download location"
 | |
|   );
 | |
| 
 | |
|   let downloadFolder = doc.getElementById("downloadFolder");
 | |
|   let chooseFolder = doc.getElementById("chooseFolder");
 | |
|   is(downloadFolder.disabled, false, "downloadFolder filefield is enabled");
 | |
|   is(chooseFolder.disabled, false, "chooseFolder button is enabled");
 | |
| 
 | |
|   // Test click of second radio option sets browser.download.folderList as 3
 | |
|   // which means the default download location is elsewhere as specified by
 | |
|   // cloud storage API getDownloadFolder and pref cloud.services.storage.key
 | |
|   saveToCloud.click();
 | |
|   is(
 | |
|     Services.prefs.getIntPref("browser.download.folderList"),
 | |
|     3,
 | |
|     "Default download location is elsewhere as specified by cloud storage API"
 | |
|   );
 | |
|   is(downloadFolder.disabled, true, "downloadFolder filefield is disabled");
 | |
|   is(chooseFolder.disabled, true, "chooseFolder button is disabled");
 | |
| 
 | |
|   // Test selecting first radio option enables downloadFolder filefield and chooseFolder button
 | |
|   saveTo.click();
 | |
|   is(downloadFolder.disabled, false, "downloadFolder filefield is enabled");
 | |
|   is(chooseFolder.disabled, false, "chooseFolder button is enabled");
 | |
| 
 | |
|   // Test selecting third radio option keeps downloadFolder and chooseFolder elements disabled
 | |
|   let alwaysAsk = doc.getElementById("alwaysAsk");
 | |
|   saveToCloud.click();
 | |
|   alwaysAsk.click();
 | |
|   is(downloadFolder.disabled, true, "downloadFolder filefield is disabled");
 | |
|   is(chooseFolder.disabled, true, "chooseFolder button is disabled");
 | |
|   saveTo.click();
 | |
|   ok(saveTo.selected, "Reset back first option as selected by default");
 | |
| 
 | |
|   gBrowser.removeCurrentTab();
 | |
| });
 | 
