Bumping manifests a=b2g-bump
[gecko.git] / dom / permission / PermissionSettings.js
bloba07745ab8dbb06bb427f7c8dbb8b8d2d702f65bf
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
3  * You can obtain one at http://mozilla.org/MPL/2.0/. */
5 "use strict";
7 function debug(aMsg) {
8   //dump("-*- PermissionSettings.js: " + aMsg + "\n");
11 const Cc = Components.classes;
12 const Ci = Components.interfaces;
13 const Cu = Components.utils;
15 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
16 Cu.import("resource://gre/modules/Services.jsm");
17 Cu.import("resource://gre/modules/PermissionsTable.jsm");
19 var cpm = Cc["@mozilla.org/childprocessmessagemanager;1"].getService(Ci.nsISyncMessageSender);
21 // PermissionSettings
23 const PERMISSIONSETTINGS_CONTRACTID = "@mozilla.org/permissionSettings;1";
24 const PERMISSIONSETTINGS_CID        = Components.ID("{cd2cf7a1-f4c1-487b-8c1b-1a71c7097431}");
26 function PermissionSettings()
28   debug("Constructor");
31 XPCOMUtils.defineLazyServiceGetter(this,
32                                    "appsService",
33                                    "@mozilla.org/AppsService;1",
34                                    "nsIAppsService");
36 PermissionSettings.prototype = {
37   get: function get(aPermName, aManifestURL, aOrigin, aBrowserFlag) {
38     debug("Get called with: " + aPermName + ", " + aManifestURL + ", " + aOrigin + ", " + aBrowserFlag);
39     let uri = Services.io.newURI(aOrigin, null, null);
40     let appID = appsService.getAppLocalIdByManifestURL(aManifestURL);
41     let principal = Services.scriptSecurityManager.getAppCodebasePrincipal(uri, appID, aBrowserFlag);
42     let result = Services.perms.testExactPermanentPermission(principal, aPermName);
44     switch (result)
45     {
46       case Ci.nsIPermissionManager.UNKNOWN_ACTION:
47         return "unknown";
48       case Ci.nsIPermissionManager.ALLOW_ACTION:
49         return "allow";
50       case Ci.nsIPermissionManager.DENY_ACTION:
51         return "deny";
52       case Ci.nsIPermissionManager.PROMPT_ACTION:
53         return "prompt";
54       default:
55         dump("Unsupported PermissionSettings Action!\n");
56         return "unknown";
57     }
58   },
60   isExplicit: function isExplicit(aPermName, aManifestURL, aOrigin,
61                                   aBrowserFlag) {
62     debug("isExplicit: " + aPermName + ", " + aManifestURL + ", " + aOrigin);
63     let uri = Services.io.newURI(aOrigin, null, null);
64     let appID = appsService.getAppLocalIdByManifestURL(aManifestURL);
65     let principal = Services.scriptSecurityManager.getAppCodebasePrincipal(uri, appID, aBrowserFlag);
67     return isExplicitInPermissionsTable(aPermName, principal.appStatus);
68   },
70   set: function set(aPermName, aPermValue, aManifestURL, aOrigin,
71                     aBrowserFlag) {
72     debug("Set called with: " + aPermName + ", " + aManifestURL + ", " +
73           aOrigin + ",  " + aPermValue + ", " + aBrowserFlag);
74     let currentPermValue = this.get(aPermName, aManifestURL, aOrigin,
75                                     aBrowserFlag);
76     let action;
77     // Check for invalid calls so that we throw an exception rather than get
78     // killed by parent process
79     if (currentPermValue === "unknown" ||
80         aPermValue === "unknown" ||
81         !this.isExplicit(aPermName, aManifestURL, aOrigin, aBrowserFlag)) {
82       let errorMsg = "PermissionSettings.js: '" + aPermName + "'" +
83                      " is an implicit permission for '" + aManifestURL +
84                      "' or the permission isn't set";
85       Cu.reportError(errorMsg);
86       throw new Components.Exception(errorMsg);
87     }
89     cpm.sendSyncMessage("PermissionSettings:AddPermission", {
90       type: aPermName,
91       origin: aOrigin,
92       manifestURL: aManifestURL,
93       value: aPermValue,
94       browserFlag: aBrowserFlag
95     });
96   },
98   remove: function remove(aPermName, aManifestURL, aOrigin) {
99     let uri = Services.io.newURI(aOrigin, null, null);
100     let appID = appsService.getAppLocalIdByManifestURL(aManifestURL);
101     let principal = Services.scriptSecurityManager.getAppCodebasePrincipal(uri, appID, true);
103     if (principal.appStatus !== Ci.nsIPrincipal.APP_STATUS_NOT_INSTALLED) {
104       let errorMsg = "PermissionSettings.js: '" + aOrigin + "'" +
105                      " is installed or permission is implicit, cannot remove '" +
106                      aPermName + "'.";
107       Cu.reportError(errorMsg);
108       throw new Components.Exception(errorMsg);
109     }
111     // PermissionSettings.jsm handles delete when value is "unknown"
112     cpm.sendSyncMessage("PermissionSettings:AddPermission", {
113       type: aPermName,
114       origin: aOrigin,
115       manifestURL: aManifestURL,
116       value: "unknown",
117       browserFlag: true
118     });
119   },
121   classID : PERMISSIONSETTINGS_CID,
122   QueryInterface : XPCOMUtils.generateQI([])
125 this.NSGetFactory = XPCOMUtils.generateNSGetFactory([PermissionSettings])