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:
Nika Layzell 2018-04-06 18:30:09 -04:00
Родитель 697573d613
Коммит e5f31c03d8
3 изменённых файлов: 45 добавлений и 2 удалений

Просмотреть файл

@ -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 */