Bug 958642 - MozActivity must fire an error when the selected app is killed, r=fabrice

This commit is contained in:
Andrea Marchesini 2014-02-06 19:55:20 +00:00
parent 128e57f09a
commit 1af48da482
2 changed files with 33 additions and 3 deletions

View File

@ -151,13 +151,18 @@ let Activities = {
// ActivityProxy.js
"Activity:Start",
// ActivityWrapper.js
"Activity:Ready",
// ActivityRequestHandler.js
"Activity:PostResult",
"Activity:PostError",
"Activities:Register",
"Activities:Unregister",
"Activities:GetContentTypes"
"Activities:GetContentTypes",
"child-process-shutdown"
],
init: function activities_init() {
@ -226,6 +231,7 @@ let Activities = {
.getService(Ci.nsISystemMessagesInternal);
if (!sysmm) {
// System message is not present, what should we do?
delete Activities.callers[aMsg.id];
return;
}
@ -280,7 +286,8 @@ let Activities = {
let obsData;
if (aMessage.name == "Activity:PostResult" ||
aMessage.name == "Activity:PostError") {
aMessage.name == "Activity:PostError" ||
aMessage.name == "Activity:Ready") {
caller = this.callers[msg.id];
if (!caller) {
debug("!! caller is null for msg.id=" + msg.id);
@ -293,12 +300,16 @@ let Activities = {
switch(aMessage.name) {
case "Activity:Start":
this.callers[msg.id] = { mm: aMessage.target,
this.callers[msg.id] = { mm: mm,
manifestURL: msg.manifestURL,
pageURL: msg.pageURL };
this.startActivity(msg);
break;
case "Activity:Ready":
caller.childMM = mm;
break;
case "Activity:PostResult":
caller.mm.sendAsyncMessage("Activity:FireSuccess", msg);
delete this.callers[msg.id];
@ -341,6 +352,18 @@ let Activities = {
case "Activities:GetContentTypes":
this.sendContentTypes(mm);
break;
case "child-process-shutdown":
for (let id in this.callers) {
if (this.callers[id].childMM == mm) {
this.callers[id].mm.sendAsyncMessage("Activity:FireError", {
"id": id,
"error": "USER_ABORT"
});
delete this.callers[id];
break;
}
}
break;
}
},

View File

@ -30,6 +30,13 @@ function ActivityWrapper() {
ActivityWrapper.prototype = {
wrapMessage: function wrapMessage(aMessage, aWindow) {
debug("Wrapping " + JSON.stringify(aMessage));
// This message is useful to communicate that the activity message has been
// properly received by the app. If the app will be killed, the
// ActivitiesService will be able to fire an error and complete the
// Activity workflow.
cpmm.sendAsyncMessage("Activity:Ready", { id: aMessage.id });
let handler = Cc["@mozilla.org/dom/activities/request-handler;1"]
.createInstance(Ci.nsIDOMMozActivityRequestHandler);
handler.wrappedJSObject._id = aMessage.id;