Exemple #1
0
        public static string GetModeName(JsEngineMode mode)
        {
            string modeName;

            switch (mode)
            {
            case JsEngineMode.Classic:
                modeName = "Classic";
                break;

            case JsEngineMode.ChakraActiveScript:
                modeName = "Chakra ActiveScript";
                break;

            case JsEngineMode.ChakraIeJsRt:
                modeName = "Chakra IE JsRT";
                break;

            case JsEngineMode.ChakraEdgeJsRt:
                modeName = "Chakra Edge JsRT";
                break;

            default:
                throw new NotSupportedException();
            }

            return(modeName);
        }
Exemple #2
0
 public MsieJsEngine(JsEngineMode engineMode)
     : this(new JsEngineSettings
 {
     EngineMode = engineMode
 })
 {
 }
Exemple #3
0
 public MsieJsEngine(JsEngineMode engineMode, bool useEcmaScript5Polyfill)
     : this(new JsEngineSettings
 {
     EngineMode = engineMode,
     UseEcmaScript5Polyfill = useEcmaScript5Polyfill
 })
 {
 }
Exemple #4
0
        /// <summary>
        /// Constructs an instance of the Chakra JsRT engine
        /// </summary>
        /// <param name="engineMode">JS engine mode</param>
        /// <param name="enableDebugging">Flag for whether to enable script debugging features</param>
        protected ChakraJsRtJsEngineBase(JsEngineMode engineMode, bool enableDebugging)
            : base(engineMode)
        {
            _enableDebugging = enableDebugging;
#if NETSTANDARD1_3
            _externalObjectFinalizeCallback = ExternalObjectFinalizeCallback;
#endif
        }
Exemple #5
0
 public MsieJsEngine(JsEngineMode engineMode, bool useEcmaScript5Polyfill, bool useJson2Library)
     : this(new JsEngineSettings
 {
     EngineMode = engineMode,
     UseEcmaScript5Polyfill = useEcmaScript5Polyfill,
     UseJson2Library = useJson2Library
 })
 {
 }
Exemple #6
0
        /// <summary>
        /// Constructs an instance of the Chakra JsRT JavaScript engine
        /// </summary>
        /// <param name="engineMode">JavaScript engine mode</param>
        /// <param name="enableDebugging">Flag for whether to enable script debugging features</param>
        protected ChakraJsRtJsEngineBase(JsEngineMode engineMode, bool enableDebugging)
        {
            _engineMode      = engineMode;
            _engineModeName  = JsEngineModeHelpers.GetModeName(engineMode);
            _enableDebugging = enableDebugging;
#if NETSTANDARD1_3
            _externalObjectFinalizeCallback = ExternalObjectFinalizeCallback;
#endif
        }
 /// <summary>
 /// Constructs an instance of the Chakra JsRT JavaScript engine
 /// </summary>
 /// <param name="engineMode">JavaScript engine mode</param>
 /// <param name="enableDebugging">Flag for whether to enable script debugging features</param>
 protected ChakraJsRtJsEngineBase(JsEngineMode engineMode, bool enableDebugging)
 {
     _engineMode = engineMode;
     _engineModeName = JsEngineModeHelpers.GetModeName(engineMode);
     _enableDebugging = enableDebugging;
     #if NETSTANDARD1_3
     _externalObjectFinalizeCallback = ExternalObjectFinalizeCallback;
     #endif
 }
		/// <summary>
		/// Constructs an instance of the wrapper for object, that implements <see cref="IReflect"/> interface
		/// </summary>
		/// <param name="target">Target object</param>
		/// <param name="engineMode">JavaScript engine mode</param>
		public HostObject(object target, JsEngineMode engineMode)
		{
			_target = target;
			_type = target.GetType();
			_engineMode = engineMode;

			var defaultBindingFlags = BindingFlags.Instance | BindingFlags.Public;
			_fields = _type.GetFields(defaultBindingFlags);
			_properties = _type.GetProperties(defaultBindingFlags);
			_methods = _type.GetMethods(defaultBindingFlags);
		}
