Functioning options page
This commit is contained in:
		| @@ -9,6 +9,14 @@ function emptyEm() { | ||||
|   browser.folder_actions.emptyTrashFolders(); | ||||
|   browser.folder_actions.emptyJunkFolders(); | ||||
|   console.log("Empty-em: Emptying.. Done"); | ||||
|  | ||||
|   // TODO: Do this on done event | ||||
|   browser.notifications.create("emptyem-done-notify", { | ||||
|     "type": "basic", | ||||
|     "iconUrl": browser.extension.getURL("icons/icon.png"), | ||||
|     "title": "Empty 'em done!", | ||||
|     "message": "Cleaned Trash and Junk folders" | ||||
|   }); | ||||
| } | ||||
|  | ||||
| // Handlers | ||||
|   | ||||
							
								
								
									
										72
									
								
								data/common.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								data/common.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | ||||
| // ----------------------------------------------- | ||||
| // Common functions used in Options handling | ||||
| // ----------------------------------------------- | ||||
| // | ||||
| // Get default values of preferences | ||||
| // | ||||
| function getPrefDefaults() { | ||||
|   return { | ||||
|     prefs: { | ||||
|       overrideDeleteConfirm: false, | ||||
|       selectTrashDelete: false, | ||||
|       selectJunkDelete: false, | ||||
|       consoleDebug: false, | ||||
|       disableDoneNotification: false, | ||||
|       alsoCompact: false | ||||
|     } | ||||
|   }; | ||||
| } | ||||
|  | ||||
| // | ||||
| // Get preferences from storage and return the structure asynchronously | ||||
| // | ||||
| async function getPrefs() { | ||||
|   let getting = await browser.storage.sync.get("prefs"); | ||||
|  | ||||
|   let fr = ""; | ||||
|   if ($.isEmptyObject(getting)) { | ||||
|     prefs = getPrefDefaults(); | ||||
|     fr = "defaults"; | ||||
|   } else { | ||||
|     prefs = getting; | ||||
|     fr = "storage"; | ||||
|   }; | ||||
|   console.log("Loaded prefs from " + fr); | ||||
|  | ||||
|   return getting; | ||||
| } | ||||
|  | ||||
| // | ||||
| // Handle the event of an option change in options UI. Event is passed in as | ||||
| // the 'ch' argument. This function records the changed option in to the | ||||
| // options storage and returns the updated structure asynchronously | ||||
| // | ||||
| async function changeOption(ch) { | ||||
|   var i = ch[0].id; | ||||
|   var c = ch[0].checked; | ||||
|   console.log("Pref: " + i + " -> " + c); | ||||
|        if (i == "overrideDeleteConfirm")   { prefs.prefs.overrideDeleteConfirm = c; } | ||||
|   else if (i == "selectTrashDelete")       { prefs.prefs.selectTrashDelete = c; } | ||||
|   else if (i == "selectJunkDelete")        { prefs.prefs.selectJunkDelete = c; } | ||||
|   else if (i == "consoleDebug")            { prefs.prefs.consoleDebug = c; } | ||||
|   else if (i == "disableDoneNotification") { prefs.prefs.disableDoneNotification = c; } | ||||
|   else if (i == "alsoCompact")             { prefs.prefs.alsoCompact = c; } | ||||
|   await browser.storage.sync.set(prefs); | ||||
|  | ||||
|   prefs = await getPrefs(); | ||||
|  | ||||
|   return prefs; | ||||
| } | ||||
|  | ||||
| // | ||||
| // Given the preferences structure, update the options IO with appropriate values | ||||
| // | ||||
| function updateOptionsForm(prefs) { | ||||
|   $("#overrideDeleteConfirm").prop('checked', prefs.prefs.overrideDeleteConfirm); | ||||
|   $("#selectTrashDelete").prop('checked', prefs.prefs.selectTrashDelete); | ||||
|   $("#selectJunkDelete").prop('checked', prefs.prefs.selectJunkDelete); | ||||
|   $("#selectJunkDelete").prop('checked', prefs.prefs.selectJunkDelete); | ||||
|   $("#consoleDebug").prop('checked', prefs.prefs.consoleDebug); | ||||
|   $("#disableDoneNotification").prop('checked', prefs.prefs.disableDoneNotification); | ||||
|   $("#alsoCompact").prop('checked', prefs.prefs.alsoCompact); | ||||
| } | ||||
| @@ -120,6 +120,7 @@ body { | ||||
|     </div> | ||||
|  | ||||
|     <script src="jquery.min.js"></script> | ||||
|     <script src="common.js"></script> | ||||
|     <script src="options.js"></script> | ||||
|   </body> | ||||
| </html> | ||||
|   | ||||
| @@ -1,3 +1,19 @@ | ||||
| // ----------------------------------------------- | ||||
| // Options UI and handling | ||||
| // ----------------------------------------------- | ||||
| // | ||||
| // Load preferences from options storage. When done, update the options UI with | ||||
| // values. Then, set up the listener for option changes. | ||||
| // | ||||
| async function loadOptions() { | ||||
|   let prefs = await getPrefs(); | ||||
|   updateOptionsForm(prefs); | ||||
|  | ||||
|   $("input[type=checkbox]").change(function() { | ||||
|     changeOption($(this)); | ||||
|   }); | ||||
| } | ||||
|  | ||||
| $(function() { | ||||
|   loadOptions(); | ||||
| }); | ||||
|   | ||||
| @@ -11,6 +11,10 @@ class FolderActionsProvider extends ExtensionCommon.EventEmitter { | ||||
|     super(); | ||||
|  | ||||
|     this.extension = extension; | ||||
|     this.options = { | ||||
|       consoleDebug: 0, | ||||
|       alsoCompact: 0 | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   get type() { | ||||
| @@ -56,11 +60,11 @@ class FolderActionsProvider extends ExtensionCommon.EventEmitter { | ||||
|     this.factory = factory.QueryInterface(Ci.nsIFactory); | ||||
|  | ||||
|     registrar.registerFactory( | ||||
|       this.classID, `Cloud file provider for ${this.extension.id}`, contractID, this.factory | ||||
|       this.classID, `Folder Actions provider for ${this.extension.id}`, contractID, this.factory | ||||
|     ); | ||||
|  | ||||
|     XPCOMUtils.categoryManager.addCategoryEntry( | ||||
|       "cloud-files", this.extension.id, contractID, false, true | ||||
|       "folder-actions", this.extension.id, contractID, false, true | ||||
|     ); | ||||
|   } | ||||
|  | ||||
| @@ -68,7 +72,7 @@ class FolderActionsProvider extends ExtensionCommon.EventEmitter { | ||||
|     let registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar); | ||||
|  | ||||
|     registrar.unregisterFactory(this.classID, this.factory); | ||||
|     XPCOMUtils.categoryManager.deleteCategoryEntry("cloud-files", this.extension.id, false); | ||||
|     XPCOMUtils.categoryManager.deleteCategoryEntry("folder-actions", this.extension.id, false); | ||||
|   } | ||||
| } | ||||
|  | ||||
| @@ -91,10 +95,18 @@ this.folder_actions = class extends ExtensionAPI { | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   debugMsg(msg) { | ||||
|     if (this.provider.options.consoleDebug > 0) { | ||||
|       console.log(msg); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   getFolderInfo() { | ||||
|     let data = []; | ||||
|     let self = this; | ||||
|  | ||||
|     toArray(fixIterator(MailServices.accounts.accounts,Components.interfaces.nsIMsgAccount)).map(function(account) { | ||||
|     toArray(fixIterator(MailServices.accounts.accounts,Components.interfaces.nsIMsgAccount)). | ||||
|               map(function(account) { | ||||
|       let info = { | ||||
|           server: null, | ||||
|           type: null, | ||||
| @@ -107,13 +119,13 @@ this.folder_actions = class extends ExtensionAPI { | ||||
|  | ||||
|       let find_flagged_folders = function(folder,inf) { | ||||
|         if (folder.getFlag(Ci.nsMsgFolderFlags.Trash)) { | ||||
|           console.log("Folder: " + folder.URI + " has Trash flag "); | ||||
|           self.debugMsg("Folder: " + folder.URI + " has Trash flag "); | ||||
|           inf.trashFolder = folder; | ||||
|           console.log(folder); | ||||
|           self.debugMsg(folder); | ||||
|         } else if (folder.getFlag(Ci.nsMsgFolderFlags.Junk)) { | ||||
|           console.log("Folder: " + folder.URI + " has Junk flag "); | ||||
|           self.debugMsg("Folder: " + folder.URI + " has Junk flag "); | ||||
|           inf.junkFolder = folder; | ||||
|           console.log(folder); | ||||
|           self.debugMsg(folder); | ||||
|         } else { | ||||
|           if (folder.hasSubFolders) { | ||||
|             toArray(fixIterator(folder.subFolders, Ci.nsMsgFolder)).map(function (f) { | ||||
| @@ -135,7 +147,7 @@ this.folder_actions = class extends ExtensionAPI { | ||||
|       }); | ||||
|       data.push(info); | ||||
|     }); | ||||
|     console.log(data); | ||||
|     this.debugMsg(data); | ||||
|     return data; | ||||
|   } | ||||
|  | ||||
| @@ -147,29 +159,32 @@ this.folder_actions = class extends ExtensionAPI { | ||||
|  | ||||
|     return { | ||||
|       folder_actions: { | ||||
|  | ||||
|         emptyFolder: function(folderName) { | ||||
|           let finfo = self.getFolderInfo(); | ||||
|         }, | ||||
|  | ||||
|         emptyTrashFolders: function() { | ||||
|           let finfo = self.getFolderInfo(); | ||||
|           finfo.map(function(info) { | ||||
|             if (info.trashFolder) { | ||||
|               console.log("emptyTrashFolders: Considering " + info.trashFolder.URI); | ||||
|               console.log("emptyTrashFolders: canDeleteMessages? " + info.trashFolder.canDeleteMessages); | ||||
|               console.log("emptyTrashFolders: hasSubFolders? " + info.trashFolder.hasSubFolders); | ||||
|               console.log(info.trashFolder); | ||||
|               self.debugMsg("emptyTrashFolders: Considering " + info.trashFolder.URI); | ||||
|               self.debugMsg("emptyTrashFolders: canDeleteMessages? " + info.trashFolder.canDeleteMessages); | ||||
|               self.debugMsg("emptyTrashFolders: hasSubFolders? " + info.trashFolder.hasSubFolders); | ||||
|               self.debugMsg(info.trashFolder); | ||||
|               info.trashFolder.emptyTrash(null,null); | ||||
|             } | ||||
|           }); | ||||
|         }, | ||||
|  | ||||
|         emptyJunkFolders: function() { | ||||
|           let finfo = self.getFolderInfo(); | ||||
|           finfo.map(function(info) { | ||||
|             if (info.junkFolder) { | ||||
|               console.log("emptyTrashFolders: Considering " + info.junkFolder.URI); | ||||
|               console.log("emptyTrashFolders: canDeleteMessages? " + info.junkFolder.canDeleteMessages); | ||||
|               console.log("emptyTrashFolders: hasSubFolders? " + info.junkFolder.hasSubFolders); | ||||
|               console.log(info.junkFolder); | ||||
|               self.debugMsg("emptyTrashFolders: Considering " + info.junkFolder.URI); | ||||
|               self.debugMsg("emptyTrashFolders: canDeleteMessages? " + info.junkFolder.canDeleteMessages); | ||||
|               self.debugMsg("emptyTrashFolders: hasSubFolders? " + info.junkFolder.hasSubFolders); | ||||
|               self.debugMsg(info.junkFolder); | ||||
|               var junk_msgs = Cc["@mozilla.org/array;1"] | ||||
|                                .createInstance(Ci.nsIMutableArray); | ||||
|               var enumerator = info.junkFolder.messages; | ||||
| @@ -183,6 +198,10 @@ this.folder_actions = class extends ExtensionAPI { | ||||
|               } | ||||
|             } | ||||
|           }); | ||||
|         }, | ||||
|  | ||||
|         setOptions: function(options) { | ||||
|           self.provider.options = Object.assign(self.provider.options, options); | ||||
|         } | ||||
|       } | ||||
|     }; | ||||
|   | ||||
| @@ -21,16 +21,16 @@ | ||||
|     "namespace": "folder_actions", | ||||
|     "events": [ | ||||
|       { | ||||
|         "name": "onEmptyFolder", | ||||
|         "name": "onEmptyTrash", | ||||
|         "type": "function", | ||||
|         "description": "Fired when a folder is emptied", | ||||
|         "parameters": [ | ||||
|         "description": "Fired when Trash folders are emptied", | ||||
|         "parameters": [] | ||||
|       }, | ||||
|       { | ||||
|             "name": "folderName", | ||||
|             "$ref": "MailFolder", | ||||
|             "description": "The folder to be emptied" | ||||
|           } | ||||
|         ] | ||||
|         "name": "onEmptyJunk", | ||||
|         "type": "function", | ||||
|         "description": "Fired when Junk folders are emptied", | ||||
|         "parameters": [] | ||||
|       } | ||||
|     ], | ||||
|     "types": [ | ||||
| @@ -44,18 +44,37 @@ | ||||
|             "description": "Name of the folder to be emptied" | ||||
|           } | ||||
|         } | ||||
|       }, | ||||
|       { | ||||
|         "id": "ApiOptions", | ||||
|         "type": "object", | ||||
|         "description": "Folder API options", | ||||
|         "properties": { | ||||
|           "consoleDebug": { | ||||
|             "type": "integer", | ||||
|             "minimum": 0, | ||||
|             "optional": true, | ||||
|             "description": "If set to 1, debug messages are printed out in console log" | ||||
|           }, | ||||
|           "alsoCompact": { | ||||
|             "type": "integer", | ||||
|             "minimum": 0, | ||||
|             "optional": true, | ||||
|             "description": "If set to 1, also compact folder after emptying" | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     ], | ||||
|     "functions": [ | ||||
|       { | ||||
|         "name": "emptyFolder", | ||||
|         "name": "setOptions", | ||||
|         "type": "function", | ||||
|         "description": "Empties specified mail folder", | ||||
|         "description": "Sets options for this API", | ||||
|         "parameters": [ | ||||
|           { | ||||
|             "name": "folderName", | ||||
|             "$ref": "MailFolder", | ||||
|             "description": "The mail folder to empty" | ||||
|             "name": "options", | ||||
|             "$ref": "ApiOptions", | ||||
|             "description": "API Options object" | ||||
|           } | ||||
|         ] | ||||
|       }, | ||||
|   | ||||
| @@ -16,6 +16,8 @@ | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|   "permissions": ["storage", "notifications"], | ||||
|  | ||||
|   "browser_action": { | ||||
|     "default_icon": { | ||||
|       "16": "icons/icon.png", | ||||
| @@ -24,10 +26,6 @@ | ||||
|     "default_title": "Empty 'em" | ||||
|   }, | ||||
|  | ||||
|   // "folder_actions": { | ||||
|   //   "name": "EmptyEm" | ||||
|   // }, | ||||
|  | ||||
|   "options_ui": { | ||||
|     "page": "data/options.html" | ||||
|   }, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user