public void JsReferencesIndicateNativeFunctionSource() { using (var runtimeHandle = Engine.JsCreateRuntime(JavaScriptRuntimeAttributes.None, null)) { Assert.Equal("JsCreateRuntime", runtimeHandle.NativeFunctionSource); } }
/// <summary> /// Creates a new JavaScript Runtime. /// </summary> /// <param name="attributes"></param> /// <returns></returns> public BaristaRuntime CreateRuntime(JavaScriptRuntimeAttributes attributes = JavaScriptRuntimeAttributes.None) { var contextService = m_serviceProvider.GetRequiredService <IBaristaContextFactory>(); var runtimeHandle = m_engine.JsCreateRuntime(attributes, null); var result = m_runtimePool.GetOrAdd(runtimeHandle, () => { var rt = new BaristaRuntime(m_engine, contextService, runtimeHandle); //Do not wire up a runtime's BeforeCollect handler with the factory as this will //remove and dispose of the runtime on ANY garbage collect, which will eventually //crash the engine. //After a runtime handle is disposed, remove the handle from the pool. void afterDispose(object sender, EventArgs args) { rt.AfterDispose -= afterDispose; m_runtimePool.RemoveHandle(runtimeHandle); } rt.AfterDispose += afterDispose; return(rt); }); if (result == null) { throw new InvalidOperationException("Unable to create or retrieve a new Barista Runtime."); } return(result); }
public void JsCanStartDebugging() { using (var runtimeHandle = Engine.JsCreateRuntime(JavaScriptRuntimeAttributes.None, null)) { using (var contextHandle = Engine.JsCreateContext(runtimeHandle)) { Engine.JsSetCurrentContext(contextHandle); bool called = false; JavaScriptDiagDebugEventCallback callback = (JavaScriptDiagDebugEventType eventType, IntPtr eventData, IntPtr callbackState) => { called = true; return(true); }; Engine.JsDiagStartDebugging(runtimeHandle, callback, IntPtr.Zero); //We didn't specify any breakpoints so... Assert.False(called); } } }
public void JsDiagEvaluateReturnsAValue() { if (DebugWindowsEngine == null) { return; } string iterate = @" var moose = 0; for(var i = 0; i < 50; i++) { moose++; } moose; "; int iPod = 0; using (var runtimeHandle = Engine.JsCreateRuntime(JavaScriptRuntimeAttributes.None, null)) { using (var contextHandle = Engine.JsCreateContext(runtimeHandle)) { Engine.JsSetCurrentContext(contextHandle); //Callback that is run for each breakpoint. JavaScriptDiagDebugEventCallback callback = (JavaScriptDiagDebugEventType eventType, IntPtr eventData, IntPtr callbackState) => { var evalScript = Engine.JsCreateString("i", (ulong)"i".Length); var evalResultHandle = Engine.JsDiagEvaluate(evalScript, 0, JavaScriptParseScriptAttributes.None, false); var handleType = Engine.JsGetValueType(evalResultHandle); Assert.Equal(JsValueType.Object, handleType); var valuePropertyHandle = CommonWindowsEngine.JsGetPropertyIdFromName("value"); var valueHandle = Engine.JsGetProperty(evalResultHandle, valuePropertyHandle); iPod = Engine.JsNumberToInt(valueHandle); evalScript.Dispose(); return(true); }; var callbackHandle = GCHandle.Alloc(callback); try { using (var ss = new ScriptSource(Engine, iterate)) { Engine.JsDiagStartDebugging(runtimeHandle, callback, IntPtr.Zero); var scripts = Engine.JsDiagGetScripts(); Assert.NotEqual(JavaScriptValueSafeHandle.Invalid, scripts); var ix = Engine.JsIntToNumber(0); var objScriptHandle = Engine.JsGetIndexedProperty(scripts, ix); var scriptIdPropertyHandle = CommonWindowsEngine.JsGetPropertyIdFromName("scriptId"); var scriptIdHandle = Engine.JsGetProperty(objScriptHandle, scriptIdPropertyHandle); var scriptId = Engine.JsNumberToInt(scriptIdHandle); //Set a breakpoint with a knkown position var breakPointHandle = Engine.JsDiagSetBreakpoint((uint)scriptId, 4, 0); Assert.NotEqual(JavaScriptValueSafeHandle.Invalid, breakPointHandle); var finalResult = Engine.JsCallFunction(ss.FunctionHandle, new IntPtr[] { ss.FunctionHandle.DangerousGetHandle() }, 1); var handleType = Engine.JsGetValueType(finalResult); Assert.Equal(JsValueType.Number, handleType); Engine.JsDiagStopDebugging(runtimeHandle); } Assert.Equal(49, iPod); } finally { callbackHandle.Free(); } } } }
public void JsParseScriptParsesAndReturnsAFunction() { if (CommonWindowsEngine == null) { return; } var script = "(()=>{return 6*7;})()"; string sourceUrl = "[eval code]"; using (var runtimeHandle = Engine.JsCreateRuntime(JavaScriptRuntimeAttributes.None, null)) { using (var contextHandle = Engine.JsCreateContext(runtimeHandle)) { Engine.JsSetCurrentContext(contextHandle); var resultHandle = CommonWindowsEngine.JsParseScript(script, JavaScriptSourceContext.GetNextSourceContext(), sourceUrl); Assert.True(resultHandle != JavaScriptValueSafeHandle.Invalid); var handleType = Engine.JsGetValueType(resultHandle); Assert.True(handleType == JsValueType.Function); resultHandle.Dispose(); } } }
public void JsCreateStringTest() { var str = "Hello, World!"; using (var runtimeHandle = Engine.JsCreateRuntime(JavaScriptRuntimeAttributes.None, null)) { using (var contextHandle = Engine.JsCreateContext(runtimeHandle)) { Engine.JsSetCurrentContext(contextHandle); var stringHandle = Engine.JsCreateString(str, (ulong)str.Length); Assert.True(stringHandle != JavaScriptValueSafeHandle.Invalid); var handleType = Engine.JsGetValueType(stringHandle); Assert.True(handleType == JsValueType.String); stringHandle.Dispose(); } } }