зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1255800 - Remove JS_THIS_OBJECT from dom/xpconnect. r=bz
--HG-- extra : rebase_source : dcaa891010e25e10079db853fe4eb1a7fe261e47
This commit is contained in:
Родитель
d55955aaf6
Коммит
2bf6212869
|
@ -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();
|
||||
|
|
Загрузка…
Ссылка в новой задаче