Ejemplo n.º 1
0
        /// <summary>
        /// For object constructed in JS, we need to create a C# representation and bind it to that
        /// object. For this, we'll use a <see cref="Dictionary{TKey,TValue}"/>. Possibly a later addition
        /// could use a custom serialization process and allow the user to control.
        /// </summary>
        private Dictionary <string, object> NewHostObject(JavaScriptValue arg)
        {
            // Create new Dictionary mapping to hold the properties, Create a new bindable JS object to replace
            // the existing one. Note: This could cause issues if these objects are used as keys.
            var d           = new Dictionary <string, object>();
            var replacement = _binder.BindObject(d);

            var propNames = (string[])ToHostArray(arg.GetOwnPropertyNames(), typeof(string[]));

            for (var i = 0; i < propNames.Length; ++i)
            {
                var propName = propNames[i];
                var propId   = JavaScriptPropertyId.FromString(propName);
                var jsProp   = arg.GetProperty(propId);

                // Copy Properties into Replacement
                replacement.SetProperty(propId, jsProp, true);

                Type propType;
                if (!TryInferType(jsProp, out propType))
                {
                    throw new Exception($"Failed to create Host representation of JS object. Property: {propName}");
                }

                d[propName] = ToHostObject(jsProp, propType);
            }

            return(d);
        }
Ejemplo n.º 2
0
        private string JSValueToString(JavaScriptValue val)
        {
            switch (val.ValueType)
            {
            case JavaScriptValueType.Boolean:
                return(val.ToBoolean() ? "true" : "false");

            case JavaScriptValueType.Number:
                try
                {
                    return(val.ToInt32().ToString());
                }
                catch (JavaScriptException)
                {
                    return(val.ToDouble().ToString(CultureInfo.InvariantCulture));
                }

            case JavaScriptValueType.Error:
                var keys = val.GetOwnPropertyNames();
                throw new Exception("Error in js");

            case JavaScriptValueType.String:
                return(val.ToString());

            case JavaScriptValueType.Array:
//                    int length = val.GetProperty(JavaScriptPropertyId.FromString("length")).ToInt32();
//                    return "Array";
            case JavaScriptValueType.Object:
                return(val.ToJsonString());

            default:
                return(val.ValueType.ToString());
            }
        }
Ejemplo n.º 3
0
        private ShibaObject VisitJavascriptObject(JavaScriptValue value)
        {
            var propers = VisitJavascriptArray(value.GetOwnPropertyNames()).Cast <string>().ToList();
            var obj     = new ShibaObject();

            foreach (var name in propers)
            {
                obj.TryAdd(name, Visit(value.GetProperty(name.ToJavaScriptPropertyId()), null));
            }

            return(obj);
        }
        private JToken VisitObject(JavaScriptValue value)
        {
            var jsonObject = new JObject();
            var properties = Visit(value.GetOwnPropertyNames()).ToObject <string[]>();

            foreach (var property in properties)
            {
                var propertyId    = JavaScriptPropertyId.FromString(property);
                var propertyValue = value.GetProperty(propertyId);
                jsonObject.Add(property, Visit(propertyValue));
            }

            return(jsonObject);
        }
Ejemplo n.º 5
0
        private static object ConvertJavaScriptValue(JavaScriptValue value)
        {
            JavaScriptValueType t = value.ValueType;

            if (t == JavaScriptValueType.Boolean)
            {
                return(value.ToBoolean());
            }
            else if (t == JavaScriptValueType.Number)
            {
                return(value.ToDouble());
            }
            else if (t == JavaScriptValueType.String)
            {
                return(value.ToString());
            }
            else if (t == JavaScriptValueType.Null)
            {
                return(null);
            }
            else if (t == JavaScriptValueType.Undefined)
            {
                return(null);
            }
            else if (t == JavaScriptValueType.Object)
            {
                Dictionary <string, object> dictionary = new Dictionary <string, object>();
                JavaScriptValue             propNames  = value.GetOwnPropertyNames();

                int             i = 0;
                JavaScriptValue index;

                while (propNames.HasIndexedProperty(index = JavaScriptValue.FromInt32(i)))
                {
                    JavaScriptValue      propName  = propNames.GetIndexedProperty(index);
                    JavaScriptPropertyId propId    = JavaScriptPropertyId.FromString(propName.ToString());
                    JavaScriptValue      propValue = value.GetProperty(propId);
                    object value2 = ConvertJavaScriptValue(propValue);
                    dictionary.Add(propName.ToString(), value2);
                    //Debug.WriteLine(propName.ToString() + ": " + propValue.ConvertToString().ToString());
                    i += 1;
                }

                return(dictionary);
            }
            else if (t == JavaScriptValueType.Array)
            {
                JavaScriptPropertyId lengthPropId = JavaScriptPropertyId.FromString("length");
                JavaScriptValue      arrayLength  = value.GetProperty(lengthPropId);
                int      length = (int)arrayLength.ToDouble();
                object[] array  = new object[length];

                int             i;
                JavaScriptValue index;

                for (i = 0; i < length; i++)
                {
                    if (value.HasIndexedProperty(index = JavaScriptValue.FromInt32(i)))
                    {
                        JavaScriptValue prop = value.GetIndexedProperty(index);
                        array[i] = ConvertJavaScriptValue(prop);
                    }
                }

                return(array);
            }
            return(null);
        }
        private JToken VisitObject(JavaScriptValue value)
        {
            var jsonObject = new JObject();
            var properties = Visit(value.GetOwnPropertyNames()).ToObject<string[]>();
            foreach (var property in properties)
            {
                var propertyId = JavaScriptPropertyId.FromString(property);
                var propertyValue = value.GetProperty(propertyId);
                jsonObject.Add(property, Visit(propertyValue));
            }

            return jsonObject;
        }