Exemple #9
0
        /// <summary>
        /// Constructs an instance of the ActiveScript JavaScript engine
        /// </summary>
        /// <param name="clsid">CLSID of JavaScript engine</param>
        /// <param name="engineMode">JavaScript engine mode</param>
        /// <param name="lowerIeVersion">Lowest supported version of Internet Explorer</param>
        /// <param name="languageVersion">Version of script language</param>
        /// <param name="useEcmaScript5Polyfill">Flag for whether to use the ECMAScript 5 Polyfill</param>
        /// <param name="useJson2Library">Flag for whether to use the JSON2 library</param>
        protected ActiveScriptJsEngineBase(string clsid, JsEngineMode engineMode, string lowerIeVersion,
                                           ScriptLanguageVersion languageVersion, bool useEcmaScript5Polyfill, bool useJson2Library)
        {
            _engineMode      = engineMode;
            _engineModeName  = JsEngineModeHelpers.GetModeName(engineMode);
            _documentVersion = DateTime.UtcNow.ToString("o");

            _dispatcher.Invoke(() =>
            {
                _pActiveScript = IntPtr.Zero;

                try
                {
                    _pActiveScript = ComHelpers.CreateInstanceByClsid <IActiveScript>(clsid);
                    _activeScript  = (IActiveScript)Marshal.GetObjectForIUnknown(_pActiveScript);
                }
                catch (Exception e)
                {
                    throw new JsEngineLoadException(
                        string.Format(CommonStrings.Runtime_IeJsEngineNotLoaded,
                                      _engineModeName, lowerIeVersion, e.Message), _engineModeName);
                }

                if (languageVersion != ScriptLanguageVersion.None)
                {
                    var activeScriptProperty = _activeScript as IActiveScriptProperty;
                    if (activeScriptProperty != null)
                    {
                        object scriptLanguageVersion = (int)languageVersion;
                        uint result = activeScriptProperty.SetProperty((uint)ScriptProperty.InvokeVersioning,
                                                                       IntPtr.Zero, ref scriptLanguageVersion);
                        if (result != (uint)ScriptHResult.Ok)
                        {
                            throw new JsEngineLoadException(
                                string.Format(NetFrameworkStrings.Runtime_ActiveScriptLanguageVersionSelectionFailed, languageVersion));
                        }
                    }
                }

                _activeScriptParse = new ActiveScriptParseWrapper(_pActiveScript, _activeScript);
                _activeScriptParse.InitNew();

                _pActiveScriptGarbageCollector = ComHelpers.QueryInterfaceNoThrow <IActiveScriptGarbageCollector>(_pActiveScript);
                _activeScriptGarbageCollector  = _activeScript as IActiveScriptGarbageCollector;

                _activeScript.SetScriptSite(this);
                _activeScript.SetScriptState(ScriptState.Started);

                InitScriptDispatch();
            });

            LoadResources(useEcmaScript5Polyfill, useJson2Library);
        }
        /// <summary>
        /// Constructs an instance of the Active Script engine
        /// </summary>
        /// <param name="engineMode">JS engine mode</param>
        /// <param name="enableDebugging">Flag for whether to enable script debugging features</param>
        /// <param name="useEcmaScript5Polyfill">Flag for whether to use the ECMAScript 5 Polyfill</param>
        /// <param name="useJson2Library">Flag for whether to use the JSON2 library</param>
        protected ActiveScriptJsEngineBase(JsEngineMode engineMode, bool enableDebugging,
                                           bool useEcmaScript5Polyfill, bool useJson2Library)
            : base(engineMode)
        {
            string clsid;
            string lowerIeVersion;
            ScriptLanguageVersion languageVersion;

            if (_engineMode == JsEngineMode.ChakraActiveScript)
            {
                clsid           = ClassId.Chakra;
                lowerIeVersion  = "9";
                languageVersion = ScriptLanguageVersion.EcmaScript5;
            }
            else if (_engineMode == JsEngineMode.Classic)
            {
                clsid           = ClassId.Classic;
                lowerIeVersion  = "6";
                languageVersion = ScriptLanguageVersion.None;
            }
            else
            {
                throw new NotSupportedException();
            }

            _dispatcher.Invoke(() =>
            {
                try
                {
                    _activeScriptWrapper = new ActiveScriptWrapper(clsid, languageVersion);
                }
                catch (Exception e)
                {
                    throw new JsEngineLoadException(
                        string.Format(CommonStrings.Runtime_IeJsEngineNotLoaded,
                                      _engineModeName, lowerIeVersion, e.Message), _engineModeName);
                }

                if (enableDebugging)
                {
                    StartDebugging();
                }

                _activeScriptWrapper.SetScriptSite(new ScriptSite(this));
                _activeScriptWrapper.InitNew();
                _activeScriptWrapper.SetScriptState(ScriptState.Started);

                InitScriptDispatch();
            });

            LoadResources(useEcmaScript5Polyfill, useJson2Library);
        }
