gecko-dev/mobile/chrome/content/OfflineApps.js

82 lines
3.0 KiB
JavaScript

/*
* Provide supports for Offline Applications
*/
var OfflineApps = {
offlineAppRequested: function(aRequest, aTarget) {
if (!Services.prefs.getBoolPref("browser.offline-apps.notify"))
return;
let currentURI = Services.io.newURI(aRequest.location, aRequest.charset, null);
// don't bother showing UI if the user has already made a decision
if (Services.perms.testExactPermission(currentURI, "offline-app") != Ci.nsIPermissionManager.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 notificationBox = Browser.getNotificationBox(aTarget);
let notification = notificationBox.getNotificationWithValue(notificationID);
let strings = Strings.browser;
if (notification) {
notification.documents.push(aRequest);
} else {
let buttons = [{
label: strings.GetStringFromName("offlineApps.allow"),
accessKey: null,
callback: function() {
for (let i = 0; i < notification.documents.length; i++)
OfflineApps.allowSite(notification.documents[i], aTarget);
}
},{
label: strings.GetStringFromName("offlineApps.never"),
accessKey: null,
callback: function() {
for (let i = 0; i < notification.documents.length; i++)
OfflineApps.disallowSite(notification.documents[i]);
}
},{
label: strings.GetStringFromName("offlineApps.notNow"),
accessKey: null,
callback: function() { /* noop */ }
}];
const priority = notificationBox.PRIORITY_INFO_LOW;
let message = strings.formatStringFromName("offlineApps.available2", [host], 1);
notification = notificationBox.appendNotification(message, notificationID, "", priority, buttons);
notification.documents = [aRequest];
}
},
allowSite: function(aRequest, aTarget) {
let currentURI = Services.io.newURI(aRequest.location, aRequest.charset, null);
Services.perms.add(currentURI, "offline-app", Ci.nsIPermissionManager.ALLOW_ACTION);
// When a site is enabled while loading, manifest resources will start
// fetching immediately. This one time we need to do it ourselves.
// The update must be started on the content process.
aTarget.messageManager.sendAsyncMessage("Browser:MozApplicationCache:Fetch", aRequest);
},
disallowSite: function(aRequest) {
let currentURI = Services.io.newURI(aRequest.location, aRequest.charset, null);
Services.perms.add(currentURI, "offline-app", Ci.nsIPermissionManager.DENY_ACTION);
},
receiveMessage: function receiveMessage(aMessage) {
if (aMessage.name == "Browser:MozApplicationManifest") {
this.offlineAppRequested(aMessage.json, aMessage.target);
}
}
};