Example #1
0
        /// <summary>
        /// Ensures that some engines have been registered with JavaScriptEngineSwitcher. IF not,
        /// registers some default engines.
        /// </summary>
        /// <param name="jsEngineSwitcher">JavaScript Engine Switcher instance</param>
        /// <param name="allowMsie">Whether to allow the MSIE JS engine</param>
        private static void EnsureJsEnginesRegistered(JsEngineSwitcher jsEngineSwitcher, bool allowMsie)
        {
            if (jsEngineSwitcher.EngineFactories.Any())
            {
                // Engines have been registered, nothing to do here!
                return;
            }

            Trace.WriteLine(
                "No JavaScript engines were registered, falling back to a default config! It is " +
                "recommended that you configure JavaScriptEngineSwitcher in your app. See " +
                "https://github.com/Taritsyn/JavaScriptEngineSwitcher/wiki/Registration-of-JS-engines " +
                "for more information."
                );

#if NET40
            jsEngineSwitcher.EngineFactories.AddV8();
#endif
            jsEngineSwitcher.EngineFactories.AddVroom();
            if (allowMsie)
            {
                jsEngineSwitcher.EngineFactories.AddMsie();
            }
#if !NET40
            jsEngineSwitcher.EngineFactories.AddChakraCore();
#endif
        }
Example #2
0
        static void Main(string[] args)
        {
            JsEngineSwitcher engineSwitcher = JsEngineSwitcher.Instance;

            engineSwitcher.EngineFactories
            .AddEFFCChakraCore()
            .AddEFFCVroom(new EFFCVroomSettings
            {
                MaxYoungSpaceSize = 4194304,
                MaxOldSpaceSize   = 8388608
            });;
            engineSwitcher.DefaultEngineName = EFFCVroomJsEngine.EngineName;
            using (var js = engineSwitcher.CreateDefaultEngine())
            {
                js.Evaluate(@"var out={
$acttype : 'Delete',
$table : 'FunctionInfo',
$where : {
    $or:[{
        FunctionNo:'1'
    },
    {
        ParentNo:'1'
    },
    ]
}
}
");
                var re = js.GetVariableValue("out");
            }
        }
        public void ShouldThrowIfJsEngineFails()
        {
            const string defaultEngineName = "DefaultEngine";

            var defaultEngineFactory = new Mock <IJsEngineFactory>();

            defaultEngineFactory.Setup(x => x.EngineName).Returns(defaultEngineName);
            defaultEngineFactory.Setup(x => x.CreateEngine()).Throws(new JsEngineLoadException("This is a custom JS engine load error."));

            var cache  = new Mock <ICache>();
            var config = new Mock <IReactSiteConfiguration>();

            config.Setup(x => x.ScriptsWithoutTransform).Returns(new List <string>());
            config.Setup(x => x.LoadReact).Returns(true);

            var fileSystem     = new Mock <IFileSystem>();
            var engineSwitcher = new JsEngineSwitcher(
                new JsEngineFactoryCollection
            {
                defaultEngineFactory.Object,
            },
                string.Empty
                );

            var caughtException = Assert.Throws <ReactEngineNotFoundException>(() =>
            {
                var factory = new JavaScriptEngineFactory(engineSwitcher, config.Object, cache.Object,
                                                          fileSystem.Object);
                factory.GetEngineForCurrentThread();
            });

            Assert.Contains("This is a custom JS engine load error", caughtException.Message);
        }
        static void AddJsEngineByName(JsEngineSwitcher engineSwitcher, string engineName)
        {
            engineSwitcher.EngineFactories.Clear();

            switch (engineName)
            {
            case JurassicJsEngine.EngineName:
                engineSwitcher.EngineFactories.AddJurassic();
                break;

            case JintJsEngine.EngineName:
                engineSwitcher.EngineFactories.AddJint();
                break;

            case MsieJsEngine.EngineName:
                engineSwitcher.EngineFactories.AddMsie();
                break;

            case ChakraCoreJsEngine.EngineName:
                engineSwitcher.EngineFactories.AddChakraCore();
                break;

            case V8JsEngine.EngineName:
                engineSwitcher.EngineFactories.AddV8();
                break;
            }
        }
        public void ShouldReturnDefaultEngine()
        {
            const string someEngineName      = "SomeEngine";
            const string defaultEngineName   = "DefaultEngine";
            const string someOtherEngineName = "SomeOtherEngine";

            var someEngineFactory = new Mock <IJsEngineFactory>();

            someEngineFactory.Setup(x => x.EngineName).Returns(someEngineName);
            someEngineFactory.Setup(x => x.CreateEngine()).Returns(() =>
            {
                var someEngine = new Mock <IJsEngine>();
                someEngine.Setup(x => x.Name).Returns(someEngineName);
                return(someEngine.Object);
            });

            var defaultEngineFactory = new Mock <IJsEngineFactory>();

            defaultEngineFactory.Setup(x => x.EngineName).Returns(defaultEngineName);
            defaultEngineFactory.Setup(x => x.CreateEngine()).Returns(() =>
            {
                var defaultEngine = new Mock <IJsEngine>();
                defaultEngine.Setup(x => x.Name).Returns(defaultEngineName);
                return(defaultEngine.Object);
            });

            var someOtherEngineFactory = new Mock <IJsEngineFactory>();

            someOtherEngineFactory.Setup(x => x.EngineName).Returns(someOtherEngineName);
            someOtherEngineFactory.Setup(x => x.CreateEngine()).Returns(() =>
            {
                var someOtherEngine = new Mock <IJsEngine>();
                someOtherEngine.Setup(x => x.Name).Returns(someOtherEngineName);
                return(someOtherEngine.Object);
            });

            var config = new Mock <IReactSiteConfiguration>();

            config.Setup(x => x.ScriptsWithoutTransform).Returns(new List <string>());
            config.Setup(x => x.LoadReact).Returns(true);

            var cache          = new Mock <ICache>();
            var fileSystem     = new Mock <IFileSystem>();
            var engineSwitcher = new JsEngineSwitcher(
                new JsEngineFactoryCollection
            {
                someEngineFactory.Object,
                defaultEngineFactory.Object,
                someOtherEngineFactory.Object
            },
                defaultEngineName
                );

            var factory = new JavaScriptEngineFactory(engineSwitcher, config.Object, cache.Object,
                                                      fileSystem.Object);
            var engine = factory.GetEngineForCurrentThread();

            Assert.Equal(defaultEngineName, engine.Name);
        }