Exemple #11
0
        /// <summary>
        /// Constructs instance of MSIE JavaScript engine
        /// </summary>
        /// <param name="settings">JavaScript engine settings</param>
        /// <exception cref="MsieJavaScriptEngine.JsEngineLoadException">Failed to load a JavaScript engine.</exception>
        /// <exception cref="System.NotSupportedException">Selected mode of JavaScript engine is not supported.</exception>
        public MsieJsEngine(JsEngineSettings settings)
        {
            JsEngineMode engineMode          = settings.EngineMode;
            JsEngineMode processedEngineMode = engineMode;

            if (engineMode == JsEngineMode.Auto)
            {
                if (ChakraJsRtJsEngine.IsSupported())
                {
                    processedEngineMode = JsEngineMode.ChakraJsRt;
                }
                else if (ChakraActiveScriptJsEngine.IsSupported())
                {
                    processedEngineMode = JsEngineMode.ChakraActiveScript;
                }
                else if (ClassicActiveScriptJsEngine.IsSupported())
                {
                    processedEngineMode = JsEngineMode.Classic;
                }
                else
                {
                    throw new JsEngineLoadException(Strings.Runtime_JsEnginesNotFound);
                }
            }

            switch (processedEngineMode)
            {
            case JsEngineMode.ChakraJsRt:
                _jsEngine = new ChakraJsRtJsEngine();
                break;

            case JsEngineMode.ChakraActiveScript:
                _jsEngine = new ChakraActiveScriptJsEngine();
                break;

            case JsEngineMode.Classic:
                _jsEngine = new ClassicActiveScriptJsEngine(settings.UseEcmaScript5Polyfill,
                                                            settings.UseJson2Library);
                break;

            default:
                throw new NotSupportedException(
                          string.Format(Strings.Runtime_JsEngineModeNotSupported, processedEngineMode));
            }
        }
        /// <summary>
        /// Constructs an instance of the wrapper for item, that implements <see cref="IReflect"/> interface
        /// </summary>
        /// <param name="type">Target type</param>
        /// <param name="target">Target object</param>
        /// <param name="engineMode">JavaScript engine mode</param>
        /// <param name="instance">Flag for whether to allow access to members of the instance</param>
        protected HostItemBase(Type type, object target, JsEngineMode engineMode, bool instance)
        {
            _type = type;
            _target = target;
            _engineMode = engineMode;

            BindingFlags bindingFlags = BindingFlags.Public;
            if (instance)
            {
                bindingFlags |= BindingFlags.Instance;
            }
            else
            {
                bindingFlags |= BindingFlags.Static;
            }

            _fields = _type.GetFields(bindingFlags);
            _properties = _type.GetProperties(bindingFlags);
            _methods = _type.GetMethods(bindingFlags);
        }
