Ejemplo n.º 1
0
        /// <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);
            }
        }
Ejemplo n.º 2
0
        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
        }
Ejemplo n.º 3
0
 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);
     }
 }
Ejemplo n.º 4
0
        /// <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);
        }