Example #6
0
        public static void Configure(JsEngineSwitcher engineSwitcher)
        {
            var v8ef = new V8JsEngineFactory();

            engineSwitcher.EngineFactories.Add(v8ef);

            engineSwitcher.DefaultEngineName = v8ef.EngineName;
        }
Example #7
0
        // For more information on bundling, visit https://go.microsoft.com/fwlink/?LinkId=301862
        public static void RegisterBundles(BundleCollection bundles)
        {
            JsEngineSwitcher engineSwitcher = JsEngineSwitcher.Instance;

            engineSwitcher.EngineFactories.AddMsie();

            RegisterScriptBundles(bundles);
            RegisterStyleBundles(bundles);
        }
        public static void Configure(JsEngineSwitcher engineSwitcher)
        {
            engineSwitcher.EngineFactories
            .AddMsie(new MsieSettings
            {
                UseEcmaScript5Polyfill = true,
                UseJson2Library        = true
            });

            engineSwitcher.DefaultEngineName = MsieJsEngine.EngineName;
        }
        public static void Configure()
        {
            JsEngineSwitcher engineSwitcher = JsEngineSwitcher.Instance;

            engineSwitcher.EngineFactories
            .AddV8(new V8Settings
            {
            })
            ;
            engineSwitcher.DefaultEngineName = V8JsEngine.EngineName;
        }
        /// <summary>
        /// Adds a JS engine switcher to <see cref="IServiceCollection"/>
        /// </summary>
        /// <param name="services">The services available in the application</param>
        /// <returns>Instance of <see cref="JsEngineFactoryCollection" /></returns>
        public static JsEngineFactoryCollection AddJsEngineSwitcher(this IServiceCollection services)
        {
            if (services == null)
            {
                throw new ArgumentNullException("services");
            }

            JsEngineSwitcher engineSwitcher = JsEngineSwitcher.Instance;

            services.AddSingleton(engineSwitcher);

            return(engineSwitcher.EngineFactories);
        }
