summaryrefslogtreecommitdiffstats
path: root/mobile/android/chrome/content/OfflineApps.js
diff options
context:
space:
mode:
Diffstat (limited to 'mobile/android/chrome/content/OfflineApps.js')
-rw-r--r--mobile/android/chrome/content/OfflineApps.js77
1 files changed, 77 insertions, 0 deletions
diff --git a/mobile/android/chrome/content/OfflineApps.js b/mobile/android/chrome/content/OfflineApps.js
new file mode 100644
index 000000000..e11b3c645
--- /dev/null
+++ b/mobile/android/chrome/content/OfflineApps.js
@@ -0,0 +1,77 @@
+/* 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/. */
+"use strict";
+
+var OfflineApps = {
+ offlineAppRequested: function(aContentWindow) {
+ if (!Services.prefs.getBoolPref("browser.offline-apps.notify"))
+ return;
+
+ let tab = BrowserApp.getTabForWindow(aContentWindow);
+ let currentURI = aContentWindow.document.documentURIObject;
+
+ // Don't bother showing UI if the user has already made a decision
+ if (Services.perms.testExactPermission(currentURI, "offline-app") != Services.perms.UNKNOWN_ACTION)
+ return;
+
+ try {
+ if (Services.prefs.getBoolPref("offline-apps.allow_by_default")) {
+ // All pages can use offline capabilities, no need to ask the user
+ return;
+ }
+ } catch(e) {
+ // This pref isn't set by default, ignore failures
+ }
+
+ let host = currentURI.asciiHost;
+ let notificationID = "offline-app-requested-" + host;
+
+ let strings = Strings.browser;
+ let buttons = [{
+ label: strings.GetStringFromName("offlineApps.dontAllow2"),
+ callback: function(aChecked) {
+ if (aChecked)
+ OfflineApps.disallowSite(aContentWindow.document);
+ }
+ },
+ {
+ label: strings.GetStringFromName("offlineApps.allow"),
+ callback: function() {
+ OfflineApps.allowSite(aContentWindow.document);
+ },
+ positive: true
+ }];
+
+ let requestor = BrowserApp.manifest ? "'" + BrowserApp.manifest.name + "'" : host;
+ let message = strings.formatStringFromName("offlineApps.ask", [requestor], 1);
+ let options = { checkbox: Strings.browser.GetStringFromName("offlineApps.dontAskAgain") };
+ NativeWindow.doorhanger.show(message, notificationID, buttons, tab.id, options);
+ },
+
+ allowSite: function(aDocument) {
+ Services.perms.add(aDocument.documentURIObject, "offline-app", Services.perms.ALLOW_ACTION);
+
+ // When a site is enabled while loading, manifest resources will
+ // start fetching immediately. This one time we need to do it
+ // ourselves.
+ this._startFetching(aDocument);
+ },
+
+ disallowSite: function(aDocument) {
+ Services.perms.add(aDocument.documentURIObject, "offline-app", Services.perms.DENY_ACTION);
+ },
+
+ _startFetching: function(aDocument) {
+ if (!aDocument.documentElement)
+ return;
+
+ let manifest = aDocument.documentElement.getAttribute("manifest");
+ if (!manifest)
+ return;
+
+ let manifestURI = Services.io.newURI(manifest, aDocument.characterSet, aDocument.documentURIObject);
+ let updateService = Cc["@mozilla.org/offlinecacheupdate-service;1"].getService(Ci.nsIOfflineCacheUpdateService);
+ updateService.scheduleUpdate(manifestURI, aDocument.documentURIObject, aDocument.nodePrincipal, window);
+ }
+};