internal static CefV8Value CastCefValueToCefV8Value(CefV8Context context, CefValue value, out bool isNew)
        {
            isNew = true;

            if (value is null)
            {
                return(CefV8Value.CreateNull());
            }

            if (!value.IsValid)
            {
                throw new InvalidCastException();
            }

            CefValueType valueType = value.Type;

            switch (valueType)
            {
            case CefValueType.String:
                return(new CefV8Value(value.GetString()));

            case CefValueType.Int:
                return(new CefV8Value(value.GetInt()));

            case CefValueType.Bool:
                return(new CefV8Value(value.GetBool()));

            case CefValueType.Null:
                return(CefV8Value.CreateNull());

            case CefValueType.Double:
                return(new CefV8Value(value.GetDouble()));

            case CefValueType.Binary:
                CefBinaryValue v = value.GetBinary();
                if (v.Size == 1)
                {
                    return(CefV8Value.CreateUndefined());
                }

                XrayHandle handle = XrayHandle.FromCfxBinaryValue(v);
                if (handle == XrayHandle.Zero)
                {
                    return(context.GetGlobal());
                }

                isNew = (handle.dataType != XrayDataType.Object && handle.dataType != XrayDataType.Function);
                return(handle.ToCefV8Value(context.Frame));
            }

            throw new NotSupportedException();
        }
        internal static CefV8Value CastDotnetTypeToCefV8Value(CefV8Context context, object value, out bool isNew)
        {
            isNew = true;

            if (value is null)
            {
                return(CefV8Value.CreateNull());
            }

            if (value is V8Undefined)
            {
                return(CefV8Value.CreateUndefined());
            }

            switch (value)
            {
            case string v:
                return(new CefV8Value(v));

            case int v:
                return(new CefV8Value(v));

            case double v:
                return(new CefV8Value(v));

            case bool v:
                return(new CefV8Value(v));

            case DateTime v:
                return(new CefV8Value(v));

            case XrayHandle v:
                isNew = (v.dataType != XrayDataType.Object && v.dataType != XrayDataType.Function);
                return(v.ToCefV8Value(context.Frame));

            case ScriptableObject v:
                XrayHandle hv = (XrayHandle)v;
                isNew = (hv.dataType != XrayDataType.Object && hv.dataType != XrayDataType.Function);
                CefV8Value cv8 = hv.ToCefV8Value(context.Frame);
                GC.KeepAlive(v);
                return(cv8);
            }

            throw new NotImplementedException("Type: " + value.GetType().Name);
        }