/// <summary> /// Working similar to SelectSingle but not throwing exceptions on error (simply return first result) /// </summary> /// <param name="xpath"></param> /// <returns></returns> public GeckoNode SelectFirst(string xpath) { var r = EvaluateXPathInternal(xpath); nsIDOMNode singleNode = null; using (var context = new AutoJSContext()) { var jsObject = context.ConvertCOMObjectToJSObject((nsISupports)r); // TODO: (Idenally I would generate these calls via a webidl-> C# compiler but for now just do it via manually written spidermonkey calls..) var resultType = SpiderMonkey.JS_GetProperty(context.ContextPointer, jsObject, "resultType").ToInteger(); switch (resultType) { case nsIDOMXPathResultConsts.UNORDERED_NODE_ITERATOR_TYPE: singleNode = (nsIDOMNode)SpiderMonkey.JS_CallFunctionName(context.ContextPointer, jsObject, "iterateNext", new JsVal[0]).ToComObject(context.ContextPointer); break; case nsIDOMXPathResultConsts.FIRST_ORDERED_NODE_TYPE: case nsIDOMXPathResultConsts.ANY_UNORDERED_NODE_TYPE: singleNode = (nsIDOMNode)SpiderMonkey.JS_GetProperty(context.ContextPointer, jsObject, "singleNodeValue").ToComObject(context.ContextPointer); break; } var ret = singleNode.Wrap(GeckoNode.Create); Xpcom.FreeComObject(ref r); return(ret); } }
public GeckoNode SelectSingle(string xpath) { var r = EvaluateXPathInternal(xpath); nsIDOMNode singleNode = null; using (var context = new AutoJSContext(Window)) using (var jsObject = context.ConvertCOMObjectToJSObject((nsISupports)r)) { // TODO: (Idenally I would generate these calls via a webidl-> C# compiler but for now just do it via manually written spidermonkey calls..) var resultType = SpiderMonkey.JS_GetProperty(context.ContextPointer, jsObject.JSObject, "resultType").ToInteger(); #if PORTFF60 switch (resultType) { case nsIDOMXPathResultConsts.UNORDERED_NODE_ITERATOR_TYPE: singleNode = (nsIDOMNode) SpiderMonkey.JS_CallFunctionName(context.ContextPointer, jsObject, "iterateNext", new JsVal[0]).ToComObject(context.ContextPointer); var test = (SpiderMonkey.JS_CallFunctionName(context.ContextPointer, jsObject, "iterateNext", new JsVal[0])); if (!test.IsNull) { Xpcom.FreeComObject(ref singleNode); Xpcom.FreeComObject(ref r); throw new GeckoDomException("There are more than 1 nodes in Single selection"); } break; case nsIDOMXPathResultConsts.FIRST_ORDERED_NODE_TYPE: case nsIDOMXPathResultConsts.ANY_UNORDERED_NODE_TYPE: singleNode = (nsIDOMNode) SpiderMonkey.JS_GetProperty(context.ContextPointer, jsObject, "singleNodeValue") .ToComObject(context.ContextPointer); break; } #endif throw new NotImplementedException(); } #if PORTFF60 var ret = singleNode.Wrap(GeckoNode.Create); Xpcom.FreeComObject(ref r); return(ret); #endif }
public IEnumerator <GeckoNode> GetEnumerator() { using (var context = new AutoJSContext()) { var jsObject = context.ConvertCOMObjectToJSObject((nsISupports)xpathResult); JsVal jsVal; do { while ( !(jsVal = SpiderMonkey.JS_CallFunctionName(context.ContextPointer, jsObject, "iterateNext")).IsNull) { yield return((jsVal.ToComObject(context.ContextPointer) as nsIDOMNode).Wrap(GeckoNode.Create)); } } while (!jsVal.IsNull); } }
/// <summary> /// Gets the nsIXPCComponents which is the javascript 'Components' objects /// The Components objects is the main object XPConnect object. /// </summary> /// <returns></returns> internal nsIXPCComponents GetComponentsObject() { if (_nsIXPCComponents == null) { var jsValue = new JsVal(); SpiderMonkey.JS_ExecuteScript(ContextPointer, "this.myfunc = function(p1) { return Components; };", out jsValue); jsValue = SpiderMonkey.JS_CallFunctionName(ContextPointer, _globalJSObject, "myfunc", new[] { jsValue }); _nsIXPCComponents = Xpcom.QueryInterface <nsIXPCComponents>(jsValue.ToObject()); if (_nsIXPCComponents == null) { throw new GeckoException(String.Format( "Components object does not implement nsIXPCComponents. {0}", jsValue)); } } return(_nsIXPCComponents); }