summaryrefslogtreecommitdiffstats
path: root/comm/suite/components/pref/content/pref-offlineapps.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/suite/components/pref/content/pref-offlineapps.js')
-rw-r--r--comm/suite/components/pref/content/pref-offlineapps.js178
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();
+}