Ejemplo n.º 1
0
        /// <summary>
        /// Calls the function.
        /// </summary>
        /// <param name="name">The name.</param>
        /// <exception cref="System.ArgumentNullException">name</exception>
        internal void CallFunction(string name)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentNullException("name");
            }

            MessageUtility.SendMessage(CefBrowser, "callFunction", null, new CallFunction {
                Name = name, Data = Undefined.Value
            });
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Calls the function asynchronous.
        /// </summary>
        /// <param name="name">The name.</param>
        /// <returns></returns>
        /// <exception cref="System.ArgumentNullException">name</exception>
        internal Task <JToken> CallFunctionAsync(string name)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentNullException("name");
            }

            var callbackId           = Guid.NewGuid();
            var taskCompletionSource = new TaskCompletionSource <JToken>();

            WaitingCallFunction.TryAdd(callbackId, taskCompletionSource);
            MessageUtility.SendMessage(CefProcessId.Renderer, CefBrowser, "callFunction", new CallFunction {
                Name = name, Data = Value.Undefined, CallbackId = callbackId
            });

            return(taskCompletionSource.Task);
        }
Ejemplo n.º 3
0
        private void ProcessMessageCallFunction(CefBrowser browser, CefProcessId sourceProcess, CefProcessMessage processMessage)
        {
            var callFunction = MessageUtility.DeserializeMessage <CallFunction>(processMessage);

            if (!Functions.ContainsKey(callFunction.Name))
            {
                throw new InvalidOperationException(string.Format("Function '{0}' not found.", callFunction.Name));
            }

            JToken returnValue = null;

            if (callFunction.Data != Value.Undefined)
            {
                returnValue = Functions[callFunction.Name].Execute(callFunction.Data);
            }
            else
            {
                returnValue = Functions[callFunction.Name].Execute();
            }

            MessageUtility.SendMessage(CefProcessId.Browser, CefBrowser, "callFunctionResult", new CallFunctionResult {
                Result = returnValue, CallbackId = callFunction.CallbackId
            });
        }
Ejemplo n.º 4
0
        private void JavascriptFunctionNative(CefV8Value obj, CefV8Value[] arguments, out CefV8Value returnValue)
        {
            if (arguments == null)
            {
                throw new ArgumentNullException("arguments");
            }

            if (arguments.Length < 2 || !arguments[0].IsString || !arguments[1].IsString || arguments.Length > 2 && !arguments[2].IsFunction)
            {
                throw new ArgumentException("Invalid arguments.", "arguments");
            }

            returnValue = null;

            var functionName     = arguments[0].GetStringValue();
            var jsonData         = arguments[1].GetStringValue();
            var callbackFunction = arguments.Length > 2 && arguments[2].IsFunction ? arguments[2] : null;

            var callbackId = AddCallback(callbackFunction, CefV8Context.GetCurrentContext());

            MessageUtility.SendMessage(CefProcessId.Browser, CefBrowser, "native", new CallNative {
                Name = functionName, Json = jsonData, CallbackId = callbackId
            });
        }
Ejemplo n.º 5
0
        public bool ProcessMessage(CefBrowser browser, CefProcessId sourceProcess, CefProcessMessage processMessage)
        {
            if (processMessage.Name == "native")
            {
                var message = MessageUtility.DeserializeMessage <CallNative>(processMessage);

                BaseMainApplication.Current.InvokeOnMainAsync(() =>
                {
                    var returnData = (object)null;
                    var exception  = (Exception)null;

                    // native found
                    if (ProcessMessages.ContainsKey(message.Data.Name))
                    {
                        try
                        {
                            returnData = ProcessMessages[message.Data.Name](message.Data.Json);
                        }
                        catch (Exception e)
                        {
                            exception  = e;
                            returnData = null;
                        }
                    }
                    else
                    {
                        exception = new NativeNotFoundException(message.Data.Name);
                    }

                    // callback
                    if (message.CallbackId != null)
                    {
                        var nativeResponse = new NativeResponse();

                        if (exception != null)
                        {
                            nativeResponse.Exception = ExceptionUtility.CreateJavascriptException(exception);
                            nativeResponse.Type      = NativeResponseType.Exception;
                            nativeResponse.Value     = null;
                        }
                        else
                        {
                            if (returnData == Undefined.Value)
                            {
                                nativeResponse.Exception = null;
                                nativeResponse.Type      = NativeResponseType.Undefined;
                                nativeResponse.Value     = null;
                            }
                            else
                            {
                                nativeResponse.Exception = null;
                                nativeResponse.Type      = NativeResponseType.Value;
                                nativeResponse.Value     = returnData;
                            }
                        }

                        var returnJson = JsonUtility.SerializeToJson(nativeResponse);

                        MessageUtility.SendMessage(browser, "native", message.CallbackId, returnJson);
                    }
                }).ContinueWith(t =>
                {
                    GeneralLog.Error("Native call exception.", t.Exception);
                }, TaskContinuationOptions.OnlyOnFaulted);

                return(true);
            }

            return(false);
        }
