/// <summary> /// Method to use for running Javascript Files. /// </summary> /// <param name="filePath">Path to JS or JSE File</param> public void RunScript(object filePath) { try { /* CODIGO JINTENGINE VIEJO Engine engine = new Engine(cfg => cfg.AllowClr(typeof(NinoJS.Resources.SQL).Assembly)) .SetValue("log", new Action<object>(Console.WriteLine)); engine.Execute(fileContent); */ string fileContent = new StreamReader(filePath.ToString()).ReadToEnd(); var engine = new V8ScriptEngine(V8ScriptEngineFlags.EnableDebugging); var typeCollection = new HostTypeCollection("mscorlib", "System", "System.Core", "NinoJS.Resources"); engine.AddHostObject("clr", typeCollection); engine.AddHostObject("host", new HostFunctions()); engine.AddHostObject("extendedHost", new ExtendedHostFunctions()); engine.AddHostObject("console", new NinoJS.Core.Helpers.Console()); engine.Execute(fileContent); } catch (Exception ex) { System.Console.WriteLine(ex.ToString()); log.LogError(ex.ToString()); } }
protected override ElementString TranslateToElementString(string sRawString, int nCardIndex, DeckLine zDeckLine, ProjectLayoutElement zElement) { using (var engine = new V8ScriptEngine()) { var sScript = GetJavaScript(nCardIndex, zDeckLine, sRawString); try { var sValue = engine.Evaluate(sScript); if (sValue is string || sValue is int) { return new ElementString() { String = sValue.ToString() }; } else { Logger.AddLogLine(sValue.GetType().ToString()); } } catch (Exception e) { Logger.AddLogLine(e.Message); } } return new ElementString() { String = string.Empty }; }
public void RunScript(string script) { Console.WriteLine("[{0}] {1} clicked Run Script", DateTime.Now, Context.ConnectionId); if (jContext == null) { jContext = new V8ScriptEngine(); jContext.AddHostObject("map", map); jContext.AddHostType("Console", typeof(Console)); } try { jContext.Evaluate(script); } catch (ScriptEngineException ex) { Clients.All.receiveMessage("JavaScript Engine:" + ex.Message + "<br>"); } foreach (var token in map.GetTokenList()) { Clients.All.onTokenMoved(token.Id, token.X, token.Y, "nobody"); } }
public IJSPlayer(string fileFullPath, ILog iLog) { this.iLog = iLog; engin = new V8ScriptEngine(); engin.Execute(File.ReadAllText(fileFullPath)); engin.AddHostObject("Console", iLog); }
public Engine() { engine = new V8ScriptEngine (V8ScriptEngineFlags.EnableDebugging); engine.AddHostObject ("dotnet", new Microsoft.ClearScript.HostTypeCollection ("mscorlib", "System.Core")); engine.AddHostType ("WinJS_KeyUtil", typeof (KeyUtil)); engine.AddHostType ("WinJS_FileUtils", typeof (FileUtils)); engine.AddHostObject ("WinJS_host", new Microsoft.ClearScript.HostFunctions ()); }
private dynamic Merge(Product site, Product user) { var engine = new V8ScriptEngine(); var underscore = File.ReadAllText("scripts/underscore.min.js"); engine.Execute(underscore); engine.Execute("function extend(thing1, thing2) { return _.extend({}, thing1, thing2) }"); var product = engine.Script.extend(site, user); return product; }
public Markdownify(Options options, RenderMethods rendereMethods, V8ScriptEngine engine) { this.engine = engine; var markedJsText = GetMarkedJsText(); engine.Execute(markedJsText); var js = GetContructionJs(options, rendereMethods); engine.Execute(js); }
public void Can_Perform_JS_ToLower_On_A_Passed_String() { using (var engine = new V8ScriptEngine(V8ScriptEngineFlags.DisableGlobalMembers)) { engine.Script.MyString = "Just a test string"; engine.AddHostType("Console", typeof(Console)); engine.Execute("Console.WriteLine ('Length of MyString = {0}', MyString.toLowerCase())"); } }
public static HtmlDocumentFacade ProcessServerSideScripts(this HtmlDocumentFacade doc) { var scripts = doc.getElementsByTagName("script"); var noSideScripts = scripts .Where(_TestForNoSide); var noSideScriptsList = noSideScripts.ToList(); noSideScriptsList.ForEach(node => { node.parentNode.removeChild(node); }); var serverSideScripts = scripts .Where(_TestForServerSide) .Where(_TestForRealScript) ; var sb = new StringBuilder(); //serverSideScripts = serverSideScripts.Where(node => string.IsNullOrEmpty(node.getAttribute(ModelAttribute))); var serverSideScriptsList = serverSideScripts.ToList(); serverSideScriptsList.ForEach(node => { string src = node.getAttribute("src"); if (string.IsNullOrEmpty(src)) { sb.AppendLine(node.innerHTML); } else { sb.AppendLine(doc.GetHostContent(src)); } if (!_TestForClientSide(node)) { node.parentNode.removeChild(node); } }); string script = sb.ToString(); if (script.Length > 0) { // Initialize a context script = sb.ToString(); using (var engine = new V8ScriptEngine()) { var jqueryFacade = new JQueryFacade(doc); engine.AddHostObject("console", new Console()); engine.AddHostObject("document", doc); engine.AddHostObject("jQueryServerSideFacade", jqueryFacade); engine.Execute("var " + modeParameter + "='server'"); if (doc.ProcessContext.Model != null) { engine.AddHostObject("model", doc.ProcessContext.Model); } engine.Execute(script); } } return doc; }
public ContentEngine(IServiceRegistry serviceRegistry, IModScriptRegistry scriptRegistry, ICEResourceService resourceService) { _serviceRegistry = serviceRegistry; _scriptRegistry = scriptRegistry; _resourceService = resourceService; _logger = MainLog.Logger; _engine = new V8ScriptEngine(V8ScriptEngineFlags.EnableDebugging); RegisterServices(); RegisterDefaultTypes(); }
public static void Main() { using (var engine = new V8ScriptEngine(typeof(ClearScriptConsole).Name, V8ScriptEngineFlags.EnableDebugging)) { engine.AddHostObject("host", new ExtendedHostFunctions()); engine.AddHostObject("lib", HostItemFlags.GlobalMembers, new HostTypeCollection("mscorlib", "System", "System.Core", "ClearScript")); engine.AllowReflection = true; RunStartupFile(engine); RunConsole(engine); } }
public void Can_Perform_JS_ToLower_On_An_Object_Property() { using (var engine = new V8ScriptEngine(V8ScriptEngineFlags.DisableGlobalMembers)) { var myObject = new {MyString = "Just a test string"}; engine.Script.MyString = "Just a test string"; engine.AddHostType("Console", typeof(Console)); engine.AddHostObject("myObject", myObject); engine.Execute("Console.WriteLine ('Length of MyString = {0}', myObject.MyString.toLowerCase())"); } }
/// <summary> /// Builds and returns a requirer to include with an engine. /// </summary> /// <param name="compiler">Compiles the required scripts if needed.</param> /// <param name="engine">The engine that will run the required script.</param> /// <returns></returns> internal static Requirer BuildRequirer(ScriptCompiler compiler, V8ScriptEngine engine) { var requirer = new Requirer { Compiler = compiler, Engine = engine }; //Need to add this as a host object to the script requirer.Engine.AddHostObject("require", new Func<string, object>(requirer.Require)); requirer.Engine.AddHostObject("requireNamed", new Func<string, string, object>(requirer.Require)); return requirer; }
public string Render(string path) { using (var engine = new V8ScriptEngine()) { Environment.CurrentDirectory = Path.GetDirectoryName(path); engine.AddHostType("externalFS", typeof(FsModule)); engine.Execute("jade.js", Resources.jade); var result = (string)engine.Script.jade.renderFile(path); return result; } }
public ClearScriptEngine(IHandlebarsResourceProvider resourceProvider) { Console.Out.WriteLine("ClearScriptEngine Loaded"); _resourceProvider = resourceProvider; _context = new V8ScriptEngine(); _context.AddHostObject("clearScriptBridge", HostItemFlags.GlobalMembers, new ClearScriptBridgeFunctions(_context, _resourceProvider)); // _context.Script.moduleLoader = new ModuleLoader(_context); // _context.Execute(File.ReadAllText("require.js")); // _context.Execute(@"require.load = function(context, name, url) { moduleLoader.LoadModuleAsync(context, name, url); };"); _context.Execute("var raw = [];"); _context.Execute("require('./Script/handlebars-1.0.0.js');"); foreach (var script in HandlebarsConfiguration.Instance.Include) { _context.Execute("require('./" + script.Source + "');"); } }
public String V8Build(String view, object modal) { String result = String.Empty; using (var engine = new V8ScriptEngine()) { engine.Execute(Juicer); engine.Script.view = view; var modal_script = "modal = " + JsonConvert.SerializeObject(modal); engine.Execute(modal_script); result = engine.Invoke("juicer", engine.Script.view, engine.Script.modal); } return result.ToString(); }
public ReflectableAssembly(Assembly assembly, V8ScriptEngine evaluator) { this.evaluator = evaluator; Assembly = assembly; }
public void PropertyBag_MultiEngine_Parallel() { // This is a torture test for ConcurrentWeakSet and general engine teardown/cleanup. // It has exposed some very tricky engine bugs. var bag = new PropertyBag(); engine.AddHostObject("bag", bag); const int threadCount = 256; var engineCount = 0; // 32-bit V8 starts failing requests to create new contexts rather quickly. This is // because each V8 isolate requires (among other things) a 32MB address space // reservation. 64-bit V8 reserves much larger blocks but benefits from the enormous // available address space. var maxV8Count = Environment.Is64BitProcess ? 128 : 16; var maxJScriptCount = (threadCount - maxV8Count) / 2; var startEvent = new ManualResetEventSlim(false); var checkpointEvent = new ManualResetEventSlim(false); var continueEvent = new ManualResetEventSlim(false); var stopEvent = new ManualResetEventSlim(false); ParameterizedThreadStart body = arg => { // ReSharper disable AccessToDisposedClosure var index = (int)arg; startEvent.Wait(); ScriptEngine scriptEngine; if (index < maxV8Count) { scriptEngine = new V8ScriptEngine(); } else if (index < (maxV8Count + maxJScriptCount)) { scriptEngine = new JScriptEngine(); } else { scriptEngine = new VBScriptEngine(); } scriptEngine.AddHostObject("bag", bag); if (Interlocked.Increment(ref engineCount) == threadCount) { checkpointEvent.Set(); } continueEvent.Wait(); scriptEngine.Dispose(); if (Interlocked.Decrement(ref engineCount) == 0) { stopEvent.Set(); } // ReSharper restore AccessToDisposedClosure }; var threads = Enumerable.Range(0, threadCount).Select(index => new Thread(body)).ToArray(); threads.ForEach((thread, index) => thread.Start(index)); startEvent.Set(); checkpointEvent.Wait(); Assert.AreEqual(threadCount + 1, bag.EngineCount); continueEvent.Set(); stopEvent.Wait(); GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); Assert.AreEqual(1, bag.EngineCount); Array.ForEach(threads, thread => thread.Join()); startEvent.Dispose(); checkpointEvent.Dispose(); continueEvent.Dispose(); stopEvent.Dispose(); }
private V8ScriptItem(V8ScriptEngine engine, IV8Object target) { this.engine = engine; this.target = target; }
public void Test() { // create a script engine using (var engine = new V8ScriptEngine(V8ScriptEngineFlags.EnableDynamicModuleImports)) { // expose a host type engine.AddHostType("Console", typeof(Console)); engine.Execute("Console.WriteLine('{0} is an interesting number.', Math.PI)"); // expose a host object engine.AddHostObject("random", new Random()); engine.Execute("Console.WriteLine(random.NextDouble())"); // expose entire assemblies engine.AddHostObject("lib", new HostTypeCollection("mscorlib", "System.Core")); engine.Execute("Console.WriteLine(lib.System.DateTime.Now)"); // create a host object from script engine.Execute(@" birthday = new lib.System.DateTime(2007, 5, 22); Console.WriteLine(birthday.ToLongDateString()); "); // use a generic class from script engine.Execute(@" Dictionary = lib.System.Collections.Generic.Dictionary; dict = new Dictionary(lib.System.String, lib.System.Int32); dict.Add('foo', 123); "); // call a host method with an output parameter engine.AddHostObject("host", new HostFunctions()); engine.Execute(@" intVar = host.newVar(lib.System.Int32); found = dict.TryGetValue('foo', intVar.out); Console.WriteLine('{0} {1}', found, intVar); "); // create and populate a host array engine.Execute(@" numbers = host.newArr(lib.System.Int32, 20); for (var i = 0; i < numbers.Length; i++) { numbers[i] = i; } Console.WriteLine(lib.System.String.Join(', ', numbers)); "); // create a script delegate engine.Execute(@" Filter = lib.System.Func(lib.System.Int32, lib.System.Boolean); oddFilter = new Filter(function(value) { return (value & 1) ? true : false; }); "); // use LINQ from script engine.Execute(@" oddNumbers = numbers.Where(oddFilter); Console.WriteLine(lib.System.String.Join(', ', oddNumbers)); "); // use a dynamic host object engine.Execute(@" expando = new lib.System.Dynamic.ExpandoObject(); expando.foo = 123; expando.bar = 'qux'; delete expando.foo; "); // call a script function engine.Execute("function print(x) { Console.WriteLine(x); }"); engine.Script.print(DateTime.Now.DayOfWeek); // examine a script object engine.Execute("person = { name: 'Fred', age: 5 }"); Console.WriteLine(engine.Script.person.name); // read a JavaScript typed array engine.Execute("values = new Int32Array([1, 2, 3, 4, 5])"); var values = (ITypedArray <int>)engine.Script.values; Console.WriteLine(string.Join(", ", values.ToArray())); } }
public void V8ScriptEngine_General_Precompiled_Dual() { engine.Dispose(); using (var runtime = new V8Runtime()) { using (var script = runtime.Compile(generalScript)) { engine = runtime.CreateScriptEngine(); using (var console = new StringWriter()) { var clr = new HostTypeCollection(type => type != typeof(Console), "mscorlib", "System", "System.Core"); clr.GetNamespaceNode("System").SetPropertyNoCheck("Console", console); engine.AddHostObject("host", new ExtendedHostFunctions()); engine.AddHostObject("clr", clr); engine.Evaluate(script); Assert.AreEqual(MiscHelpers.FormatCode(generalScriptOutput), console.ToString().Replace("\r\n", "\n")); console.GetStringBuilder().Clear(); Assert.AreEqual(string.Empty, console.ToString()); engine.Evaluate(script); Assert.AreEqual(MiscHelpers.FormatCode(generalScriptOutput), console.ToString().Replace("\r\n", "\n")); } engine.Dispose(); engine = runtime.CreateScriptEngine(); using (var console = new StringWriter()) { var clr = new HostTypeCollection(type => type != typeof(Console), "mscorlib", "System", "System.Core"); clr.GetNamespaceNode("System").SetPropertyNoCheck("Console", console); engine.AddHostObject("host", new ExtendedHostFunctions()); engine.AddHostObject("clr", clr); engine.Evaluate(script); Assert.AreEqual(MiscHelpers.FormatCode(generalScriptOutput), console.ToString().Replace("\r\n", "\n")); console.GetStringBuilder().Clear(); Assert.AreEqual(string.Empty, console.ToString()); engine.Evaluate(script); Assert.AreEqual(MiscHelpers.FormatCode(generalScriptOutput), console.ToString().Replace("\r\n", "\n")); } } } }
public void V8ScriptEngine_ResourceConstraints_Dual() { const int limit = 4 * 1024 * 1024; const string code = @"x = []; for (i = 0; i < 1024 * 1024; i++) { x.push(x); }"; engine.Execute(code); engine.CollectGarbage(true); var usedHeapSize = engine.GetRuntimeHeapInfo().UsedHeapSize; var constraints = new V8RuntimeConstraints { MaxYoungSpaceSize = limit, MaxOldSpaceSize = limit, MaxExecutableSize = limit }; engine.Dispose(); engine = new V8ScriptEngine(constraints); TestUtil.AssertException<ScriptEngineException>(() => { try { engine.Execute(code); } catch (ScriptEngineException exception) { Assert.IsTrue(exception.IsFatal); throw; } }); engine.CollectGarbage(true); Assert.IsTrue(usedHeapSize > engine.GetRuntimeHeapInfo().UsedHeapSize); }
public JavascriptView(string viewPath, JsEngine engine, V8ScriptEngine context) { _viewPath = viewPath; _engine = engine; _context = context; }
private Scene CreateScene(string script) { using (var engine = new V8ScriptEngine()) { } }
/// <summary> /// Constructor! /// </summary> public JavascriptHostObject(Dictionary <string, string> configParameters, V8ScriptEngine engine) { this.configParameters = configParameters; this.engine = engine; }
public HttpResult(V8ScriptEngine scriptEngine, HttpResponseMessage response) { this._response = response; this._scriptEngine = scriptEngine; }
private static void ConfigureJavaScriptEngine(ref V8ScriptEngine v8) { }
public ServerTester(Server server) { this.server = server; engine = new V8ScriptEngine(); engine.AddHostObject("Server", server); }
public static void _init() { m_engine = new V8ScriptEngine(); m_engine.AddHostObject("___api", new apiJS()); }
public JArray(V8ScriptEngine evaluator) : this(evaluator, null) { }
public void TestInitialize() { engine = new V8ScriptEngine(V8ScriptEngineFlags.EnableDebugging); }
public void TestSetup() { _engine = new V8ScriptEngine(); }
public void V8ScriptEngine_ErrorHandling_NestedScriptError() { var innerEngine = new V8ScriptEngine("inner", V8ScriptEngineFlags.EnableDebugging); engine.AddHostObject("engine", innerEngine); TestUtil.AssertException<ScriptEngineException>(() => { try { engine.Execute("engine.Execute('foo = {}; foo();')"); } catch (ScriptEngineException exception) { TestUtil.AssertValidException(engine, exception); Assert.IsNotNull(exception.InnerException); var hostException = exception.InnerException; Assert.IsInstanceOfType(hostException, typeof(TargetInvocationException)); TestUtil.AssertValidException(hostException); Assert.IsNotNull(hostException.InnerException); var nestedException = hostException.InnerException as ScriptEngineException; Assert.IsNotNull(nestedException); TestUtil.AssertValidException(innerEngine, nestedException); Assert.IsNull(nestedException.InnerException); Assert.AreEqual("Error: " + hostException.Message, exception.Message); throw; } }); }
/// <summary> /// configura o Helper para posterior execuçao /// </summary> /// <param name="diretorioJavascripts">Diretório onde estão os arquivos em js</param> /// <param name="setTimeout">Habilitar a função global setTimeout</param> /// <param name="setInterval">Habilitar a função global setInterval</param> private void Carregar(string diretorioJavascripts, bool setTimeout, bool setInterval) { TimedOuts = new List<IDisposable>(); _diretorioExecucao = diretorioJavascripts; _timeoutTestes = int.MaxValue; ExecutouTestesAteFinal = false; SetTimeOutLigado = setTimeout; //O manager vai compilar e cachear as bibliotecas _manager = new RuntimeManager(new ManualManagerSettings() { MaxExecutableBytes = (1000000000 * 2), RuntimeMaxCount = int.MaxValue}); _engine = _manager.GetEngine(); //RequireManager.ClearPackages(); //garantir uma execução limpa #region Ler arquivos Js _cacheCodigos = new Dictionary<string, string>(); foreach (var enumerateFile in Directory.EnumerateFiles(diretorioJavascripts, "*.js")) { _cacheCodigos.Add(Path.GetFileNameWithoutExtension(enumerateFile), File.ReadAllText(enumerateFile)); //_manager.Compile(Path.GetFileNameWithoutExtension(enumerateFile), File.ReadAllText(enumerateFile), true, int.MaxValue); } #endregion #region Configura a Engine com o JavascriptHelper e Console, Settimeout e etc FalhasDosTestes = new List<string>(); _timers = new Dictionary<int, bool>(); _engine.AddHostObject("javascriptHelper", this); _engine.Execute(@"'use strict'; function console() { if (!(this instanceof console)) { return new Console(); } } console.prototype.log = function(args, args1, args2) { javascriptHelper.Escrever(args, args1, args2); };"); _engine.Execute("var console = new console();"); _engine.Execute("var GLOBAL = this;"); _engine.Execute(@"var stFunctionsCallBack = new Array();"); if (setTimeout) { _engine.Execute(@"var setTimeout = function (funcToCall, millis) { var textoId = javascriptHelper.CurrentThreadId; var idlocal = javascriptHelper.SetTimeout(millis); stFunctionsCallBack.push(funcToCall); return idlocal; };"); _engine.Execute(@"var clearTimeout = function(id) { javascriptHelper.ClearTimeout(id);};"); } if (setInterval) { _engine.Execute(@"var setInterval = function (funcToCall, millis) { var idlocal = javascriptHelper.SetTimeout(millis); var funcaoTimeout = function() { funcToCall(); setTimeout(funcToCall, millis); }; stFunctionsCallBack.push(funcaoTimeout); return idlocal; };"); _engine.Execute(@"var clearInterval = function(id) { javascriptHelper.ClearTimeout(id);};"); } #endregion }
public static void Init(V8ScriptEngine engine) { _createJsArray = engine.Evaluate(@" (function (list) { var array = []; for (var i = 0; i < list.Length; i++){ array.push(list[i]); } return array; }).valueOf() "); _createJsByteArray = engine.Evaluate(@" (function (length) { var array = new Uint8Array(length); return array; }).valueOf() "); _createJSPromise = engine.Evaluate(@" (function (action) { return new Promise((resolve, reject) => { action(resolve, reject); }); }).valueOf() "); _createJSObject = engine.Evaluate(@" (function (list) { var obj = {}; for (var i = 0; i < list.Count; i++){ obj[list[i].Key] = list[i].Value; } return obj; }).valueOf() "); _createJSObjectArray = engine.Evaluate(@" (function (json) { return JSON.parse(json); }).valueOf() "); _fillDictionary = engine.Evaluate(@" (function (obj, dict) { for(var key in obj){ dict.Add(key, obj[key]); } }).valueOf() "); _getStack = engine.Evaluate(@" (function() { // Save original Error.prepareStackTrace var origPrepareStackTrace = Error.prepareStackTrace // Override with function that just returns `stack` Error.prepareStackTrace = function (_, stack) { return stack } // Create a new `Error`, which automatically gets `stack` var err = new Error() // Evaluate `err.stack`, which calls our new `Error.prepareStackTrace` var stack = err.stack // Restore original `Error.prepareStackTrace` Error.prepareStackTrace = origPrepareStackTrace // Remove superfluous function call on stack stack.shift() // getStack --> Error return stack }).valueOf() "); }
public V8EngineSession() { logFilePath = Path.Combine(Path.GetTempPath(), "V8Enginelog.log"); m_currentScriptName = GetRandomScriptTargetName(); var debuggingPort = PortUtilities.FindFreePort(IPAddress.Loopback); m_scriptEngine = new V8ScriptEngine(V8ScriptEngineFlags.DisableGlobalMembers | V8ScriptEngineFlags.EnableDebugging, debuggingPort) { AllowReflection = false, }; m_scriptEngine.AddHostObject("host", new HostFunctions()); m_scriptEngine.AddHostObject("lib", new HostTypeCollection("mscorlib", "System.Core")); m_scriptEngine.AddHostObject("winform", new HostTypeCollection("System.Windows.Forms")); portUri = new Uri("tcp://127.0.0.1:"+debuggingPort); m_tcpClient = new TcpClient(portUri.Host, portUri.Port); Connect(); }
public static object Wrap(V8ScriptEngine engine, object obj) { Debug.Assert(!(obj is IScriptMarshalWrapper)); if (obj == null) { return null; } var target = obj as IV8Object; if (target != null) { return new V8ScriptItem(engine, target); } return obj; }
public void Cleanup() { if (_scriptEngine != null) { _scriptEngine.Dispose(); _scriptEngine = null; } }
public void PropertyBag_MultiEngine_HostFunctions() { using (var scriptEngine = new V8ScriptEngine(V8ScriptEngineFlags.EnableDebugging)) { const string code = "bag.host.func(0, function () { return bag.func(); })"; var bag = new PropertyBag { { "host", new HostFunctions() }, { "func", new Func<object>(() => ScriptEngine.Current) } }; engine.AddHostObject("bag", bag); scriptEngine.AddHostObject("bag", bag); var func = (Func<object>)engine.Evaluate(code); Assert.AreSame(engine, func()); func = (Func<object>)scriptEngine.Evaluate(code); Assert.AreSame(scriptEngine, func()); } }
internal void InjectFuncs(V8ScriptEngine context) { //context.AddHostObject("module.import", new Func<string,DynamicObject>(ImportModule)); }
public Async(V8ScriptEngine evaluator) { this.evaluator = evaluator; }
private JsScriptRunner(JsScriptRunnerType type, object scriptingContext = null, string contextName = null) { if (!(scriptingContext is null) && contextName is null) { throw new ArgumentNullException(nameof(contextName)); } ScriptingContext = scriptingContext; Type = type; switch (type) { case JsScriptRunnerType.Jint: { // engine settings: // strict mode https://stackoverflow.com/a/34302448 https://stackoverflow.com/questions/34301881/should-i-use-strict-for-every-single-javascript-function-i-write JintEngine = new Engine(cfg => cfg.Strict(true)); //JintEngine = new Engine(); if (!(scriptingContext is null)) { JintEngine.SetValue(contextName, scriptingContext); // pass 'scriptingConnector' to Js } break; } case JsScriptRunnerType.ClearScript: { //ClearScriptEngine = new V8ScriptEngine(); //ClearScriptEngine = new V8ScriptEngine(V8ScriptEngineFlags.EnableDateTimeConversion); ClearScriptEngine = new V8ScriptEngine(V8ScriptEngineFlags.EnableDateTimeConversion | V8ScriptEngineFlags.DisableGlobalMembers); ClearScriptEngine.AllowReflection = false; //ClearScriptEngine.DefaultAccess = Microsoft.ClearScript.ScriptAccess.Full; //ClearScriptEngine.DefaultAccess = Microsoft.ClearScript.ScriptAccess.None; if (!(scriptingContext is null)) { ClearScriptEngine.AddHostObject(contextName, scriptingContext); // pass 'scriptingConnector' to Js } break; } case JsScriptRunnerType.ClearScriptDebugMode: { ClearScriptEngine = new V8ScriptEngine(V8ScriptEngineFlags.EnableDateTimeConversion | V8ScriptEngineFlags.DisableGlobalMembers | V8ScriptEngineFlags.EnableDebugging | V8ScriptEngineFlags.AwaitDebuggerAndPauseOnStart); /* ClearScriptEngine = new V8ScriptEngine(V8ScriptEngineFlags.EnableDateTimeConversion | V8ScriptEngineFlags.DisableGlobalMembers | V8ScriptEngineFlags.EnableDebugging | V8ScriptEngineFlags.EnableRemoteDebugging | V8ScriptEngineFlags.AwaitDebuggerAndPauseOnStart);*/ ClearScriptEngine.AllowReflection = false; if (!(scriptingContext is null)) { ClearScriptEngine.AddHostObject(contextName, scriptingContext); // pass 'scriptingConnector' to Js } break; } } }
public static void Colorify(List <LabelledLogTraceExt> traces, List <LogLabel> activeRules) { var sw = Stopwatch.StartNew(); foreach (var trace in traces) { trace.Compile(); } using (var v8 = new V8ScriptEngine()) { int colorifiedOnClientCount = 0; int colorifiedOnServerCount = 0; v8.AddHostType("Console", typeof(Console)); foreach (var rule in activeRules) { try { v8.Execute("var " + "o" + " = " + rule.JSFilter + ";"); } catch (Exception e) { MessageBox.Show("Rule " + rule.Name + " is wrong, cannot colorify"); return; } bool wasJsUsed = false; foreach (var trace in traces) { if (trace.HasLabelPrecompiled(rule._id)) { continue; } wasJsUsed = true; for (int i = 0; i < trace.Items.Count; i++) { var item = trace.Items[i]; var toPass = JsonConvert.DeserializeObject <ExpandoObject>(JsonConvert.SerializeObject(item)); if (v8.Script["o"](toPass)) { trace.ItemsLabels[i].Add(rule._id); } } } if (wasJsUsed) { colorifiedOnClientCount++; } else { colorifiedOnServerCount++; } } Console.WriteLine("--colorify info--"); Console.WriteLine("Total traces " + traces.Count); Console.WriteLine("Rules on server " + colorifiedOnServerCount); Console.WriteLine("Rules on client " + colorifiedOnClientCount); sw.Stop(); Console.WriteLine("Time elapsed " + sw.ElapsedMilliseconds + "ms"); //foreach (var rule in activeRules) //{ // try // { // v8.Execute("var " + "o" + " = " + rule.JSFilter + ";"); // } // catch (Exception e) // { // MessageBox.Show("Rule " + rule.Name + " is wrong, cannot colorify"); // return; // } //} //foreach (var logTrace in traces) //{ // logTrace.ItemsLabels.Clear();//remove old info if there is // foreach (var item in logTrace.Items) // { // List<string> labels = new List<string>(); // var toPass = JsonConvert.DeserializeObject<ExpandoObject>(JsonConvert.SerializeObject(item)); // foreach (var rule in activeRules) // { // if (v8.Script["o"](toPass)) // { // labels.Add(rule._id); // } // } // logTrace.ItemsLabels.Add(labels.ToArray()); // } //} } }
public async Task <GenerateResult> GenerateDocumentAsync(string code, object model, IResourceManager resourceManager = null, CancellationToken cancellationToken = default) { using var engine = new V8ScriptEngine(V8ScriptEngineFlags.EnableDynamicModuleImports); engine.Execute(PolyfillScripts.Get("ImageData")); engine.DocumentSettings.Loader = new CustomLoader(engine.DocumentSettings.Loader, _resourceScriptFactory, resourceManager); engine.DocumentSettings.AddSystemDocument("main", ModuleCategory.Standard, code); dynamic setModel = engine.Evaluate(@" let model; const setModel = m => model = JSON.parse(m); setModel"); setModel(JsonSerializer.Serialize(model)); dynamic contentTypePromise = engine.Evaluate(new DocumentInfo() { Category = ModuleCategory.Standard }, @" async function getContentType() { const { contentType } = await import('main'); return contentType; } getContentType()"); var contentType = await ToTask(contentTypePromise); if (contentType is Undefined) { contentType = null; } dynamic resultPromise = engine.Evaluate(new DocumentInfo() { Category = ModuleCategory.Standard }, @" import Builder from 'main'; let builder = new Builder(); Promise.resolve(builder.build(model));"); var result = await ToTask(resultPromise); switch (result) { case string @string: return(new GenerateResult() { Content = Encoding.UTF8.GetBytes(@string), ContentType = contentType ?? "text/plain" }); case ITypedArray <byte> typedArray: return(new GenerateResult() { Content = typedArray.ToArray(), ContentType = contentType ?? "application/octet-stream" }); case IList list: { var array = new byte[list.Count]; for (var i = 0; i < list.Count; i++) { array[i] = Convert.ToByte(list[i]); } return(new GenerateResult() { Content = array, ContentType = contentType ?? "application/octet-stream" }); } default: throw new NotSupportedException("Build did not produce a supported result"); } }
public ReadableStream(V8ScriptEngine evaluator) { Evaluator = evaluator; pipes = new List <IPipe>(); promises = new List <Promise>(); }
public void Restart() { // Find available port _engineDebugPort = -1; for (var p = DebugPortStart; p <= DebugPortEnd; p++) { if (Proxy.IsPortAvailable(p)) { _engineDebugPort = p; break; } } // Dispose old engine if (_engine != null) { _engine.Dispose(); } // Clear queues _callbacks = new ConcurrentQueue <Callback>(); _timeouts = new List <TimeOut>(); _requests = new ConcurrentQueue <Request>(); // Clear XDoc callback API.XDoc.ResetHooks(); if (_engineDebugPort != -1) { // Enable debugging on port "port" _engine = new V8ScriptEngine(V8ScriptEngineFlags.EnableDebugging, _engineDebugPort); } else { // Create engine without debugging because no port is open // (this should never happen since there are a lot of ports in the range) _engine = new V8ScriptEngine(); } // Clear the list of required files _required.Clear(); // Define the NetJS API AddHostType(typeof(API.HTTP)); AddHostType(typeof(API.SQLAPI)); AddHostType(typeof(API.IO)); AddHostType(typeof(API.Log)); AddHostType(typeof(API.Application)); AddHostType(typeof(API.Session)); AddHostType(typeof(API.XDoc)); AddHostType(typeof(API.Base64)); AddHostType(typeof(API.Buffer)); AddHostType(typeof(API.Windows)); AddHostType(typeof(API.DLL)); AddHostType(typeof(API.XML)); AddHostType(typeof(API.MongoDBAPI)); AddHostFunctions(typeof(API.Functions)); // Initialize the tool functions Tool.Init(_engine); // Call the after start callback _afterStart(this); }
/// <summary> /// Serve para reiniciar a Engine e liberar memória /// </summary> public void ReiniciarEngine() { _engine.Interrupt(); _engine.Dispose(); _engine = _manager.GetEngine(); Carregar(_diretorioExecucao, SetTimeOutLigado, false); ConfigurarGeracao(); }
public RequireFunction(V8ScriptEngine scriptEvaluator, IModuleLoader loader, Module module) { this.scriptEvaluator = scriptEvaluator; Loader = loader; Module = module; }
public void Dispose() { if (m_tcpClient != null) { m_tcpClient.Close(); } if (m_scriptEngine != null) { m_scriptEngine.Interrupt(); //m_scriptEngine.CollectGarbage(true); m_scriptEngine.Dispose(); m_scriptEngine = null; } }
/// <summary> /// 执行JS /// </summary> private static void RunJs(string code) { if (string.IsNullOrEmpty(code)) { return; } using (var engine = new V8ScriptEngine()) { // expose a host type engine.AddHostType("Console", typeof(Console)); engine.AddHostObject("lib", new HostTypeCollection("mscorlib", "System.Core")); //engine.Execute("Console.WriteLine(lib.System.DateTime.Now)"); // expose a host object engine.AddHostObject("random", new Random()); //engine.Execute("Console.WriteLine(random.NextDouble())"); // expose entire assemblies // create a host object from script // engine.Execute(@" // birthday = new lib.System.DateTime(2007, 5, 22); // Console.WriteLine(birthday.ToLongDateString()); //"); // use a generic class from script // engine.Execute(@" // Dictionary = lib.System.Collections.Generic.Dictionary; // dict = new Dictionary(lib.System.String, lib.System.Int32); // dict.Add('foo', 123); //"); // call a host method with an output parameter engine.AddHostObject("host", new HostFunctions()); // engine.Execute(@" // intVar = host.newVar(lib.System.Int32); // found = dict.TryGetValue('foo', intVar.out); // Console.WriteLine('{0} {1}', found, intVar); //"); // create and populate a host array // engine.Execute(@" // numbers = host.newArr(lib.System.Int32, 20); // for (var i = 0; i < numbers.Length; i++) { numbers[i] = i; } // Console.WriteLine(lib.System.String.Join(', ', numbers)); //"); // create a script delegate // engine.Execute(@" // Filter = lib.System.Func(lib.System.Int32, lib.System.Boolean); // oddFilter = new Filter(function(value) { // return (value & 1) ? true : false; // }); //"); // use LINQ from script // engine.Execute(@" // oddNumbers = numbers.Where(oddFilter); // Console.WriteLine(lib.System.String.Join(', ', oddNumbers)); //"); // use a dynamic host object // engine.Execute(@" // expando = new lib.System.Dynamic.ExpandoObject(); // expando.foo = 123; // expando.bar = 'qux'; // delete expando.foo; //"); // call a script function //engine.Execute("function print(x) { Console.WriteLine(x); }"); //engine.Script.print(DateTime.Now.DayOfWeek); // examine a script object //engine.Execute("person = { name: 'Fred', age: 5 }"); //Console.WriteLine(engine.Script.person.name); // read a JavaScript typed array //engine.Execute("values = new Int32Array([1, 2, 3, 4, 5])"); //var values = (ITypedArray<int>)engine.Script.values; //Console.WriteLine(string.Join(", ", values.ToArray())); var Proxy = new ScriptProxy(); Proxy.系统.Img = () => { CaptureImage screen = FlaUI.Core.Capturing.Capture.Screen(engine.Script.屏幕()); return((Bitmap)screen.Bitmap.Clone()); }; engine.AddHostObject("代理", Proxy); engine.Execute(code); } }
/// <summary> /// Retrieves the script engine for the current runtime manager. /// </summary> /// <returns></returns> public V8ScriptEngine GetEngine() { if (_scriptEngine == null) { V8ScriptEngineFlags flags = _settings.V8DebugEnabled ? V8ScriptEngineFlags.DisableGlobalMembers | V8ScriptEngineFlags.EnableDebugging : V8ScriptEngineFlags.DisableGlobalMembers; _scriptEngine = _v8Runtime.CreateScriptEngine(flags, _settings.V8DebugPort); } return _scriptEngine; }
public void PropertyBag_MultiEngine_Parallel() { // This is a torture test for ConcurrentWeakSet and general engine teardown/cleanup. // It has exposed some very tricky engine bugs. var bag = new PropertyBag(); engine.AddHostObject("bag", bag); var threadCount = Environment.Is64BitProcess ? 1024 : 256; var engineCount = 0; // 32-bit V8 starts failing requests to create new contexts rather quickly. This is // because each V8 isolate requires (among other things) a 32MB address space // reservation. 64-bit V8 reserves much larger blocks but benefits from the enormous // available address space. var maxV8Count = Environment.Is64BitProcess ? 256 : 16; var maxJScriptCount = (threadCount - maxV8Count) / 2; var startEvent = new ManualResetEventSlim(false); var checkpointEvent = new ManualResetEventSlim(false); var continueEvent = new ManualResetEventSlim(false); var stopEvent = new ManualResetEventSlim(false); ParameterizedThreadStart body = arg => { // ReSharper disable AccessToDisposedClosure var index = (int)arg; startEvent.Wait(); ScriptEngine scriptEngine; if (index < maxV8Count) { scriptEngine = new V8ScriptEngine(); } else if (index < (maxV8Count + maxJScriptCount)) { scriptEngine = new JScriptEngine(); } else { scriptEngine = new VBScriptEngine(); } scriptEngine.AddHostObject("bag", bag); if (Interlocked.Increment(ref engineCount) == threadCount) { checkpointEvent.Set(); } continueEvent.Wait(); scriptEngine.Dispose(); if (Interlocked.Decrement(ref engineCount) == 0) { stopEvent.Set(); } // ReSharper restore AccessToDisposedClosure }; var threads = Enumerable.Range(0, threadCount).Select(index => new Thread(body)).ToArray(); threads.ForEach((thread, index) => thread.Start(index)); startEvent.Set(); checkpointEvent.Wait(); Assert.AreEqual(threadCount + 1, bag.EngineCount); continueEvent.Set(); stopEvent.Wait(); GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); Assert.AreEqual(1, bag.EngineCount); Array.ForEach(threads, thread => thread.Join()); startEvent.Dispose(); checkpointEvent.Dispose(); continueEvent.Dispose(); stopEvent.Dispose(); }
public JavaScriptContext() { this.engine = new V8ScriptEngine(); }