Bug 865410 - Use CallArgs for nsIJSNativeInitializer::Initialize. r=bz

This commit is contained in:
Tom Schuster 2013-05-04 19:25:15 +02:00
parent cbcd967826
commit b497643dd7
9 changed files with 48 additions and 62 deletions

View File

@ -170,13 +170,12 @@ NS_IMETHODIMP
nsDOMMultipartFile::Initialize(nsISupports* aOwner,
JSContext* aCx,
JSObject* aObj,
uint32_t aArgc,
JS::Value* aArgv)
const JS::CallArgs& aArgs)
{
if (!mIsFile) {
return InitBlob(aCx, aArgc, aArgv, GetXPConnectNative);
return InitBlob(aCx, aArgs.length(), aArgs.array(), GetXPConnectNative);
}
return InitFile(aCx, aArgc, aArgv);
return InitFile(aCx, aArgs.length(), aArgs.array());
}
nsresult

View File

@ -51,8 +51,7 @@ public:
NS_IMETHOD Initialize(nsISupports* aOwner,
JSContext* aCx,
JSObject* aObj,
uint32_t aArgc,
JS::Value* aArgv);
const JS::CallArgs& aArgs);
typedef nsIDOMBlob* (*UnwrapFuncPtr)(JSContext*, JSObject*);
nsresult InitBlob(JSContext* aCx,

View File

@ -314,9 +314,9 @@ nsDOMEvent::SetTrusted(bool aTrusted)
NS_IMETHODIMP
nsDOMEvent::Initialize(nsISupports* aOwner, JSContext* aCx, JSObject* aObj,
uint32_t aArgc, JS::Value* aArgv)
const JS::CallArgs& aArgs)
{
NS_ENSURE_TRUE(aArgc >= 1, NS_ERROR_XPC_NOT_ENOUGH_ARGS);
NS_ENSURE_TRUE(aArgs.length() >= 1, NS_ERROR_XPC_NOT_ENOUGH_ARGS);
bool trusted = false;
nsCOMPtr<nsPIDOMWindow> w = do_QueryInterface(aOwner);
@ -336,7 +336,7 @@ nsDOMEvent::Initialize(nsISupports* aOwner, JSContext* aCx, JSObject* aObj,
}
JSAutoRequest ar(aCx);
JSString* jsstr = JS_ValueToString(aCx, aArgv[0]);
JSString* jsstr = JS_ValueToString(aCx, aArgs[0]);
if (!jsstr) {
return NS_ERROR_DOM_SYNTAX_ERR;
}
@ -346,7 +346,7 @@ nsDOMEvent::Initialize(nsISupports* aOwner, JSContext* aCx, JSObject* aObj,
nsDependentJSString type;
NS_ENSURE_STATE(type.init(aCx, jsstr));
nsresult rv = InitFromCtor(type, aCx, aArgc >= 2 ? &(aArgv[1]) : nullptr);
nsresult rv = InitFromCtor(type, aCx, aArgs.length() >= 2 ? &(aArgs[1]) : nullptr);
NS_ENSURE_SUCCESS(rv, rv);
SetTrusted(trusted);

View File

@ -95,7 +95,7 @@ public:
// nsIJSNativeInitializer
NS_IMETHOD Initialize(nsISupports* aOwner, JSContext* aCx, JSObject* aObj,
uint32_t aArgc, JS::Value* aArgv);
const JS::CallArgs& aArgs);
virtual nsresult InitFromCtor(const nsAString& aType,
JSContext* aCx, JS::Value* aVal);

View File

@ -1247,8 +1247,7 @@ txMozillaXSLTProcessor::ContentRemoved(nsIDocument* aDocument,
NS_IMETHODIMP
txMozillaXSLTProcessor::Initialize(nsISupports* aOwner, JSContext* cx,
JSObject* obj, uint32_t argc,
JS::Value* argv)
JSObject* obj, const JS::CallArgs& args)
{
nsCOMPtr<nsIPrincipal> prin;
nsIScriptSecurityManager* secMan = nsContentUtils::GetSecurityManager();

View File

@ -27,7 +27,7 @@ class txIGlobalParameter;
/* bacd8ad0-552f-11d3-a9f7-000064657374 */
#define TRANSFORMIIX_XSLT_PROCESSOR_CID \
{ 0xbacd8ad0, 0x552f, 0x11d3, {0xa9, 0xf7, 0x00, 0x00, 0x64, 0x65, 0x73, 0x74} }
{ 0x618ee71d, 0xd7a7, 0x41a1, {0xa3, 0xfb, 0xc2, 0xbe, 0xdc, 0x6a, 0x21, 0x7e} }
#define TRANSFORMIIX_XSLT_PROCESSOR_CONTRACTID \
"@mozilla.org/document-transformer;1?type=xslt"
@ -106,7 +106,7 @@ public:
// nsIJSNativeInitializer
NS_IMETHODIMP Initialize(nsISupports* aOwner, JSContext *cx, JSObject *obj,
uint32_t argc, JS::Value *argv);
const JS::CallArgs& aArgs);
static nsresult Startup();
static void Shutdown();

View File

@ -3386,9 +3386,8 @@ FindConstructorFunc(const nsDOMClassInfoData *aDOMClassInfoData)
static nsresult
BaseStubConstructor(nsIWeakReference* aWeakOwner,
const nsGlobalNameStruct *name_struct, JSContext *cx,
JSObject *aObj, unsigned argc, jsval *argv, jsval *rval)
JS::Handle<JSObject*> obj, const JS::CallArgs &args)
{
JS::Rooted<JSObject*> obj(cx, aObj);
MOZ_ASSERT(obj);
nsresult rv;
@ -3430,16 +3429,16 @@ BaseStubConstructor(nsIWeakReference* aWeakOwner,
}
if (initializer) {
rv = initializer->Initialize(currentInner, cx, obj, argc, argv);
rv = initializer->Initialize(currentInner, cx, obj, args);
if (NS_FAILED(rv)) {
return rv;
}
} else {
nsCOMPtr<nsIXPConnectWrappedJS> wrappedJS = do_QueryInterface(native);
JS::Rooted<JSObject*> object(cx);
wrappedJS->GetJSObject(object.address());
if (!object) {
JS::Rooted<JSObject*> thisObject(cx);
wrappedJS->GetJSObject(thisObject.address());
if (!thisObject) {
return NS_ERROR_UNEXPECTED;
}
@ -3447,44 +3446,40 @@ BaseStubConstructor(nsIWeakReference* aWeakOwner,
pusher.Push(cx);
JSAutoRequest ar(cx);
JSAutoCompartment ac(cx, object);
JSAutoCompartment ac(cx, thisObject);
JS::Rooted<JS::Value> thisValue(cx, JS::UndefinedValue());
JS::Rooted<JS::Value> funval(cx);
if (!JS_GetProperty(cx, object, "constructor", funval.address()) || !funval.isObject()) {
if (!JS_GetProperty(cx, thisObject, "constructor", funval.address()) ||
!funval.isObject()) {
return NS_ERROR_UNEXPECTED;
}
// Check if the object is even callable.
NS_ENSURE_STATE(JS_ObjectIsCallable(cx, &funval.toObject()));
thisValue.setObject(*object);
{
JS::Rooted<JSObject*> thisObject(cx, &thisValue.toObject());
// wrap parameters in the target compartment
// we also pass in the calling window as the first argument
++argc;
nsAutoArrayPtr<JS::Value> args(new JS::Value[argc]);
JS::AutoArrayRooter rooter(cx, 0, args);
unsigned argc = args.length() + 1;
nsAutoArrayPtr<JS::Value> argv(new JS::Value[argc]);
JS::AutoArrayRooter rooter(cx, 0, argv);
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
nsCOMPtr<nsIDOMWindow> currentWin(do_GetInterface(currentInner));
rv = WrapNative(cx, obj, currentWin, &NS_GET_IID(nsIDOMWindow),
true, &args[0], getter_AddRefs(holder));
if (!JS_WrapValue(cx, &args[0]))
true, &argv[0], getter_AddRefs(holder));
if (!JS_WrapValue(cx, &argv[0]))
return NS_ERROR_FAILURE;
rooter.changeLength(1);
for (size_t i = 1; i < argc; ++i) {
args[i] = argv[i - 1];
if (!JS_WrapValue(cx, &args[i]))
argv[i] = args[i - 1];
if (!JS_WrapValue(cx, &argv[i]))
return NS_ERROR_FAILURE;
rooter.changeLength(i + 1);
}
JS::Value frval;
bool ret = JS_CallFunctionValue(cx, thisObject, funval, argc, args, &frval);
bool ret = JS_CallFunctionValue(cx, thisObject, funval, argc, argv, &frval);
if (!ret) {
return NS_ERROR_FAILURE;
@ -3493,7 +3488,7 @@ BaseStubConstructor(nsIWeakReference* aWeakOwner,
}
}
return WrapNative(cx, obj, native, true, rval);
return WrapNative(cx, obj, native, true, args.rval().address());
}
static nsresult
@ -3746,7 +3741,7 @@ public:
nsresult Construct(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
JS::Handle<JSObject*> obj, const JS::CallArgs &args,
bool *_retval););
bool *_retval);
nsresult HasInstance(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
JS::Handle<JSObject*> obj, const jsval &val, bool *bp,
@ -3918,8 +3913,7 @@ nsDOMConstructor::Construct(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
return NS_ERROR_DOM_NOT_SUPPORTED_ERR;
}
return BaseStubConstructor(mWeakOwner, name_struct, cx, obj, args.length(), args.array(),
args.rval().address());
return BaseStubConstructor(mWeakOwner, name_struct, cx, obj, args);
}
nsresult
@ -7498,7 +7492,7 @@ nsDOMConstructorSH::Call(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
}
#endif
return wrapped->Construct(wrapper, cx, obj, argc, argv, vp, _retval);
return wrapped->Construct(wrapper, cx, obj, args, _retval);
}
NS_IMETHODIMP
@ -7519,7 +7513,7 @@ nsDOMConstructorSH::Construct(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
}
#endif
return wrapped->Construct(wrapper, cx, obj, argc, argv, vp, _retval);
return wrapped->Construct(wrapper, cx, obj, args, _retval);
}
NS_IMETHODIMP