Exemple #13
0
        /// <summary>
        /// Constructs an instance of the wrapper for item, that implements <see cref="IReflect"/> interface
        /// </summary>
        /// <param name="type">Target type</param>
        /// <param name="target">Target object</param>
        /// <param name="engineMode">JavaScript engine mode</param>
        /// <param name="instance">Flag for whether to allow access to members of the instance</param>
        protected HostItemBase(Type type, object target, JsEngineMode engineMode, bool instance)
        {
            _type       = type;
            _target     = target;
            _engineMode = engineMode;

            BindingFlags bindingFlags = BindingFlags.Public;

            if (instance)
            {
                bindingFlags |= BindingFlags.Instance;
            }
            else
            {
                bindingFlags |= BindingFlags.Static;
            }

            _fields     = _type.GetFields(bindingFlags);
            _properties = _type.GetProperties(bindingFlags);
            _methods    = _type.GetMethods(bindingFlags);
        }
		/// <summary>
		/// Makes a mapping of value from the host type to a script type
		/// </summary>
		/// <param name="value">The source value</param>
		/// <param name="engineMode">JavaScript engine mode</param>
		/// <returns>The mapped value</returns>
		public static object MapToScriptType(object value, JsEngineMode engineMode)
		{
			if (value == null)
			{
				return DBNull.Value;
			}

			if (value is Undefined)
			{
				return null;
			}

			if (TypeConverter.IsPrimitiveType(value.GetType()))
			{
				return value;
			}

			var result = new HostObject(value, engineMode);

			return result;
		}
Exemple #15
0
        /// <summary>
        /// Makes a mapping of value from the host type to a script type
        /// </summary>
        /// <param name="value">The source value</param>
        /// <param name="engineMode">JavaScript engine mode</param>
        /// <returns>The mapped value</returns>
        public static object MapToScriptType(object value, JsEngineMode engineMode)
        {
            if (value == null)
            {
                return(DBNull.Value);
            }

            if (value is Undefined)
            {
                return(null);
            }

            if (TypeConverter.IsPrimitiveType(value.GetType()))
            {
                return(value);
            }

            var result = new HostObject(value, engineMode);

            return(result);
        }
		public static string GetModeName(JsEngineMode mode)
		{
			string modeName;

			switch (mode)
			{
				case JsEngineMode.Classic:
					modeName = "Classic";
					break;
				case JsEngineMode.ChakraActiveScript:
					modeName = "Chakra ActiveScript";
					break;
				case JsEngineMode.ChakraIeJsRt:
					modeName = "Chakra IE JsRT";
					break;
				case JsEngineMode.ChakraEdgeJsRt:
					modeName = "Chakra Edge JsRT";
					break;
				default:
					throw new NotSupportedException();
			}

			return modeName;
		}