Example #11
0
 private static JsEngineSwitcher GetJsEngineSwitcher()
 {
     if (JsEngineSwitcher == null)
     {
         JsEngineSwitcher engineSwitcher = JsEngineSwitcher.Current as JsEngineSwitcher;
         engineSwitcher.EngineFactories.AddJint(new JintSettings {
             StrictMode = true
         });
         //engineSwitcher.EngineFactories.AddJurassic(new JurassicSettings { StrictMode = true, });
         JsEngineSwitcher = engineSwitcher;
     }
     return(JsEngineSwitcher);
 }
Example #12
0
        public static void RegisterJsEngines()
        {
            JsEngineSwitcher engineSwitcher = JsEngineSwitcher.Instance;

            engineSwitcher.EngineFactories
            .AddV8()
            .AddMsie(new MsieSettings
            {
                UseEcmaScript5Polyfill = true,
                UseJson2Library        = true
            });

            engineSwitcher.DefaultEngineName = V8JsEngine.EngineName;
        }
        /// <summary>
        /// Gets a factory for the most appropriate JavaScript engine for the current environment.
        /// The first functioning JavaScript engine with the lowest priority will be used.
        /// </summary>
        /// <returns>Function to create JavaScript engine</returns>
        private static Func <IJsEngine> GetFactory(JsEngineSwitcher jsEngineSwitcher, bool allowMsie)
        {
            EnsureJsEnginesRegistered(jsEngineSwitcher, allowMsie);
            foreach (var engineFactory in jsEngineSwitcher.EngineFactories)
            {
                IJsEngine engine = null;
                try
                {
                    engine = engineFactory.CreateEngine();
                    if (EngineIsUsable(engine, allowMsie))
                    {
                        // Success! Use this one.
                        return(engineFactory.CreateEngine);
                    }
                }
                catch (Exception ex)
                {
                    // This engine threw an exception, try the next one
                    Trace.WriteLine(string.Format("Error initialising {0}: {1}", engineFactory, ex));
                }
                finally
                {
                    if (engine != null)
                    {
                        engine.Dispose();
                    }
                }
            }

            // Epic fail, none of the engines worked. Nothing we can do now.
            // Throw an error relevant to the engine they should be able to use.
#if NET40
            if (JavaScriptEngineUtils.EnvironmentSupportsClearScript())
            {
                JavaScriptEngineUtils.EnsureEngineFunctional <V8JsEngine, ClearScriptV8InitialisationException>(
                    ex => new ClearScriptV8InitialisationException(ex)
                    );
            }
#endif
#if NET40 || NETSTANDARD1_6
            if (JavaScriptEngineUtils.EnvironmentSupportsVroomJs())
            {
                JavaScriptEngineUtils.EnsureEngineFunctional <VroomJsEngine, VroomJsInitialisationException>(
                    ex => new VroomJsInitialisationException(ex.Message)
                    );
            }
#endif
            throw new ReactEngineNotFoundException();
        }
Example #14
0
        public static void Configure()
        {
            JsEngineSwitcher engineSwitcher = JsEngineSwitcher.Instance;

            engineSwitcher.EngineFactories
            .AddV8()
            .AddChakraCore();

            engineSwitcher.DefaultEngineName = V8JsEngine.EngineName;

            ReactSiteConfiguration.Configuration
            .SetLoadBabel(false)
            .SetLoadReact(false)
            .AddScriptWithoutTransform("~/js/server.js");
        }
