mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-10 03:45:46 +00:00
Bug 1444991 - Part 4: Handle DOM Objects in XPConnect, r=mccr8
This patch goes through the XPConnect conversion methods, and adds cases for T_DOMOBJECT which call the Wrap, Unwrap, and Cleanup methods from the nsXPTDOMObjectInfo objects created in the last part. For consistency with normal interface pointers, and because it wasn't too complex, I also added support for including T_DOMOBJECTs in XPCOM arrays.
This commit is contained in:
parent
697573d613
commit
e5f31c03d8
@ -344,6 +344,17 @@ XPCConvert::NativeData2JS(MutableHandleValue d, const void* s,
|
||||
return NativeInterface2JSObject(d, helper, iid, true, pErr);
|
||||
}
|
||||
|
||||
case nsXPTType::T_DOMOBJECT:
|
||||
{
|
||||
void* ptr = *static_cast<void* const*>(s);
|
||||
if (!ptr) {
|
||||
d.setNull();
|
||||
return true;
|
||||
}
|
||||
|
||||
return type.GetDOMObjectInfo().Wrap(cx, ptr, d);
|
||||
}
|
||||
|
||||
default:
|
||||
NS_ERROR("bad type");
|
||||
return false;
|
||||
@ -705,6 +716,26 @@ XPCConvert::JSData2Native(void* d, HandleValue s,
|
||||
RootedObject src(cx, &s.toObject());
|
||||
return JSObject2NativeInterface((void**)d, src, iid, nullptr, pErr);
|
||||
}
|
||||
|
||||
case nsXPTType::T_DOMOBJECT:
|
||||
{
|
||||
if (s.isNullOrUndefined()) {
|
||||
*((void**)d) = nullptr;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Can't handle non-JSObjects
|
||||
if (!s.isObject()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
nsresult err = type.GetDOMObjectInfo().Unwrap(s, (void**)d);
|
||||
if (pErr) {
|
||||
*pErr = err;
|
||||
}
|
||||
return NS_SUCCEEDED(err);
|
||||
}
|
||||
|
||||
default:
|
||||
NS_ERROR("bad type");
|
||||
return false;
|
||||
@ -1261,6 +1292,7 @@ XPCConvert::NativeArray2JS(MutableHandleValue d, const void** s,
|
||||
case nsXPTType::T_WCHAR_STR : POPULATE(char16_t*); break;
|
||||
case nsXPTType::T_INTERFACE : POPULATE(nsISupports*); break;
|
||||
case nsXPTType::T_INTERFACE_IS : POPULATE(nsISupports*); break;
|
||||
case nsXPTType::T_DOMOBJECT : POPULATE(void*); break;
|
||||
case nsXPTType::T_UTF8STRING : NS_ERROR("bad type"); return false;
|
||||
case nsXPTType::T_CSTRING : NS_ERROR("bad type"); return false;
|
||||
case nsXPTType::T_ASTRING : NS_ERROR("bad type"); return false;
|
||||
@ -1525,8 +1557,8 @@ XPCConvert::JSArray2Native(void** d, HandleValue s,
|
||||
} \
|
||||
PR_END_MACRO
|
||||
|
||||
// No Action, FRee memory, RElease object
|
||||
enum CleanupMode {na, fr, re};
|
||||
// No Action, FRee memory, RElease object, CLeanup object
|
||||
enum CleanupMode {na, fr, re, cl};
|
||||
|
||||
CleanupMode cleanupMode;
|
||||
|
||||
@ -1558,6 +1590,7 @@ XPCConvert::JSArray2Native(void** d, HandleValue s,
|
||||
case nsXPTType::T_WCHAR_STR : POPULATE(fr, char16_t*); break;
|
||||
case nsXPTType::T_INTERFACE : POPULATE(re, nsISupports*); break;
|
||||
case nsXPTType::T_INTERFACE_IS : POPULATE(re, nsISupports*); break;
|
||||
case nsXPTType::T_DOMOBJECT : POPULATE(cl, void*); break;
|
||||
case nsXPTType::T_UTF8STRING : NS_ERROR("bad type"); goto failure;
|
||||
case nsXPTType::T_CSTRING : NS_ERROR("bad type"); goto failure;
|
||||
case nsXPTType::T_ASTRING : NS_ERROR("bad type"); goto failure;
|
||||
@ -1584,6 +1617,12 @@ failure:
|
||||
void* p = a[i];
|
||||
if (p) free(p);
|
||||
}
|
||||
} else if (cleanupMode == cl) {
|
||||
void** a = (void**) array;
|
||||
for (uint32_t i = 0; i < initedCount; i++) {
|
||||
void* p = a[i];
|
||||
if (p) type.GetDOMObjectInfo().Cleanup(p);
|
||||
}
|
||||
}
|
||||
free(array);
|
||||
}
|
||||
|
@ -1895,6 +1895,9 @@ CallMethodHelper::CleanupParam(nsXPTCMiniVariant& param, nsXPTType& type)
|
||||
case nsXPTType::T_INTERFACE_IS:
|
||||
((nsISupports*)param.val.p)->Release();
|
||||
break;
|
||||
case nsXPTType::T_DOMOBJECT:
|
||||
type.GetDOMObjectInfo().Cleanup(param.val.p);
|
||||
break;
|
||||
case nsXPTType::T_ASTRING:
|
||||
case nsXPTType::T_DOMSTRING:
|
||||
mCallContext.GetContext()->mScratchStrings.Destroy((nsString*)param.val.p);
|
||||
|
@ -128,6 +128,7 @@ struct nsXPTCVariant : public nsXPTCMiniVariant
|
||||
case nsXPTType::T_WCHAR_STR: /* fall through */
|
||||
case nsXPTType::T_INTERFACE: /* fall through */
|
||||
case nsXPTType::T_INTERFACE_IS: /* fall through */
|
||||
case nsXPTType::T_DOMOBJECT: /* fall through */
|
||||
case nsXPTType::T_ARRAY: /* fall through */
|
||||
case nsXPTType::T_PSTRING_SIZE_IS: /* fall through */
|
||||
case nsXPTType::T_PWSTRING_SIZE_IS: /* fall through */
|
||||
|
Loading…
Reference in New Issue
Block a user