Exemple #17
0
        /// <summary>
        /// Constructs instance of MSIE JavaScript engine
        /// </summary>
        /// <param name="settings">JavaScript engine settings</param>
        /// <exception cref="MsieJavaScriptEngine.JsEngineLoadException">Failed to load a JavaScript engine.</exception>
        /// <exception cref="System.NotSupportedException">Selected mode of JavaScript engine is not supported.</exception>
        public MsieJsEngine(JsEngineSettings settings)
        {
            JsEngineMode engineMode          = settings.EngineMode;
            JsEngineMode processedEngineMode = engineMode;

            if (engineMode == JsEngineMode.Auto)
            {
                if (ChakraEdgeJsRtJsEngine.IsSupported())
                {
                    processedEngineMode = JsEngineMode.ChakraEdgeJsRt;
                }
                else if (ChakraIeJsRtJsEngine.IsSupported())
                {
                    processedEngineMode = JsEngineMode.ChakraIeJsRt;
                }
#if !NETSTANDARD1_3
                else if (ChakraActiveScriptJsEngine.IsSupported())
                {
                    processedEngineMode = JsEngineMode.ChakraActiveScript;
                }
                else if (ClassicActiveScriptJsEngine.IsSupported())
                {
                    processedEngineMode = JsEngineMode.Classic;
                }
#endif
                else
                {
                    throw new JsEngineLoadException(
#if NETSTANDARD1_3
                              NetCoreStrings.Runtime_JsEnginesNotFound
#else
                              NetFrameworkStrings.Runtime_JsEnginesNotFound
#endif
                              );
                }
            }

            lock (_creationSynchronizer)
            {
                JsEngineMode previousMode = _currentMode;

                switch (processedEngineMode)
                {
                case JsEngineMode.ChakraEdgeJsRt:
                    if (previousMode != JsEngineMode.ChakraIeJsRt &&
                        previousMode != JsEngineMode.ChakraActiveScript)
                    {
                        _jsEngine = new ChakraEdgeJsRtJsEngine(settings.EnableDebugging);
                    }
                    else if (previousMode == JsEngineMode.ChakraIeJsRt)
                    {
                        throw new JsEngineLoadException(
                                  string.Format(
                                      CommonStrings.Runtime_JsEnginesConflictInProcess,
                                      JsEngineModeHelpers.GetModeName(processedEngineMode),
                                      JsEngineModeHelpers.GetModeName(previousMode)
                                      )
                                  );
                    }
                    else if (previousMode == JsEngineMode.ChakraActiveScript)
                    {
                        throw new JsEngineLoadException(
                                  string.Format(
                                      CommonStrings.Runtime_JsEnginesConflictInProcess,
                                      JsEngineModeHelpers.GetModeName(processedEngineMode),
                                      JsEngineModeHelpers.GetModeName(previousMode)
                                      )
                                  );
                    }

                    break;

                case JsEngineMode.ChakraIeJsRt:
                    if (previousMode != JsEngineMode.ChakraEdgeJsRt)
                    {
                        _jsEngine = new ChakraIeJsRtJsEngine(settings.EnableDebugging);
                    }
                    else
                    {
                        throw new JsEngineLoadException(
                                  string.Format(
                                      CommonStrings.Runtime_JsEnginesConflictInProcess,
                                      JsEngineModeHelpers.GetModeName(processedEngineMode),
                                      JsEngineModeHelpers.GetModeName(previousMode)
                                      )
                                  );
                    }

                    break;

                case JsEngineMode.ChakraActiveScript:
#if !NETSTANDARD1_3
                    if (previousMode != JsEngineMode.ChakraEdgeJsRt)
                    {
                        _jsEngine = new ChakraActiveScriptJsEngine();
                    }
                    else
                    {
                        throw new JsEngineLoadException(
                                  string.Format(
                                      CommonStrings.Runtime_JsEnginesConflictInProcess,
                                      JsEngineModeHelpers.GetModeName(processedEngineMode),
                                      JsEngineModeHelpers.GetModeName(previousMode)
                                      )
                                  );
                    }

                    break;
#else
                    throw new NotSupportedException(
                              string.Format(NetCoreStrings.Runtime_JsEngineModeNotCompatibleWithNetCore, processedEngineMode));
#endif
                case JsEngineMode.Classic:
#if !NETSTANDARD1_3
                    _jsEngine = new ClassicActiveScriptJsEngine(settings.UseEcmaScript5Polyfill,
                                                                settings.UseJson2Library);

                    break;
#else
                    throw new NotSupportedException(
                              string.Format(NetCoreStrings.Runtime_JsEngineModeNotCompatibleWithNetCore, processedEngineMode));
#endif
                default:
                    throw new NotSupportedException(
                              string.Format(CommonStrings.Runtime_JsEngineModeNotSupported, processedEngineMode));
                }

                _currentMode = processedEngineMode;
            }
        }
 /// <summary>
 /// Constructs an instance of the wrapper for object, that implements <see cref="IReflect"/> interface
 /// </summary>
 /// <param name="target">Target object</param>
 /// <param name="engineMode">JavaScript engine mode</param>
 public HostObject(object target, JsEngineMode engineMode)
     : base(target.GetType(), target, engineMode, true)
 {
 }
