Bug 1017420 - Add support for certified apps to get the list of apps matching an activity request r=sicking

This commit is contained in:
Fabrice Desré 2014-05-29 17:24:49 -07:00
parent d02f773020
commit e090f17324
3 changed files with 61 additions and 10 deletions

View File

@ -11,6 +11,10 @@ const Ci = Components.interfaces;
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/IndexedDBHelper.jsm");
Cu.import("resource://gre/modules/AppsUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "DOMApplicationRegistry",
"resource://gre/modules/Webapps.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "ActivitiesServiceFilter",
"resource://gre/modules/ActivitiesServiceFilter.jsm");
@ -276,9 +280,43 @@ let Activities = {
}
};
let glue = Cc["@mozilla.org/dom/activities/ui-glue;1"]
.createInstance(Ci.nsIActivityUIGlue);
glue.chooseActivity(aMsg.options, aResults.options, getActivityChoice);
let caller = Activities.callers[aMsg.id];
if (aMsg.getFilterResults === true &&
caller.mm.assertAppHasStatus(Ci.nsIPrincipal.APP_STATUS_CERTIFIED)) {
// Certified apps can ask to just get the picker data.
// We want to return the manifest url, icon url and app name.
// The app name needs to be picked up from the localized manifest.
let reg = DOMApplicationRegistry;
let ids = aResults.options.map((aItem) => {
return { id: reg._appIdForManifestURL(aItem.manifest) }
});
reg._readManifests(ids).then((aManifests) => {
let results = [];
aManifests.forEach((aManifest, i) => {
let manifestURL = aResults.options[i].manifest;
let helper = new ManifestHelper(aManifest.manifest, manifestURL);
results.push({
manifestURL: manifestURL,
iconURL: aResults.options[i].icon,
appName: helper.name
});
});
// Now fire success with the array of choices.
caller.mm.sendAsyncMessage("Activity:FireSuccess",
{
"id": aMsg.id,
"result": results
});
delete Activities.callers[aMsg.id];
});
} else {
let glue = Cc["@mozilla.org/dom/activities/ui-glue;1"]
.createInstance(Ci.nsIActivityUIGlue);
glue.chooseActivity(aMsg.options, aResults.options, getActivityChoice);
}
};
let errorCb = function errorCb(aError) {

View File

@ -52,16 +52,28 @@ ActivityProxy.prototype = {
appId != Ci.nsIScriptSecurityManager.UNKNOWN_APP_ID)
? DOMApplicationRegistry.getManifestURLByLocalId(appId)
: null;
cpmm.sendAsyncMessage("Activity:Start", { id: this.id,
options: {
name: aOptions.name,
data: aOptions.data
},
manifestURL: manifestURL,
pageURL: aWindow.document.location.href });
// Only let certified apps enumerate providers for this filter.
if (aOptions.getFilterResults === true &&
principal.appStatus != Ci.nsIPrincipal.APP_STATUS_CERTIFIED) {
Services.DOMRequest.fireError(this.activity, "SecurityError");
Services.obs.notifyObservers(null, "Activity:Error", null);
return;
}
cpmm.addMessageListener("Activity:FireSuccess", this);
cpmm.addMessageListener("Activity:FireError", this);
cpmm.sendAsyncMessage("Activity:Start",
{
id: this.id,
options: {
name: aOptions.name,
data: aOptions.data
},
getFilterResults: aOptions.getFilterResults,
manifestURL: manifestURL,
pageURL: aWindow.document.location.href });
},
receiveMessage: function actProxy_receiveMessage(aMessage) {

View File

@ -7,6 +7,7 @@
dictionary ActivityOptions {
DOMString name = "";
any data = null;
boolean getFilterResults = false;
};
[Pref="dom.sysmsg.enabled",