示例#1
0
 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);
        }
示例#3
0
 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);
 }
示例#4
0
 internal static extern JavaScriptErrorCode JsRunSerializedScriptWithCallback(JavaScriptSerializedScriptLoadSourceCallback scriptLoadCallback,
     JavaScriptSerializedScriptUnloadCallback scriptUnloadCallback, byte[] buffer, JavaScriptSourceContext sourceContext, string sourceUrl, out JavaScriptValue result);
示例#5
0
        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();
            }
        }