Example #15
0
        public void RegisterBundles(BundleCollection bundles)
        {
            JsEngineSwitcher engineSwitcher = JsEngineSwitcher.Instance;

            engineSwitcher.EngineFactories.AddMsie(new MsieSettings
            {
                UseEcmaScript5Polyfill = true,
                UseJson2Library        = true
            });

            engineSwitcher.DefaultEngineName = MsieJsEngine.EngineName;

            bundles.UseCdn = true;
            BundleTable.EnableOptimizations =
                Sitecore.Configuration.Settings.GetBoolSetting("BundleTableEnableOptimizations", true);
            BundleResolver.Current = new CustomBundleResolver();

            // JS Bundle
            bundles.Add(new ScriptBundle("~/bundles/js").Include("~/Assets/js/jquery.validate*",
                                                                 "~/Assets/js/modernizr-*",
                                                                 "~/Assets/js/app.js"));

            //Rasmussen Bundle
            bundles.Add(new ScriptBundle("~/bundles/js/rasmussen").
                        Include("~/Assets/dev/js/common.js"));
            //can add more "~/Assets/dev/js/header.js"));

            //Backend JS Bundles

            //This Bundle is used on following components :
            //1. PageNavigation.cshtml
            bundles.Add(new ScriptBundle("~/bundles/js/pagenavigation").Include("~/Assets/dev/js/PageNavigation.js"));

            //This Bundle is used on following components :
            //1. VerticalTabComponent.cshtml
            bundles.Add(new ScriptBundle("~/bundles/js/verticalnav").Include("~/Assets/dev/js/VerticalTabs.js"));

            // CSS Bundle
            //CSS Bundle for Rasmussen
            var rasStyleBundle =
                new Bundle("~/bundles/css").Include("~/Assets/css/app.css", new CssRewriteUrlFixedTransform());

            rasStyleBundle.Builder = new NullBuilder();
            rasStyleBundle.Transforms.Add(new StyleTransformer());
            rasStyleBundle.Orderer = new NullOrderer();
            rasStyleBundle.Transforms.Add(new CssMinify());
            bundles.Add(rasStyleBundle);
        }
Example #16
0
        public static void Configure(JsEngineSwitcher engineSwitcher)
        {
            engineSwitcher.EngineFactories
            .AddChakraCore()
            .AddJint()
            .AddJurassic()
            .AddMsie(new MsieSettings
            {
                UseEcmaScript5Polyfill = true,
                UseJson2Library        = true
            })
            .AddV8()
            ;

            engineSwitcher.DefaultEngineName = ChakraCoreJsEngine.EngineName;
        }
Example #17
0
        public void ShouldThrowIfDefaultEngineFactoryNotFound()
        {
            const string someEngineName      = "SomeEngine";
            const string defaultEngineName   = "DefaultEngine";
            const string someOtherEngineName = "SomeOtherEngine";

            var someEngineFactory = new Mock <IJsEngineFactory>();

            someEngineFactory.Setup(x => x.EngineName).Returns(someEngineName);
            someEngineFactory.Setup(x => x.CreateEngine()).Returns(() =>
            {
                var someEngine = new Mock <IJsEngine>();
                someEngine.Setup(x => x.Name).Returns(someEngineName);
                return(someEngine.Object);
            });

            var someOtherEngineFactory = new Mock <IJsEngineFactory>();

            someOtherEngineFactory.Setup(x => x.EngineName).Returns(someOtherEngineName);
            someOtherEngineFactory.Setup(x => x.CreateEngine()).Returns(() =>
            {
                var someOtherEngine = new Mock <IJsEngine>();
                someOtherEngine.Setup(x => x.Name).Returns(someOtherEngineName);
                return(someOtherEngine.Object);
            });

            var config = new Mock <IReactSiteConfiguration>();

            config.Setup(x => x.ScriptsWithoutTransform).Returns(new List <string>());
            config.Setup(x => x.LoadReact).Returns(true);

            var fileSystem     = new Mock <IFileSystem>();
            var engineSwitcher = new JsEngineSwitcher(
                new JsEngineFactoryCollection
            {
                someEngineFactory.Object,
                someOtherEngineFactory.Object
            },
                defaultEngineName
                );

            Assert.Throws <ReactEngineNotFoundException>(() =>
            {
                var factory = new JavaScriptEngineFactory(engineSwitcher, config.Object, fileSystem.Object);
            });
        }
Example #18
0
        /// <summary>
        /// Initializes a new instance of the <see cref="JavaScriptEngineFactory"/> class.
        /// </summary>
        public JavaScriptEngineFactory(
            JsEngineSwitcher jsEngineSwitcher,
            IReactSiteConfiguration config,
            IFileSystem fileSystem
            )
        {
            _jsEngineSwitcher = jsEngineSwitcher;
            _config           = config;
            _fileSystem       = fileSystem;
#pragma warning disable 618
            _factory = GetFactory(_jsEngineSwitcher, config.AllowMsieEngine);
#pragma warning restore 618
            if (_config.ReuseJavaScriptEngines)
            {
                _pool = CreatePool();
            }
        }
        public static void Initialize()
        {
            if (!_initialized)
            {
                lock (_synchronizer)
                {
                    if (!_initialized)
                    {
                        JsEngineSwitcher engineSwitcher = JsEngineSwitcher.Instance;
                        engineSwitcher.EngineFactories
                        .AddMsie()
                        ;
                        engineSwitcher.DefaultEngineName = MsieJsEngine.EngineName;

                        _initialized = true;
                    }
                }
            }
        }
