diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
commit | 6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch) | |
tree | a68f146d7fa01f0134297619fbe7e33db084e0aa /comm/suite/components/pref/content/pref-offlineapps.js | |
parent | Initial commit. (diff) | |
download | thunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.tar.xz thunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.zip |
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'comm/suite/components/pref/content/pref-offlineapps.js')
-rw-r--r-- | comm/suite/components/pref/content/pref-offlineapps.js | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/comm/suite/components/pref/content/pref-offlineapps.js b/comm/suite/components/pref/content/pref-offlineapps.js new file mode 100644 index 0000000000..db7c44cb81 --- /dev/null +++ b/comm/suite/components/pref/content/pref-offlineapps.js @@ -0,0 +1,178 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +const {DownloadUtils} = ChromeUtils.import("resource://gre/modules/DownloadUtils.jsm"); +var {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm"); + +function Startup() +{ + OfflineAppsObserver.init(); + + let always = document.getElementById("offline-apps.allow_by_default").value; + UpdateNotifyBox(always); +} + +var OfflineAppsObserver = { + + init: function offlineAppsInit() { + this.update(); + Services.obs.addObserver(this, "perm-changed"); + window.addEventListener("unload", this); + }, + + update: function offlineAppsUpdate() { + UpdateActualCacheSize(); + UpdateOfflineApps(); + }, + + observe: function offlineAppsObserve(aSubject, aTopic, aData) { + if (aTopic == "perm-changed") + this.update(); + }, + + handleEvent: function offlineAppsEvent(aEvent) { + if (aEvent.type == "unload") { + window.removeEventListener("unload", this); + Services.obs.removeObserver(this, "perm-changed"); + } + } +} + +function UpdateActualCacheSize() +{ + var visitor = { + onCacheStorageInfo: function(aEntryCount, aTotalSize) + { + let actualSizeLabel = document.getElementById("offlineAppSizeInfo"); + let sizeStrings = DownloadUtils.convertByteUnits(aTotalSize); + let bundle = document.getElementById("bundle_prefutilities"); + let sizeStr = bundle.getFormattedString("offlineAppSizeInfo", + sizeStrings); + actualSizeLabel.textContent = sizeStr; + }, + + onCacheEntryInfo: function(entryInfo) + { + }, + + onCacheEntryVisitCompleted: function() + { + } + }; + + Services.cache2.appCacheStorage(Services.loadContextInfo.default, null) + .asyncVisitStorage(visitor, false); +} + +/** + * Clears the application cache. + */ +var callback = { + onCacheEntryDoomed: function(aResult) { + UpdateActualCacheSize(); + UpdateOfflineApps(); + } +}; + +function ClearOfflineAppCache() +{ + try { + Services.cache2.appCacheStorage(Services.loadContextInfo.default, null) + .asyncEvictStorage(callback); + } catch(ex) {} +} + +function UpdateNotifyBox(aValue) +{ + EnableElementById("offlineNotifyAsk", !aValue); + + // remove this once bug 934457 and bug 1024832 are fixed + document.getElementById("offlineNotifyPermissions").disabled = aValue; +} + +function _getOfflineAppUsage(aPermission) +{ + var appCache = Cc["@mozilla.org/network/application-cache-service;1"] + .getService(Ci.nsIApplicationCacheService); + var groups = appCache.getGroups(); + + var usage = 0; + for (let i = 0; i < groups.length; i++) { + let uri = Services.io.newURI(groups[i]); + if (aPermission.matchesURI(uri, true)) + usage += appCache.getActiveCache(groups[i]).usage; + } + return usage; +} + +/** + * Updates the list of offline applications. + */ +function UpdateOfflineApps() +{ + var list = document.getElementById("offlineAppsList"); + while (list.hasChildNodes()) + list.lastChild.remove(); + + var bundle = document.getElementById("bundle_prefutilities"); + var pm = Services.perms; + var enumerator = pm.enumerator; + + while (enumerator.hasMoreElements()) { + let perm = enumerator.getNext() + .QueryInterface(Ci.nsIPermission); + if (perm.type != "offline-app" || + perm.capability != pm.ALLOW_ACTION) + continue; + + let usage = _getOfflineAppUsage(perm); + let row = document.createElement("listitem"); + row.setAttribute("host", perm.principal.URI.host); + let converted = DownloadUtils.convertByteUnits(usage); + row.setAttribute("usage", bundle.getFormattedString("offlineAppUsage", + converted)); + list.appendChild(row); + } +} + +function OfflineAppSelected(aList) +{ + document.getElementById("offlineAppsListRemove") + .setAttribute("disabled", !aList.selectedItem); +} + +function RemoveOfflineApp() +{ + var list = document.getElementById("offlineAppsList"); + var item = list.selectedItem; + var host = item.getAttribute("host"); + + var flags = Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_0 + + Services.prompt.BUTTON_TITLE_CANCEL * Services.prompt.BUTTON_POS_1; + + var bundle = document.getElementById("bundle_prefutilities"); + var title = bundle.getString("offlineAppRemoveTitle"); + var prompt = bundle.getFormattedString("offlineAppRemovePrompt", [host]); + var confirm = bundle.getString("offlineAppRemoveConfirm"); + if (Services.prompt.confirmEx(window, title, prompt, flags, confirm, + null, null, null, {})) + return; + + // clear offline cache entries + var appCache = Cc["@mozilla.org/network/application-cache-service;1"] + .getService(Ci.nsIApplicationCacheService); + var groups = appCache.getGroups(); + for (let i = 0; i < groups.length; i++) { + var uri = Services.io.newURI(groups[i]); + if (uri.asciiHost == host) + appCache.getActiveCache(groups[i]).discard(); + } + + // remove the permission + // Services.perms.remove(host, "offline-app"); + + UpdateOfflineApps(); + OfflineAppSelected(list); + UpdateActualCacheSize(); +} |