Mypal/devtools/server/tests/unit/test_protocol_formtype.js
2019-03-11 13:26:37 +03:00

178 lines
3.7 KiB
JavaScript

var protocol = require("devtools/shared/protocol");
var {Arg, Option, RetVal} = protocol;
protocol.types.addActorType("child");
protocol.types.addActorType("root");
const childSpec = protocol.generateActorSpec({
typeName: "child",
methods: {
getChild: {
response: RetVal("child")
}
}
});
// The child actor doesn't provide a form description
var ChildActor = protocol.ActorClassWithSpec(childSpec, {
initialize(conn) {
protocol.Actor.prototype.initialize.call(this, conn);
},
form(detail) {
return {
actor: this.actorID,
extra: "extra"
};
},
getChild: function () {
return this;
}
});
var ChildFront = protocol.FrontClassWithSpec(childSpec, {
initialize(client) {
protocol.Front.prototype.initialize.call(this, client);
},
form(v, ctx, detail) {
this.extra = v.extra;
}
});
const rootSpec = protocol.generateActorSpec({
typeName: "root",
// Basic form type, relies on implicit DictType creation
formType: {
childActor: "child"
},
// This detail uses explicit DictType creation
"formType#detail1": protocol.types.addDictType("RootActorFormTypeDetail1", {
detailItem: "child"
}),
// This detail a string type.
"formType#actorid": "string",
methods: {
getDefault: {
response: RetVal("root")
},
getDetail1: {
response: RetVal("root#detail1")
},
getDetail2: {
response: {
item: RetVal("root#actorid")
}
},
getUnknownDetail: {
response: RetVal("root#unknownDetail")
}
}
});
// The root actor does provide a form description.
var RootActor = protocol.ActorClassWithSpec(rootSpec, {
initialize(conn) {
protocol.Actor.prototype.initialize.call(this, conn);
this.manage(this);
this.child = new ChildActor();
},
sayHello() {
return {
from: "root",
applicationType: "xpcshell-tests",
traits: []
};
},
form(detail) {
if (detail === "detail1") {
return {
actor: this.actorID,
detailItem: this.child
};
} else if (detail === "actorid") {
return this.actorID;
}
return {
actor: this.actorID,
childActor: this.child
};
},
getDefault: function () {
return this;
},
getDetail1: function () {
return this;
},
getDetail2: function () {
return this;
},
getUnknownDetail: function () {
return this;
}
});
var RootFront = protocol.FrontClassWithSpec(rootSpec, {
initialize(client) {
this.actorID = "root";
protocol.Front.prototype.initialize.call(this, client);
// Root owns itself.
this.manage(this);
},
form(v, ctx, detail) {
this.lastForm = v;
}
});
const run_test = Test(function* () {
DebuggerServer.createRootActor = (conn => {
return RootActor(conn);
});
DebuggerServer.init();
const connection = DebuggerServer.connectPipe();
const conn = new DebuggerClient(connection);
const client = Async(conn);
yield client.connect();
let rootFront = RootFront(conn);
// Trigger some methods that return forms.
let retval = yield rootFront.getDefault();
do_check_true(retval instanceof RootFront);
do_check_true(rootFront.lastForm.childActor instanceof ChildFront);
retval = yield rootFront.getDetail1();
do_check_true(retval instanceof RootFront);
do_check_true(rootFront.lastForm.detailItem instanceof ChildFront);
retval = yield rootFront.getDetail2();
do_check_true(retval instanceof RootFront);
do_check_true(typeof (rootFront.lastForm) === "string");
// getUnknownDetail should fail, since no typeName is specified.
try {
yield rootFront.getUnknownDetail();
do_check_true(false);
} catch (ex) {
}
yield client.close();
});