Example #20
0
        private JavaScriptEngineFactory CreateFactory(
            Mock <IReactSiteConfiguration> config,
            Mock <IFileSystem> fileSystem,
            Func <IJsEngine> innerEngineFactory
            )
        {
            var engineFactory = new Mock <IJsEngineFactory>();

            engineFactory.Setup(x => x.EngineName).Returns("MockEngine");
            engineFactory.Setup(x => x.CreateEngine()).Returns(innerEngineFactory);

            var engineSwitcher = new JsEngineSwitcher(
                new JsEngineFactoryCollection {
                engineFactory.Object
            },
                string.Empty
                );

            return(new JavaScriptEngineFactory(engineSwitcher, config.Object, fileSystem.Object));
        }
Example #21
0
        public void ShouldThrowIfNoEnginesRegistered()
        {
            var config     = new Mock <IReactSiteConfiguration>();
            var fileSystem = new Mock <IFileSystem>();

            config.Setup(x => x.ScriptsWithoutTransform).Returns(new List <string>());
            config.Setup(x => x.LoadReact).Returns(true);

            var engineSwitcher = new JsEngineSwitcher(
                new JsEngineFactoryCollection(),
                string.Empty
                );

            var caughtException = Assert.Throws <ReactException>(() =>
            {
                new JavaScriptEngineFactory(engineSwitcher, config.Object, fileSystem.Object);
            });

            Assert.Contains("No JS engines were registered", caughtException.Message);
        }
Example #22
0
 public AfishaJavaScriptEngineFactory(JsEngineSwitcher engineSwitcher, IReactSiteConfiguration config, IFileSystem fileSystem) : base(engineSwitcher, config, fileSystem)
 {
 }
 /// <summary>
 /// Gets a Jint JavaScript engine configuration settings
 /// </summary>
 /// <param name="switcher">JavaScript engine switcher</param>>
 /// <returns>Configuration settings of Jint JavaScript engine</returns>
 public static JintConfiguration GetJintConfiguration(this JsEngineSwitcher switcher)
 {
     return(_jintConfig.Value);
 }
 public JsEvaluationService(JsEngineSwitcher engineSwitcher)
 {
     _engineSwitcher = engineSwitcher;
 }
Example #25
0
 /// <summary>
 /// Gets a MSIE JavaScript engine configuration settings
 /// </summary>
 /// <param name="switcher">JavaScript engine switcher</param>>
 /// <returns>Configuration settings of MSIE JavaScript engine</returns>
 public static MsieConfiguration GetMsieConfiguration(this JsEngineSwitcher switcher)
 {
     return(_msieConfig.Value);
 }
Example #26
0
 /// <summary>
 /// Gets a Jurassic JavaScript engine configuration settings
 /// </summary>
 /// <param name="switcher">JavaScript engine switcher</param>>
 /// <returns>Configuration settings of Jurassic JavaScript engine</returns>
 public static JurassicConfiguration GetJurassicConfiguration(this JsEngineSwitcher switcher)
 {
     return(_jurassicConfig.Value);
 }
 public static void Configure(JsEngineSwitcher engineSwitcher)
 {
     engineSwitcher.EngineFactories
     .AddMsie()
     ;
 }
Example #28
0
 public static void Configure(JsEngineSwitcher engineSwitcher)
 {
     engineSwitcher.EngineFactories.AddV8();
     engineSwitcher.DefaultEngineName = V8JsEngine.EngineName;
 }
 /// <summary>
 /// Gets a V8 JavaScript engine configuration settings
 /// </summary>
 /// <param name="switcher">JavaScript engine switcher</param>>
 /// <returns>Configuration settings of V8 JavaScript engine</returns>
 public static V8Configuration GetV8Configuration(this JsEngineSwitcher switcher)
 {
     return(_v8Config.Value);
 }