View File

@ -10,8 +10,9 @@
#include "jsapi.h"
#define NS_IJSNATIVEINITIALIZER_IID \
{ 0x536c5ad2, 0x1275, 0x4706, \
{ 0x99, 0xbd, 0x4a, 0xef, 0xb2, 0x4a, 0xb7, 0xf7 } }
{ 0xdb48eee5, 0x89a4, 0x4f18, \
{ 0x86, 0xd0, 0x4c, 0x4e, 0x9d, 0x4b, 0xf8, 0x7e } }
/**
* A JavaScript specific interface used to initialize new
@ -29,7 +30,7 @@ public:
* constructor and the parameters passed into the JavaScript constructor.
*/
NS_IMETHOD Initialize(nsISupports* aOwner, JSContext *cx, JSObject *obj,
uint32_t argc, JS::Value *argv) = 0;
const JS::CallArgs& args) = 0;
};
NS_DEFINE_STATIC_IID_ACCESSOR(nsIJSNativeInitializer,

View File

@ -236,17 +236,17 @@ Btoa(JSContext *cx, unsigned argc, jsval *vp)
}
static JSBool
File(JSContext *cx, unsigned argc, jsval *vp)
File(JSContext *cx, unsigned argc, Value *vp)
{
nsresult rv;
CallArgs args = CallArgsFromVp(argc, vp);
if (!argc) {
if (args.length() == 0) {
XPCThrower::Throw(NS_ERROR_UNEXPECTED, cx);
return false;
}
nsCOMPtr<nsISupports> native;
rv = nsDOMMultipartFile::NewFile(getter_AddRefs(native));
nsresult rv = nsDOMMultipartFile::NewFile(getter_AddRefs(native));
if (NS_FAILED(rv)) {
XPCThrower::Throw(rv, cx);
return false;
@ -255,7 +255,7 @@ File(JSContext *cx, unsigned argc, jsval *vp)
nsCOMPtr<nsIJSNativeInitializer> initializer = do_QueryInterface(native);
NS_ASSERTION(initializer, "what?");
rv = initializer->Initialize(nullptr, cx, nullptr, argc, JS_ARGV(cx, vp));
rv = initializer->Initialize(nullptr, cx, nullptr, args);
if (NS_FAILED(rv)) {
XPCThrower::Throw(rv, cx);
return false;
@ -270,26 +270,23 @@ File(JSContext *cx, unsigned argc, jsval *vp)
JSObject* glob = JS_GetGlobalForScopeChain(cx);
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
RootedValue retval(cx);
rv = xpc->WrapNativeToJSVal(cx, glob, native, nullptr,
&NS_GET_IID(nsISupports),
true, retval.address(), nullptr);
true, args.rval().address(), nullptr);
if (NS_FAILED(rv)) {
XPCThrower::Throw(rv, cx);
return false;
}
JS_SET_RVAL(cx, vp, retval);
return true;
}
static JSBool
Blob(JSContext *cx, unsigned argc, jsval *vp)
Blob(JSContext *cx, unsigned argc, Value *vp)
{
nsresult rv;
CallArgs args = CallArgsFromVp(argc, vp);
nsCOMPtr<nsISupports> native;
rv = nsDOMMultipartFile::NewBlob(getter_AddRefs(native));
nsresult rv = nsDOMMultipartFile::NewBlob(getter_AddRefs(native));
if (NS_FAILED(rv)) {
XPCThrower::Throw(rv, cx);
return false;
@ -298,7 +295,7 @@ Blob(JSContext *cx, unsigned argc, jsval *vp)
nsCOMPtr<nsIJSNativeInitializer> initializer = do_QueryInterface(native);
NS_ASSERTION(initializer, "what?");
rv = initializer->Initialize(nullptr, cx, nullptr, argc, JS_ARGV(cx, vp));
rv = initializer->Initialize(nullptr, cx, nullptr, args);
if (NS_FAILED(rv)) {
XPCThrower::Throw(rv, cx);
return false;
@ -313,16 +310,13 @@ Blob(JSContext *cx, unsigned argc, jsval *vp)
JSObject* glob = JS_GetGlobalForScopeChain(cx);
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
RootedValue retval(cx);
rv = xpc->WrapNativeToJSVal(cx, glob, native, nullptr,
&NS_GET_IID(nsISupports),
true, retval.address(), nullptr);
true, args.rval().address(), nullptr);
if (NS_FAILED(rv)) {
XPCThrower::Throw(rv, cx);
return false;
}
JS_SET_RVAL(cx, vp, retval);
return true;
}