private static List <JsVal> ConvertTypes(object[] paramObjects, AutoJSContext context) { var collection = new List <JsVal>(); foreach (var p in paramObjects) { JsVal val; if (p is nsAString || p is nsACString || p is nsAUTF8String || p is String) { SpiderMonkey.JS_ExecuteScript(context.ContextPointer, '"' + p.ToString() + '"', out val); } else if (p is nsISupports) { // This returns a [xpconnect wrapped nsISupports] - why may or may not be good enought - if not could try and access the objects wrappedJSObject property? // val = SpiderMonkey.JS_CallFunctionName(context.ContextPointer, jsObject, "valueOf"); // Replaced CallFunctionName 'valueOf' method with 'managed convert' (for speed reasons) val = JsVal.FromPtr(context.ConvertCOMObjectToJSObject((nsISupports)p)); } else if (p is bool) { SpiderMonkey.JS_ExecuteScript(context.ContextPointer, ((bool)p) ? "true;" : "false;", out val); } else if (p is double) { val = JsVal.FromDouble((double)p); } else { SpiderMonkey.JS_ExecuteScript(context.ContextPointer, p.ToString(), out val); } collection.Add(val); } return(collection); }
public void SpiderMonkeyEntryPointTests() { foreach (var entryPoint in EntryPoints()) { using (var dummy = new GeckoWebBrowser()) { dummy.CreateControl(); var dummyHandle = dummy.Handle; // Try us around the using because, AutoJSContext can throw exception caused by the junk arguments we pass to EntryPoints. try { using (var cx = new AutoJSContext(dummy.Window)) { entryPoint.Value(cx.ContextPointer, SpiderMonkey.CurrentGlobalOrNull(cx.ContextPointer)); } } catch (Exception e) { if (e is EntryPointNotFoundException) { Assert.Fail(String.Format("{0}:{1} EntryPoint is wrong: {2}", entryPoint.Value, entryPoint.Key, e.Message)); } } } } }
private static JsVal CreateBoolJsVal(AutoJSContext context, bool b) { JsVal val; SpiderMonkey.JS_ExecuteScript(context.ContextPointer, ((bool)b) ? "true;" : "false;", out val); return(val); }
public GeckoElement GetElementByJQuery(string jQuery) { using (var autoContext = new AutoJSContext(_window)) { var jsValue = autoContext.EvaluateScript(jQuery, _window.DomWindow); if (!jsValue.IsObject) { return(null); } var nativeComObject = jsValue.ToComObject(autoContext.ContextPointer); var element = Xpcom.QueryInterface </* nsIDOMHTMLElement */ nsIDOMElement>(nativeComObject); if (element != null) { return(GeckoHtmlElement.Create((mozIDOMWindowProxy)_window.DomWindow, element)); } if (!SpiderMonkey.JS_HasProperty(autoContext.ContextPointer, jsValue.AsPtr, "length")) { return(null); } var length = SpiderMonkey.JS_GetProperty(autoContext.ContextPointer, jsValue.AsPtr, "length").ToInteger(); if (length == 0) { return(null); } return(CreateHtmlElementFromDom(autoContext, jsValue, 0)); } }
public string GetStringValue() { using (var context = new AutoJSContext()) { var jsObject = context.ConvertCOMObjectToJSObject((nsISupports)_xpathResult.Instance); return(SpiderMonkey.JS_GetProperty(context.ContextPointer, jsObject, "stringValue").ToString()); } }
public void PeekCompartmentScope_NotContextHaveBeenPushed_ReturnsGlobalContext() { using (var context = new AutoJSContext()) { var globalObject = SpiderMonkey.DefaultObjectForContextOrNull(context.ContextPointer); Assert.AreEqual(context.PeekCompartmentScope(), globalObject); } }
public GeckoNode GetSingleNodeValue() { using (var context = new AutoJSContext()) { var jsObject = context.ConvertCOMObjectToJSObject((nsISupports)xpathResult.Instance); return((SpiderMonkey.JS_GetProperty(context.ContextPointer, jsObject, "singleNodeValue").ToComObject(context.ContextPointer) as nsIDOMNode).Wrap(GeckoNode.Create)); } }
public double GetNumberValue() { using (var context = new AutoJSContext()) { var jsObject = context.ConvertCOMObjectToJSObject((nsISupports)xpathResult.Instance); return(SpiderMonkey.JS_GetProperty(context.ContextPointer, jsObject, "numberValue").ToDouble()); } }
public XPathResultType GetResultType() { using (var context = new AutoJSContext()) { var jsObject = context.ConvertCOMObjectToJSObject((nsISupports)xpathResult.Instance); return((XPathResultType)SpiderMonkey.JS_GetProperty(context.ContextPointer, jsObject, "resultType").ToInteger()); } }
public bool GetBooleanValue() { using (var context = new AutoJSContext(_proxy)) using (var jsObject = context.ConvertCOMObjectToJSObject((nsISupports)_xpathResult.Instance)) { return(SpiderMonkey.JS_GetProperty(context.ContextPointer, jsObject.JSObject, "booleanValue").ToBoolean()); } }
public void JS_TypeOfValue_OnBoolJsValCreatedBySpiderMonkey_ReturnsTypeBool() { var jsVal = CreateBoolJsVal(_gwb.Window, true); using (AutoJSContext cx = new AutoJSContext(_gwb.Window)) { Assert.AreEqual(JSType.JSTYPE_BOOLEAN, SpiderMonkey.JS_TypeOfValue(cx.ContextPointer, jsVal)); } }
public void JS_TypeOfValue_OnNumberJsValCreatedBySpiderMonkey_ReturnsTypeNumber() { var jsVal = CreateNumberJsVal(_gwb.Window, 100); using (AutoJSContext cx = new AutoJSContext(_gwb.Window)) { Assert.AreEqual(JSType.JSTYPE_NUMBER, SpiderMonkey.JS_TypeOfValue(cx.ContextPointer, jsVal)); } }
public void JS_TypeOfValue_OnStringJsValCreatedBySpiderMonkey_ReturnsTypeString() { var jsVal = CreateStringJsVal(_gwb.Window, "hello world"); using (AutoJSContext cx = new AutoJSContext(_gwb.Window)) { Assert.AreEqual(JSType.JSTYPE_STRING, SpiderMonkey.JS_TypeOfValue(cx.ContextPointer, jsVal)); } }
public void JS_TypeOfValue_OnStringJsValCreatedBySpiderMonkey_ReturnsTypeString() { var jsVal = CreateStringJsVal("hello world"); using (AutoJSContext cx = new AutoJSContext(GlobalJSContextHolder.BackstageJSContext)) { Assert.AreEqual(JSType.JSTYPE_STRING, SpiderMonkey.JS_TypeOfValue(cx.ContextPointer, jsVal)); } }
private static GeckoElement CreateHtmlElementFromDom(AutoJSContext autoContext, JsVal jsValue, int elementIndex) { var elementIndexString = elementIndex.ToString(CultureInfo.InvariantCulture); var firstNativeDom = SpiderMonkey.JS_GetProperty(autoContext.ContextPointer, jsValue.AsPtr, elementIndexString).ToComObject(autoContext.ContextPointer); var element = Xpcom.QueryInterface </* nsIDOMHTMLElement */ nsIDOMElement>(firstNativeDom); return(element == null ? null : GeckoHtmlElement.Create((mozIDOMWindowProxy)autoContext.Window, element)); }
public void CallVoidMethod(string methodName, params object[] paramObjects) { using (var context = new AutoJSContext(_globalWindow)) { var jsObject = context.ConvertCOMObjectToJSObject(_thisObject); var collection = ConvertTypes(paramObjects, context); SpiderMonkey.JS_CallFunctionName(context.ContextPointer, jsObject, methodName, collection.ToArray()); } }
public void JS_TypeOfValue_OnBoolJsValCreatedBySpiderMonkey_ReturnsTypeBool() { var jsVal = CreateBoolJsVal(true); using (AutoJSContext cx = new AutoJSContext(GlobalJSContextHolder.BackstageJSContext)) { Assert.AreEqual(JSType.JSTYPE_BOOLEAN, SpiderMonkey.JS_TypeOfValue(cx.ContextPointer, jsVal)); } }
public void JS_TypeOfValue_OnNumberJsValCreatedBySpiderMonkey_ReturnsTypeNumber() { var jsVal = CreateNumberJsVal(100); using (AutoJSContext cx = new AutoJSContext(GlobalJSContextHolder.BackstageJSContext)) { Assert.AreEqual(JSType.JSTYPE_NUMBER, SpiderMonkey.JS_TypeOfValue(cx.ContextPointer, jsVal)); } }
public void CallVoidMethod(string methodName, params object[] paramObjects) { using (var context = new AutoJSContext(_globalWindowProxy)) using (var jsObject = context.ConvertCOMObjectToJSObject(_thisObject, true)) { DisposablCollection disposablCollection; var collection = ConvertTypes(paramObjects, context, out disposablCollection); SpiderMonkey.JS_CallFunctionName(context.ContextPointer, jsObject.JSObject, methodName, collection.ToArray()); disposablCollection.Dispose(); } }
public void PushCompartmentScope_PushANewScopeObject_PeekNoLongerReturnsGlobalContext() { _browser.TestLoadHtml("hello world"); using (var context = new AutoJSContext(_browser.Window.JSContext)) { context.PushCompartmentScope((nsISupports)_browser.Window.DomWindow); var globalObject = SpiderMonkey.DefaultObjectForContextOrNull(context.ContextPointer); Assert.AreNotEqual(context.PeekCompartmentScope(), globalObject); } }
public T CallMethod <T>(string methodName, params object[] paramObjects) { using (var context = new AutoJSContext(_globalWindow)) { var jsObject = context.ConvertCOMObjectToJSObject(_thisObject); var collection = ConvertTypes(paramObjects, context); var retObject = SpiderMonkey.JS_CallFunctionName(context.ContextPointer, jsObject, methodName, collection.ToArray()) .ToObject(); return(ConvertObject <T>(retObject)); } }
public void JS_NewStringCopyN() { using (AutoJSContext cx = new AutoJSContext(GlobalJSContextHolder.BackstageJSContext)) { IntPtr jsString = SpiderMonkey.JS_NewStringCopyN(cx.ContextPointer, "hello world", 11); Assert.NotNull(jsString); IntPtr str = SpiderMonkey.JS_EncodeString(cx.ContextPointer, jsString); string result = Marshal.PtrToStringAnsi(str); Assert.AreEqual("hello world", result); } }
public void SetProperty(string propertyName, object value) { using (var context = new AutoJSContext(_globalWindow)) { var jsObject = context.ConvertCOMObjectToJSObject(_thisObject); if (!SpiderMonkey.JS_SetProperty(context.ContextPointer, jsObject, propertyName, ConvertTypes(new[] { value }, context).First())) { throw new GeckoException(String.Format("Property '{0}' of value '{1}' could not be set on object", propertyName, value)); } } }
private static JsVal CreateJsVal(AutoJSContext cx, string jscript) { if (cx == null) { return(CreateJsVal(jscript)); } var ptr = new JsVal(); bool ret = SpiderMonkey.JS_EvaluateScript(cx.ContextPointer, jscript, (uint)jscript.Length, "script", 1, ref ptr); Assert.IsTrue(ret); return(ptr); }
public void JS_TypeOfValue() { if (Xpcom.IsLinux && IntPtr.Size == 8) { Assert.Ignore("unsafe test:seg faults on 64bit Linux"); } using (AutoJSContext cx = new AutoJSContext(GlobalJSContextHolder.BackstageJSContext)) { Assert.AreEqual(JSType.JSTYPE_NUMBER, SpiderMonkey.JS_TypeOfValue(cx.ContextPointer, JsVal.FromPtr(0))); Assert.AreEqual(JSType.JSTYPE_NUMBER, SpiderMonkey.JS_TypeOfValue(cx.ContextPointer, JsVal.FromPtr(0xffff0000ffffffff))); Assert.AreEqual(JSType.JSTYPE_BOOLEAN, SpiderMonkey.JS_TypeOfValue(cx.ContextPointer, JsVal.FromPtr(0xffffffffffffffff))); } }
public T GetProperty <T>(string propertyName) { using (var context = new AutoJSContext(_globalWindow)) { var jsObject = context.ConvertCOMObjectToJSObject(_thisObject); var result = SpiderMonkey.JS_GetProperty(context.ContextPointer, jsObject, propertyName); if (result.IsUndefined) { throw new GeckoException(String.Format("Property '{0}' of type '{1}' does not exist on object", propertyName, typeof(T).Name)); } var retObject = result.ToObject(); return(ConvertObject <T>(retObject)); } }
public void GetWrappedNativePrototype() { _browser.TestLoadHtml("<span id='a'>hello world</span>"); var element = _browser.Document.GetHtmlElementById("a"); using (AutoJSContext context = new AutoJSContext(_browser.Window.JSContext)) { IntPtr globalObject = SpiderMonkey.JS_GetGlobalForScopeChain(context.ContextPointer); var jsobjectholder = m_instance.GetWrappedNativePrototype(context.ContextPointer, globalObject, new MyClassInfo()); string result; Console.WriteLine(context.EvaluateScript("this", (nsISupports)jsobjectholder, out result)); Console.WriteLine(result); } }
/// <summary> /// Unittest helper method to create a String JsVal /// </summary> /// <param name="value"></param> /// <returns></returns> private static JsVal CreateJsVal(string jscript) { using (AutoJSContext cx = new AutoJSContext(GlobalJSContextHolder.BackstageJSContext)) { var ptr = new JsVal(); var _securityManager = Xpcom.GetService <nsIScriptSecurityManager>("@mozilla.org/scriptsecuritymanager;1"); var _systemPrincipal = _securityManager.GetSystemPrincipal(); IntPtr globalObject = SpiderMonkey.JS_GetGlobalForScopeChain(cx.ContextPointer); bool ret = SpiderMonkey.JS_EvaluateScript(cx.ContextPointer, globalObject, jscript, (uint)jscript.Length, "script", 1, ref ptr); Assert.IsTrue(ret); Marshal.ReleaseComObject(_securityManager); return(ptr); } }
public void FindInterfaceWithMember_OnAWindowElementLookingForNameMethod_ReturnsInterfaceThatContainsMethodNode() { _browser.TestLoadHtml("hello world"); using (var context = new AutoJSContext(_browser.Window)) { var jsValWindow = context.EvaluateScript("this"); var jsVal = SpiderMonkeyTests.CreateStringJsVal(context, "name"); var jsObject = SpiderMonkey.JS_ValueToObject(context.ContextPointer, jsValWindow); var a = m_instance.GetWrappedNativeOfJSObject(context.ContextPointer, jsObject); // Perform the test. var i = a.FindInterfaceWithMember(ref jsVal.AsPtr); Assert.NotNull(i); Assert.IsTrue(i.IsScriptable()); Assert.AreEqual("nsIDOMWindow", i.GetNameShared()); } }
public void FindInterfaceWithName_OnAWindowElementLookingForADOMWindowInterface_ReturnsExpectedInterface() { _browser.TestLoadHtml("hello world"); using (var context = new AutoJSContext(_browser.Window.JSContext)) { context.PushCompartmentScope((nsISupports)_browser.Window.DomWindow); var jsValWindow = context.EvaluateScript("this"); var jsVal = SpiderMonkeyTests.CreateStringJsVal(context, "nsIDOMWindow"); var jsObject = SpiderMonkey.JS_ValueToObject(context.ContextPointer, jsValWindow); var a = m_instance.GetWrappedNativeOfJSObject(context.ContextPointer, jsObject); // Perform the test var i = a.FindInterfaceWithName(ref jsVal.AsPtr); Assert.NotNull(i); Assert.IsTrue(i.IsScriptable()); Assert.AreEqual("nsIDOMWindow", i.GetNameShared()); } }