mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-11 12:25:53 +00:00
Bug 705355 - Use IDL for Components.utils.evalInSandbox; r=bholley
This commit is contained in:
parent
dcfa1754b2
commit
fa37af10f4
@ -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);
|
||||
|
||||
|
||||
/*
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user