Bug 705355 - Use IDL for Components.utils.evalInSandbox; r=bholley

This commit is contained in:
Ms2ger 2011-12-18 11:09:56 +01:00
parent dcfa1754b2
commit fa37af10f4
2 changed files with 36 additions and 66 deletions

View File

@ -152,7 +152,7 @@ interface ScheduledGCCallback : nsISupports
/**
* interface of Components.utils
*/
[scriptable, uuid(a5213836-fd24-4b36-8916-fff222b23cf3)]
[scriptable, uuid(6b1ca9d9-a941-4ba8-8421-af72f544e795)]
interface nsIXPCComponents_Utils : nsISupports
{
@ -198,7 +198,11 @@ interface nsIXPCComponents_Utils : nsISupports
* s.seven = res;
* var thirtyFive = C.u.evalInSandbox("five * seven", s);
*/
void evalInSandbox(in AString source/*, obj */);
[implicit_jscontext,optional_argc]
jsval evalInSandbox(in AString source, in jsval sandbox,
[optional] in jsval version,
[optional] in jsval filename,
[optional] in long lineNo);
/*

View File

@ -3367,82 +3367,53 @@ ContextHolder::ContextHolderOperationCallback(JSContext *cx)
/* void evalInSandbox(in AString source, in nativeobj sandbox); */
NS_IMETHODIMP
nsXPCComponents_Utils::EvalInSandbox(const nsAString &source)
nsXPCComponents_Utils::EvalInSandbox(const nsAString& source,
const JS::Value& sandboxVal,
const JS::Value& version,
const JS::Value& filenameVal,
PRInt32 lineNumber,
JSContext *cx,
PRUint8 optionalArgc,
JS::Value *retval)
{
nsresult rv;
nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID(), &rv));
if (NS_FAILED(rv))
return rv;
// get the xpconnect native call context
nsAXPCNativeCallContext *cc = nsnull;
xpc->GetCurrentNativeCallContext(&cc);
if (!cc)
return NS_ERROR_FAILURE;
// Get JSContext of current call
JSContext* cx;
rv = cc->GetJSContext(&cx);
if (NS_FAILED(rv) || !cx)
return NS_ERROR_FAILURE;
// get place for return value
jsval *rval = nsnull;
rv = cc->GetRetValPtr(&rval);
if (NS_FAILED(rv) || !rval)
return NS_ERROR_FAILURE;
// get argc and argv and verify arg count
PRUint32 argc;
rv = cc->GetArgc(&argc);
if (NS_FAILED(rv))
return rv;
// The second argument is the sandbox object. It is required.
if (argc < 2)
return NS_ERROR_XPC_NOT_ENOUGH_ARGS;
jsval *argv;
rv = cc->GetArgvPtr(&argv);
if (NS_FAILED(rv))
return rv;
JSObject *sandbox;
JSString *jsVersionStr = NULL;
JSString *filenameStr = NULL;
PRInt32 lineNo = 0;
JSBool ok = JS_ConvertArguments(cx, argc, argv, "*o/SSi",
&sandbox, &jsVersionStr,
&filenameStr, &lineNo);
if (!ok || !sandbox)
if (!JS_ValueToObject(cx, sandboxVal, &sandbox) || !sandbox)
return NS_ERROR_INVALID_ARG;
JSVersion jsVersion = JSVERSION_DEFAULT;
// Optional third argument: JS version, as a string.
if (jsVersionStr) {
JSVersion jsVersion = JSVERSION_DEFAULT;
if (optionalArgc >= 1) {
JSString *jsVersionStr = JS_ValueToString(cx, version);
if (!jsVersionStr)
return NS_ERROR_INVALID_ARG;
JSAutoByteString bytes(cx, jsVersionStr);
if (!bytes)
return NS_ERROR_INVALID_ARG;
jsVersion = JS_StringToVersion(bytes.ptr());
if (jsVersion == JSVERSION_UNKNOWN)
return NS_ERROR_INVALID_ARG;
}
JSAutoByteString filenameBytes;
nsXPIDLCString filename;
// Optional fourth and fifth arguments: filename and line number.
if (filenameStr) {
nsXPIDLCString filename;
PRInt32 lineNo = (optionalArgc >= 3) ? lineNumber : 0;
if (optionalArgc >= 2) {
JSString *filenameStr = JS_ValueToString(cx, filenameVal);
if (!filenameStr)
return NS_ERROR_INVALID_ARG;
JSAutoByteString filenameBytes;
if (!filenameBytes.encode(cx, filenameStr))
return NS_ERROR_INVALID_ARG;
filename = filenameBytes.ptr();
} else {
// Get the current source info from xpc.
nsresult rv;
nsCOMPtr<nsIXPConnect> xpc = do_GetService(nsIXPConnect::GetCID(), &rv);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIStackFrame> frame;
xpc->GetCurrentJSStack(getter_AddRefs(frame));
if (frame) {
@ -3451,13 +3422,8 @@ nsXPCComponents_Utils::EvalInSandbox(const nsAString &source)
}
}
rv = xpc_EvalInSandbox(cx, sandbox, source, filename.get(), lineNo,
jsVersion, false, rval);
if (NS_SUCCEEDED(rv) && !JS_IsExceptionPending(cx))
cc->SetReturnValueWasSet(true);
return rv;
return xpc_EvalInSandbox(cx, sandbox, source, filename.get(), lineNo,
jsVersion, false, retval);
}
nsresult