public void CanConvertStringToReturnedObjectName() { IJavascriptNameConverter converter = new CamelCaseJavascriptNameConverter(); var propertyInfo = new TestMemberInfo("APropertyName"); var result = converter.ConvertReturnedObjectPropertyAndFieldToNameJavascript(propertyInfo); Assert.Equal("aPropertyName", result); }
public void HonorsJavascriptNameConverter() { var namingConverter = new CamelCaseJavascriptNameConverter(); IBinder binder = new DefaultBinder(namingConverter); var obj = new Dictionary <string, object> { { "aString", "SomeValue" }, { "aBool", true }, }; var result = (TestObject)binder.Bind(obj, typeof(TestObject)); Assert.Equal(obj["aString"], result.AString); Assert.Equal(obj["aBool"], result.ABool); }
public void Register(string name, object value, bool isAsync, BindingOptions options) { if (name == null) { throw new ArgumentNullException("name"); } if (value == null) { throw new ArgumentNullException("value"); } //Enable WCF if not already enabled - can only be done before the browser has been initliazed //if done after the subprocess won't be WCF enabled it we'll have to throw an exception if (!IsBrowserInitialized && !isAsync) { CefSharpSettings.WcfEnabled = true; } if (!CefSharpSettings.WcfEnabled && !isAsync) { throw new InvalidOperationException(@"To enable synchronous JS bindings set WcfEnabled true in CefSharpSettings before you create your ChromiumWebBrowser instances."); } //Validation name is unique if (objects.Values.Count(x => string.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase)) > 0) { throw new ArgumentException("Object already bound with name:" + name, name); } //Binding of System types is problematic, so we don't support it var type = value.GetType(); if (type.IsPrimitive || type.BaseType.Namespace.StartsWith("System.")) { throw new ArgumentException("Registering of .Net framework built in types is not supported, " + "create your own Object and proxy the calls if you need to access a Window/Form/Control.", "value"); } IJavascriptNameConverter nameConverter = null; //If a custom name converter was provided we'll use that //as a preference if (options != null && options.NameConverter != null) { nameConverter = options.NameConverter; } else if (options == null || options.CamelCaseJavascriptNames) { nameConverter = new CamelCaseJavascriptNameConverter(); } var jsObject = CreateJavascriptObject(rootObject: true, nameConveter: nameConverter); jsObject.Value = value; jsObject.Name = name; jsObject.JavascriptName = name; jsObject.IsAsync = isAsync; jsObject.Binder = options?.Binder; jsObject.MethodInterceptor = options?.MethodInterceptor; AnalyseObjectForBinding(jsObject, analyseMethods: true, analyseProperties: !isAsync, readPropertyValue: false, nameConverter: nameConverter); }