private JavascriptObject CreateJavascriptObject(bool camelCaseJavascriptNames) { var id = Interlocked.Increment(ref lastId); var result = new JavascriptObject { Id = id, CamelCaseJavascriptNames = camelCaseJavascriptNames }; objects[id] = result; return result; }
/// <summary> /// Analyse the object and generate metadata which will /// be used by the browser subprocess to interact with Cef. /// Method is called recursively /// </summary> /// <param name="obj">Javascript object</param> /// <param name="analyseMethods">Analyse methods for inclusion in metadata model</param> /// <param name="readPropertyValue">When analysis is done on a property, if true then get it's value for transmission over WCF</param> /// <param name="camelCaseJavascriptNames">camel case the javascript names of properties/methods</param> /// <param name="analyseProperties">Analyse properties for binding</param> private void AnalyseObjectForBinding(JavascriptObject obj, bool analyseMethods, bool readPropertyValue, bool camelCaseJavascriptNames, bool analyseProperties) { if (obj.Value == null) { return; } var type = obj.Value.GetType(); if (type.IsPrimitive || type == typeof(string)) { return; } if (analyseMethods) { foreach (var methodInfo in type.GetMethods(BindingFlags.Instance | BindingFlags.Public).Where(p => !p.IsSpecialName)) { // Type objects can not be serialized. if (methodInfo.ReturnType == typeof(Type) || Attribute.IsDefined(methodInfo, typeof(JavascriptIgnoreAttribute))) { continue; } var jsMethod = CreateJavaScriptMethod(methodInfo, camelCaseJavascriptNames); obj.Methods.Add(jsMethod); } } if (analyseProperties) { foreach (var propertyInfo in type.GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(p => !p.IsSpecialName)) { if (propertyInfo.PropertyType == typeof(Type) || Attribute.IsDefined(propertyInfo, typeof(JavascriptIgnoreAttribute))) { continue; } var jsProperty = CreateJavaScriptProperty(propertyInfo, camelCaseJavascriptNames); if (jsProperty.IsComplexType) { var jsObject = CreateJavascriptObject(camelCaseJavascriptNames); jsObject.Name = propertyInfo.Name; jsObject.JavascriptName = GetJavascriptName(propertyInfo.Name, camelCaseJavascriptNames); jsObject.Value = jsProperty.GetValue(obj.Value); jsProperty.JsObject = jsObject; AnalyseObjectForBinding(jsProperty.JsObject, analyseMethods, readPropertyValue, camelCaseJavascriptNames, true); } else if (readPropertyValue) { jsProperty.PropertyValue = jsProperty.GetValue(obj.Value); } obj.Properties.Add(jsProperty); } } }
internal JavascriptObject CreateJavascriptObject() { long id; lock (Lock) { id = lastId++; } var result = new JavascriptObject { Id = id }; objects[id] = result; return result; }
private JavascriptObject CreateJavascriptObject(bool camelCaseJavascriptNames) { var id = Interlocked.Increment(ref lastId); var result = new JavascriptObject { Id = id, CamelCaseJavascriptNames = camelCaseJavascriptNames }; objects[id] = result; return(result); }
private JavascriptObject CreateJavascriptObject(bool rootObject) { var id = Interlocked.Increment(ref lastId); var result = new JavascriptObject { Id = id, RootObject = rootObject }; objects[id] = result; return(result); }
private JavascriptObject CreateJavascriptObject(bool rootObject, IJavascriptNameConverter nameConveter) { var id = Interlocked.Increment(ref lastId); var result = new JavascriptObject { Id = id, RootObject = rootObject, NameConverter = nameConveter }; objects[id] = result; return(result); }
private JavascriptObject CreateJavascriptObject(bool camelCaseJavascriptNames) { long id; lock (Lock) { id = lastId++; } var result = new JavascriptObject { Id = id, CamelCaseJavascriptNames = camelCaseJavascriptNames }; objects[id] = result; return(result); }
internal JavascriptObject CreateJavascriptObject() { long id; lock (Lock) { id = lastId++; } var result = new JavascriptObject { Id = id }; objects[id] = result; return(result); }
private void Analyse(JavascriptObject obj) { if (obj.Value == null) { return; } var type = obj.Value.GetType(); if (type.IsPrimitive || type == typeof(string)) { return; } foreach (var methodInfo in type.GetMethods(BindingFlags.Instance | BindingFlags.Public).Where(p => !p.IsSpecialName)) { // Type objects can not be serialized. if (methodInfo.ReturnType == typeof(Type) || Attribute.IsDefined(methodInfo, typeof(JavascriptIgnoreAttribute))) { continue; } var jsMethod = CreateJavaScriptMethod(methodInfo); obj.Methods.Add(jsMethod); } foreach (var propertyInfo in type.GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(p => !p.IsSpecialName)) { if (propertyInfo.PropertyType == typeof(Type) || Attribute.IsDefined(propertyInfo, typeof(JavascriptIgnoreAttribute))) { continue; } var jsProperty = CreateJavaScriptProperty(propertyInfo); if (jsProperty.IsComplexType) { var jsObject = CreateJavascriptObject(); jsObject.Name = propertyInfo.Name; jsObject.JavascriptName = LowercaseFirst(propertyInfo.Name); jsObject.Value = jsProperty.GetValue(obj.Value); jsProperty.JsObject = jsObject; Analyse(jsProperty.JsObject); } obj.Properties.Add(jsProperty); } }
/// <summary> /// Analyse the object and generate metadata which will /// be used by the browser subprocess to interact with Cef. /// Method is called recursively /// </summary> /// <param name="obj">Javascript object</param> /// <param name="analyseMethods">Analyse methods for inclusion in metadata model</param> /// <param name="readPropertyValue">When analysis is done on a property, if true then get it's value for transmission over WCF</param> private void AnalyseObjectForBinding(JavascriptObject obj, bool analyseMethods, bool readPropertyValue) { if (obj.Value == null) { return; } var type = obj.Value.GetType(); if (type.IsPrimitive || type == typeof(string)) { return; } if (analyseMethods) { foreach (var methodInfo in type.GetMethods(BindingFlags.Instance | BindingFlags.Public).Where(p => !p.IsSpecialName)) { // Type objects can not be serialized. if (methodInfo.ReturnType == typeof (Type) || Attribute.IsDefined(methodInfo, typeof (JavascriptIgnoreAttribute))) { continue; } var jsMethod = CreateJavaScriptMethod(methodInfo); obj.Methods.Add(jsMethod); } } foreach (var propertyInfo in type.GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(p => !p.IsSpecialName)) { if (propertyInfo.PropertyType == typeof(Type) || Attribute.IsDefined(propertyInfo, typeof(JavascriptIgnoreAttribute))) { continue; } var jsProperty = CreateJavaScriptProperty(propertyInfo); if (jsProperty.IsComplexType) { var jsObject = CreateJavascriptObject(); jsObject.Name = propertyInfo.Name; jsObject.JavascriptName = LowercaseFirst(propertyInfo.Name); jsObject.Value = jsProperty.GetValue(obj.Value); jsProperty.JsObject = jsObject; AnalyseObjectForBinding(jsProperty.JsObject, analyseMethods, readPropertyValue); } else if (readPropertyValue) { jsProperty.PropertyValue = jsProperty.GetValue(obj.Value); } obj.Properties.Add(jsProperty); } }
/// <summary> /// Analyse the object and generate metadata which will /// be used by the browser subprocess to interact with Cef. /// Method is called recursively /// </summary> /// <param name="obj">Javascript object</param> /// <param name="analyseMethods">Analyse methods for inclusion in metadata model</param> /// <param name="analyseProperties">Analyse properties for inclusion in metadata model</param> /// <param name="readPropertyValue">When analysis is done on a property, if true then get it's value for transmission over WCF</param> /// <param name="nameConverter">convert names of properties/methods</param> private void AnalyseObjectForBinding(JavascriptObject obj, bool analyseMethods, bool analyseProperties, bool readPropertyValue) { if (obj.Value == null) { return; } var type = obj.Value.GetType(); if (type.IsPrimitive || type == typeof(string)) { return; } if (analyseMethods) { foreach (var methodInfo in type.GetMethods(BindingFlags.Instance | BindingFlags.Public).Where(p => !p.IsSpecialName)) { // Type objects can not be serialized. if (methodInfo.ReturnType == typeof(Type) || Attribute.IsDefined(methodInfo, typeof(JavascriptIgnoreAttribute))) { continue; } var jsMethod = CreateJavaScriptMethod(methodInfo, nameConverter); obj.Methods.Add(jsMethod); } } if (analyseProperties) { foreach (var propertyInfo in type.GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(p => !p.IsSpecialName)) { //https://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.getindexparameters(v=vs.110).aspx //An array of type ParameterInfo containing the parameters for the indexes. If the property is not indexed, the array has 0 (zero) elements. //According to MSDN array has zero elements when it's not an indexer, so in theory no null check is required var isIndexer = propertyInfo.GetIndexParameters().Length > 0; var hasIgnoreAttribute = Attribute.IsDefined(propertyInfo, typeof(JavascriptIgnoreAttribute)); if (propertyInfo.PropertyType == typeof(Type) || isIndexer || hasIgnoreAttribute) { continue; } var jsProperty = CreateJavaScriptProperty(propertyInfo); if (jsProperty.IsComplexType) { var jsObject = CreateJavascriptObject(rootObject: false); jsObject.Name = propertyInfo.Name; jsObject.JavascriptName = nameConverter == null ? propertyInfo.Name : nameConverter.ConvertToJavascript(propertyInfo); jsObject.Value = jsProperty.GetValue(obj.Value); jsProperty.JsObject = jsObject; AnalyseObjectForBinding(jsProperty.JsObject, analyseMethods, analyseProperties: true, readPropertyValue: readPropertyValue); } else if (readPropertyValue) { jsProperty.PropertyValue = jsProperty.GetValue(obj.Value); } obj.Properties.Add(jsProperty); } } }
private JavascriptObject CreateJavascriptObject(bool camelCaseJavascriptNames) { long id; lock (Lock) { id = lastId++; } var result = new JavascriptObject { Id = id, CamelCaseJavascriptNames = camelCaseJavascriptNames }; objects[id] = result; return result; }