/// <summary> /// Evaluate javascript in the current context with system privileges. /// </summary> /// <param name="jsScript"></param> /// <param name="jsval"></param> /// <returns></returns> public bool EvaluateTrustedScript(string jsScript, out string result) { var ptr = new JsVal(); IntPtr globalObject = SpiderMonkey.JS_GetGlobalForScopeChain(_cx); bool ret; IntPtr systemGlobalObject = SpiderMonkey.JS_GetGlobalForScopeChain(GlobalJSContextHolder.BackstageJSContext); // Compartments have to be entered and left in LIFO order. bool inSystemCompartment = false; IntPtr oldCompartment = IntPtr.Zero; try { // Allow access to any object on page. oldCompartment = SpiderMonkey.JS_EnterCompartment(_cx, systemGlobalObject); // At any time, a JSContext has a current (possibly-NULL) compartment. inSystemCompartment = true; ret = SpiderMonkey.JS_EvaluateScript(_cx, globalObject, jsScript, (uint)jsScript.Length, "script", 1, ref ptr); IntPtr jsStringPtr = SpiderMonkey.JS_ValueToString(_cx, ptr); result = Marshal.PtrToStringAnsi(SpiderMonkey.JS_EncodeString(_cx, jsStringPtr)); } finally { if (inSystemCompartment) { SpiderMonkey.JS_LeaveCompartment(_cx, oldCompartment); } } return(ret); }
public override string ToString() { using (AutoJSContext context = new AutoJSContext()) { IntPtr jsString = SpiderMonkey.JS_ValueToString(context.ContextPointer, this); return(Marshal.PtrToStringAnsi(SpiderMonkey.JS_EncodeString(context.ContextPointer, jsString))); } }
/// <summary> /// Evaluate javascript in the current context. /// </summary> /// <param name="jsScript"></param> /// <param name="jsval"></param> /// <returns></returns> public bool EvaluateScript(string jsScript, out string result) { var ptr = new JsVal(); IntPtr globalObject = SpiderMonkey.JS_GetGlobalForScopeChain(_cx); bool ret = SpiderMonkey.JS_EvaluateScript(_cx, globalObject, jsScript, (uint)jsScript.Length, "script", 1, ref ptr); IntPtr jsStringPtr = SpiderMonkey.JS_ValueToString(_cx, ptr); result = Marshal.PtrToStringAnsi(SpiderMonkey.JS_EncodeString(_cx, jsStringPtr)); return(ret); }
/// <summary> /// Evaluate javascript in the current context. /// </summary> /// <param name="jsScript"></param> /// <param name="jsval"></param> /// <returns></returns> public bool EvaluateScript(string jsScript, out string result) { var ptr = new JsVal(); IntPtr globalObject = SpiderMonkey.JS_GetGlobalForScopeChain(_cx); bool ret = SpiderMonkey.JS_EvaluateScript(_cx, globalObject, jsScript, (uint)jsScript.Length, "script", 1, ref ptr); // TODO: maybe getting JS_EvaluateScriptForPrincipals working would increase priviliges of the running script. //bool ret = SpiderMonkey.JS_EvaluateScriptForPrincipals(_cx, globalObject, ..., jsScript, (uint)jsScript.Length,"script", 1, ref ptr); IntPtr jsStringPtr = SpiderMonkey.JS_ValueToString(_cx, ptr); result = Marshal.PtrToStringAnsi(SpiderMonkey.JS_EncodeString(_cx, jsStringPtr)); return(ret); }
/// <summary> /// Evaluate javascript in the current context. /// </summary> /// <param name="jsScript"></param> /// <param name="thisObject">a nsISupports com object that this is set too.</param> /// <param name="result"></param> /// <returns></returns> public bool EvaluateScript(string jsScript, nsISupports thisObject, out string result) { try { Guid guid = typeof(nsISupports).GUID; IntPtr globalObject = SpiderMonkey.JS_GetGlobalForScopeChain(_cx); var ptr = new JsVal(); var wrapper = XPConnect.WrapNative(_cx, globalObject, thisObject, ref guid); bool ret = SpiderMonkey.JS_EvaluateScript(_cx, wrapper.GetJSObjectAttribute(), jsScript, (uint)jsScript.Length, "script", 1, ref ptr); IntPtr jsStringPtr = SpiderMonkey.JS_ValueToString(_cx, ptr); result = Marshal.PtrToStringAnsi(SpiderMonkey.JS_EncodeString(_cx, jsStringPtr)); return(ret); } catch (Exception e) { Console.WriteLine("Exception {0}", e); result = String.Empty; return(false); } }