Bug 1255800 - Remove JS_THIS_OBJECT from dom/xpconnect. r=bz

--HG--
extra : rebase_source : dcaa891010e25e10079db853fe4eb1a7fe261e47
This commit is contained in:
Tom Schuster 2018-03-07 14:35:22 +01:00
Родитель d55955aaf6
Коммит 2bf6212869
8 изменённых файлов: 79 добавлений и 61 удалений

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

@ -1216,13 +1216,14 @@ bool
QueryInterface(JSContext* cx, unsigned argc, JS::Value* vp)
{
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
JS::Rooted<JS::Value> thisv(cx, JS_THIS(cx, vp));
if (thisv.isNull())
if (!args.thisv().isObject()) {
JS_ReportErrorASCII(cx, "QueryInterface called on incompatible non-object");
return false;
}
// Get the object. It might be a security wrapper, in which case we do a checked
// unwrap.
JS::Rooted<JSObject*> origObj(cx, &thisv.toObject());
JS::Rooted<JSObject*> origObj(cx, &args.thisv().toObject());
JS::Rooted<JSObject*> obj(cx, js::CheckedUnwrap(origObj,
/* stopAtWindowProxy = */ false));
if (!obj) {
@ -1269,7 +1270,7 @@ QueryInterface(JSContext* cx, unsigned argc, JS::Value* vp)
return Throw(cx, rv);
}
*vp = thisv;
args.rval().set(args.thisv());
return true;
}

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

@ -1600,10 +1600,11 @@ static bool
CallNPMethod(JSContext *cx, unsigned argc, JS::Value *vp)
{
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
JS::Rooted<JSObject*> obj(cx, JS_THIS_OBJECT(cx, vp));
if (!obj)
return false;
if (!args.thisv().isObject()) {
ThrowJSExceptionASCII(cx, "plug-in method called on incompatible non-object");
return false;
}
JS::Rooted<JSObject*> obj(cx, &args.thisv().toObject());
return CallNPMethodInternal(cx, obj, args.length(), args.array(), vp, false);
}

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