Exemple #19
0
 /// <summary>
 /// Makes a mapping of array items from the host type to a script type
 /// </summary>
 /// <param name="args">The source array</param>
 /// <param name="engineMode">JavaScript engine mode</param>
 /// <returns>The mapped array</returns>
 public static object[] MapToScriptType(object[] args, JsEngineMode engineMode)
 {
     return(args.Select(arg => MapToScriptType(arg, engineMode)).ToArray());
 }
		/// <summary>
		/// Makes a mapping of array items from the host type to a script type
		/// </summary>
		/// <param name="args">The source array</param>
		/// <param name="engineMode">JavaScript engine mode</param>
		/// <returns>The mapped array</returns>
		public static object[] MapToScriptType(object[] args, JsEngineMode engineMode)
		{
			return args.Select(arg => MapToScriptType(arg, engineMode)).ToArray();
		}
 /// <summary>
 /// Constructs an instance of the wrapper for object, that implements <see cref="IReflect"/> interface
 /// </summary>
 /// <param name="target">Target object</param>
 /// <param name="engineMode">JavaScript engine mode</param>
 public HostObject(object target, JsEngineMode engineMode)
     : base(target.GetType(), target, engineMode, true)
 {
 }
 /// <summary>
 /// Constructs an instance of the wrapper for type, that implements <see cref="IReflect"/> interface
 /// </summary>
 /// <param name="type">Target type</param>
 /// <param name="engineMode">JavaScript engine mode</param>
 public HostType(Type type, JsEngineMode engineMode)
     : base(type, null, engineMode, false)
 {
 }
Exemple #23
0
 /// <summary>
 /// Constructs instance of MSIE JavaScript engine
 /// </summary>
 /// <param name="engineMode">JavaScript engine mode</param>
 /// <exception cref="MsieJavaScriptEngine.JsEngineLoadException">Failed to load a JavaScript engine.</exception>
 /// <exception cref="System.NotSupportedException">Selected mode of JavaScript engine is not supported.</exception>
 public MsieJsEngine(JsEngineMode engineMode)
     : this(engineMode, false)
 {
 }
		/// <summary>
		/// Constructs instance of the Chakra JsRT JavaScript engine
		/// </summary>
		/// <param name="engineMode">JavaScript engine mode</param>
		/// <param name="enableDebugging">Flag for whether to enable script debugging features</param>
		protected ChakraJsRtJsEngineBase(JsEngineMode engineMode, bool enableDebugging)
		{
			_engineMode = engineMode;
			_engineModeName = JsEngineModeHelpers.GetModeName(engineMode);
			_enableDebugging = enableDebugging;
		}
Exemple #25
0
 /// <summary>
 /// Constructs instance of MSIE JavaScript engine
 /// </summary>
 /// <param name="engineMode">JavaScript engine mode</param>
 /// <param name="useEcmaScript5Polyfill">Flag for whether to use the ECMAScript 5 Polyfill</param>
 /// <exception cref="MsieJavaScriptEngine.JsEngineLoadException">Failed to load a JavaScript engine.</exception>
 /// <exception cref="System.NotSupportedException">Selected mode of JavaScript engine is not supported.</exception>
 public MsieJsEngine(JsEngineMode engineMode, bool useEcmaScript5Polyfill)
     : this(engineMode, useEcmaScript5Polyfill, false)
 {
 }
 /// <summary>
 /// Constructs an instance of the wrapper for type, that implements <see cref="IReflect"/> interface
 /// </summary>
 /// <param name="type">Target type</param>
 /// <param name="engineMode">JavaScript engine mode</param>
 public HostType(Type type, JsEngineMode engineMode)
     : base(type, null, engineMode, false)
 {
 }
 /// <summary>
 /// Constructs an instance of the inner JS engine
 /// </summary>
 /// <param name="engineMode">JS engine mode</param>
 protected InnerJsEngineBase(JsEngineMode engineMode)
 {
     _engineMode     = engineMode;
     _engineModeName = JsEngineModeHelpers.GetModeName(engineMode);
 }