diff --git a/b2g/app/b2g.js b/b2g/app/b2g.js index beaac16af619..55dd00867489 100644 --- a/b2g/app/b2g.js +++ b/b2g/app/b2g.js @@ -387,6 +387,7 @@ pref("dom.mozAlarms.enabled", true); // WebSettings pref("dom.mozSettings.enabled", true); +pref("dom.mozPermissionSettings.enabled", true); // controls if we want camera support pref("device.camera.enabled", true); diff --git a/b2g/chrome/content/shell.js b/b2g/chrome/content/shell.js index 3c3833b0dc6e..c4b2d95797a8 100644 --- a/b2g/chrome/content/shell.js +++ b/b2g/chrome/content/shell.js @@ -19,6 +19,7 @@ Cu.import('resource://gre/modules/DOMFMRadioParent.jsm'); Cu.import('resource://gre/modules/AlarmService.jsm'); Cu.import('resource://gre/modules/ActivitiesService.jsm'); Cu.import('resource://gre/modules/PermissionPromptHelper.jsm'); +Cu.import('resource://gre/modules/PermissionSettings.jsm'); Cu.import('resource://gre/modules/ObjectWrapper.jsm'); Cu.import('resource://gre/modules/accessibility/AccessFu.jsm'); Cu.import('resource://gre/modules/Payment.jsm'); diff --git a/b2g/installer/package-manifest.in b/b2g/installer/package-manifest.in index 11eb986563cb..f906434fc914 100644 --- a/b2g/installer/package-manifest.in +++ b/b2g/installer/package-manifest.in @@ -195,6 +195,7 @@ @BINPATH@/components/dom_power.xpt @BINPATH@/components/dom_range.xpt @BINPATH@/components/dom_settings.xpt +@BINPATH@/components/dom_permissionsettings.xpt @BINPATH@/components/dom_sidebar.xpt @BINPATH@/components/dom_sms.xpt @BINPATH@/components/dom_storage.xpt @@ -331,6 +332,8 @@ @BINPATH@/components/BrowserElementParent.js @BINPATH@/components/ContactManager.js @BINPATH@/components/ContactManager.manifest +@BINPATH@/components/PermissionSettings.js +@BINPATH@/components/PermissionSettings.manifest @BINPATH@/components/AlarmsManager.js @BINPATH@/components/AlarmsManager.manifest @BINPATH@/components/FeedProcessor.manifest diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in index e3d1851d0150..8f470a576520 100644 --- a/browser/installer/package-manifest.in +++ b/browser/installer/package-manifest.in @@ -199,6 +199,7 @@ @BINPATH@/components/dom_power.xpt @BINPATH@/components/dom_range.xpt @BINPATH@/components/dom_settings.xpt +@BINPATH@/components/dom_permissionsettings.xpt @BINPATH@/components/dom_sidebar.xpt @BINPATH@/components/dom_sms.xpt @BINPATH@/components/dom_storage.xpt @@ -481,6 +482,8 @@ @BINPATH@/components/nsIDService.js @BINPATH@/components/Identity.manifest +@BINPATH@/components/PermissionSettings.js +@BINPATH@/components/PermissionSettings.manifest @BINPATH@/components/ContactManager.js @BINPATH@/components/ContactManager.manifest @BINPATH@/components/AlarmsManager.js diff --git a/dom/Makefile.in b/dom/Makefile.in index 889bd94a1feb..89a65907e741 100644 --- a/dom/Makefile.in +++ b/dom/Makefile.in @@ -35,6 +35,7 @@ PARALLEL_DIRS = \ interfaces/offline \ interfaces/geolocation \ interfaces/notification \ + interfaces/permission \ interfaces/svg \ interfaces/smil \ interfaces/apps \ diff --git a/dom/base/nsDOMClassInfo.cpp b/dom/base/nsDOMClassInfo.cpp index 9b093547eac4..528498c2d11c 100644 --- a/dom/base/nsDOMClassInfo.cpp +++ b/dom/base/nsDOMClassInfo.cpp @@ -174,6 +174,7 @@ #include "nsEventSource.h" #include "nsIDOMSettingsManager.h" #include "nsIDOMContactManager.h" +#include "nsIDOMPermissionSettings.h" #include "nsIDOMApplicationRegistry.h" #ifdef MOZ_B2G_RIL diff --git a/dom/dom-config.mk b/dom/dom-config.mk index 5527d03e29a9..0e933c9f32a7 100644 --- a/dom/dom-config.mk +++ b/dom/dom-config.mk @@ -12,6 +12,7 @@ DOM_SRCDIRS = \ dom/settings \ dom/sms/src \ dom/contacts \ + dom/permission \ dom/alarm \ dom/src/events \ dom/src/storage \ diff --git a/dom/interfaces/permission/Makefile.in b/dom/interfaces/permission/Makefile.in new file mode 100644 index 000000000000..69a20f3e4757 --- /dev/null +++ b/dom/interfaces/permission/Makefile.in @@ -0,0 +1,24 @@ +# 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/. + +DEPTH = @DEPTH@ +topsrcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +include $(DEPTH)/config/autoconf.mk + +MODULE = dom +XPIDL_MODULE = dom_permissionsettings +GRE_MODULE = 1 + +XPIDLSRCS = \ + nsIDOMPermissionSettings.idl \ + $(NULL) + +include $(topsrcdir)/config/rules.mk + +XPIDL_FLAGS += \ + -I$(topsrcdir)/dom/interfaces/base \ + $(NULL) diff --git a/dom/interfaces/permission/nsIDOMPermissionSettings.idl b/dom/interfaces/permission/nsIDOMPermissionSettings.idl new file mode 100644 index 000000000000..e29a4fd3e679 --- /dev/null +++ b/dom/interfaces/permission/nsIDOMPermissionSettings.idl @@ -0,0 +1,15 @@ +/* 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/. */ + +#include "domstubs.idl" + +interface nsIDOMDOMRequest; + +[scriptable, uuid(36e73ef0-c6f4-11e1-9b21-0800200c9a66)] +interface nsIDOMPermissionSettings : nsISupports +{ + DOMString get(in DOMString permission, in DOMString access, in DOMString manifestURI, in DOMString origin, in bool browserFlag); + + void set(in DOMString permission, in DOMString access, in DOMString manifestURI, in DOMString origin, in DOMString value, in bool browserFlag); +}; diff --git a/dom/permission/Makefile.in b/dom/permission/Makefile.in index 79db6ee5ea7e..0a60451c18ea 100644 --- a/dom/permission/Makefile.in +++ b/dom/permission/Makefile.in @@ -10,15 +10,23 @@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk MODULE = dom -LIBRARY_NAME = jsdompermission_s +LIBRARY_NAME = jsdompermissionsettings_s -XPIDL_MODULE = dom_permission +XPIDL_MODULE = dom_permissionsettings GRE_MODULE = 1 +EXTRA_COMPONENTS = \ + PermissionSettings.js \ + PermissionSettings.manifest \ + $(NULL) + EXTRA_JS_MODULES = \ PermissionPromptHelper.jsm \ + PermissionSettings.jsm \ $(NULL) +TEST_DIRS += tests + include $(topsrcdir)/config/config.mk include $(topsrcdir)/ipc/chromium/chromium-config.mk include $(topsrcdir)/config/rules.mk diff --git a/dom/permission/PermissionSettings.js b/dom/permission/PermissionSettings.js new file mode 100644 index 000000000000..c8637b2db6e5 --- /dev/null +++ b/dom/permission/PermissionSettings.js @@ -0,0 +1,97 @@ +/* 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"; + +let DEBUG = 0; +if (DEBUG) + debug = function (s) { dump("-*- PermissionSettings: " + s + "\n"); } +else + debug = function (s) {} + +const Cc = Components.classes; +const Ci = Components.interfaces; +const Cu = Components.utils; + +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); +Cu.import("resource://gre/modules/Services.jsm"); +Cu.import("resource://gre/modules/PermissionSettings.jsm"); + +var cpm = Components.classes["@mozilla.org/childprocessmessagemanager;1"].getService(Components.interfaces.nsISyncMessageSender); + +// PermissionSettings + +const PERMISSIONSETTINGS_CONTRACTID = "@mozilla.org/permissionSettings;1"; +const PERMISSIONSETTINGS_CID = Components.ID("{36e73ef0-c6f4-11e1-9b21-0800200c9a66}"); +const nsIDOMPermissionSettings = Components.interfaces.nsIDOMPermissionSettings; + +function PermissionSettings() +{ + debug("Constructor"); +} + +var permissionManager = Components.classes["@mozilla.org/permissionmanager;1"].getService(Ci.nsIPermissionManager); +var secMan = Components.classes["@mozilla.org/scriptsecuritymanager;1"].getService(Components.interfaces.nsIScriptSecurityManager); +var appsService = Components.classes["@mozilla.org/AppsService;1"].getService(Components.interfaces.nsIAppsService); + +PermissionSettings.prototype = { + get: function get(aPermission, aAccess, aManifestURL, aOrigin, aBrowserFlag) { + debug("Get called with: " + aPermission + ", " + aAccess + ", " + aManifestURL + ", " + aOrigin + ", " + aBrowserFlag); + let uri = Services.io.newURI(aOrigin, null, null); + let appID = appsService.getAppLocalIdByManifestURL(aManifestURL); + let principal = secMan.getAppCodebasePrincipal(uri, appID, aBrowserFlag); + let result = permissionManager.testExactPermissionFromPrincipal(principal, aPermission); + + switch (result) + { + case Ci.nsIPermissionManager.UNKNOWN_ACTION: + return "unknown" + case Ci.nsIPermissionManager.ALLOW_ACTION: + return "allow"; + case Ci.nsIPermissionManager.DENY_ACTION: + return "deny"; + case Ci.nsIPermissionManager.PROMPT_ACTION: + return "prompt"; + default: + dump("Unsupported PermissionSettings Action!\n"); + return "unknown"; + } + }, + + set: function set(aPermission, aAccess, aManifestURL, aOrigin, aValue, aBrowserFlag) { + debug("Set called with: " + aPermission + ", " + aAccess + ", " + aManifestURL + ", " + aOrigin + ", " + aValue + ", " + aBrowserFlag); + let action; + cpm.sendSyncMessage("PermissionSettings:AddPermission", { + type: aPermission, + access: aAccess, + origin: aOrigin, + manifestURL: aManifestURL, + value: aValue, + browserFlag: aBrowserFlag + }); + }, + + init: function(aWindow) { + debug("init"); + // Set navigator.mozPermissionSettings to null. + if (!Services.prefs.getBoolPref("dom.mozPermissionSettings.enabled") + || Services.perms.testExactPermissionFromPrincipal(aWindow.document.nodePrincipal, "permissions")) { + debug("Permission to get/set permissions not granted!"); + return null; + } + + debug("Permission to get/set permissions granted!"); + }, + + classID : PERMISSIONSETTINGS_CID, + QueryInterface : XPCOMUtils.generateQI([nsIDOMPermissionSettings, Ci.nsIDOMGlobalPropertyInitializer]), + + classInfo : XPCOMUtils.generateCI({classID: PERMISSIONSETTINGS_CID, + contractID: PERMISSIONSETTINGS_CONTRACTID, + classDescription: "PermissionSettings", + interfaces: [nsIDOMPermissionSettings], + flags: Ci.nsIClassInfo.DOM_OBJECT}) +} + +const NSGetFactory = XPCOMUtils.generateNSGetFactory([PermissionSettings]) diff --git a/dom/permission/PermissionSettings.jsm b/dom/permission/PermissionSettings.jsm new file mode 100644 index 000000000000..e1dff9872046 --- /dev/null +++ b/dom/permission/PermissionSettings.jsm @@ -0,0 +1,85 @@ +/* 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"; + +let DEBUG = 0; +if (DEBUG) + debug = function (s) { dump("-*- PermissionSettings Module: " + s + "\n"); } +else + debug = function (s) {} + +const Cu = Components.utils; +const Cc = Components.classes; +const Ci = Components.interfaces; + +let EXPORTED_SYMBOLS = ["PermissionSettingsModule"]; + +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); +Cu.import("resource://gre/modules/Services.jsm"); + +XPCOMUtils.defineLazyServiceGetter(this, "ppmm", + "@mozilla.org/parentprocessmessagemanager;1", + "nsIMessageListenerManager"); + +var permissionManager = Cc["@mozilla.org/permissionmanager;1"].getService(Ci.nsIPermissionManager); +var secMan = Cc["@mozilla.org/scriptsecuritymanager;1"].getService(Ci.nsIScriptSecurityManager); +var appsService = Cc["@mozilla.org/AppsService;1"].getService(Ci.nsIAppsService); + +let PermissionSettingsModule = { + init: function() { + debug("Init"); + ppmm.addMessageListener("PermissionSettings:AddPermission", this); + Services.obs.addObserver(this, "profile-before-change", false); + }, + + addPermission: function(aData, aCallbacks) { + let uri = Services.io.newURI(aData.origin, null, null); + let appID = appsService.getAppLocalIdByManifestURL(aData.manifestURL); + let principal = secMan.getAppCodebasePrincipal(uri, appID, aData.browserFlag); + + let action; + switch (aData.value) + { + case "unknown": + action = Ci.nsIPermissionManager.UNKNOWN_ACTION; + break; + case "allow": + action = Ci.nsIPermissionManager.ALLOW_ACTION; + break; + case "deny": + action = Ci.nsIPermissionManager.DENY_ACTION; + break; + case "prompt": + action = Ci.nsIPermissionManager.PROMPT_ACTION; + break; + default: + dump("Unsupported PermisionSettings Action: " + aData.value +"\n"); + action = Ci.nsIPermissionManager.UNKNOWN_ACTION; + } + debug("add: " + aData.origin + " " + appID + " " + action); + permissionManager.addFromPrincipal(principal, aData.type, action); + }, + + observe: function(aSubject, aTopic, aData) { + ppmm.removeMessageListener("PermissionSettings:AddPermission", this); + Services.obs.removeObserver(this, "profile-before-change"); + ppmm = null; + }, + + receiveMessage: function(aMessage) { + debug("PermissionSettings::receiveMessage " + aMessage.name); + let mm = aMessage.target; + let msg = aMessage.data; + + let result; + switch (aMessage.name) { + case "PermissionSettings:AddPermission": + this.addPermission(msg); + break; + } + } +} + +PermissionSettingsModule.init(); diff --git a/dom/permission/PermissionSettings.manifest b/dom/permission/PermissionSettings.manifest new file mode 100644 index 000000000000..9b0bcbf93c0d --- /dev/null +++ b/dom/permission/PermissionSettings.manifest @@ -0,0 +1,3 @@ +component {36e73ef0-c6f4-11e1-9b21-0800200c9a66} PermissionSettings.js +contract @mozilla.org/permissionSettings;1 {36e73ef0-c6f4-11e1-9b21-0800200c9a66} +category JavaScript-navigator-property mozPermissionSettings @mozilla.org/permissionSettings;1 diff --git a/dom/permission/tests/Makefile.in b/dom/permission/tests/Makefile.in new file mode 100644 index 000000000000..de111dfc34a0 --- /dev/null +++ b/dom/permission/tests/Makefile.in @@ -0,0 +1,27 @@ +# 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/. + +DEPTH = ../../.. +topsrcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +relativesrcdir = dom/permission/tests + +include $(DEPTH)/config/autoconf.mk + +DIRS = \ + $(NULL) + +include $(topsrcdir)/config/rules.mk + +_TEST_FILES = \ + test_permission_basics.html \ + $(NULL) + +_CHROME_TEST_FILES = \ + $(NULL) + +libs:: $(_TEST_FILES) + $(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/tests/$(relativesrcdir) diff --git a/dom/permission/tests/test_permission_basics.html b/dom/permission/tests/test_permission_basics.html new file mode 100644 index 000000000000..c845259b1c53 --- /dev/null +++ b/dom/permission/tests/test_permission_basics.html @@ -0,0 +1,62 @@ + + + + + Test for Bug {770731} Permissions + + + + + + +Mozilla Bug {674720} +

