Пример #1
0
        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);
        }
Пример #2
0
        /// <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);
            }
        }
Пример #3
0
        /// <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);
                }
            }
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        /// <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);
        }
Пример #6
0
        /// <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);
        }
Пример #7
0
        /// <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}");
                }
        }
Пример #8
0
        /// <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);
        }
Пример #9
0
        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));
        }
Пример #10
0
 /// <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);
     }
 }
Пример #11
0
 /// <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);
     }
 }
Пример #12
0
        /// <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);
        }
Пример #13
0
        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);
            }
        }
Пример #14
0
        /// <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);
                }
            }
        }