// Copyright © 2020 The CefSharp Authors. All rights reserved. // // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. using System.Linq; using System.Reflection; namespace CefSharp.JavascriptBinding { /// /// CamelCaseJavascriptNameConverter converts .Net property/method names /// to camcel case. /// public class CamelCaseJavascriptNameConverter : IJavascriptNameConverter { string IJavascriptNameConverter.ConvertToJavascript(MemberInfo memberInfo) { return ConvertToJavascript(memberInfo); } /// /// Get the javascript name for the property/field/method. /// Typically this would be based on /// /// property/field/method /// javascript name protected virtual string ConvertToJavascript(MemberInfo memberInfo) { return ConvertMemberInfoNameToCamelCase(memberInfo); } string IJavascriptNameConverter.ConvertReturnedObjectPropertyAndFieldToNameJavascript(MemberInfo memberInfo) { return ConvertReturnedObjectPropertyAndFieldToNameJavascript(memberInfo); } /// /// This method exists for backwards compatability reasons, historically /// only the bound methods/fields/properties were converted. Objects returned /// from a method call were not translated. To preserve this functionality /// for upgrading users we split this into two methods. Typically thie method /// would return the same result as /// Issue #2442 /// /// property/field/method /// javascript name protected virtual string ConvertReturnedObjectPropertyAndFieldToNameJavascript(MemberInfo memberInfo) { return ConvertMemberInfoNameToCamelCase(memberInfo); } /// /// Converts the to CamelCase /// /// memberInfo /// camelcased name protected static string ConvertMemberInfoNameToCamelCase(MemberInfo memberInfo) { var name = memberInfo.Name; // camelCase says that if the string is only one character that it is preserved. if (name.Length == 1) { return name; } // camelCase says that if the entire string is uppercase to preserve it. //TODO: We need to cache these values to avoid the cost of validating this if (name.All(char.IsUpper)) { return name; } var firstHalf = name.Substring(0, 1); var remainingHalf = name.Substring(1); return firstHalf.ToLowerInvariant() + remainingHalf; } } }