mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-11 12:25:53 +00:00
Bug 693341 - Test arrays of iid_is params. r=khuey
This commit is contained in:
parent
14ddb21b51
commit
1eb6706bda
@ -59,6 +59,16 @@ function f_is(aIs, a, bIs, b, rvIs) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
function f_size_and_iid(aSize, aIID, a, bSize, bIID, b, rvSize, rvIID) {
|
||||
|
||||
// Copy the iids.
|
||||
rvIID.value = bIID.value;
|
||||
bIID.value = aIID;
|
||||
|
||||
// Now that we've reduced the problem to one dependent variable, use f_is.
|
||||
return f_is(aSize, a, bSize, b, rvSize);
|
||||
}
|
||||
|
||||
TestParams.prototype = {
|
||||
|
||||
/* Boilerplate */
|
||||
@ -94,6 +104,7 @@ TestParams.prototype = {
|
||||
testSizedString: f_is,
|
||||
testSizedWstring: f_is,
|
||||
testInterfaceIs: f_is,
|
||||
testInterfaceIsArray: f_size_and_iid,
|
||||
};
|
||||
|
||||
var NSGetFactory = XPCOMUtils.generateNSGetFactory([TestParams]);
|
||||
|
@ -60,7 +60,7 @@ nsXPCTestParams::~nsXPCTestParams()
|
||||
}
|
||||
|
||||
#define TAKE_OWNERSHIP_NOOP(val) {}
|
||||
#define TAKE_OWNERSHIP_INTERFACE(val) {(val)->AddRef();}
|
||||
#define TAKE_OWNERSHIP_INTERFACE(val) {static_cast<nsISupports*>(val)->AddRef();}
|
||||
#define TAKE_OWNERSHIP_STRING(val) { \
|
||||
nsDependentCString vprime(val); \
|
||||
val = ToNewCString(vprime); \
|
||||
@ -341,3 +341,30 @@ NS_IMETHODIMP nsXPCTestParams::TestInterfaceIs(const nsIID *aIID, void *a,
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* void testInterfaceIsArray (in unsigned long aLength, in nsIIDPtr aIID,
|
||||
* [array, size_is (aLength), iid_is (aIID)] in nsQIResult a,
|
||||
* inout unsigned long bLength, inout nsIIDPtr bIID,
|
||||
* [array, size_is (bLength), iid_is (bIID)] inout nsQIResult b,
|
||||
* out unsigned long rvLength, out nsIIDPtr rvIID,
|
||||
* [retval, array, size_is (rvLength), iid_is (rvIID)] out nsQIResult rv); */
|
||||
NS_IMETHODIMP nsXPCTestParams::TestInterfaceIsArray(PRUint32 aLength, const nsIID *aIID,
|
||||
void **a,
|
||||
PRUint32 *bLength NS_INOUTPARAM, nsIID **bIID NS_INOUTPARAM,
|
||||
void ***b NS_INOUTPARAM,
|
||||
PRUint32 *rvLength NS_OUTPARAM, nsIID **rvIID NS_OUTPARAM,
|
||||
void ***rv NS_OUTPARAM)
|
||||
{
|
||||
// Transfer the IIDs. See the comments in TestInterfaceIs (above) for an
|
||||
// explanation of what we're doing.
|
||||
*rvIID = static_cast<nsIID*>(NS_Alloc(sizeof(nsID)));
|
||||
if (!*rvIID)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
**rvIID = **bIID;
|
||||
**bIID = *aIID;
|
||||
|
||||
// The macro is agnostic to the actual interface types, so we can re-use code here.
|
||||
//
|
||||
// Do this second, since the macro returns.
|
||||
BUFFER_METHOD_IMPL(void*, 0, TAKE_OWNERSHIP_INTERFACE);
|
||||
}
|
||||
|
@ -104,4 +104,13 @@ interface nsIXPCTestParams : nsISupports {
|
||||
void testInterfaceIs(in nsIIDPtr aIID, [iid_is(aIID)] in nsQIResult a,
|
||||
inout nsIIDPtr bIID, [iid_is(bIID)] inout nsQIResult b,
|
||||
out nsIIDPtr rvIID, [retval, iid_is(rvIID)] out nsQIResult rv);
|
||||
|
||||
// Test arrays of iid_is. According to khuey we don't use it for anything
|
||||
// in mozilla-central, but calendar stuff depends on it.
|
||||
void testInterfaceIsArray(in unsigned long aLength, in nsIIDPtr aIID,
|
||||
[array, size_is(aLength), iid_is(aIID)] in nsQIResult a,
|
||||
inout unsigned long bLength, inout nsIIDPtr bIID,
|
||||
[array, size_is(bLength), iid_is(bIID)] inout nsQIResult b,
|
||||
out unsigned long rvLength, out nsIIDPtr rvIID,
|
||||
[retval, array, size_is(rvLength), iid_is(rvIID)] out nsQIResult rv);
|
||||
};
|
||||
|
@ -99,6 +99,26 @@ function test_component(contractid) {
|
||||
do_check_true(isComparator(val1Is, bIs.value));
|
||||
}
|
||||
|
||||
// Special-purpose function for testing arrays of iid_is interfaces, where we
|
||||
// have 2 distinct sets of dependent parameters.
|
||||
function doIs2Test(name, val1, val1Size, val1IID, val2, val2Size, val2IID) {
|
||||
var a = val1;
|
||||
var aSize = val1Size;
|
||||
var aIID = val1IID;
|
||||
var b = {value: val2};
|
||||
var bSize = {value: val2Size};
|
||||
var bIID = {value: val2IID};
|
||||
var rvSize = {};
|
||||
var rvIID = {};
|
||||
var rv = o[name].call(o, aSize, aIID, a, bSize, bIID, b, rvSize, rvIID);
|
||||
do_check_true(arrayComparator(interfaceComparator)(rv, val2));
|
||||
do_check_true(standardComparator(rvSize.value, val2Size));
|
||||
do_check_true(dotEqualsComparator(rvIID.value, val2IID));
|
||||
do_check_true(arrayComparator(interfaceComparator)(val1, b.value));
|
||||
do_check_true(standardComparator(val1Size, bSize.value));
|
||||
do_check_true(dotEqualsComparator(val1IID, bIID.value));
|
||||
}
|
||||
|
||||
// Workaround for bug 687612 (inout parameters broken for dipper types).
|
||||
// We do a simple test of copying a into b, and ignore the rv.
|
||||
function doTestWorkaround(name, val1) {
|
||||
@ -162,4 +182,8 @@ function test_component(contractid) {
|
||||
doIsTest("testInterfaceIs", makeA(), Ci['nsIXPCTestInterfaceA'],
|
||||
makeB(), Ci['nsIXPCTestInterfaceB'],
|
||||
interfaceComparator, dotEqualsComparator);
|
||||
|
||||
// Test arrays of iids.
|
||||
doIs2Test("testInterfaceIsArray", [makeA(), makeA(), makeA(), makeA(), makeA()], 5, Ci['nsIXPCTestInterfaceA'],
|
||||
[makeB(), makeB(), makeB()], 3, Ci['nsIXPCTestInterfaceB']);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user