internal static extern JsErrorCode JsRunSerializedScriptWithCallback( JavaScriptSerializedScriptLoadSourceCallback scriptLoadCallback, JavaScriptSerializedScriptUnloadCallback scriptUnloadCallback, byte[] buffer, JsSourceContext sourceContext, string sourceUrl, out JsValue result);
public void JsSerializedScriptCanBeParsedWithCallbacks() { if (CommonWindowsEngine == null) { return; } var script = "(()=>{return 6*7;})()"; string sourceUrl = "[eval code]"; bool loaded = false; bool unloaded = false; using (var runtimeHandle = Engine.JsCreateRuntime(JavaScriptRuntimeAttributes.None, null)) { using (var contextHandle = Engine.JsCreateContext(runtimeHandle)) { Engine.JsSetCurrentContext(contextHandle); byte[] buffer = new byte[1024]; uint bufferSize = (uint)buffer.Length; CommonWindowsEngine.JsSerializeScript(script, buffer, ref bufferSize); JavaScriptSerializedScriptLoadSourceCallback loadCallback = (JavaScriptSourceContext sourceContext, out StringBuilder scriptBuffer) => { loaded = true; scriptBuffer = new StringBuilder(script); return(true); }; JavaScriptSerializedScriptUnloadCallback unloadCallback = (JavaScriptSourceContext sourceContext) => { unloaded = true; }; var fnHandle = CommonWindowsEngine.JsParseSerializedScriptWithCallback(loadCallback, unloadCallback, buffer, JavaScriptSourceContext.GetNextSourceContext(), sourceUrl); Assert.NotEqual(JavaScriptValueSafeHandle.Invalid, fnHandle); var handleType = Engine.JsGetValueType(fnHandle); Assert.True(handleType == JsValueType.Function); //Get the string representation of the function. This triggers the load callback. var fnStringHandle = Engine.JsConvertValueToString(fnHandle); var stringPtr = CommonWindowsEngine.JsStringToPointer(fnStringHandle, out ulong length); Assert.True(stringPtr != IntPtr.Zero); Assert.True(length > 0); fnStringHandle.Dispose(); fnHandle.Dispose(); } Engine.JsCollectGarbage(runtimeHandle); } Assert.True(loaded); Assert.True(unloaded); }
public JavaScriptValueSafeHandle JsRunSerializedScriptWithCallback(JavaScriptSerializedScriptLoadSourceCallback scriptLoadCallback, JavaScriptSerializedScriptUnloadCallback scriptUnloadCallback, byte[] buffer, JavaScriptSourceContext sourceContext, string sourceUrl) { Errors.ThrowIfError(LibChakraCore.JsRunSerializedScriptWithCallback(scriptLoadCallback, scriptUnloadCallback, buffer, sourceContext, sourceUrl, out JavaScriptValueSafeHandle result)); result.NativeFunctionSource = nameof(LibChakraCore.JsRunSerializedScriptWithCallback); if (result != JavaScriptValueSafeHandle.Invalid) { Errors.ThrowIfError(LibChakraCore.JsAddRef(result, out uint valueRefCount)); } return(result); }
internal static extern JavaScriptErrorCode JsRunSerializedScriptWithCallback(JavaScriptSerializedScriptLoadSourceCallback scriptLoadCallback, JavaScriptSerializedScriptUnloadCallback scriptUnloadCallback, byte[] buffer, JavaScriptSourceContext sourceContext, string sourceUrl, out JavaScriptValue result);
public static extern JavaScriptErrorCode JsParseSerializedScriptWithCallback(JavaScriptSerializedScriptLoadSourceCallback scriptLoadCallback, JavaScriptSerializedScriptUnloadCallback scriptUnloadCallback, byte[] buffer, JavaScriptSourceContext sourceContext, string sourceUrl, out JavaScriptValue result);
public void JsSerializedScriptCanBeRunWithCallbacks() { if (CommonWindowsEngine == null) { return; } var script = @" var moose1 = function() { //Trigger script loading var str = arguments.callee.toString(); return 6*7; }; moose1(); "; string sourceUrl = "[eval code]"; bool loaded = false; bool unloaded = false; JavaScriptSerializedScriptLoadSourceCallback loadCallback = (JavaScriptSourceContext sourceContext, out StringBuilder scriptBuffer) => { loaded = true; scriptBuffer = new StringBuilder(script); return(true); }; JavaScriptSerializedScriptUnloadCallback unloadCallback = (JavaScriptSourceContext sourceContext) => { unloaded = true; }; var loadCallbackHandle = GCHandle.Alloc(loadCallback); var unloadCallbackHandle = GCHandle.Alloc(unloadCallback); try { using (var runtimeHandle = Engine.JsCreateRuntime(JavaScriptRuntimeAttributes.None, null)) { using (var contextHandle = Engine.JsCreateContext(runtimeHandle)) { Engine.JsSetCurrentContext(contextHandle); byte[] buffer = new byte[1024]; uint bufferSize = (uint)buffer.Length; CommonWindowsEngine.JsSerializeScript(script, buffer, ref bufferSize); var resultHandle = CommonWindowsEngine.JsRunSerializedScriptWithCallback(loadCallback, unloadCallback, buffer, JavaScriptSourceContext.GetNextSourceContext(), sourceUrl); Assert.NotEqual(JavaScriptValueSafeHandle.Invalid, resultHandle); var handleType = Engine.JsGetValueType(resultHandle); Assert.True(handleType == JsValueType.Number); Assert.Equal(42, Engine.JsNumberToInt(resultHandle)); resultHandle.Dispose(); } Engine.JsCollectGarbage(runtimeHandle); } Assert.True(loaded); Assert.True(unloaded); } finally { loadCallbackHandle.Free(); unloadCallbackHandle.Free(); } }