@ -132,11 +132,8 @@ Load(JSContext *cx,
{
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
JS::Rooted<JSObject*> obj(cx, JS_THIS_OBJECT(cx, vp));
if (!obj)
return false;
if (!JS_IsGlobalObject(obj)) {
JS::RootedValue thisv(cx, args.computeThis(cx));
if (!thisv.isObject() || !JS_IsGlobalObject(&thisv.toObject())) {
JS_ReportErrorASCII(cx, "Trying to load() into a non-global object");
return false;
}

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

@ -288,15 +288,17 @@ FunctionForwarder(JSContext* cx, unsigned argc, Value* vp)
RootedValue v(cx, js::GetFunctionNativeReserved(&args.callee(), 0));
RootedObject unwrappedFun(cx, js::UncheckedUnwrap(&v.toObject()));
RootedObject thisObj(cx, args.isConstructing() ? nullptr : JS_THIS_OBJECT(cx, vp));
RootedValue thisVal(cx, NullValue());
if (!args.isConstructing()) {
thisVal.set(args.computeThis(cx));
}
{
// We manually implement the contents of CrossCompartmentWrapper::call
// here, because certain function wrappers (notably content->nsEP) are
// not callable.
JSAutoCompartment ac(cx, unwrappedFun);
RootedValue thisVal(cx, ObjectOrNullValue(thisObj));
if (!CheckSameOriginArg(cx, options, thisVal) || !JS_WrapObject(cx, &thisObj))
if (!CheckSameOriginArg(cx, options, thisVal) || !JS_WrapValue(cx, &thisVal))
return false;
for (size_t n = 0; n < args.length(); ++n) {
@ -311,7 +313,7 @@ FunctionForwarder(JSContext* cx, unsigned argc, Value* vp)
return false;
args.rval().setObject(*obj);
} else {
if (!JS_CallFunctionValue(cx, thisObj, fval, args, args.rval()))
if (!JS::Call(cx, thisVal, fval, args, args.rval()))
return false;
}
}

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

@ -215,11 +215,13 @@ SandboxImport(JSContext* cx, unsigned argc, Value* vp)
// We need to resolve the this object, because this function is used
// unbound and should still work and act on the original sandbox.
RootedObject thisObject(cx, JS_THIS_OBJECT(cx, vp));
if (!thisObject) {
RootedValue thisv(cx, args.computeThis(cx));
if (!thisv.isObject()) {
XPCThrower::Throw(NS_ERROR_UNEXPECTED, cx);
return false;
}
RootedObject thisObject(cx, &thisv.toObject());
if (!JS_SetPropertyById(cx, thisObject, id, args[0]))
return false;

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

@ -337,11 +337,8 @@ Load(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
JS::Rooted<JSObject*> obj(cx, JS_THIS_OBJECT(cx, vp));
if (!obj)
return false;
if (!JS_IsGlobalObject(obj)) {
RootedValue thisv(cx, args.computeThis(cx));
if (!thisv.isObject() || !JS_IsGlobalObject(&thisv.toObject())) {
JS_ReportErrorASCII(cx, "Trying to load() into a non-global object");
return false;
}

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

@ -69,9 +69,13 @@ static bool
XPC_WN_Shared_ToString(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
RootedObject obj(cx, JS_THIS_OBJECT(cx, vp));
if (!obj)
RootedValue thisv(cx, args.computeThis(cx));
if (!thisv.isObject()) {
JS_ReportErrorASCII(cx, "Called on incompatible |this|");
return false;
}
RootedObject obj(cx, &thisv.toObject());
XPCCallContext ccx(cx, obj);
if (!ccx.IsValid())
@ -176,9 +180,11 @@ XPC_WN_DoubleWrappedGetter(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
RootedObject obj(cx, JS_THIS_OBJECT(cx, vp));
if (!obj)
if (!args.thisv().isObject()) {
JS_ReportErrorASCII(cx, "xpconnect double wrapped getter called on incompatible non-object");
return false;
}
RootedObject obj(cx, &args.thisv().toObject());
XPCCallContext ccx(cx, obj);
XPCWrappedNative* wrapper = ccx.GetWrapper();
@ -894,9 +900,12 @@ XPC_WN_CallMethod(JSContext* cx, unsigned argc, Value* vp)
MOZ_ASSERT(JS_TypeOfValue(cx, args.calleev()) == JSTYPE_FUNCTION, "bad function");
RootedObject funobj(cx, &args.callee());
RootedObject obj(cx, JS_THIS_OBJECT(cx, vp));
if (!obj)
RootedValue thisv(cx, args.computeThis(cx));
if (!thisv.isObject()) {
JS_ReportErrorASCII(cx, "Called on incompatible |this|");
return false;
}
RootedObject obj(cx, &thisv.toObject());
obj = FixUpThisIfBroken(obj, funobj);
XPCCallContext ccx(cx, obj, funobj, JSID_VOIDHANDLE, args.length(),
@ -920,9 +929,11 @@ XPC_WN_GetterSetter(JSContext* cx, unsigned argc, Value* vp)
MOZ_ASSERT(JS_TypeOfValue(cx, args.calleev()) == JSTYPE_FUNCTION, "bad function");
RootedObject funobj(cx, &args.callee());
RootedObject obj(cx, JS_THIS_OBJECT(cx, vp));
if (!obj)
if (!args.thisv().isObject()) {
JS_ReportErrorASCII(cx, "xpconnect getter/setter called on incompatible non-object");
return false;
}
RootedObject obj(cx, &args.thisv().toObject());
obj = FixUpThisIfBroken(obj, funobj);
XPCCallContext ccx(cx, obj, funobj, JSID_VOIDHANDLE, args.length(),

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

@ -1193,21 +1193,22 @@ internal_JSHistogram_CoerceValue(JSContext* aCx, JS::Handle<JS::Value> aElement,
bool
internal_JSHistogram_Add(JSContext *cx, unsigned argc, JS::Value *vp)
{
JSObject *obj = JS_THIS_OBJECT(cx, vp);
MOZ_ASSERT(obj);
if (!obj ||
JS_GetClass(obj) != &sJSHistogramClass) {
JS::CallArgs args = CallArgsFromVp(argc, vp);
if (!args.thisv().isObject() ||
JS_GetClass(&args.thisv().toObject()) != &sJSHistogramClass) {
JS_ReportErrorASCII(cx, "Wrong JS class, expected JSHistogram class");
return false;
}
JSObject* obj = &args.thisv().toObject();
JSHistogramData* data = static_cast<JSHistogramData*>(JS_GetPrivate(obj));
MOZ_ASSERT(data);
HistogramID id = data->histogramId;
MOZ_ASSERT(internal_IsHistogramEnumId(id));
uint32_t type = gHistogramInfos[id].histogramType;
JS::CallArgs args = CallArgsFromVp(argc, vp);
// This function should always return |undefined| and never fail but
// rather report failures using the console.
args.rval().setUndefined();
@ -1291,13 +1292,14 @@ bool
internal_JSHistogram_Snapshot(JSContext *cx, unsigned argc, JS::Value *vp)
{
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
JSObject *obj = JS_THIS_OBJECT(cx, vp);
if (!obj ||
JS_GetClass(obj) != &sJSHistogramClass) {
if (!args.thisv().isObject() ||
JS_GetClass(&args.thisv().toObject()) != &sJSHistogramClass) {
JS_ReportErrorASCII(cx, "Wrong JS class, expected JSHistogram class");
return false;
}
JSObject* obj = &args.thisv().toObject();
JSHistogramData* data = static_cast<JSHistogramData*>(JS_GetPrivate(obj));
MOZ_ASSERT(data);
HistogramID id = data->histogramId;
@ -1341,18 +1343,19 @@ internal_JSHistogram_Snapshot(JSContext *cx, unsigned argc, JS::Value *vp)
bool
internal_JSHistogram_Clear(JSContext *cx, unsigned argc, JS::Value *vp)
{
JSObject *obj = JS_THIS_OBJECT(cx, vp);
if (!obj ||
JS_GetClass(obj) != &sJSHistogramClass) {
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
if (!args.thisv().isObject() ||
JS_GetClass(&args.thisv().toObject()) != &sJSHistogramClass) {
JS_ReportErrorASCII(cx, "Wrong JS class, expected JSHistogram class");
return false;
}
JSObject* obj = &args.thisv().toObject();
JSHistogramData* data = static_cast<JSHistogramData*>(JS_GetPrivate(obj));
MOZ_ASSERT(data);
bool onlySubsession = false;
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
// This function should always return |undefined| and never fail but
// rather report failures using the console.
args.rval().setUndefined();
@ -1467,19 +1470,20 @@ internal_KeyedHistogram_SnapshotImpl(JSContext *cx, unsigned argc,
JS::Value *vp,
bool subsession, bool clearSubsession)
{
JSObject *obj = JS_THIS_OBJECT(cx, vp);
if (!obj ||
JS_GetClass(obj) != &sJSKeyedHistogramClass) {
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
if (!args.thisv().isObject() ||
JS_GetClass(&args.thisv().toObject()) != &sJSKeyedHistogramClass) {
JS_ReportErrorASCII(cx, "Wrong JS class, expected JSKeyedHistogram class");
return false;
}
JSObject *obj = &args.thisv().toObject();
JSHistogramData* data = static_cast<JSHistogramData*>(JS_GetPrivate(obj));
MOZ_ASSERT(data);
HistogramID id = data->histogramId;
MOZ_ASSERT(internal_IsHistogramEnumId(id));
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
// This function should always return |undefined| and never fail but
// rather report failures using the console.
args.rval().setUndefined();
@ -1544,19 +1548,20 @@ internal_KeyedHistogram_SnapshotImpl(JSContext *cx, unsigned argc,
bool
internal_JSKeyedHistogram_Add(JSContext *cx, unsigned argc, JS::Value *vp)
{
JSObject *obj = JS_THIS_OBJECT(cx, vp);
if (!obj ||
JS_GetClass(obj) != &sJSKeyedHistogramClass) {
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
if (!args.thisv().isObject() ||
JS_GetClass(&args.thisv().toObject()) != &sJSKeyedHistogramClass) {
JS_ReportErrorASCII(cx, "Wrong JS class, expected JSKeyedHistogram class");
return false;
}
JSObject *obj = &args.thisv().toObject();
JSHistogramData* data = static_cast<JSHistogramData*>(JS_GetPrivate(obj));
MOZ_ASSERT(data);
HistogramID id = data->histogramId;
MOZ_ASSERT(internal_IsHistogramEnumId(id));
JS::CallArgs args = CallArgsFromVp(argc, vp);
// This function should always return |undefined| and never fail but
// rather report failures using the console.
args.rval().setUndefined();
@ -1625,13 +1630,15 @@ internal_JSKeyedHistogram_Add(JSContext *cx, unsigned argc, JS::Value *vp)
bool
internal_JSKeyedHistogram_Keys(JSContext *cx, unsigned argc, JS::Value *vp)
{
JSObject *obj = JS_THIS_OBJECT(cx, vp);
if (!obj ||
JS_GetClass(obj) != &sJSKeyedHistogramClass) {
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
if (!args.thisv().isObject() ||
JS_GetClass(&args.thisv().toObject()) != &sJSKeyedHistogramClass) {
JS_ReportErrorASCII(cx, "Wrong JS class, expected JSKeyedHistogram class");
return false;
}
JSObject *obj = &args.thisv().toObject();
JSHistogramData* data = static_cast<JSHistogramData*>(JS_GetPrivate(obj));
MOZ_ASSERT(data);
HistogramID id = data->histogramId;
@ -1652,7 +1659,6 @@ internal_JSKeyedHistogram_Keys(JSContext *cx, unsigned argc, JS::Value *vp)
return false;
}
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
return NS_SUCCEEDED(keyed->GetJSKeys(cx, args));
}
@ -1689,18 +1695,19 @@ internal_JSKeyedHistogram_SnapshotSubsessionAndClear(JSContext *cx,
bool
internal_JSKeyedHistogram_Clear(JSContext *cx, unsigned argc, JS::Value *vp)
{
JSObject *obj = JS_THIS_OBJECT(cx, vp);
if (!obj ||
JS_GetClass(obj) != &sJSKeyedHistogramClass) {
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
if (!args.thisv().isObject() ||
JS_GetClass(&args.thisv().toObject()) != &sJSKeyedHistogramClass) {
JS_ReportErrorASCII(cx, "Wrong JS class, expected JSKeyedHistogram class");
return false;
}
JSObject *obj = &args.thisv().toObject();
JSHistogramData* data = static_cast<JSHistogramData*>(JS_GetPrivate(obj));
MOZ_ASSERT(data);
HistogramID id = data->histogramId;
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
// This function should always return |undefined| and never fail but
// rather report failures using the console.
args.rval().setUndefined();