Ejemplo n.º 6
0
        private void ProcessMessageNative(CefBrowser browser, CefProcessId sourceProcess, CefProcessMessage processMessage)
        {
            var callNative = MessageUtility.DeserializeMessage <CallNative>(processMessage);

            Application.Current.InvokeOnMainAsync(() =>
            {
                object returnData   = null;
                Exception exception = null;

                NativeFunctionDelegate handler;
                NativeFunctionDelegates.TryGetValue(callNative.Name, out handler);

                // function call
                if (handler != null)
                {
                    try
                    {
                        returnData = handler(callNative.Json);
                    }
                    catch (Exception e)
                    {
                        exception = e;
                    }
                }
                else
                {
                    exception = new NativeNotFoundException(callNative.Name);
                }

                // callback
                if (callNative.CallbackId != null)
                {
                    var nativeResponse = new NativeResponse();

                    if (exception != null)
                    {
                        nativeResponse.Exception = ExceptionUtility.CreateJavascriptException(exception);
                        nativeResponse.Type      = NativeResponseType.Exception;
                        nativeResponse.Value     = null;
                    }
                    else
                    {
                        if (returnData == Value.Undefined)
                        {
                            nativeResponse.Exception = null;
                            nativeResponse.Type      = NativeResponseType.Undefined;
                            nativeResponse.Value     = null;
                        }
                        else
                        {
                            nativeResponse.Exception = null;
                            nativeResponse.Type      = NativeResponseType.Value;
                            nativeResponse.Value     = returnData;
                        }
                    }

                    var returnJson = JsonUtility.SerializeToJson(nativeResponse);

                    MessageUtility.SendMessage(CefProcessId.Renderer, browser, "native", new CallNativeResult {
                        JsonResult = returnJson, CallbackId = callNative.CallbackId
                    });
                }
            }).ContinueWith(t =>
            {
                Logger.Error("Native call exception.", t.Exception);
            }, TaskContinuationOptions.OnlyOnFaulted);
        }
Ejemplo n.º 7
0
 protected override void SyncPropertyInternal(string name, object value)
 {
     MessageUtility.SendMessage(CefProcessId.Browser, CefBrowser, "syncProperty", new SyncProperty {
         Name = name, Value = value
     });
 }
Ejemplo n.º 8
0
 private void SyncPropertyWithSendMessage(string name, object value)
 {
     MessageUtility.SendMessage(CefProcessId.Renderer, Window.CefBrowser, "syncProperty", new SyncProperty {
         Name = name, Value = value
     });
 }
Ejemplo n.º 9
0
        /// <summary>
        /// Sends the request to the browser process.
        /// </summary>
        /// <param name="name"></param>
        /// <param name="obj"></param>
        /// <param name="arguments"></param>
        /// <param name="returnValue"></param>
        /// <param name="exception"></param>
        /// <returns></returns>
        protected override bool Execute(string name, CefV8Value obj, CefV8Value[] arguments, out CefV8Value returnValue, out string exception)
        {
            if (arguments == null)
            {
                throw new ArgumentNullException("arguments");
            }

            returnValue = null;
            exception   = null;

            // native
            if (name == "native")
            {
                var functionName     = arguments[0].GetStringValue();
                var jsonData         = arguments[1].GetStringValue();
                var callbackFunction = arguments.Length > 2 && arguments[2].IsFunction ? arguments[2] : null;

                var callbackId = AddCallback(callbackFunction, CefV8Context.GetCurrentContext());

                MessageUtility.SendMessage(CefBrowser, "native", callbackId, new CallNative {
                    Name = functionName, Json = jsonData
                });

                return(true);
            }

            // register function
            else if (name == "registerFunction")
            {
                var functionName = arguments[0].GetStringValue();
                var function     = arguments[1];

                if (!Functions.ContainsKey(functionName))
                {
                    Functions.Add(functionName, new JavascriptFunction(function, CefV8Context.GetCurrentContext()));
                }
                else
                {
                    exception = string.Format("Function '{0}' is already registered.", functionName);
                }

                return(true);
            }

            // load internal script
            else if (name == "loadInternalScript")
            {
                if (arguments.Length > 0 && arguments[0].IsString)
                {
                    var scriptName = "Scripts/" + arguments[0].GetStringValue();

                    if (ResourceUtility.ResourceExists(scriptName))
                    {
                        CefV8Value     evalReturnValue = null;
                        CefV8Exception evalException   = null;

                        string script  = ResourceUtility.GetResourceAsString(scriptName);
                        var    context = CefV8Context.GetCurrentContext();

                        if (!context.TryEval(script, out evalReturnValue, out evalException))
                        {
                            exception = string.Format("Exception: {0}.", JsonConvert.SerializeObject(exception));
                        }
                    }
                    else
                    {
                        exception = "Script not found.";
                    }
                }
                else
                {
                    exception = "Missing script name.";
                }

                return(true);
            }

            return(false);
        }