+ +
+
+
+ + diff --git a/dom/tests/mochitest/general/test_interfaces.html b/dom/tests/mochitest/general/test_interfaces.html index 568928e908fd..06d91611a9b9 100644 --- a/dom/tests/mochitest/general/test_interfaces.html +++ b/dom/tests/mochitest/general/test_interfaces.html @@ -533,7 +533,8 @@ var interfaceNamesInGlobalScope = "MozCanvasPrintState", "TCPSocket", "MozTimeManager", - "MozNavigatorTime" + "MozNavigatorTime", + "PermissionSettings" ] for (var i in Components.interfaces) { diff --git a/layout/build/Makefile.in b/layout/build/Makefile.in index 87cd2ed3814c..1aa08e3b79a7 100644 --- a/layout/build/Makefile.in +++ b/layout/build/Makefile.in @@ -68,6 +68,7 @@ SHARED_LIBRARY_LIBS = \ $(DEPTH)/dom/file/$(LIB_PREFIX)domfile_s.$(LIB_SUFFIX) \ $(DEPTH)/dom/power/$(LIB_PREFIX)dom_power_s.$(LIB_SUFFIX) \ $(DEPTH)/dom/settings/$(LIB_PREFIX)jsdomsettings_s.$(LIB_SUFFIX) \ + $(DEPTH)/dom/permission/$(LIB_PREFIX)jsdompermissionsettings_s.$(LIB_SUFFIX) \ $(DEPTH)/dom/network/src/$(LIB_PREFIX)dom_network_s.$(LIB_SUFFIX) \ $(DEPTH)/dom/media/$(LIB_PREFIX)dom_media_s.$(LIB_SUFFIX) \ $(DEPTH)/dom/sms/src/$(LIB_PREFIX)dom_sms_s.$(LIB_SUFFIX) \ @@ -261,6 +262,7 @@ LOCAL_INCLUDES += -I$(srcdir)/../base \ -I$(topsrcdir)/dom/src/geolocation \ -I$(topsrcdir)/dom/contacts \ -I$(topsrcdir)/dom/settings \ + -I$(topsrcdir)/dom/permission \ -I$(topsrcdir)/dom/telephony \ -I. \ -I$(topsrcdir)/editor/libeditor/base \ diff --git a/modules/libpref/src/init/all.js b/modules/libpref/src/init/all.js index efb043ae4a06..df9e25b45b3b 100644 --- a/modules/libpref/src/init/all.js +++ b/modules/libpref/src/init/all.js @@ -3676,6 +3676,7 @@ pref("dom.mozAlarms.enabled", false); // WebSettings pref("dom.mozSettings.enabled", false); +pref("dom.mozPermissionSettings.enabled", false); // enable JS dump() function. pref("browser.dom.window.dump.enabled", false); diff --git a/netwerk/base/public/nsIPermissionManager.idl b/netwerk/base/public/nsIPermissionManager.idl index 8ba0f2cba292..cb5b10e272ec 100644 --- a/netwerk/base/public/nsIPermissionManager.idl +++ b/netwerk/base/public/nsIPermissionManager.idl @@ -48,6 +48,7 @@ interface nsIPermissionManager : nsISupports const uint32_t UNKNOWN_ACTION = 0; const uint32_t ALLOW_ACTION = 1; const uint32_t DENY_ACTION = 2; + const uint32_t PROMPT_ACTION = 3; /** * Predefined expiration types for permissions. Permissions can be permanent diff --git a/testing/mochitest/android.json b/testing/mochitest/android.json index 754850be1f06..93ee65a6c06c 100644 --- a/testing/mochitest/android.json +++ b/testing/mochitest/android.json @@ -156,6 +156,7 @@ "dom/contacts/tests/test_contacts_blobs.html": "", "dom/contacts/tests/test_contacts_basics.html": "", "dom/contacts/tests/test_contacts_events.html": "", + "dom/permission/tests/test_permission_basics.html": "", "dom/sms/tests/test_sms_basics.html": "", "dom/tests/mochitest/ajax/jquery/test_jQuery.html": "bug 775227", "dom/tests/mochitest/ajax/offline/test_simpleManifest.html": "TIMED_OUT",