Пример #1
0
        public void CanConvertStringToReturnedObjectName()
        {
            IJavascriptNameConverter converter = new CamelCaseJavascriptNameConverter();
            var propertyInfo = new TestMemberInfo("APropertyName");

            var result = converter.ConvertReturnedObjectPropertyAndFieldToNameJavascript(propertyInfo);

            Assert.Equal("aPropertyName", result);
        }
Пример #2
0
        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);
        }