diff -r 000000000000 -r 6474c204b198 browser/metro/base/content/helperui/OfflineApps.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browser/metro/base/content/helperui/OfflineApps.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,81 @@ +/* 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/. */ + +/* + * 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: "", + callback: function() { + for (let i = 0; i < notification.documents.length; i++) + OfflineApps.allowSite(notification.documents[i], aTarget); + } + },{ + label: strings.GetStringFromName("contentPermissions.neverForSite"), + accessKey: "", + callback: function() { + for (let i = 0; i < notification.documents.length; i++) + OfflineApps.disallowSite(notification.documents[i]); + } + }]; + + const priority = notificationBox.PRIORITY_INFO_LOW; + let message = strings.formatStringFromName("offlineApps.wantsTo", [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); + } + } +}; +