public bool EvaluateTrustedScript(string jsScript, out string result) { throw new NotImplementedException(); 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); result = ConvertValueToString(ptr); } finally { if (inSystemCompartment) { SpiderMonkey.JS_LeaveCompartment(_cx, oldCompartment); } } 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 { var ptr = new JsVal(); IntPtr globalObject = ConvertCOMObjectToJSObject(thisObject); using (new JSAutoCompartment(_cx, globalObject)) { bool ret = SpiderMonkey.JS_EvaluateScript(_cx, globalObject, jsScript, (uint)jsScript.Length, "script", 1, ref ptr); if (GetComponentsObject().GetUtilsAttribute().IsXrayWrapper(ref ptr)) { ptr = GetComponentsObject().GetUtilsAttribute().WaiveXrays(ref ptr, _cx); } result = ret ? ConvertValueToString(ptr) : null; return(ret); } } catch (Exception e) { Console.WriteLine("Exception {0}", e); result = String.Empty; return(false); } }
/// <summary> /// Evaluate JavaScript in specified window, and with specified scope. /// Throws GeckoJavaScriptException on error. /// </summary> /// <param name="javascript">The javascript to run.</param> /// <param name="window">The window to execuate javascript in. (ie. the global object)</param> /// <param name="scope">object to use as scope.</param> /// <returns>The return value of the script as a JsVal</returns> public JsVal EvaluateScript(string javascript, nsISupports window, nsISupports scope) { string msg = String.Empty; JsVal exceptionJsVal = default(JsVal); IntPtr globalObject = ConvertCOMObjectToJSObject(window); using (new JSAutoCompartment(ContextPointer, globalObject)) { var old = SpiderMonkey.JS_SetErrorReporter(SpiderMonkey.JS_GetRuntime(ContextPointer), (cx, message, report) => { var exception = SpiderMonkey.JS_GetPendingException(ContextPointer); if (exception != IntPtr.Zero) { exceptionJsVal = JsVal.FromPtr(exception); } msg = message; }); try { var retJsVal = new JsVal(); bool ret; // If not running in window scope. if (window != scope) { var scopeJSVal = JsVal.FromPtr(ConvertCOMObjectToJSObject(scope)); if (!SpiderMonkey.JS_SetProperty(ContextPointer, globalObject, "__RequestedScope", scopeJSVal)) { throw new GeckoException("Failed to set __RequestedScope Property."); } javascript = InsertReturnStatement(javascript); string s = "(function() { " + javascript + " }).call(this.__RequestedScope)"; ret = SpiderMonkey.JS_EvaluateScript(ContextPointer, s, (uint)s.Length, "script", 1, ref retJsVal); } else { ret = SpiderMonkey.JS_EvaluateScript(ContextPointer, javascript, (uint)javascript.Length, "script", 1, ref retJsVal); } if (ret) { return(retJsVal); } msg += GetStackTrace(globalObject, exceptionJsVal); throw new GeckoJavaScriptException(String.Format("JSError : {0}", msg)); } finally { SpiderMonkey.JS_SetErrorReporter(SpiderMonkey.JS_GetRuntime(ContextPointer), old); } } }
/// <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(); bool ret = SpiderMonkey.JS_EvaluateScript(_cx, GetGlobalObject(), jsScript, (uint)jsScript.Length, "script", 1, ref ptr); result = ret ? ConvertValueToString(ptr) : null; 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); 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(); bool ret = SpiderMonkey.JS_EvaluateScript(_cx, GetGlobalObject(), 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); result = ret ? ConvertValueToString(ptr) : null; return(ret); }
/// <summary> /// Evaluate JavaScript in specified window, and with specified scope. /// Throws GeckoJavaScriptException on error. /// </summary> /// <param name="javascript">The javascript to run.</param> /// <param name="window">The window to execuate javascript in. (ie. the global object)</param> /// <param name="scope">object to use as scope.</param> /// <returns>The return value of the script as a JsVal</returns> public JsVal EvaluateScript(string javascript, nsISupports window, nsISupports scope) { string msg = String.Empty; JsVal exceptionJsVal = default(JsVal); using (var globalObject = ConvertCOMObjectToJSObject(window)) using (new JSAutoCompartment(ContextPointer, globalObject.JSObject)) { var retJsVal = new JsVal(); bool ret; // If not running in window scope. if (window != scope) { using (var scopeObject = ConvertCOMObjectToJSObject(scope)) { var scopeJSVal = JsVal.FromPtr(scopeObject.JSObject); var go = globalObject.JSObject; if (!SpiderMonkey.JS_SetProperty(ContextPointer, ref go, "__RequestedScope", ref scopeJSVal)) { throw new GeckoException("Failed to set __RequestedScope Property."); } javascript = InsertReturnStatement(javascript); string s = "(function() { " + javascript + " }).call(this.__RequestedScope)"; ret = SpiderMonkey.JS_EvaluateScript(ContextPointer, s, (uint)s.Length, "script", 1, ref retJsVal); } } else { ret = SpiderMonkey.JS_EvaluateScript(ContextPointer, javascript, (uint)javascript.Length, "script", 1, ref retJsVal); } if (ret) { return(retJsVal); } var exception = SpiderMonkey.JS_GetPendingException(ContextPointer); if (exception != IntPtr.Zero) { exceptionJsVal = JsVal.FromPtr(exception); } msg += exceptionJsVal.ToString(); msg += SpiderMonkey.GetStackTrace(ContextPointer, globalObject.JSObject, exceptionJsVal); throw new GeckoJavaScriptException($"JSError : {msg}"); } }
/// <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); }
private string GetStackTrace(IntPtr globalObject, JsVal exceptionJsVal) { if (!exceptionJsVal.IsObject) { return(String.Empty); } if (!SpiderMonkey.JS_SetProperty(ContextPointer, globalObject, "__RequestedScope", exceptionJsVal)) { throw new GeckoException("Failed to set __RequestedScope Property."); } const string s = "(function() { " + "return this.stack" + " }).call(this.__RequestedScope)"; var retJsVal = new JsVal(); var success = SpiderMonkey.JS_EvaluateScript(ContextPointer, s, (uint)s.Length, "script", 1, ref retJsVal); return(!success ? String.Empty : String.Format(" StackTrace: {0}", retJsVal)); }
/// <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); } }
/// <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; var ptr = new JsVal(); IntPtr globalObject = ConvertCOMObjectToJSObject(thisObject); using (new JSAutoCompartment(_cx, globalObject)) { bool ret = SpiderMonkey.JS_EvaluateScript(_cx, globalObject, jsScript, (uint)jsScript.Length, "script", 1, ref ptr); result = ret ? ConvertValueToString(ptr) : null; return(ret); } } catch (Exception e) { Console.WriteLine("Exception {0}", e); result = String.Empty; return(false); } }
/// <summary> /// Gets the nsIXPCComponents which is the javascript 'Components' objects /// The Components objects is the main object XPConnect object. /// </summary> /// <returns></returns> public nsIXPCComponents GetComponentsObject() { if (_nsIXPCComponents == null) { string javaScript = "Components"; var jsValue = new JsVal(); var ret = SpiderMonkey.JS_EvaluateScript(_cx, PeekCompartmentScope(), javaScript, (uint)javaScript.Length, "script", 1, ref jsValue); if (!ret || !jsValue.IsObject) { return(null); } _nsIXPCComponents = jsValue.ToObject() as nsIXPCComponents; } return(_nsIXPCComponents); }
public JsVal EvaluateScript(string javaScript) { string msg = String.Empty; var old = SpiderMonkey.JS_SetErrorReporter(_cx, (cx, message, report) => { msg = message; }); try { var jsValue = new JsVal(); var ret = SpiderMonkey.JS_EvaluateScript(_cx, PeekCompartmentScope(), javaScript, (uint)javaScript.Length, "script", 1, ref jsValue); if (!ret) { throw new GeckoJavaScriptException(String.Format("JSError : {0}", msg)); } return(jsValue); } finally { SpiderMonkey.JS_SetErrorReporter(_cx, old); } }
/// <summary> /// Evaluate JavaScript in specified window. /// Will throw a GeckoJavaScriptException if unable to convert window into a JsVal /// </summary> /// <param name="javascript">The javascript to run.</param> /// <param name="window">The window to execuate javascript in.</param> /// <returns>The return value of the script as a JsVal</returns> public JsVal EvaluateScript(string javascript, nsIDOMWindow window) { string msg = String.Empty; IntPtr globalObject = ConvertCOMObjectToJSObject((nsISupports)window); using (new JSAutoCompartment(_cx, globalObject)) { var old = SpiderMonkey.JS_SetErrorReporter(_cx, (cx, message, report) => { msg = message; }); try { var windowJsVal = new JsVal(); string jsScript = "this"; bool ret = SpiderMonkey.JS_EvaluateScript(_cx, globalObject, jsScript, (uint)jsScript.Length, "script", 1, ref windowJsVal); if (!ret) { throw new GeckoJavaScriptException(String.Format("JSError : {0}", msg)); } if (GetComponentsObject().GetUtilsAttribute().IsXrayWrapper(ref windowJsVal)) { windowJsVal = GetComponentsObject().GetUtilsAttribute().WaiveXrays(ref windowJsVal, _cx); } using (nsAStringBase b = new nsAString(javascript)) { return(GetComponentsObject().GetUtilsAttribute().EvalInWindow(b, ref windowJsVal, _cx)); } } finally { SpiderMonkey.JS_SetErrorReporter(_cx, old); } } }