Source code

Revision control

Copy as Markdown

Other Tools

/* 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/. */
function xpcWrap(obj, iface) {
let ifacePointer = Cc[
"@mozilla.org/supports-interface-pointer;1"
].createInstance(Ci.nsISupportsInterfacePointer);
ifacePointer.data = obj;
return ifacePointer.data.QueryInterface(iface);
}
export var ReturnCodeChild = {
QueryInterface: ChromeUtils.generateQI(["nsIXPCTestReturnCodeChild"]),
doIt(behaviour) {
switch (behaviour) {
case Ci.nsIXPCTestReturnCodeChild.CHILD_SHOULD_THROW:
throw(new Error("a requested error"));
case Ci.nsIXPCTestReturnCodeChild.CHILD_SHOULD_RETURN_SUCCESS:
return;
case Ci.nsIXPCTestReturnCodeChild.CHILD_SHOULD_RETURN_RESULTCODE:
Components.returnCode = Cr.NS_ERROR_FAILURE;
return;
case Ci.nsIXPCTestReturnCodeChild.CHILD_SHOULD_NEST_RESULTCODES:
// Use xpconnect to create another instance of *this* component and
// call that. This way we have crossed the xpconnect bridge twice.
// We set *our* return code early - this should be what is returned
// to our caller, even though our "inner" component will set it to
// a different value that we will see (but our caller should not)
Components.returnCode = Cr.NS_ERROR_UNEXPECTED;
// call the child asking it to do the .returnCode set.
let sub = xpcWrap(ReturnCodeChild, Ci.nsIXPCTestReturnCodeChild);
let childResult = Cr.NS_OK;
try {
sub.doIt(Ci.nsIXPCTestReturnCodeChild.CHILD_SHOULD_RETURN_RESULTCODE);
} catch (ex) {
childResult = ex.result;
}
// write it to the console so the test can check it.
let consoleService = Cc["@mozilla.org/consoleservice;1"]
.getService(Ci.nsIConsoleService);
consoleService.logStringMessage("nested child returned " + childResult);
return;
}
}
};